ブログ翻訳プロジェクトは当初、複雑に設計されていた——まずMarkdown形式を解析し、プレースホルダーでコンテンツを保護し、最後に大規模言語モデルに送信する仕組みだった。これは完全に無駄であり、大規模言語モデル自体がMarkdownの文法を認識する能力を備えており、元のコンテンツを直接処理し、翻訳時にフォーマットを維持することができたからだ。
私たちの仕事は、コードのデバッグから、大規模言語モデルのプロンプトのデバッグへと変わった。
モデル:google/gemma-3-4b
ハードウェア:Nvidia 3060 12GB
そう、思考しないモデルを選んだ。思考するモデルは翻訳タスクを実行する際に効率が低く、4Bパラメータと12Bパラメータの効果を比較したところ、翻訳タスクにおいてはgemma3の4Bパラメータで十分だった。12Bパラメータは翻訳タスクにおいて明確な利点を持っていなかった。
12Bパラメータの速度:11.32 tok/sec、4Bパラメータの速度:75.21 tok/sec。
背景説明
システムに様々な条件制限を加えても、出力される翻訳結果には依然として問題が発生することがありました。具体的には、フォーマットの保護が不十分であったり、過剰な説明文が含まれていたりしました。役割定義時には、Markdown形式を保護し、翻訳結果のみを出力することを明示していたにも関わらず、最終的な翻訳は不安定でした。
その時、以前漫画翻訳プロジェクトで大言語モデルを活用した経験が思い出されました。その時の翻訳精度は、私のものより良かったようです。コードやリクエストデータを確認したところ、漫画翻訳プロジェクトでは、毎回リクエストにコンテキスト(文脈)を付与していました。現在の翻訳内容に加え、過去の翻訳内容もまとめて送信していたのです。
このメリットは何でしょうか?前後の翻訳の一貫性を高めるだけでなく、出力フォーマットの安定性を確保することにもつながったと考えられます。
履歴対話の重要性
AI 大規模モデル(GPT シリーズ、Claude、Gemini など)の普及に伴い、ますます多くの企業や開発者が API を通じてこれらのモデルにアクセスし、インテリジェントな顧客サポート、コンテンツ生成、コードアシスタントなどのアプリケーションを構築しています。しかし、多くの方は API への初期導入時に共通の問題に直面します:モデル出力が不整合で文脈理解が欠如しており、場合によっては質問の意図を誤解してしまう。
この現象を引き起こす主要な原因の一つは——API リクエスト中に履歴対話の内容を含めないことです。
履歴対話とは?
履歴対話とは、一度の会話セッションにおいて、モデルとユーザー間の過去のやり取りの記録を指します。OpenAI の Chat Completions API(など、多くの大規模言語モデル API)では、開発者がリクエスト内で完全な messages
配列を作成し、過去の会話をユーザーとアシスタントのメッセージが交互に並んだ形式で渡す必要があります。
例文
{
"model": "gpt-4",
"messages": [
{"role": "user", "content": "退職の手紙を書いてください"},
{"role": "assistant", "content": "かしこまりました。退職理由は何を書くようにしますか?"},
{"role": "user", "content": "個人的なキャリアの追求をしたいと考えていると述べる"}
]
}
もし最後の文だけを送った場合:
{"role": "user", "content": "個人的なキャリアの追求をしたいと考えていると述べる"}
モデルは退職の手紙だと全く認識できず、文脈が理解されないため、出力品質は著しく低下します。
歴史対話がなぜ重要なのか?
1. 文脈の構築と一貫性の向上
AIモデルは本質的に「コンテキスト駆動型」であり、過去の出来事を記憶することはできません。除非你明示的に伝えるのです。対話履歴を渡すことで、モデルはあなたの意図や話題の背景をより良く理解し、期待される出力を生成できます。
2. 誤解の低減
もしあなたがモデルに複数のステップで指示を実行させたい場合(例:文章作成、要約、コードデバッグ)、過去の履歴はモデルが徐々に理解を深め、途中で「逸脱」したり、重要な点を失ったりするのを防ぐのに役立ちます。
3. 実際の人間のような対話行動のシミュレーション
実用例として、カスタマーサポートシステム、教育アシスタント、健康相談などにおいて、ユーザーの質問は通常、段階的に展開され、一度に明確な表現で表明されることはありません。会話履歴を保持することで、AIが「記憶力のあるアシスタント」のように振る舞うことができます。
API 中における会話履歴の正しい追加方法
OpenAI の API を例に、以下の構造に従うことを推奨します。
messages = [
{"role": "system", "content": "あなたは専門的な法律アシスタントです"},
{"role": "user", "content": "契約書の有効条件とは何ですか?"},
{"role": "assistant", "content": "契約書が有効であるためには、以下の条件を満たす必要があります:……"},
{"role": "user", "content": "口頭での合意は有効ですか?"}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages
)
注意点:
system
メッセージを使用してモデルの動作とアイデンティティを設定します。- 最新の数回の重要な会話のみを保持し、毎回すべての履歴を送信する必要はありません(トークン制限を超えないように)。
- 長いセッションでは、早期のコンテンツを切り捨てて、コア情報を要約し、トークンの消費を制御します。
実践的推奨事項
- 対話状態管理: バックエンドは、各ユーザーのセッション履歴(例: Redis、データベース)を記録するためのキャッシュメカニズムを設計する必要があります。
- 長さ制限: OpenAI GPT-4 のコンテキスト長は 128k tokens であり、Claude 3 は 200k~1M पर्यंत可能です。適切なトリミングが必要です。
- 動的履歴の要約: 履歴が長すぎる場合は、モデルを使用して古い会話を要約し、その結果を対話コンテキストに追加します。
まとめ
AI 大規模モデルの能力は強力ですが、開発者に十分なコンテキスト情報を「与える」必要があります。API リクエストに過去の会話を追加することで、モデル出力の品質と一貫性を大幅に向上させるだけでなく、ユーザーエクスペリエンスをより自然で現実的な対話に近づけることができます。AI 顧客サービス、ライティングアシスタント、プログラミングアシスタント、教育アプリケーションなど、どのような分野でも無視できない最適化テクニックです。