最近githubでlangchainについて色々勉強しました。特にlangchainにおいて最も重要な"Agent"の内容について中身を理解しましたので、それを共有したいと思います。
まずlangchainは、LLMのために開発されたフレームワークです。(イメージとしては、ディープラーニングためのPyTorchやTensorFlowといった関係に近いです。)
langchainには主に以下の6つのモジュールがあり、"Agent"はこれらの中で最もコアな機能です。
①Agentとは
"Agent"はモデルに意思決定の機能を与えるものです。具体的に言うと、モデルが状況によって、適切なAPIやツールを活用して問題を解決する能力を提供します。
Agentを活用すればLLMが持っている多くの弱みを克服できます。
例えば、LLMは学習データに含まれていない情報に対しては適切に回答することができず、誤った情報を提供する(幻覚問題とも呼ばれる)傾向がありますが、Agentなら解決できます。
APIを使って、自分でインターネットに接続し、必要な情報を検索すれば、学習されたことない情報に関する問題にも対処できるようになりますね。
さらに、どのような状況でローカルのデータセットを利用して検索するか、どのような状況でインターネットを使うべきかまでも全部「Agent」が考えて作業します。
②ReActについて
langchainにはいくつかのAgentが用意されてます。(Agentより「モデルの考え方」に近いです。)
最もシンプルなAgentはReActです。
ReActはReasoning+Actingの略語で、もう少し具体的に分けると「思考+行動+観察」の三段階になります。
③ReActの例
下の例を見るとわかりやすく理解できると思います。
例えば、「現在アメリカのバラの平均価格に15%を上乗せして販売したいならいくらにするべきか?」という質問をAgentに投げたら、Agentは以下のような流れで処理しました。(verboseというパラメーターをTrueにすれば、LLMがどのように問題を処理しているかの流れが表示されます。)
まず「思考」段階で、「現在アメリカのバラの平均価格はいくらなのか」を先に考えます、それに対してLLMは学習データにその情報がないため、調査が必要だと判断します。
次に、「行動」としてインターネットでの検索を行います(ネットにつなげるchain (serpapi.com)を呼び出して探しに行きます)。
その後、「観察」段階でインターネット検索の結果を確認します。そして再度「思考」に戻り、平均価格が判明したので、次の「行動」として「平均価格に15%を上乗せする」という計算が必要であると理解します。
この計算を行うために計算用の「chain」(計算機能を提供するAPI)を呼び出して計算します。(80.16*1.15)
最終的な計算結果を「観察」した後、「思考」を経て「最終的な答えを得た」という結果に至ります。そして、「求めていた結果を得られたので、ここで作業を終了する」として処理を終了します。
このようにLLMが意思決定できるのは、「AgentExecutor」と呼ばれるプロンプトの集まりのような関数を通じて実現されています。
AgentExecutorの詳細についてさらに理解を深めたい場合は、langchainの「agent.py」における「AgentExecutor」関数の中身をデバッグすればわかります。
④他のAgent
ReAct以外にも他のAgentがあります。
例えば、Structured Tool Chat(複数の外部ツールAPIを組み合わせて使う)、Self-Ask with Search(自分の回答に対して質問をして、それに再び答えるというプロセスを繰り返す)、Plan and execute(マルチAgent)などがあります。
"Plan and execute"は今一番注目されてるマルチエージェントです。普通のAgentとの違いは"思考"(Plan)と"行動"(execute)をそれぞれ違うLLMに任せることです。(処理時間は長くなりますが、より複雑な問題も回答できます)
ReActについて:
マルチエージェント(Plan and execute)を最初に提出した論文:
END