Компонент памяти на основе векторной базы данных

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...
    Подсказка после форматирования:
    Здесь приведен дружеский разговор между людьми и искусственным интеллектом. ИИ разговорчив и предоставляет много конкретных деталей из своего контекста. Если ИИ не знает ответ на вопрос, он искренне скажет, что не знает.
    
Связные части предыдущего разговора:

Ввод: Мой любимый вид спорта - футбол.

Вывод: ...

(Если несущественно, вам не нужно использовать эту информацию)

Текущий разговор:

Человек: Какой мой любимый вид спорта?

ИИ:
    
    > Цепочка завершена.

    'Ты рассказал мне ранее, что твой любимый вид спорта - футбол.'