Разговорная память в LangChain
LangChain - это надежный фреймворк для создания LLM-приложений. Однако вместе с этой мощью приходит и некоторая сложность. LangChain предоставляет множество способов подсказки LLM и такие важные функции, как разговорная память. Память разговоров предлагает контекст, в котором LLM запоминает ваш разговор.
В этом посте мы рассмотрим, как использовать разговорную память с LangChain и Milvus. Чтобы следовать этому, вам нужно pip
установить четыре библиотеки и ключ OpenAI API. Четыре необходимые библиотеки можно установить, запустив pip install langchain milvus pymilvus python-dotenv
. Или выполнив первый блок в блокноте CoLab для этой статьи.
В этом посте мы узнаем о:
- Разговорная память с LangChain
- Настройка контекста разговора
- Создание подсказок в разговорной памяти с помощью LangChain
- Краткое описание разговорной памяти LangChain
Разговорная память с LangChain
В состоянии по умолчанию вы взаимодействуете с LLM с помощью одиночных подсказок. Добавление памяти для контекста, или "разговорной памяти", означает, что вам больше не нужно передавать все через одну подсказку. LangChain предлагает возможность хранить разговор, который вы уже вели с LLM, чтобы получить эту информацию позже.
Чтобы настроить постоянную разговорную память с векторным хранилищем, нам понадобятся шесть модулей от LangChain. Во-первых, мы должны получить OpenAIEmbeddings
и OpenAI
LLM. Для использования бэкенда векторного хранилища нам также нужны VectorStoreRetrieverMemory
и LangChain-версия Milvus
. Затем нам нужны ConversationChain
и PromptTemplate
, чтобы сохранить наш разговор и запросить его.
Библиотеки os
, dotenv
и openai
предназначены в основном для операционных целей. Мы используем их для загрузки и использования ключа API OpenAI. Последний шаг настройки - запуск локального экземпляра Milvus Lite. Для этого мы используем default_server
из пакета Milvus Python.
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
from langchain.vectorstores import Milvus
embeddings = OpenAIEmbeddings()
import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
from milvus import default_server
default_server.start()
Настройка контекста разговора
Теперь, когда все предварительные условия созданы, мы можем приступить к созданию памяти разговора. Первым шагом будет создание соединения с сервером Milvus с помощью LangChain. Далее мы используем пустой словарь для создания коллекции LangChain Milvus. Кроме того, мы передаем созданные нами выше вкрапления и данные для подключения к серверу Milvus Lite.
Чтобы использовать векторную базу данных для разговорной памяти, нам нужно инстанцировать ее как ретривер. В данном случае мы получаем только 1 лучший результат, установив k=1
. Последний шаг настройки разговорной памяти - использование объекта VectorStoreRetrieverMemory
в качестве разговорной памяти через соединение ретривера и векторной базы данных, которое мы только что установили.
Чтобы использовать нашу разговорную память, в ней должен быть некоторый контекст. Поэтому давайте зададим памяти контекст. Для этого примера мы дадим пять частей информации. Давайте запомним мою любимую закуску (шоколад), вид спорта (плавание), пиво (Guinness), десерт (чизкейк) и музыканта (Тейлор Свифт). Каждая запись сохраняется в памяти с помощью функции save_context
.
vectordb = Milvus.from_documents(
{},
embeddings,
connection_args={"host": "127.0.0.1", "port": default_server.listen_port})
retriever = Milvus.as_retriever(vectordb, search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
about_me = [
{"input": "My favorite snack is chocolate",
"output": "Nice"},
{"input": "My favorite sport is swimming",
"output": "Cool"},
{"input": "My favorite beer is Guinness",
"output": "Great"},
{"input": "My favorite dessert is cheesecake",
"output": "Good to know"},
{"input": "My favorite musician is Taylor Swift",
"output": "Same"}
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
Создание подсказок для разговорной памяти с помощью LangChain
Пришло время посмотреть, как мы можем использовать нашу разговорную память. Начнем с подключения к OpenAI LLM через LangChain. Мы используем температуру 0, чтобы указать, что мы не хотим, чтобы наша LLM была творческой.
Далее мы создадим шаблон. Мы сообщаем LLM, что он участвует в дружеской беседе с человеком, и вставляем две переменные. Переменная history
предоставляет контекст из памяти разговора. Переменная input
предоставляет текущий ввод. Мы используем объект PromptTemplate
для вставки этих переменных.
Мы используем объект ConversationChain
для объединения подсказки, LLM и памяти. Теперь мы готовы проверить память нашего разговора, дав ему несколько подсказок. Начнем с того, что сообщим LLM, что нас зовут Гэри, главный соперник в серии Pokemon (все остальное в памяти разговора - это факты обо мне).
llm = OpenAI(temperature=0) # Can be any valid LLM
_DEFAULT_TEMPLATE = """The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
Relevant pieces of previous conversation:
{history}
(You do not need to use these pieces of information if not relevant)
Current conversation:
Human: {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="Hi, my name is Gary, what's up?")
На изображении ниже показано, как может выглядеть ожидаемая реакция LLM. В данном примере он ответил, что его зовут "ИИ".
Теперь давайте проверим, как работает память. Используем объект ConversationChain
, который мы создали ранее, и сделаем запрос на моего любимого музыканта.
conversation_with_summary.predict(input="who is my favorite musician?")
На изображении ниже показан ожидаемый ответ от Conversation Chain. Поскольку мы использовали опцию verbose, он также показывает нам соответствующую беседу. Мы видим, что, как и ожидалось, в ответ приходит сообщение о том, что моим любимым исполнителем является Тейлор Свифт.
Далее давайте проверим мой любимый десерт - чизкейк.
conversation_with_summary.predict(input="Whats my favorite dessert?")
Когда мы запрашиваем мой любимый десерт, мы видим, что цепочка разговоров снова выбирает правильную информацию из Milvus. Она обнаруживает, что мой любимый десерт - чизкейк, как я и говорил ранее.
Теперь, когда мы убедились, что можем запрашивать информацию, которую мы сообщили ранее, давайте проверим еще одну вещь - информацию, которую мы предоставили в начале нашего разговора. Мы начали разговор, сообщив ИИ, что нас зовут Гэри.
conversation_with_summary.predict(input="What's my name?")
Наша последняя проверка показывает, что цепочка разговора сохранила информацию о нашем имени в нашей векторной памяти разговора. Она возвращает, что мы сказали, что нас зовут Гэри.
Краткое описание разговорной памяти LangChain
В этом уроке мы узнали, как использовать разговорную память в LangChain. LangChain предлагает доступ к бэкендам векторных хранилищ, таких как Milvus, для постоянной разговорной памяти. Мы можем использовать разговорную память, внедряя историю в наши подсказки и сохраняя исторический контекст в объекте ConversationChain
.
В этом учебном примере мы сообщили разговорной цепочке пять фактов обо мне и притворились главным соперником в Pokemon, Гэри. Затем мы задали разговорной цепочке вопросы о сохраненных априорных знаниях - о моем любимом музыканте и десерте. Она правильно ответила на оба вопроса и вывела на экран соответствующие записи. Наконец, мы спросили его о нашем имени, указанном в начале разговора, и он правильно ответил, что мы сказали, что нас зовут "Гэри".
- Разговорная память с LangChain
- Настройка контекста разговора
- Создание подсказок для разговорной памяти с помощью LangChain
- Краткое описание разговорной памяти LangChain
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word