ベクトルデータベースベースのメモリコンポーネント

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:

    
    > チェーンを終了。

    '以前にお気に入りのスポーツがサッカーであると教えてくれました。'