「LangChain」と「LlamaIndex」の違い

布留川英一氏:OpenAIの新機能を話したので、次にLangChain 0.1とLlamaIndex 0.10について話そうかと思います。今回のOpenAI本にはこのLangChainとLlamaIndex(の話題)は入れませんでした。その1個前の本にはLangChainとLlamaIndexは入っていたんですが、今回の本には入れられませんでした。

年末ぐらいにLangChainとLlamaIndexの大規模アップデートがありました。より実用的なLLMアプリケーションを作るために大規模アップデートがあったので、本に載せるにはちょっと危ないかなと思って、今回はスルーしていました。

その大規模アップデートが、1月、2月ぐらいで両方とも完了したということで、これからどんどん使っていくのがいいかと思います。ということで、どんな感じのアップデートをしたかを解説していきます。

「LangChainとLlamaIndexはどっちを使うのがいいの?」とよく聞かれたりします。自分が説明する際は、「LangChainは主にAIエージェントを開発するためのフレームワーク。LlamaIndexはRAGを作るためのフレームワーク」みたいな感じで解説しています。中の人が「どっちのほうを作ろう」という感じで重点を置いているのがLangChainがAIエージェント、LlamaIndexがRAGになります。

ただもちろん、LangChainでもAIエージェントの中でRAGの機能を持っていたり、LlamaIndexがRAGの中でAIエージェントを持っていたりするので、両方ともけっこう持っていたりします。重視している機能がLangChainはAIエージェント、LlamaIndexはRAGなので、設計の方針も若干変わってきます。

LangChainとLlamaIndexはLLMアプリを構築するフレームワークとしてもすごく重要で、LLMアプリの未来を考えるコミュニティとしても、自分的にはすごく重要視しています。

中でも「これからどうしていこう?」みたいな会話とかを見ていくと、これからAIエージェントがどうなっていくのかとかを見ることができます。この2つは、すごく熱い議論が交わされていて、いつもかなり熱のある感じでコミュニティが動いているので、すごく注目しています。

LangChain 0.1で変わったこと

LangChain 0.1で一番大きく変わったのは、このLangChainというものが、「langchain-core」と「langchain-community」と「langchain」の3つのパッケージに分離したことです。

今までのLangChainで実運用のアプリをやるには難しいなと思っていたところは、とにかく毎日のようにバージョンアップして、いつの間にか動かなくなったりするということがけっこう起こっていたからでした。

LangChainの中にあるさまざまな機能が1つのパッケージに入っているので、それがお互いに影響し合ってしまって、実運用なんだけど動かなくなるというような困ったことが起きていたので、そのあたりの依存関係を全部分離することになっています。これを分離したことによって、langchain-coreという一番コア部分の機能だけを使って、上のほうは自分で実装して実アプリケーションに使うとか。

langchain-communityという、ほかのcommunityの部分と、langchain-coreのアセットだけを使って作るみたいな。そういう実運用アプリケーションに向けて、自分が必要なところだけを使って実装できるので、変な依存関係で動かなくなることがなくなりました。 あと、パッケージもサイズがすごくデカくなっていたものを、自分が使うパッケージだけを選んで使うので、その問題もなくなっています。

もう1つは、少し前からあったんですが、LCEL(LangChain Expression Language)と「LangGraph」という2つの機能が本格的に導入されています。

LangChain Expression Languageのほうは、前のバージョンではChainクラスで実装していたんですが、書きやすいフォーマットで書くための言語で、よりスマートに書くことができる言語になっています。

さらにLCELだけだとループするようなチェーンの流れが作れなかったのが、LangGraphでやるとネットワーク型のループするようなグラフも作れるということで。このあたりを本格的に導入したことによって、より実用的なアプリケーションが作れるようになっています。

LangChainの0.の「認知アーキテクチャ」という考え方

そして、LangChainの0.1で一番重要だと思うのが、認知アーキテクチャという考え方です。LangChainのLLMアプリケーションで、昔のAIエージェントの考え方は、なにかをAIに要求すると何をするかをAIが全部考えて実行して、ちゃんと完了したと思ったら答えを返すという感じで、何をするかはすべてAIに決めさせるみたいな、かなり自由なアプリケーションだったんです。

ただ、実運用のアプリケーションを自由にさせてしまうと成功率も低くなってしまうということで、ステートマシン的な設計にして、ステートマシンの「どんな順番で移動していいか?」とか「どのステートからどのステートへ行けばいいか?」ということを、ある程度人間のほうでルールを決めてしまう。AIには「ここを選んでね」というところだけを決めるみたいな(かたちにする)。

つまり、完全に自由じゃなくても、仕事のワークフローを決めて、その中で最善を尽くす感じのLLMアプリケーションを作るみたいな。そういう考え方をして、そのワークフローを作るためのいろいろな設定をする言語が、先ほど言ったLCELとLangGraphになります。

ちょっと自由度が低くなるように見えますが、人間的には「ここだけを決めてね」みたいなものを決められるので、実運用アプリケーションでは、このような仕組みがすごく求められると思っています。

LlamaIndex 0.10で変わったこと

次に、LlamaIndexの0.10。LlamaIndexのほうもLangChainと同様に、パッケージの分離が行われました。「llama-index-core」と個別の「Integration」に分離したということで、今までは全部一緒にやって、データローダーだけを「LlamaHub」で管理していたんですが、LlamaIndex 0.10からは、データローダーだけじゃなくてLLMとかVector Storeとか、すべてのものがIntegrationという部品に分離して、分離した部品を全部LlamaHubで管理するような仕組みになりました。すべてバラバラにして、LlamaHubから部品を拾ってきて、langchain-coreの上でいろいろつなぐみたいな仕組みになっています。

これによってLangChainと同じように、パッケージは小さく、実運用で動かすには依存関係が少ないので、急に動かなくなるということもないみたいな、いい感じになっています。

あと、ちょっと前まで使っていた人からすると、ServiceContextがなくなったのはすごく大きなことです。実際、ServiceContextは使わず、Settingsに設定すればよくなったので、意外と対応は簡単で、さらに使いやすくなっているので、書き換えは必要ですが、かなりお手軽に移行できて、管理もだいぶ簡単になりました。

LlamaIndexのほうで重視しているのはRAGなので、「Gemini」に登場したロングコンテキストLLMという、すごく長いコンテキストが入るLLMがあるんですが、それによってRAGの新アーキテクチャを変えなくちゃいけないということが、最近すごく話題になっています。「長いコンテキストがあるからRAGは要らないんじゃないか?」というのがTwitter(現X)上で話題になっていました。

実際には本1冊分のRAGを作るのには要らなくなったという話で、会社のいろいろなファイルシステムを全部RAGにするという場合にはどっちみちGeminiぐらいの長いコンテキストでも入らないので、RAGはそういうものに使われるだろうというような感じです。長いコンテキストを使ったRAGでどうやると管理ができるかみたいな、そういうアーキテクチャを最近いろいろ試行錯誤して、考えてやろうとしています。

今までのRAGだと、1冊の本から何ページか破って持ってきて、見て、それで質問に答えるという感じだったので、質問の回答の正解率がけっこう低かったんですが、本棚から本を2、3冊取ってきて、そこから答えを返すみたいなことができるので、今後は正解率がだいぶ上がるんじゃないかなと思っています。

そのためには、今までと違う部分をいろいろチューニングしなくちゃいけないということで、逆に今までと違ったノウハウが必要になってくるかと思います。

(次回につづく)