<НА ГЛАВНУЮ

Руководство по Коду: Активируем Память 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

Switch to English