LangChain は、大規模言語モデルを利用する柔軟なアプリケーションを構築するためのツール群を提供するオープンソースライブラリである。LangChain は「チェーン」(プラグインとも呼ばれる)と「エージェント」を定義する。これらはユーザー入力を受け取り、通常は開発者が用意したプロンプトと組み合わせてモデルに渡し、そのモデルの出力を使ってさらなるアクション(オンラインでの調べもの、データベースの検索、問題を解くためのプログラムの構築など)を引き起こす。
ここでの記述の一部はプロジェクト自身のドキュメントではなくセキュリティ分析に基づき、一部は LangChain 自身のブログに基づいている。セキュリティ分析は、重要だとする三者の区別を設けている。すなわち、チェーンやエージェントを構築し、それらをサードパーティ API につなぐためのツールを提供するコアライブラリ、それを使って構築されたチェーンとエージェント、そしてそれらがアクセスするサードパーティの API やツールである。
機能
- チェーンとエージェントはユーザーとモデルの仲介役として働く。プロンプトテンプレートがユーザー入力を LLM へのリクエストに変換し、その結果が外部サービスへの呼び出しとして解釈され、最後のステップ(多くの場合、再びモデルを使う)が返ってきた内容を整形する。
- このライブラリは LLM を外部のデータソースや計算資源につなぐものであり、分析はこれがそうしたアプリケーションに絶大な力と柔軟性をもたらすと述べている。
- 2023 年 5 月、LangChain は 構造化ツール で発表された 構造化ツールを導入した。これは名前、説明、Pydantic の引数スキーマ、そしてそれを実行する関数によって定義され、任意の数の型付き入力をとるツールであり、それ以前のツールは単一の文字列を入力としていた。これを利用する新しい
StructuredChatAgentがリリースされ、あわせて新しいクラスの上に構築されたファイル管理用と PlayWright ブラウザ用のツールキットも公開された。 - 2024 年 4 月、モデルプロバイダー各社が互換性のないインターフェースでネイティブのツール呼び出しを提供するようになるなか、LangChain はそれらを横断する標準インターフェースを追加し、LangChain によるツール呼び出し で発表した。ツール定義(生の辞書、Pydantic クラス、LangChain のツール、または通常の関数)を任意のツール呼び出し対応モデルに付与する
ChatModel.bind_tools()、モデルによるツール呼び出しを単一の形式で読み取るAIMessage.tool_calls、そしてこの両方を実装する任意のモデル上にエージェントを構築するcreate_tool_calling_agent()である。with_structured_output()インターフェースは、ツール呼び出しをサポートするほとんどのモデルでツール呼び出しの上に構築されている。 - LangChain 1.0 はエージェントの抽象化として エージェントミドルウェアを導入し、エージェントミドルウェア で発表した。中核となるループは引き続きモデルノードとツールノードからなる。ミドルウェアは、モデル呼び出しの前(
before_model)、その後(after_model)、あるいは 1 回のリクエストのツール、プロンプト、メッセージ、モデル、設定、出力形式、ツール選択を変更すること(modify_model_request)によって処理に介入する。複数のミドルウェアは、入りの方向では順に、出の方向では逆順に実行される。チームはこれを 1.0 における最大の新要素と呼んでいる。 - アルファ版には 3 つのミドルウェア実装が同梱された。ツール呼び出しに対するヒューマン・イン・ザ・ループのレビュー、長いメッセージ履歴の要約、そして Anthropic のプロンプトキャッシュである。チームはこれらをすでに社内のエージェントで使っていたと述べ、さらにミドルウェアによって、それまで個別の LangGraph エージェントとして提供していた supervisor、swarm、bigtool、deepagents、reflection の各アーキテクチャを再現できるとしている。
- 同じ記事は、ミドルウェアをエージェントのカスタマイズの長い系譜の到達点として位置づけている。LangChain にはほぼ 3 年にわたってエージェントの抽象化があり、モデル・プロンプト・ツールからなるループの一形態は 2022 年 11 月にはすでに存在していた。そしてそれまでの 2 年間で、ランタイム設定、カスタムの状態スキーマ、動的プロンプト、メッセージリストの完全な制御、モデル呼び出し前後のフック、呼び出しごとのモデル選択をエージェントのパラメータとして追加してきた。記事によれば、このアプローチは相互に依存するパラメータを増やしすぎ、それらの調整が困難になったという。
セキュリティの歴史
NVIDIA AI Red Team は LangChain のチェーンに 3 つの脆弱性を特定・検証した。いずれも プロンプトインジェクションを通じて到達可能であり、いずれも上述のパターンを共有している。すなわち、攻撃者がモデルの出力を制御し、それによってチェーンが外部サービスに送る内容を制御する。llm_math チェーンは Python インタプリタを通じたリモートコード実行を許していた(CVE-2023-29374、CVSS 9.8)が、これはバージョン 0.0.141 の時点で修正されている。APIChain.from_llm_and_api_docs はサーバーサイドリクエストフォージェリ(CVE-2023-32786)を、SQLDatabaseChain は SQL インジェクション(CVE-2023-32785)を許しており、この 2 つは執筆時点でバージョン 0.0.193 まで(同バージョンを含む)依然として悪用可能であると報告された。
分析は、これらが影響するのは特定のチェーンであってコアエンジンではないと明言しており、影響を受けるチェーンは主にライブラリの能力を示すサンプルとして提供されていたものだと述べている。当時の最新バージョンではそれらがコアライブラリから削除されていたこと、古いバージョンからは引き続きインポート可能であったことを報告し、ユーザーにアップデートを促している。最初の公開は 2023 年 1 月にサードパーティが LangChain の GitHub issue を通じて行ったもので、翌月にさらに 2 件の公開があり、2023 年 3 月末に NVIDIA が CVE を申請したと記録している。残る 2 件は 2023 年 4 月に公開され、LangChain チームの承認のもとで発表された。分析の結びの謝辞では同チームの協力に感謝し、このやりとりを新しい領域における協調的な脆弱性開示の良い手本だと評している。
採用とエコシステム
Harrison Chase は LangChain のブログ記事 エージェントフレームワーク、ランタイム、ハーネス――なんてこった! において、LangChain を エージェントフレームワーク、つまり主な価値がその抽象化にあるパッケージに分類し、エージェントランタイムと呼ぶ LangGraph や、エージェントハーネスである Deep Agents と対比している。彼は LangChain と LangGraph を LangChain 社が保守するオープンソースパッケージのなかで最大のものとして挙げ、LangChain 1.0 はそのランタイムを使うために LangGraph の上に構築されていること、そして 1.0 の作業は構造化コンテンツブロック、エージェントループ、ミドルウェアのための抽象化に注がれたことを述べている。Deep Agents は、さらにその LangChain の上に構築されている。
LangChain 自身による初期の歴史の説明では、エージェントは当初から中心に置かれていた。2022 年 11 月のローンチ時点で、エージェントとツール利用はその設計において中心的な役割を果たしており、チームは ReAct 論文に基づく最初期のチェーンの 1 つを構築したと述べている(ReAct を参照)。当時のツール利用は 1 ターンにつき 1 つのツール、単一の文字列入力に限られており、チームはこれを当時のモデルが確実にこなせたことの限界によるものとしている。そして、より高性能なモデルの登場が、まず 2023 年初頭の「マルチアクション」エージェントフレームワークを、次いで構造化ツールを生み出すきっかけになったとしている。
これらの脆弱性は、このライブラリ特有の欠陥としてではなく、一般的なパターンを示すものとして提示されている。モデルの出力を使って外部サービスへの呼び出しを組み立てる設計はどれも同じリスクを抱えることになり、分析はこれを 制御プレーンとデータプレーンの混同に帰している。独自のチェーンを書く開発者への推奨は、すべてのモデル出力を潜在的に悪意あるものとして扱い、テンプレートと外部呼び出しをパラメータ化し、プロンプトに寄与するエンティティ全体に最小権限を適用することである。