Как склеить оборванные ответы языковой модели без артефактов
Разработчики сервиса с несколькими LLM рассказали, почему ответы могут обрываться и как обойти три главные ловушки при их объединении.
Что случилось?
В одном из наших чат‑ботов, использующих несколько языковых моделей в одном диалоге, модель неожиданно выдала список из 100 пунктов и оборвалась посередине слова. При этом в ответе не было ошибок и никаких предупреждений о завершении генерации.
Почему ответы прерываются?
LLM генерируют токены до тех пор, пока не встретят один из finish_reason: stop, length, content_filter или tool_calls. При превышении лимита токенов (обычно 4 К) модель просто обрывает вывод, не указывая, что текст обрезан. Это особенно проблематично в мульти‑модельных сценариях, где каждый кусок передаётся клиенту как отдельный ответ.
Три ловушки склейки
- Неполные токены – обрезанный токен может оказаться частью UTF‑8 символа, что приводит к «кракозябрам».\
- Повторяющиеся фрагменты – при повторном запросе модели часто начинают генерировать с того же места, дублируя несколько токенов.\
- Контекстные разрывы – часть предложения может потерять связь с предыдущим контекстом, вызывая смысловые несоответствия.
Решение автора
В статье предложена функция stitchResponses, которая:
- проверяет
finish_reasonи, если онlength, автоматически делает дополнительный запрос с параметромcontinue_from; - использует байтовый буфер для корректного объединения UTF‑8‑символов;
- сравнивает последние 5 токенов предыдущего куска с первыми токенами нового, удаляя дублирование.
Практический результат
После внедрения функции количество «обрезанных» ответов сократилось на 97 %, а пользователи перестали видеть странные артефакты в тексте. Код функции опубликован в открытом репозитории и может быть адаптирован под любые LLM.
Ссылка на оригинал: Habr AI – Как мы дописываем оборванные ответы языковой модели
Для разработчиков чат‑ботов это напоминание, что нельзя полагаться только на `finish_reason`. Нужно предусмотреть автоматическое продолжение генерации и корректную стыковку токенов, иначе пользовательский опыт пострадает. Функция‑обёртка пригодится как в продакшене, так и в учебных проектах, где часто работают с ограниченными токенами.


