Discourse AI가 많은 게시물과 주제 번역 실패

안녕하세요,

커뮤니티 포럼에 Discourse AI를 활성화하고 여러 언어로 백필(backfill)을 시작했습니다. 게시글과 주제의 약 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 함수가 있습니다.

문제는 이 토큰 대부분이 추론(reasoning)에 사용된다는 점입니다. 아래 감사 로그를 보면 한도가 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]

번역 작업에 추론 모델(thinking models)의 사용을 권하지 않습니다.

제 경험은 그 반대입니다. 맥락을 이해해야 하는 일련의 지침을 따르도록 해야 하는데, 비추론 모델은 이를 무시하거나 잘못된 상황에서 적용합니다. 저는 이 방식으로 전체 애플리케이션(3,000개 이상의 문자열)을 번역했는데, 추론 모델이 훨씬 더 나은 결과를 보여주었습니다.

제 조사 결과에 따라 추론 노력을 low로 낮추고 모든 번역을 처리했습니다. 하지만 저는 출력을 그렇게 제한하는 것이 역효과라고 생각합니다. 추론 모델이 번역에서 사용되지 못하도록 제한된 것이 아니며, 사용자가 실패 이유가 무엇인지 알 수 없기 때문입니다.

해결책은 LLM에 추론이 활성화된 경우 배수를 2로 더 곱하는 것일 수도 있습니다. 또는 배수를 설정 옵션으로 노출하는 것도 방법입니다.

구조화된 출력(structured outputs)을 사용하다 보니, 많은 소형 모델들이 번역 과정에서 무한 루프에 빠지기 쉬웠기 때문에 max_tokens를 제한해야 했습니다.

OpenAI Responses API의 최신 버전에서는 max_tokens를 적용할 때 생각 토큰(thinking tokens)을 제외하고 계산한다고 하며, 이는 이 문제를 해결합니다.

최신 GPT-5를 테스트해 보고 있습니다. Gemini 2.5 Pro와 2.5 Flash에서도 정확히 동일한 문제를 확인했습니다. 한도를 조금만 높이면 안 될까요?

디버그 로깅을 활성화하지 않았다면 알 수도 없었을 실패한 시도들에 꽤 많은 돈을 썼고, 데이터 탐색기(Data Explorer)에서 로그를 찾아내기 위해 직접 살펴봐야 했습니다. 그런데도 저는 미리 정의된 모델 크리에이터를 사용했습니다.

스트리밍을 비활성화하니 훨씬 나아졌어요 (그리고 여전히 사고 처리를 하고 있어요)

새 설정 ai_translation_max_tokens_multiplier에 접근할 수 있도록 해주는 업데이트를 방금 병합했습니다. 이 설정의 기본값은 1입니다.

현재 보고 계신 한도를 해결하기 위해 이 값을 원하는 숫자로 높일 수 있습니다.