117 lines
7.5 KiB
Markdown
117 lines
7.5 KiB
Markdown
# DeepSeek — спонтанный переход на китайский
|
||
|
||
**Дата:** 2026-09-15
|
||
**Статус:** известный баг модели, официального фикса нет. Решение не принято.
|
||
**Проявление:** Кит (Whale) начал отвечать Alex'у на китайском вместо русского.
|
||
|
||
## Симптом
|
||
|
||
Модель `deepseek-chat` (провайдер `deepseek`, наш основной) выдаёт ответ
|
||
целиком на китайском, хотя весь диалог — на русском или английском.
|
||
Диалог был: коммиты git, английский технический вывод, короткие ответы.
|
||
|
||
**Опять же**, баг плавающий: тот же промпт то даёт правильный язык, то нет.
|
||
|
||
## Первопричина (подтверждена)
|
||
|
||
Модель **рассуждает внутри на китайском** (это её дефолт — так эффективнее
|
||
по токенам), а финальный шаг «перевести на язык пользователя» иногда
|
||
пропускается или сбоит.
|
||
|
||
Два фактора:
|
||
|
||
1. **Мультиязычное reasoning по дизайну.** Внутренняя цепочка рассуждений
|
||
генерируется на китайском намеренно, для эффективности. Перевод обратно
|
||
не всегда происходит.
|
||
2. **Недетерминированность генерации.** Тот же вход иногда даёт английский,
|
||
иногда китайский. Поэтому ни один фикс не гарантирован.
|
||
|
||
**Промпт игнорируется:** в багрепортах отмечено, что модель продолжает
|
||
на китайском **даже после прямой просьбы** не переключать язык.
|
||
|
||
## Триггеры
|
||
|
||
- **Короткие технические ответы без явной языковой привязки** — самый частый
|
||
триггер. Формулировка из разбора: «short, context-lacking prompts more
|
||
likely trigger default reasoning language».
|
||
- Большой объём англоязычного вывода (git-логи, diff'ы, термины) —
|
||
сбивает языковую привязку.
|
||
- В нашем system prompt **нет жёсткой языковой инструкции**: единственное
|
||
упоминание — строка 4 `SOUL.md`: `respond in the language you're
|
||
addressed in — Russian or English`. Формулировка мягкая.
|
||
|
||
## Статус в апстриме
|
||
|
||
Issue **открыты**, мейнтейнеры не ответили, официального фикса **нет**:
|
||
|
||
- [DeepSeek-V3 #1226](https://github.com/deepseek-ai/DeepSeek-V3/issues/1226) — Model sometimes responds in Chinese even when the conversation is in English
|
||
- [DeepSeek-V3 #1443](https://github.com/deepseek-ai/DeepSeek-V3/issues/1443) — Model switches to Chinese despite all English prompts
|
||
- [DeepSeek-V3 #1463](https://github.com/deepseek-ai/DeepSeek-V3/issues/1463) — DeepSeek responds in Chinese instead of English
|
||
|
||
Все решения ниже — community workarounds, не официальные.
|
||
|
||
## Способы решения (по возрастанию стоимости)
|
||
|
||
### 1. Жёсткая языковая инструкция в SOUL.md — дешёвый, не гарантирован
|
||
|
||
Заменить мягкую формулировку на явную:
|
||
|
||
> Отвечай **только** на языке собеседника — русский или английский.
|
||
> Никогда не используй китайский, даже внутри рассуждений.
|
||
> Если сомневаешься — пиши по-русски.
|
||
|
||
**Плюс:** правится без кода, `SOUL.md` редактируется напрямую.
|
||
**Минус:** в багрепортах модель игнорировала и прямые запреты.
|
||
|
||
Полезно ещё потому, что теперь есть `prompt_overrides` — можно вынести
|
||
формулировку в `review/*.md`, не трогая Python. См. [[hermes-agent-improvements]].
|
||
|
||
### 2. Детектор языка + retry — надёжно, дорого
|
||
|
||
Программная проверка вывода: если китайский — повтор запроса.
|
||
Недетерминированность играет в нашу пользу: retry часто даёт правильный язык.
|
||
|
||
**Требует кода в Hermes** (перехват ответа, детекция, повтор). Отдельная задача.
|
||
|
||
### 3. Смена модели — радикально, эффективно
|
||
|
||
Claude / GPT следуют языковым инструкциям заметно лучше. Если китайский
|
||
будет повторяться — вариант.
|
||
|
||
**Открытый вопрос:** `deepseek-chat` выбран сознательно или это дефолт,
|
||
который никто не выбирал? Ответ определяет выбор между путями 1+2 и 3.
|
||
|
||
## Что НЕ работает
|
||
|
||
- Повтор той же просьбы «говори по-английски» — модель игнорирует.
|
||
- Опора на мягкую формулировку (`respond in the language you're addressed in`).
|
||
|
||
## Сопутствующая находка: апстрим учитывает CJK на уровне FTS
|
||
|
||
В апстриме Hermes есть `native/fts5_cjk` — C-расширение SQLite FTS5 для
|
||
токенизации **китайского / японского / корейского** текста (`build.sh`,
|
||
`vendor/sqlite3.h`, `fts5_cjk.c`).
|
||
|
||
Это не про генерацию, а про **поиск**: без CJK-токенизатора китайский текст
|
||
в `session_search` / FTS5-индексе не находится нормально (китайский не
|
||
разбивается пробелами). Косвенно подтверждает: CJK в контексте DeepSeek —
|
||
известная проблема, апстрим вложился в её инфраструктуру.
|
||
|
||
Нам это **не нужно**, пока мы не переезжаем на вариант B и не храним
|
||
китайский текст в сессиях. См. [[hermes-fork-vs-upstream]].
|
||
|
||
## Статус решения (2026-09-15)
|
||
|
||
**Ни один путь не выбран.** Правка `SOUL.md` (путь 1) **не выполнялась** —
|
||
предложена Alex'у, ответа не последовало (сессия ушла в другие задачи:
|
||
git-коммиты, tirith, сравнение с апстримом).
|
||
|
||
Вопрос «`deepseek-chat` сознательно или дефолт?» **остаётся открытым.**
|
||
При следующем обращении к теме — задать первым.
|
||
|
||
## Связанное
|
||
|
||
- [[hermes-whale-system-prompt]] — где живёт языковая инструкция (SOUL.md, строка 4)
|
||
- [[hermes-agent-improvements]] — prompt_overrides, способ правки без кода
|
||
- [[hermes-fork-vs-upstream]] — `native/fts5_cjk`, общий обзор нового в апстриме
|