エージェントは、状況に応じて次の処理を選ぶ
この教材で扱うエージェントは、モデルが利用可能なツールを選び、その結果を受けて、さらに処理するか回答するかを判断する構成です。単に質問へ文章を返す場合よりも、途中の選択が増えます。「自律的」という言葉で紹介されることがありますが、どんな権限でも自由に持つという意味ではありません。
たとえば「出張の精算が済んでいなければ、必要な手続きを教えて」という依頼では、本人の申請状況を確認し、未完了なら関連する規程を検索し、その結果を説明する流れが考えられます。状況によって不要な検索を省いたり、追加で調べたりする判断を、モデルに任せることができます。
create_agentが組み立てる基本のループ
LangChainのcreate_agentは、モデル、ツール、回答方針などを受け取り、エージェントの基本的な処理を組み立てる入口です。モデルを呼ぶ、ツールの要求があれば実行する、結果をモデルへ返す、という往復を構成します。状態や実行には、LangGraphの基盤が使われています。
利用者の質問は、まずモデルへ渡ります。モデルがツールを要求すれば、アプリケーション側の処理がそれを実行し、結果を返します。次のモデル呼び出しでは、その結果を踏まえて、別のツールを使うか、最終的な回答を返すかを判断します。必ず一回だけツールを呼ぶわけでも、必ずツールを使うわけでもありません。
このループの周囲には、ツールの実行制御、入力の構成、記録、上限などの仕組みがあります。モデルの生成能力と、それを仕事として動かす周囲の仕組みを合わせて考えることが、エージェントを理解するポイントです。
一度だけ規程を検索して回答する場合でも、内部では「モデルの一回目の呼び出しで検索を要求する」「検索ツールが結果を返す」「モデルの二回目の呼び出しで回答を作る」という流れになることがあります。利用者には一つの回答として見えても、モデル呼び出しは二回、ツール実行は一回です。
検索結果を見て追加の検索が必要と判断すれば、さらに往復が増えます。反対に、利用者が挨拶をしただけなら、ツールを使わず回答して終わる場合もあります。回数は、利用者の発言数だけからは決まりません。
第6節のChainでは、部品をつなぐ順序を開発者が決めました。エージェントでは、モデルへ利用可能なツールを示し、途中でどれを要求するかを選ばせます。入力から結果へ進む途中の選択を、どこまでモデルへ任せるかが違います。
決まった手順との使い分け
あらかじめ定めた手順に沿って進める構成を、workflow(ワークフロー)と呼びます。毎回「規程を検索して、その結果から回答する」と決まっているなら、固定したworkflowで十分な場合があります。固定した流れは、どの処理が行われるかを予想しやすく、品質や費用も比較しやすくなります。
固定した手順にも、条件による分岐はあります。たとえば「検索結果が空なら不足を伝え、あれば回答する」というルールを開発者が決める方法です。分岐があることだけでエージェントになるわけではなく、次の処理の選択にモデルの判断を使うかが、ここで比べている違いです。
一方、質問によって必要な情報源が変わる、途中の結果を見て追加の照会を判断したい、といった場合は、エージェントの柔軟性が役立ちます。その分、経路が毎回同じとは限らず、呼び出し回数や時間のばらつきも増えます。高度な機能に見えるから選ぶのではなく、途中の判断をモデルへ任せる必要があるかで選びます。
補足:ReActという言葉を見かけたら
ReActは、状況についての判断と行動を往復するエージェントの考え方です。LangChainのエージェントを理解する際は、まず「モデルの要求→ツールの実行→結果を受けた次の判断」という往復を押さえます。実際の動作は、ツール名・引数・結果・最終回答で確認でき、モデルの内面を推測して説明する必要はありません。
最終回答を、項目として受け取る場合
エージェントの最終回答にも、第5節の構造化出力を適用できます。たとえば途中で規程を検索し、最後に「回答」「出典」「追加確認が必要か」という項目へ整理する構成です。途中で使うツールと、最後に受け取るデータの形は、役割が異なります。
補足:エージェントの出力設定の名前
create_agentのresponse_formatは、最終出力のスキーマを指定する入口です。得られた構造化データは、結果の状態にあるstructured_responseという項目で受け取れます。第5節のモデル単体に対するwith_structured_outputとは、使う入口が異なります。名前よりも、モデル単体の応答とエージェント全体の最終結果を分ける点を理解してください。
終了条件は、仕事の成功と同じではない
モデルがこれ以上ツールを要求せず、回答を返すと、ループは通常の終了へ進みます。しかし、回答を返したことだけで、依頼した仕事が正しく完了したとは言えません。検索に失敗したのに一般論で答えた場合や、必要な条件を確認し忘れた場合も、文章は返せるためです。
また、処理回数や時間の上限に達して止める場合もあります。これは、正常な完了とは別の結果です。「必要な情報を取得できた」「利用者へ説明できた」「上限で止まった」といった状態を分けることで、停止を成功として扱う誤りを防げます。
柔軟性を使う範囲を決める
エージェントには、利用可能なツール、モデルやツールの呼び出し上限、再試行、出力形式などを設計します。一回の利用者の質問でも、モデルを数回呼ぶことがあり、ツール自体の外部通信が加わる場合もあります。生成の回数と外部処理の回数を分けて把握すると、費用や遅延を説明しやすくなります。
自由に判断できる部分と、必ず守る手順を組み合わせたい場合は、標準のエージェントループの外側にも処理を構成します。次の節では、その実行経路と状態を明示するためのLangGraphを紹介します。