📘

Langchainを使ったAIチャットシステム開発

2024/03/20に公開

背景

とあるお仕事でOpenAI APIを使ったAIチャットシステム開発をしました。

この手のAIチャットシステムを作る際に欠かせないのが『Langchain』というライブラリなのですが、
このライブラリの概念理解に少々手こずったため、概念的な部分を共有できればと思います。

Langchainの概要

一旦公式の説明を載せます

LangChain は、言語モデルを利用してアプリケーションを開発するためのフレームワークです。
これにより、次のようなアプリケーションが可能になります。

- コンテキストを認識する: 言語モデルをコンテキストのソース
(プロンプトな指示、いくつかのショットの例、応答の基礎となるコンテンツなど) に接続します。

- 理由: 言語モデルに基づいて推論します 
(提供されたコンテキストに基づいて回答する方法、実行するアクションなど)。

あまりピンときませんね...

特に『言語モデルに基づいて推論します 』という表現は、あたかもLangchainがLLM/AIとしての機能を持っているかのように受け取れそうです
(初見の私はそのように理解してしまいました)

現在の私の理解としては**『OpenAI等のLLMモデルとのコミュニケーションをスムーズに行ってくれるライブラリ』** です。

Langchainを使って何が嬉しいか

LangchainではLLMを意図通りに動かすためのプロンプトのテンプレートが提供されているため、そちらを使うことができます。
(プロンプトの中身は一部こちらで参照可能)

プロンプトには一定の技術が必要ですが、Langchainやそのコミュニティ側でテンプレートを作ってくれているのでかなり便利ですね。

また、agentと呼ばれるコンセプトがあり、こちらを使うことで外部ツールを自動で使ってくれたり、ブラウザから期待するデータを取得できない場合に自動で再取得してくれる、といった処理を実現することが可能になります。
(おそらくagentの内部では、質の高いプロンプトや、LLMへのAPIcall時のパラメータ制御を行、LLMとうまくコミュニケーションしてくれている)

agentは外部ツールと連携したチャットサービスやRAGを構築する上で必須の概念かなと思います。

(別途Toolという概念もありますが、今回は説明を省きます。簡単に説明しておくと、toolはagentから呼び出される関数やインスタンスと思ってもらえたらいいと思っており、カスタムtoolを作成する際は「僕はこういうtoolだよ」という簡潔な説明文を定義する必要が出てきます。)

大まかな処理の流れ

BingSearchを行えるチャットサービスを作る際の大まかなバックエンド側の処理の流れを記載します。

[User]ユーザーの入力
↓
[APIサーバー]
↓
[Langchain]入力内容とチャット履歴、tool名(Bing-search等)を全てLLMに送る
↓
[LLM]送られてきた内容をもとに回答できそうであればそのまま回答し、toolを使う必要があればtool名を送り返す
↓
[Langchain]toolを使う必要があればtoolを実行。toolの実行結果と入力内容とチャット履歴、tool名を全てLLMに再送信する
↓
[LLM]送られてきた内容をもとに回答できそうであればそのまま回答し、toolを使う必要があればtool名を送り返す
...永遠ループ
↓
[Langchain]回答をもらい次第、レスポンスを変数に入れる
↓
[APIサーバー]ユーザーにレスポンス

終わりに

一旦テキストでまとめてみましたが、もし分からない点があれば図式化するので、遠慮なくおっしゃってください。

参考サイト

  1. Langchain introduction
  2. OpenAI tools

Discussion