LangChain チームによるこの記事は、LangChain における 構造化ツール を発表するものである。これは、以前の LangChain のツールが単一の文字列を受け取っていたのに対し、任意の型の入力を任意の数だけ受け取れるようにする新しいツールの抽象化である。記事はこの抽象化を、そうしたツールと連携するよう設計された新しいエージェントクラス StructuredChatAgent と組み合わせて紹介している。
記事はこの変更を LangChain のエージェントの歴史の中に位置づけている。初期のツール利用は単純なもので、モデルがツール名と 1 つの入力文字列を生成するだけだったため、エージェントは 1 ターンにつき 1 つのツールしか使えなかった。記事はこの制約の主な原因を、当時のモデルが確実にこなせることの限界に帰している。そして、text-davinci-003、gpt-3.5-turbo、gpt-4 のようなより高性能なモデルがその下限を引き上げたことで、チームがツール利用の制約を見直すきっかけになったとしている。
要点
- 2022 年 11 月に LangChain が公開された時点で、エージェントとツール利用はその設計の中心にあり、チームは ReAct 論文に基づく最初期のチェーンの 1 つを構築した。
- 2023 年の初めに、LangChain はエージェントが 1 ステップで複数のアクションを計画できる「マルチアクション」エージェントフレームワークを導入していた。構造化ツールは、その上に単一文字列入力という制約を取り除くものである。
- 構造化ツールは任意の関数をラップしてエージェントから呼び出せるようにするもので、
name、description、args_schema(どの入力が必要かをエージェントに伝えるとともに、実行前にその入力を検証する Pydantic のBaseModel)、そしてツールのロジックを保持する_run/_arun関数によって定義される。 - 記事は、ツールの名前はそれが何をするのかを曖昧さなく伝えるべきだと助言している — 「ツールの名前があなたにとって明確でないなら、おそらくエージェントにとっても明確ではない」 — また、名前によってツール同士の関係を示唆することもできるとしている。
StructuredTool.from_function()は呼び出し可能オブジェクトからツールを構築し、関数のシグネチャからargs_schemaを推論する。BaseToolをサブクラス化すれば、定義をより細かく制御できる。- 新しいクラスに基づく 2 つのツールキットが新たにリリースされた。ファイル管理(書き込み、grep、移動、コピー、ディレクトリの一覧表示、検索)と、Web サイトの訪問、クリック、フォームの送信、データの問い合わせを行うための、状態を持つ PlayWright ブラウザツールキットである。
- 複数の引数を持つ構造化ツールは、カスタマイズなしでは LangChain の以前のエージェントタイプでは動作しない。一方、単一の文字列を受け取るツールは既存のエージェントでも引き続き動作し、従来の文字列ツールも新しいエージェントで動作する。
背景
この記事はベンダー自身による機能発表であり、以前のツールが単一の文字列に限られていた理由 — 当時のモデルの制約 — についての説明はチーム自身によるものである。