LangChainのモジュール「Agents」

大嶋勇樹氏:最後に、一番おもしろいモジュールであるAgentsを見ていこうと思います。質問をまあまあもらっていますが、最後までいってから回答できればと思います。最後に、一番おもしろいのがこのAgentsです。

まずAgentsのモチベーションですが、Indexesを使ってVector Storeを検索する以外にも、LLMが必要に応じていろいろなことをしてくれたら夢が広がると思います。

例えば、必要に応じて知らない知識だったらGoogleで検索してくれるとか。例えば「この環境について知りたい」みたいな状況だったら、Bashでコマンドを実行してくれるとか、Pythonのスクリプトを実行してくれるとかしてくれたら、本当に夢が広がるんじゃないかと思います。そこで登場するのがAgentsというものになります。

Agentsを使うとLLMがいろいろなツールを選択して使いながら動作します。実際にはLLMがツールを使うわけじゃないんですが、まるでLLMがツールを使うかのように動きます。例えばBash、Google Search、IFTTT、Python、PythonのRequestsとか、Wikipedia APIなど、いろいろなものを使いながらLLMが課題を解決してくれます。

「Agents」を使用したデモ

Agentsを使う例を実際にやってみようと思います。すごく短い例ですが、これをやってみます。

まずコードを見ようと思いますが、モデル、text-davinci-003を用意して、load_toolsというものでterminalというツールを用意しています。このterminalはいわゆるBash、コマンドを打てるツールですね。これを設定したagent_executorを作り、それをrun(させます)。

その時に「現在のディレクトリにあるファイルの一覧を教えてください」としてrunを実行します。すると、LLMは本来僕の今いるディレクトリにどんなファイルがあるかなんて知らないはずなんですが、このツールを使ってちゃんと答えてくれます。

poetry run python...。これを実行します。

verboseに出力するようになっているので中の動きもちょっと見えるんですが、いろいろやります。(画面を示して)最終結果はこれですね。ちゃんとこのディレクトリにあるものを答えてくれているんですね。

一時期ChatGPTにlsとかそういうコマンドを実行させるようなことがちょっと流行ったというか、「コマンドを実行したらどうなると思いますか?」みたいに妄想させることが流行ったことがあると思うんですが、これは妄想させているわけじゃなくて、ディレクトリにあるものを表示しているんですね。APIの応答としてこれが返ってきています。

なぜLLMがlsコマンドを実行した結果を返せるのかを見ていこうと思います。

「Agents」を動かすプロンプト「MRKL」「ReAct」

このAgentsは「MRKL」や「ReAct」といった仕組みのプロンプトで動いています。MRKLは“ミラクル”と読むらしいですね。中の細かい紹介まではできませんが、こういった仕組みで動いています。

どんな動きか見ていこうと思います。まずはLLMを呼び出します。「Answer the following questions as best you can. You have access to the following tools:」ということで、「下のほうにある質問にできるだけベストな回答をしてね」と(渡します)。

「次に続くツールが使えますよ」ということでツールを紹介しています。これはツールとしてコードで設定したものですね。「『Terminal』という名前で、コマンドを実行できるツールです」という説明が書いてあります。

そして「LLMに求めるフォーマットはこうしてください」ということが書いてあります。例えば「Question:」と来たら「ここに質問があります」と。「Thought:」と来たら「ここにあなたの考え、AIの考えを書いてください」と。ポイントは、「Action:」と書いて「使うツールの名前を書いてください」、「Action Input:」の箇所に、「使うツールの引数を書いてくださいみたい」なことが書いてあるんですね。

そして続きの説明がいろいろあって、最後に「Question: 」。現在のディレクトリにあるファイルの一覧を教えてください。「Thought:」。考えてね。これをAPIに投げます。

すると、LLMは「I need to find a command that will list the files in the current directory」、つまりカレントディレクトリにあるファイルをリストアップするコマンドを見つける必要がある。「Action: Terminal」「Action Input: ls」、こんな応答を返してくるんですね。

LangChainのAgentsはこの応答からActionとAction Inputを抽出して実行します。ソースコードを見ると無理矢理に正規表現で抽出しているんですが、これを抽出してTerminal、lsと来たからBashでlsを実行するんだなとLangChainのAgentsが判断して実行します。

LangChainのAgentsはそれを実行できるので、実行した結果を先ほどまでのプロンプトの下のほうに入れて、またLLMのAPIを叩きます。

すると今度LLMは、「I now know the final answer」「最終的な回答がわかった、ファイナルアンサーはこれだ」という回答をくれるんですね。これに対してLangChainのAgentsは、「Final Answer:」の箇所を抜き出して、こんなふうに表示してくれます。

Agentsを応用するとLLMで実現できることは大きく広がる

ということで、Agentsはややこしいことをしているわりにちょっと駆け足で来ちゃいましたが、MRKLやReActといったプロンプトの仕組みを実装したAgentsを使うことで、LLMとの対話にとどまらず、LLMにアクションを起こさせることができたわけですね。このAgentsを応用すると、LLMで実現できることは本当に大きく広がると思います。

ちなみに、LangChainには「Human as a tool」という人間を使うツールも提供されていて、なかなかおもしろいなと。「Human are AGI so they can certainly be……」、人間はAGIなのでAIが困った時に助けてくれますよ、と。AGIは汎用人工知能ですね。人間が人工かはちょっと置いておいて、こんなツールも提供されていてなかなかおもしろいですね。

LangChainの概念を理解するならプロンプトエンジニアリングがポイント

というところで駆け足ではありますが、ひととおりLangChainの主な概念を紹介したので、最後にちょっとまとめさせていただきます。

今日の勉強会、大変駆け足ではありましたが、LangChainに登場する基本的な概念を整理してきました。LangChainに登場する概念を理解するには、中で行われているプロンプトエンジニアリングがポイントだと思います。プロンプトエンジニアリングの手法自体も、本当にいろいろあると思いますが、調べていくとけっこうおもしろいですね。

LangChain自体は簡単に触ることができます。インストールはpip installだけです。ぜひ触ってみてもらえればと思います。