ИИ Discourse не справляется с переводом большого количества постов и тем

Привет!

Я включил Discourse AI на нашем форуме сообщества и начал обратную загрузку переводов на несколько языков. Примерно 60% постов и тем переведены, но в процессе я получаю ОГРОМНОЕ количество ошибок в консоли (ai_translation_verbose_logs включен), и теперь обратная загрузка в основном остановилась:

DiscourseAi::Translation: Failed to translate topic 563 to de: Validation failed: Title can't be blank, Fancy title can't be blank /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.3/

DiscourseAi::Translation: Failed to translate post 582 to pl_PL: Validation failed: Raw can't be blank, Cooked can't be blank /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-8.0.3/lib/a

Странность ситуации в следующем:

  • Упомянутые посты и темы выглядят вполне нормально: у них разные типы заголовков и тел, как простые, так и сложные. Похожее успешно переводилось ранее.
  • При второй или третьей попытке они часто переводятся успешно.
  • Я использую кастомную персону для постов, но это происходит и со встроенной персоной переводчика постов, и со встроенной персоной для перевода заголовков тем.
  • Это происходит со всеми протестированными моделями: Gemini-2.5-flash (без рассуждений), Gemini-2.5-flash (с рассуждениями), GPT5 и GPT5-mini.
  • Это происходит во всех локалях в равной степени (en, es, pt, de, pl_PL, fr, nl).

Возможно ли логировать полные промпты и ответы моделей для дальнейшего отладки?

Я вручную тестирую те же промпты на всех этих моделях, и они всегда отвечают успешно.

Я нашел ai_api_audit_logs, и, кажется, обнаружил проблему.

При отправке перевода используется функция get_max_tokens, которая назначает максимальное количество токенов на основе длины текста.

Проблема в том, что оно в основном расходуется на рассуждения. Посмотрите этот лог аудита: лимит был установлен на 1000, и рассуждения использовали все 1000 токенов, даже не начав генерацию вывода.

Лимит для моделей с рассуждениями должен быть значительно выше.

data: {"id":"chatcmpl-CQ7XU4Ep16RClb7OZQAxOXN9JWgIG","object":"chat.completion.chunk","created":1760341544,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"dPNNK7ojEf"}

data: {"id":"chatcmpl-CQ7XU4Ep16RClb7OZQAxOXN9JWgIG","object":"chat.completion.chunk","created":1760341544,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"length"}],"usage":null,"obfuscation":"dM2r"}

data: {"id":"chatcmpl-CQ7XU4Ep16RClb7OZQAxOXN9JWgIG","object":"chat.completion.chunk","created":1760341544,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":1075,"completion_tokens":1000,"total_tokens":2075,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":1000,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"j4"}

data: [DONE]

Я просто не рекомендую использовать какие-либо модели мышления для задач перевода.

Мой опыт совершенно противоположен. У меня есть набор инструкций, которые должны выполняться и требуют понимания контекста; модели без мышления либо игнорируют их, либо применяют в неподходящих ситуациях. Я только что перевёл целое приложение именно так — более 3000 строк, и модели с рассуждением дали гораздо лучшие результаты.

Исходя из своих выводов, я снизил уровень мышления до low, и все переводы были успешно выполнены. Однако я считаю, что такое ограничение выходных токенов контрпродуктивно, поскольку модели с мышлением не ограничены в использовании для переводов, а пользователи не понимают, почему возникает сбой.

Решение может быть столь же простым, как увеличение коэффициента в два раза, если у LLM включено мышление. Или же можно вывести этот коэффициент в виде параметра конфигурации.

Нам пришлось ограничить параметр max_tokens, так как использование структурированных выводов приводило к тому, что многие небольшие модели легко уходили в бесконечные циклы во время переводов.

Я полагаю, что в новой версии API OpenAI Responses параметр max_tokens применяется без учёта токенов размышления, что решает эту проблему.

Я тестирую последнюю версию GPT-5. Столкнулся с точно такой же проблемой и в Gemini 2.5 Pro, и в 2.5 Flash. Почему бы просто немного не увеличить лимит?

Я потратил довольно много средств на неудачные попытки, о которых даже не узнал бы, если бы не включил отладочное логирование, а затем пришлось бы копаться в Data Explorer, чтобы найти эти логи. И всё это время я использовал предопределённого создателя моделей.

Я отключил потоковую передачу, и это значительно улучшило ситуацию (и продолжает улучшать, думаю)

Мы только что объединили обновление, которое предоставляет вам доступ к новому параметру ai_translation_max_tokens_multiplier, значение по умолчанию которого равно 1.

Вы можете увеличить это значение до любого числа, которое вам нужно, чтобы справиться с наблюдаемым вами ограничением.