Компонент памяти на основе векторной базы данных
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 = """Здесь приведен дружеский разговор между людьми и искусственным интеллектом. ИИ разговорчив и предоставляет много конкретных деталей из своего контекста. Если ИИ не знает ответ на вопрос, он искренне скажет, что не знает.
Связные части предыдущего разговора:
{history}
(Если несущественно, вам не нужно использовать эту информацию)
Текущий разговор:
Человек: {input}
ИИ:"""
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...
Подсказка после форматирования:
Здесь приведен дружеский разговор между людьми и искусственным интеллектом. ИИ разговорчив и предоставляет много конкретных деталей из своего контекста. Если ИИ не знает ответ на вопрос, он искренне скажет, что не знает.
Связные части предыдущего разговора:
Ввод: Моя любимая еда - пицца.
Вывод: Это хорошо знать.
(Если несущественно, вам не нужно использовать эту информацию)
Текущий разговор:
Человек: Привет, меня зовут Перри, как дела?
ИИ:
> Цепочка завершена.
"Привет Перри, у меня все отлично. А у тебя?"
conversation_with_summary.predict(input="Какой мой любимый вид спорта?")
> Вход в новую цепочку ConversationChain...
Подсказка после форматирования:
Здесь приведен дружеский разговор между людьми и искусственным интеллектом. ИИ разговорчив и предоставляет много конкретных деталей из своего контекста. Если ИИ не знает ответ на вопрос, он искренне скажет, что не знает.
Связные части предыдущего разговора:
Ввод: Мой любимый вид спорта - футбол.
Вывод: ...
(Если несущественно, вам не нужно использовать эту информацию)
Текущий разговор:
Человек: Какой мой любимый вид спорта?
ИИ:
> Цепочка завершена.
'Ты рассказал мне ранее, что твой любимый вид спорта - футбол.'