ベクトルデータベースベースのメモリコンポーネント
VectorStoreRetrieverMemory
は、メモリをベクトルデータベースに格納し、過去のメモリデータがクエリされるたびに上位K個の類似コンテンツを返します。
ここで、「ドキュメント」とは以前の対話メッセージ断片を指します。
from datetime import datetime
from langchain_openai import OpenAIEmbeddings
from langchain_openai import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain_core.prompts import PromptTemplate
ベクトルデータベースの初期化
異なるベクトルデータベースには若干異なる初期化手順があります。ここでは Faiss を使用した例を示します。
import faiss
from langchain.docstore import InMemoryDocstore
from langchain_community.vectorstores import FAISS
embedding_size = 1536 # ベクトル次元
index = faiss.IndexFlatL2(embedding_size)
embedding_fn = OpenAIEmbeddings().embed_query
vectorstore = FAISS(embedding_fn, index, InMemoryDocstore({}), {})
VectorStoreRetrieverMemory の作成
ベクトルデータベースを使用して VectorStoreRetrieverMemory コンポーネントを作成します。
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
memory.save_context({"input": "私の好きな食べ物はピザです"}, {"output": "知っていて良かった"})
memory.save_context({"input": "私の好きなスポーツはサッカーです"}, {"output": "..."})
memory.save_context({"input": "セルティックスが好きではありません"}, {"output": "了解"}) #
print(memory.load_memory_variables({"prompt": "どんなスポーツを見るべきですか?"})["history"])
input: 私の好きなスポーツはサッカーです
output: ...
チェーン経由でメモリコンポーネントを使用
以下はメモリコンポーネントの使用方法の例です。 "verbose=True" パラメータを設定して、モデルとの対話プロンプトを印刷することができます。
llm = OpenAI(temperature=0) # 有効な LLM であればなんでも使えます。ここでは openai を選択します
_DEFAULT_TEMPLATE = """人間とAIの友好的な会話です。 AI は話好きで、コンテキストから多くの具体的な詳細を提供します。 AI が質問の回答を知らない場合は、知らないと率直に言います。
前回の会話の関連部分:
{history}
(関連しない場合は、この情報は使用しなくても構いません)
現在の会話:
人間: {input}
AI:"""
PROMPT = PromptTemplate(
input_variables=["history", "input"],
template=_DEFAULT_TEMPLATE
)
conversation_with_summary = ConversationChain(
llm=llm,
prompt=PROMPT,
memory=memory,
verbose=True
)
conversation_with_summary.predict(input="こんにちは、私の名前はペリーです。どうしたの?")
> 新しい ConversationChain チェーンに入る...
フォーマット後のプロンプト:
人間とAIの友好的な会話です。 AI は話好きで、コンテキストから多くの具体的な詳細を提供します。 AI が質問の回答を知らない場合は、知らないと率直に言います。
前回の会話の関連部分:
Input: 私の好きな食べ物はピザです。
Output: 知っていて良かった。
(関連しない場合は、この情報は使用しなくても構いません)
現在の会話:
Human: こんにちは、私の名前はペリーです。どうしたの?
AI:
> チェーンを終了。
"こんにちはペリー、私は元気ですよ。あなたはどう?"
conversation_with_summary.predict(input="私の好きなスポーツは何ですか?")
> 新しい ConversationChain チェーンに入る...
フォーマット後のプロンプト:
人間とAIの友好的な会話です。 AI は話好きで、コンテキストから多くの具体的な詳細を提供します。 AI が質問の回答を知らない場合は、知らないと率直に言います。
前回の会話の関連部分:
Input: 私の好きなスポーツはサッカーです。
Output: ...
(関連しない場合は、この情報は使用しなくても構いません)
現在の会話:
Human: 私の好きなスポーツは何ですか?
AI:
> チェーンを終了。
'以前にお気に入りのスポーツがサッカーであると教えてくれました。'