LangChainとMilvusを用いた長期記憶を持つ会話AIエージェントの構築

大規模言語モデル(LLMs)は人工知能(AI)のゲームを変えた。これらの高度なモデルは、人間のようなテキストを簡単に理解し、驚くほどの精度で生成することができ、AIアシスタントやチャットボットをより賢く、より便利なものにしている。LLMのおかげで、質問に対する回答から言語の翻訳まで、複雑な言語タスクを処理できるAIツールが登場した。
会話エージェントは、実際の人間と話すように、自然言語でユーザーとチャットするソフトウェア・プログラムである。チャットボットやバーチャルアシスタントのようなもので、私たちの質問やコマンドを理解し応答することで、日常的なタスクを助けてくれる。
LangChainは、このような会話エージェントを簡単に構築できるオープンソースのフレームワークである。スマートでコンテキストを意識したチャットボットやその他のAIアプリケーションを迅速かつ効率的に作成するための便利なツールやテンプレートを提供しています。
##LangChainエージェント入門
LangChainエージェントは、複雑なタスクを完了するために様々なツールやデータソースと対話するためにLLMを使用する高度なシステムです。これらのエージェントは、ユーザの入力を理解し、決定を下し、応答を作成することができ、従来の方法よりも柔軟で適応的な意思決定を提供するためにLLMを使用します。
LangChainエージェントの大きな利点は、外部のツールやデータソースを利用できることです。つまり、単に言語を処理するだけでなく、情報を収集したり、計算を実行したり、アクションを起こしたりすることができるため、様々なアプリケーションでより強力で効果的なものとなります。
ラングチェーンエージェントとチェーンの比較
チェーン とエージェントは、LangChainで使われる2つの主要なツールです。チェーンは、あらかじめ定義されたツールの使用順序を作ることができ、特定の操作順序を必要とするタスクに便利です。
LangChainチェーンの仕組み](https://assets.zilliz.com/How_Lang_Chain_Chains_work_b15cd2e788.png)
一方、エージェントは、大規模な言語モデルがループでツールを使用することを可能にし、ツールを使用する回数を決めることができます。この柔軟性は、反復処理や動的な意思決定を必要とするタスクに最適である。
LangChainエージェントの仕組み](https://assets.zilliz.com/How_Lang_Chain_Agents_work_de7b0757ce.png)
##LangChainを使った会話エージェントの構築
PythonでLangChainを使った会話エージェントを作ってみましょう。
依存関係のインストール
LangChainエージェントを構築するには、以下の依存関係をインストールする必要があります:
LangChain](https://pypi.org/project/langchain/):LangChainはオープンソースのフレームワークで、大規模言語モデル(LLM)を使ったアプリケーションの開発を支援します。
Langchain OpenAI](https://pypi.org/project/langchain-openai/):本パッケージには
openai
SDK を通して OpenAI に統合された LangChain が含まれます。OpenAI API SDK](https://pypi.org/project/openai/):OpenAI Python ライブラリは、Python 3.7+ アプリケーションから OpenAI REST API への便利なアクセスを提供します。
Dotenv](https://pypi.org/project/python-dotenv/):Python-dotenv は
.env
ファイルからキーと値のペアを読み込み、環境変数として設定することができます。Milvus](https://pypi.org/project/milvus/):億単位のベクトル保存と類似検索に最適なオープンソースのベクトルデータベース。また、RAG (Retrieval Augmented Generation) アプリケーションを構築するためのインフラストラクチャ・コンポーネントとしても人気がある。
Pymilvus](https://pypi.org/project/pymilvus/):MilvusのPython SDK。多くの一般的な埋め込みと再ランク付けモデルを統合しており、RAGアプリケーションの構築を効率化する。
Tiktoken](https://pypi.org/project/tiktoken/): OpenAIのモデルで使える高速なBPEトークナイザー。
以下のコマンドを実行することでインストールできます:
pip install langchain==0.1.20 langchain-openai openai python-dotenv pymilvus langchain_milvus tiktoken
この例では特にLangChainバージョン0.1.20を使うことに注意してください。
全ての依存関係をインストールした後、簡単な会話エージェントをセットアップするコードを書きましょう。
環境変数のロード
最初に、dotenv
パッケージを使って環境変数をロードする。このパッケージはAPIキーのような機密情報を保護するのに役立つ。
from dotenv import load_dotenv
load_dotenv()
プロジェクトのディレクトリに、OpenAIのAPIキーを含む .env
ファイルがあることを確認します。
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxx
OpenAI LLMを初期化する
次に、langchain_openai
パッケージを使って OpenAI LLM を初期化します。
from langchain_openai import OpenAI
llm = OpenAI()
会話チェーンの作成
会話エージェントを作成するために langchain.chains
の ConversationChain
クラスを使う。このチェーンはユーザとの対話を処理する。
from langchain.chains import ConversationChain
conversation = ConversationChain(
llm=llm、
)
予測を立てる
最後に、会話チェーンにユーザー入力を渡すことで、予測を行うことができます。この例では、エージェントに簡単な質問をします。
answer = conversation.predict(input="What's my name?")
print(answer)
コード例
すべてのステップを組み合わせた完全なコードは以下の通り。
from dotenv import load_dotenv
from langchain_openai import OpenAI
from langchain.chains import ConversationChain
load_dotenv()
llm = OpenAI()
会話 = ConversationChain(
llm=llm、
)
answer = conversation.predict(input="私の名前は?")
print(answer)
コードの実行
コードを実行するには、.env
ファイルに OpenAI API キーが設定されていることを確認してください。そして、Pythonスクリプトを実行します。エージェントが質問に答える出力が表示され、LangChainフレームワークの会話機能が紹介されるはずです。
Pythonスクリプトを実行すると、以下のような応答が返ってくるはずです:
> 私はあなたの個人情報にアクセスできませんので、その質問に正確にお答えすることができません。あなたのお名前をお教えください。
おめでとう!あなたはLangChainを使って基本的な会話エージェントを作ることに成功しました。この例はほんの始まりに過ぎません。LangChainを使えば、あなたのニーズに合わせた、より複雑で有能なAIエージェントを構築することができます。
会話エージェントにおけるメモリの重要性
しかし、私たちがエージェントに "私の名前は何ですか?"*と尋ねると、エージェントには以前の対話の記憶がないため、正しく答えることができませんでした。このような記憶の欠如は、会話エージェントの有用性を制限します。記憶を統合することで、私たちのエージェントは過去の対話から重要な詳細を記憶することができ、応答をより正確でパーソナライズされたものにすることができます。
LangChainとMilvusを使った長期記憶を持つ会話エージェントの構築
Milvusは、10億スケールのベクトルを効率的に保存・検索するために構築された、高性能なオープンソースのベクトルデータベースです。意味検索](https://zilliz.com/glossary/semantic-search)や検索拡張生成(RAG)のようなGenAIのユースケースに広く利用されている。また、LLMの長期記憶を追加するための重要なインフラコンポーネントでもある。
Milvus LiteはMilvusの軽量版であり、ローカルデバイス上で動作させることができます。この例では、ベクターストアとしてMilvus Liteを使用し、私のプライベートデータを保存・検索する。
それでは、LangChainとMilvus Liteを使って、会話エージェントに長期記憶を持たせてみましょう。
インストール要件
まず,必要なパッケージをインストールしてください.
pip install langchain==0.1.20 langchain-openai python-dotenv openai pymilvus tiktoken
では、順を追ってコードを書いていこう。
環境変数をロードする
dotenv` パッケージを使って環境変数をロードする。このステップはAPIキーのような機密情報の保護に役立つ。
from dotenv import load_dotenv
load_dotenv()
プロジェクトのディレクトリに、OpenAIのAPIキーを含む .env
ファイルがあることを確認します。
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx
OpenAI LLMとEmbeddingsを初期化する.
langchain_openai` パッケージを使って、OpenAI LLM とエンベッディングを初期化します。
from langchain_openai import OpenAI, OpenAIEmbeddings
llm = OpenAI()
embeddings = OpenAIEmbeddings()
ベクトルストアとしてMilvusをセットアップする
Milvusのベクターデータベースをセットアップして、データを保存・取得します。
from langchain_milvus.vectorstores import Milvus
vectordb = Milvus(
embeddings、
connection_args={"uri":"./milvus_demo.db"}、
# 最も簡単な方法は、Milvus Liteを使用することです。
# Milvusサーバーがある場合は "http://localhost:19530 "のようなサーバーURIを利用することができます.
)
retriever = vectordb.as_retriever( search_kwargs=dict(k=1))
エージェントのメモリを作成する
ベクター・リトリーバーを使ってメモリをセットアップする。
from langchain.memory import VectorStoreRetrieverMemory
memory = VectorStoreRetrieverMemory(retriever=retriever)
初期コンテキストの保存
メモリに初期情報を追加する。
about_me = [
{"input":"My name is Bob.", "output":"Got it!" }、
{"input":"I'm from San Francisco.", "output":"Got it!}
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
プロンプト・テンプレートの定義
memoryを含むプロンプト・テンプレートを作成する。
from langchain.prompts import PromptTemplate
prompt_template = """以下はユーザーとチャットボットのフレンドリーな会話です。チャットボットは饒舌で、文脈から具体的な詳細をたくさん提供してくれます。チャットボットは質問の答えを知らない場合、正直に「知らない」と答えます。
以前の会話の関連する部分:
{歴史}。
(関連性がない場合は、これらの情報を使用する必要はありません。)
現在の会話
ユーザー: {入力}
チャットボット:""
prompt = PromptTemplate(input_variables=["history", "input"], template=prompt_template)
メモリーを使った会話チェーンの作成
プロンプトとメモリーを使用するように会話チェーンを設定する。
from langchain.chains import ConversationChain
conversation_with_memory = ConversationChain(
llm=llm, prompt=prompt, memory=memory, verbose=True
)
予測を行う
最後に、エージェントがメモリをどのように使うかを見るために、エージェントに質問をします。
完全なコード例
すべてのステップを組み合わせた完全なコードは以下の通りです。
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
from langchain_openai import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
from langchain_milvus.vectorstores import Milvus
load_dotenv()
llm = OpenAI()
embeddings = OpenAIEmbeddings()
vectordb = Milvus(
embeddings、
connection_args={"uri":"./milvus_demo.db"}、
)
retriever = vectordb.as_retriever(search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
about_me = [
{"input":"My name is Bob.", "output":"了解!"}、
{"input":"I'm from San Francisco.", "output":"Got it!}
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
prompt_template = """以下は、ユーザーとチャットボットのフレンドリーな会話です。チャットボットは饒舌で、コンテキストから具体的な詳細をたくさん提供してくれます。チャットボットが質問の答えを知らない場合、正直に「知らない」と答えます。
以前の会話の関連する部分:
{歴史}。
(関連性がなければ、これらの情報を使う必要はありません。)
現在の会話
ユーザー: {入力}
チャットボット:""
prompt = PromptTemplate(input_variables=["history", "input"], template=prompt_template)
conversation_with_memory = ConversationChain(
llm=llm, prompt=prompt, memory=memory, verbose=True
)
answer = conversation_with_memory.predict(input="What's my name?")
print(answer)
コードの実行
コードを実行するために、.env
ファイルにOpenAIのAPIキーを設定します。そして、Pythonスクリプトを実行します。エージェントが質問に答える出力が表示され、メモリ統合によるLangChainフレームワークの強化された機能が紹介されるはずです。
Pythonスクリプトを実行すると、以下のような応答が返ってくるはずです:
> あなたの名前はBobです。Bobという名前は、ゲルマン語で "輝かしい名声 "を意味するRobertという名前の短縮形であることをご存知ですか?中世に人気のあった名前で、歴史上多くの有名人に使われてきました。ボブという名前の有名人を知っていますか?
おめでとう!あなたはLangChainとMilvusを使って長期記憶を持つ会話エージェントを作ることに成功しました。この例は、正確でパーソナライズされた応答を提供するために、記憶がエージェントの能力をいかに著しく向上させるかを示しています。LangChainとMilvusを使えば、あなたのニーズに合わせたさらに高度で有能なAIエージェントを構築することができます。
要約
本記事では、LangChainエージェントの魅力的な世界と、会話AIを変革する可能性を探ってきました。まず、LangChainの基本的な紹介から始め、高度でコンテキストを意識した会話エージェントの構築におけるLangChainの役割を理解しました。そして、LangChainを使った簡単なエージェントを作成する実践的なステップを探求し、メモリを持たないエージェントの限界を明らかにしました。
これらの限界に対処するために、Milvus Liteを使用してエージェントに長期記憶を統合する方法を実演し、この拡張機能によってエージェントが重要な情報を保持し、より正確でパーソナライズされた応答を提供できることを紹介しました。
実験のすすめ
LangChainの基礎と会話エージェントの作り方を理解したところで、いよいよ実験です!より複雑なエージェントを作ってみたり、追加ツールを統合してみたり、様々なユースケースを試してみてください。LangChainの柔軟性とパワーは、会話AIが達成できる限界を押し広げるための素晴らしいフレームワークです。
LangChainとMilvusをより深く知るには、公式ドキュメントと推奨チュートリアルをご覧ください:
LangChainチェーン vs. エージェント](https://python.langchain.com/v0.1/docs/use_cases/tool_use/)
LangChainエージェント](https://python.langchain.com/v0.1/docs/modules/agents/)
ベクターデータベースとは](https://zilliz.com/learn/what-is-vector-database)
数秒でGenAIアプリケーションを構築できるMilvus Liteのご紹介](https://milvus.io/blog/introducing-milvus-lite.md)
ローカルでMilvus Liteを動かす](https://milvus.io/docs/milvus_lite.md)
MilvusでLangChain](https://python.langchain.com/v0.1/docs/integrations/vectorstores/milvus/)
これらのリソースを探索することで、より包括的な理解を得ることができ、高度でインテリジェントな会話エージェントを構築するためのより良い環境を得ることができます。ハッピーコーディング
読み続けて

Vector Databases vs. Document Databases
Use a vector database for similarity search and AI-powered applications; use a document database for flexible schema and JSON-like data storage.

Producing Structured Outputs from LLMs with Constrained Sampling
Discuss the role of semantic search in processing unstructured data, how finite state machines enable reliable generation, and practical implementations using modern tools for structured outputs from LLMs.

GLiNER: Generalist Model for Named Entity Recognition Using Bidirectional Transformer
GLiNER is an open-source NER model using a bidirectional transformer encoder.