「LangChain」の「Agent」「Tool」「Toolkits」の概要をまとめました。
1. Agent
1-1. Agentの概要
「Agent」は、LLMで実行する一連の行動を決定するChainです。通常の「Chain」では一連の行動が (コード内に) ハードコーディングされていますが、「Agent」では「LLM」がどの行動をどの順序で実行するかを決定します。
1-2. Agentのスキーマ
「Agent」との連携を容易にするための「スキーマ」がいくつかあります。
◎ AgentAction
「AgentAction」は、Agentが実行する行動を表すデータクラスです。これには、toolプロパティ (呼び出す必要があるToolの名前) と、tool_inputプロパティ (そのツールへの入力) があります。
◎ AgentFinish
「AgentFinish」は、「Agent」がユーザーに応答を返す準備ができた時の、Agentからの最終結果を表すデータクラスです。 これには、return_valuesプロパティ (エージェントの応答) があります。
◎ Intermediate Steps
「Intermediate Steps」は、過去のAgentの行動と現在のAgentの実行に関する出力を表すデータ形です。Agentが既に行った作業を知るために、将来の反復に渡すことが重要です。これは List[Tuple[AgentAction, Any]] として型付けされます。現在のところ、observation は最大限の柔軟性を持たせるためにAny型のままですが、実際には文字列であることが多いです。
1-3. Agentの入出力
◎ Agentの入力
Agentの入力は、「辞書」です。必要なキーは、intermediate_stepsの1つだけです。これは、上で説明した「Intermediate Steps」に対応します。一般に「PromptTemplate」は、これら辞書をLLMに渡すことができる形式に変換します。
◎ Agentの出力
Agentの出力は、「AgentAction」(次に実行する行動) と「AgentActionリスト」または「AgentFinish」(ユーザーに送信する最終応答) です。「Output Parser」は、生のLLM出力を取得し、これら3つのいずれかに変換します。
1-4. AgentExecutor
「AgentExecutor」は、「Agent」のランタイムです。 これは実際にAgentを呼び出し、Agentが選択した行動を実行し、行動の出力をAgentに返し、これを繰り返します。
擬似コードでは、次のようになります。
next_action = agent.get_action(...)
while next_action != AgentFinish:
observation = run(next_action)
next_action = agent.get_action(..., next_action, observation)
return next_action
これは単純に見えるかもしれませんが、このランタイムは次のような複雑な問題を処理します。
1-5. 組み込みAgent
「組み込みAgent」の一覧は次のとおりです。
詳しくは「Agent Types」を参照してください。
2. Tool
2-1. Toolの概要
「Tool」は、Agentが呼び出すことができる機能です。「Tool」は、次の2つのコンポーネントで構成されます。
「Tool」に関しては、設計上の重要な考慮事項が 2 つあります。
Agentに適切なToolへのアクセスを許可しないと、Agentは指定された目的を達成できなくなります。Toolついてうまく説明しないと、AgentはToolの適切な使用方法がわかりません。
2-2. 組み込みTool
「組み込みTool」の一覧は次のとおりです。
詳しくは「Tools Integrations」を参照してください。
3. Toolkits
3-1. Toolkitsの概要
「Toolkits」は、特定の目的のためにグループ化された3~5 個程度の「Tool」セットです。たとえば、「GitHub Toolkits」には、「GitHub の問題を検索するためのTool」「ファイルを読み取るためのTool」「コメントするためのTool」などが含まれています。
3-2. 組み込みToolkits
「組み込みToolkits」の一覧は次のとおりです。
詳しくは「Toolkits Integrations」を参照してください。