クエリの言語に応じて、ドイツ語または英語で回答する必要があるRAGシステムを作りました。簡単そうでした。簡単ではありませんでした。
ソース文書は主にドイツ語ですが、フランスの法律用語が含まれているものもあり、ラテン語の句や、時には英語の引用も含まれます。起きていたことはというと、LLMがまずドイツ語で回答を始めるものの、文脈の中にフランス語の一節が出てくると、ただ..段落の途中でフランス語に切り替えてしまう、ということでした。同じ文の中でドイツ語とフランス語を混ぜてしまうこともありました。一度、イタリア語だけで最後まで回答したことがあって、今でも理由がわかりません。
LLMにクエリの言語自体を検出させてみました。信頼できませんでした。ユーザーがフランスの裁判例を名前で挙げると、クエリがフランス語だと判断してしまうことがありました。
実際にうまくいったのは、単純なregex(正規表現)検出器でした。クエリに一般的なドイツ語の単語(der, die, das, und, ist, nicht, mit, für, datenschutz, verletzung など)が含まれているかをチェックします。ドイツ語の目印が十分にある場合は、応答言語をドイツ語に強制します。そうでなければ英語です。言語検出のための高度なライブラリは使いません。パターンマッチングだけです。
そしてプロンプトに、強い制約を追加しました。"あなたの回答はすべてONLYで{language}で書いてください。出力はドイツ語または英語のみです。決してフランス語、スペイン語、イタリア語、または他のいかなる言語もしないでください。取得したコンテキストが別の言語を一部含む場合でも、あなたの回答は{language}のみに翻訳してください。"
「never French(決してフランス語にしない)」の部分が重要な役割を果たしています。明示的な禁止がないと、テストを始めて数日でモデルが再びフランス語に戻ってしまいます。モデルが文脈上のフランスの法律文書を見て、「あ、これフランス語でやるんだ」と思ってしまう感じです。
多言語のRAGシステムを作っている人で、これに遭遇した人はいますか? ソース文書由来の言語汚染が、私が対応した中で最も厄介なバグで、ほとんど誰もそれについて書いていないのを見かけました。
[link] [comments]

