Skip to main content
Alpha 版本提示: 本文档涵盖的是 v1-alpha 版本。内容尚不完整,且可能随时变更。如需查阅最新稳定版本,请参阅 v0 版本的 LangChain Python 文档LangChain JavaScript 文档

概述

LangChain 代理使用 LangGraph 持久化机制 来实现长期记忆功能。这是一个较高级的主题,需要掌握 LangGraph 才能使用。

记忆存储

LangGraph 将长期记忆以 JSON 文档的形式存储在 存储器 中。 每条记忆都按自定义的 命名空间(类似文件夹)和唯一的 (类似文件名)组织。命名空间通常包含用户或组织 ID 或其他标签,便于信息分类。 这种结构支持记忆的层级化组织,并可通过内容过滤器实现跨命名空间搜索。
from langgraph.store.memory import InMemoryStore


def embed(texts: list[str]) -> list[list[float]]:
    # 替换为实际的嵌入函数或 LangChain 嵌入对象
    return [[1.0, 2.0] * len(texts)]


# InMemoryStore 将数据保存在内存字典中。生产环境中请使用数据库支持的存储。
store = InMemoryStore(index={"embed": embed, "dims": 2})
user_id = "my-user"
application_context = "chitchat"
namespace = (user_id, application_context)
store.put(
    namespace,
    "a-memory",
    {
        "rules": [
            "用户喜欢简短直接的语言",
            "用户只会说英语和 Python",
        ],
        "my-key": "my-value",
    },
)
# 通过 ID 获取“记忆”
item = store.get(namespace, "a-memory")
# 在此命名空间内搜索“记忆”,按内容相等性过滤,按向量相似度排序
items = store.search(
    namespace, filter={"my-key": "my-value"}, query="语言偏好"
)
有关记忆存储器的更多信息,请参阅 持久化指南

在工具中读取长期记忆

from dataclasses import dataclass

from langchain_core.runnables import RunnableConfig
from langchain.agents import create_agent
from langgraph.config import get_store
from langgraph.runtime import get_runtime
from langgraph.store.memory import InMemoryStore

@dataclass
class Context:
    user_id: str

store = InMemoryStore() # (1)!

store.put(  # (2)!
    ("users",),  # (3)!
    "user_123",  # (4)!
    {
        "name": "John Smith",
        "language": "English",
    } # (5)!
)

def get_user_info() -> str:
    """查找用户信息。"""
    # 与传递给 `create_agent` 的存储器相同
    store = get_runtime().store # (6)!
    user_id = get_runtime(Context).context.user_id
    user_info = store.get(("users",), user_id) # (7)!
    return str(user_info.value) if user_info else "未知用户"

agent = create_agent(
    model="anthropic:claude-3-7-sonnet-latest",
    tools=[get_user_info],
    store=store # (8)!,
    context_schema=Context
)

# 运行代理
agent.invoke(
    {"messages": [{"role": "user", "content": "查找用户信息"}]},
    context=Context(user_id="user_123")
)
  1. InMemoryStore 是一个将数据存储在内存中的存储器。在生产环境中,通常应使用数据库或其他持久化存储。请查阅 存储器文档 获取更多选项。如果使用 LangGraph Platform 部署,平台将为您提供生产就绪的存储器。
  2. 本例中,我们使用 put 方法向存储器写入一些示例数据。详情请参阅 BaseStore.put API 参考。
  3. 第一个参数是命名空间,用于将相关数据分组。此处使用 users 命名空间对用户数据进行分组。
  4. 命名空间内的键。本例使用用户 ID 作为键。
  5. 我们希望为指定用户存储的数据。
  6. get_store 函数用于访问存储器。您可以在代码的任何位置(包括工具和提示)调用它。此函数返回创建代理时传入的存储器。
  7. get 方法用于从存储器检索数据。第一个参数是命名空间,第二个参数是键。这将返回一个 StoreValue 对象,其中包含值及其元数据。
  8. store 被传递给代理。这使得代理在运行工具时可以访问存储器。您也可以在代码的任何位置使用 get_store 函数访问存储器。

从工具中写入长期记忆

from typing_extensions import TypedDict

from langchain_core.runnables import RunnableConfig
from langchain.agents import create_agent
from langgraph.config import get_store
from langgraph.store.memory import InMemoryStore

store = InMemoryStore() # (1)!

class UserInfo(TypedDict): # (2)!
    name: str

def save_user_info(user_info: UserInfo, config: RunnableConfig) -> str: # (3)!
    """保存用户信息。"""
    # 与传递给 `create_agent` 的存储器相同
    store = get_store() # (4)!
    user_id = config["configurable"].get("user_id")
    store.put(("users",), user_id, user_info) # (5)!
    return "成功保存用户信息。"

agent = create_agent(
    model="anthropic:claude-3-7-sonnet-latest",
    tools=[save_user_info],
    store=store
)

# 运行代理
agent.invoke(
    {"messages": [{"role": "user", "content": "我的名字是 John Smith"}]},
    config={"configurable": {"user_id": "user_123"}} # (6)!
)

# 您可以直接访问存储器获取值
store.get(("users",), "user_123").value
  1. InMemoryStore 是一个将数据存储在内存中的存储器。在生产环境中,通常应使用数据库或其他持久化存储。请查阅 存储器文档 获取更多选项。如果使用 LangGraph Platform 部署,平台将为您提供生产就绪的存储器。
  2. UserInfo 类是一个 TypedDict,用于定义用户信息的结构。LLM 将据此格式化响应。
  3. save_user_info 函数是一个允许代理更新用户信息的工具。在用户希望更新个人资料信息的聊天应用中非常有用。
  4. get_store 函数用于访问存储器。您可以在代码的任何位置(包括工具和提示)调用它。此函数返回创建代理时传入的存储器。
  5. put 方法用于将数据存储到存储器中。第一个参数是命名空间,第二个参数是键。这会将用户信息存储到存储器中。
  6. user_id 通过配置传入。用于标识要更新信息的用户。