Руководство по Коду: Активируем Память mem0 для Бота Anthropic Claude для Контекстных Диалогов
В этом руководстве показано, как создать чатбота с памятью, объединяющего модель Claude от Anthropic и mem0 для контекстных диалогов в Google Colab.
Создание Чатбота с Памятью на Claude в Google Colab
В этом руководстве мы создаём полнофункционального чатбота, использующего модель Claude от Anthropic в связке с памятью mem0 для бесшовного запоминания контекста. Сочетание оркестрации LangGraph и векторного хранилища памяти mem0 позволяет помощнику запоминать предыдущие диалоги и по запросу возвращать релевантные данные, обеспечивая естественную непрерывность общения.
Установка Необходимых Библиотек
Сначала установим и обновим все нужные библиотеки: LangGraph, клиент mem0, LangChain с коннектором Anthropic и SDK Anthropic. Это обеспечит совместимость и упростит настройку:
!pip install -qU langgraph mem0ai langchain langchain-anthropic anthropicИмпорт Ключевых Модулей
Импортируем модули для управления API-ключами, типизации, LangGraph для управления потоком общения, классы сообщений LangChain для создания подсказок, обёртку ChatAnthropic для взаимодействия с Claude и клиент mem0 для хранения памяти.
import os
from typing import Annotated, TypedDict, List
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_anthropic import ChatAnthropic
from mem0 import MemoryClientНастройка API-Ключей
Безопасно вставляем ключи Anthropic и mem0 в переменные окружения и локальные переменные, чтобы избежать жёсткой кодировки чувствительных данных.
os.environ["ANTHROPIC_API_KEY"] = "Use Your Own API Key"
MEM0_API_KEY = "Use Your Own API Key"Инициализация Модели и Клиента Памяти
Создаём экземпляр ChatAnthropic с моделью Claude 3.5 Sonnet и инициализируем mem0 MemoryClient для векторного хранения памяти.
llm = ChatAnthropic(
model="claude-3-5-haiku-latest",
temperature=0.0,
max_tokens=1024,
anthropic_api_key=os.environ["ANTHROPIC_API_KEY"]
)
mem0 = MemoryClient(api_key=MEM0_API_KEY)Определение Состояния Диалога и Логики Бота
Определяем TypedDict для хранения истории сообщений и ID пользователя. Функция чатбота ищет в mem0 релевантные воспоминания на основе последнего сообщения, создаёт контекстно обогащённое системное сообщение, вызывает Claude для ответа и сохраняет новую пару сообщений в памяти.
class State(TypedDict):
messages: Annotated[List[HumanMessage | AIMessage], add_messages]
mem0_user_id: str
graph = StateGraph(State)
def chatbot(state: State):
messages = state["messages"]
user_id = state["mem0_user_id"]
memories = mem0.search(messages[-1].content, user_id=user_id)
context = "\n".join(f"- {m['memory']}" for m in memories)
system_message = SystemMessage(content=(
"Вы — полезный ассистент поддержки клиентов. "
"Используйте контекст ниже для персонализации ответов:\n" + context
))
full_msgs = [system_message] + messages
ai_resp: AIMessage = llm.invoke(full_msgs)
mem0.add(
f"Пользователь: {messages[-1].content}\nАссистент: {ai_resp.content}",
user_id=user_id
)
return {"messages": [ai_resp]}Настройка Выполнения Через LangGraph
Добавляем функцию чатбота как узел, создаём ребра для управления потоком диалога, позволяя повторять обработку каждого нового сообщения.
graph.add_node("chatbot", chatbot)
graph.add_edge(START, "chatbot")
graph.add_edge("chatbot", "chatbot")
compiled_graph = graph.compile()Запуск Цикла Общения
Определяем функцию для обработки пользовательского ввода через скомпилированный граф и выводим ответ ассистента. В REPL-цикле вводим сообщения и завершаем работу по команде "exit".
def run_conversation(user_input: str, mem0_user_id: str):
config = {"configurable": {"thread_id": mem0_user_id}}
state = {"messages": [HumanMessage(content=user_input)], "mem0_user_id": mem0_user_id}
for event in compiled_graph.stream(state, config):
for node_output in event.values():
if node_output.get("messages"):
print("Ассистент:", node_output["messages"][-1].content)
return
if __name__ == "__main__":
print("Добро пожаловать! (введите 'exit' для выхода)")
mem0_user_id = "customer_123"
while True:
user_in = input("Вы: ")
if user_in.lower() in ["exit", "quit", "bye"]:
print("Ассистент: До свидания!")
break
run_conversation(user_in, mem0_user_id)Эта архитектура позволяет чатботу запоминать индивидуальные данные пользователя и предоставлять персонализированные, контекстно насыщенные ответы, комбинируя возможности Claude, mem0 и LangGraph в Google Colab.
Рекомендуется экспериментировать с улучшением стратегий поиска памяти, тонкой настройкой подсказок и расширением функционала бота дополнительными инструментами.
Ознакомьтесь с Colab Notebook по ссылке в исходной статье для практического применения.
Switch Language
Read this article in English