モデル・メッセージ・プロンプトの関係

前の節では、APIを通してモデルへ入力を送り、結果を受け取る流れを学びました。この節では、その入力と結果をLangChainで扱うための部品を整理します。

モデルは応答を生成する部品で、メッセージはモデルとやり取りする情報の単位です。プロンプトは、モデルへ渡す指示や文脈を含む入力の構成を指します。これらを区別すると、「モデルを選ぶこと」と「どの情報を渡すかを決めること」を別々に考えられます。

LangChainでは、init_chat_modelなどを通して会話モデルを用意し、invokeで入力を渡して応答を受け取れます。ここでモデルを用意するとは、学習を一から行うことではなく、既存のモデルを呼び出すための部品を設定することです。接続先は外部APIの場合も、ローカルのモデル提供サービスの場合もあります。

等幅の文字で示した名前は、LangChainの部品や操作を指す目印です。init_chat_modelは「使うモデルを準備する」、invokeは「入力を渡して実行する」と読めば、Pythonを知らなくても説明を追えます。会話モデルは、役割付きのメッセージを受け取って応答するモデルです。この教材では、名前の綴りの暗記より、準備と実行の違いを押さえます。

メッセージには内容だけでなく役割がある

会話の入力は、単に文章を連結したものとしてではなく、役割付きのメッセージとして表現できます。代表的な役割は、全体の振る舞いを示すsystem、利用者の発言を示すhumanまたはuser、モデルの応答を示すaiまたはassistantです。ツールから返った情報は、toolの役割で扱います。

LangChainには、方針を表すSystemMessage、利用者の発言を表すHumanMessage、モデルの応答を表すAIMessage、ツールの結果を表すToolMessageなどがあります。同じ「交通費」という文字が含まれていても、それが利用者の質問なのか、資料の一部なのか、ツールが返した結果なのかで意味が異なります。役割を保つことは、その区別をモデルへ伝えるために役立ちます。

systemに書いた方針も、アクセス権限を強制するプログラムそのものではありません。「社外秘を答えない」と指示するだけで機密保護が完成するわけではなく、そもそも見せてよい資料だけを渡す制御が別途必要です。

プロンプトは、方針と今回の入力を整理する

社内規程の案内なら、共通の方針は「提示した資料の範囲で答える」「根拠がなければ不明と伝える」、今回の入力は「出張の交通費はどう申請するか」という質問です。これらを一つの長い文章に混在させるより、共通の方針と毎回変わる内容を分けて構成すると、どこを変更したかが明確になります。

ChatPromptTemplateは、役割付きメッセージや差し込む値を、再利用できるひな型として表す部品です。「質問」という差し込み先へ今回の質問を入れ、「参考資料」という差し込み先へ検索した文章を入れる、といった組み立てに使います。ひな型を作ること自体は、モデルへの送信や生成ではありません。

ひな型の目的は、指示を長くすることではなく、入力の構造を一定にすることです。同じ仕事の質問でも、あるときだけ根拠資料を渡し忘れる、回答形式の指示が抜ける、といったばらつきを減らせます。ただし、ひな型へ入れる情報が誤っていれば、その誤りまで修正してくれるわけではありません。

入力の構成を、文章で示すと次のようになります。これは仕組みを説明するための例で、実際のAPIへ送信した記録ではありません。

入力の役割内容の例
共通の方針提示した資料だけを根拠に、申請方法を説明する。確認できない条件は不明と伝える。
今回の資料検索で取得した規程の本文と、その出典。
今回の質問日帰り出張の交通費は、どのように申請しますか。

質問だけを変えても、回答方針と資料の受け渡し方をそろえられることが、ひな型を使う意味です。資料の内容を変更すること、方針を変更すること、モデルを変更することは、それぞれ異なる変更として比較できます。

応答は文章以外の情報も持つ

会話モデルから返るAIMessageには、生成した本文に加え、ツールの要求や利用量などが含まれる場合があります。本文は常に単純な文字列とは限らず、画像などを含む形式では複数の内容ブロックになることもあります。画面へ表示する文章と、処理に必要な元のメッセージを分けて扱うことが大切です。

とくにツールを使う会話では、応答を文章だけにして保存すると、要求のIDや付随情報が失われることがあります。IDは、対象を識別するための番号や文字列です。LangChainのメッセージを使う意味は、見える文章だけでなく、モデルとのやり取りに必要な構造を保つことにもあります。

設定の変更と、指示の変更は分けて考える

モデルには、出力の長さや生成の変動に関する設定があり、利用できる項目は接続先によって異なります。一方、プロンプトは、何を答えるか、何を根拠にするか、どの形で返すかという仕事の条件を伝えます。長さの上限を変えることと、要約の観点を変えることは、別の操作です。

思った応答にならない場合は、「必要な情報が入力に入っているか」「指示が曖昧でないか」「選んだモデルが必要な機能に対応しているか」を順に考えます。次の節では、自然な文章として受け取るだけでなく、アプリケーションが使える項目として結果を受け取る方法を説明します。