> ## Documentation Index
> Fetch the complete documentation index at: https://langchain.idochub.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# 长期记忆

<Warning>
  **Alpha 版本提示：** 本文档涵盖的是 **v1-alpha** 版本。内容尚不完整，且可能随时变更。

  如需查阅最新稳定版本，请参阅 v0 版本的 [LangChain Python 文档](https://python.langchain.com/docs/introduction/) 或 [LangChain JavaScript 文档](https://js.langchain.com/docs/introduction/)。
</Warning>

## 概述

LangChain 代理使用 [LangGraph 持久化机制](/oss/python/langgraph/persistence#memory-store) 来实现长期记忆功能。这是一个较高级的主题，需要掌握 LangGraph 才能使用。

## 记忆存储

LangGraph 将长期记忆以 JSON 文档的形式存储在 [存储器](/oss/python/langgraph/persistence#memory-store) 中。

每条记忆都按自定义的 `命名空间`（类似文件夹）和唯一的 `键`（类似文件名）组织。命名空间通常包含用户或组织 ID 或其他标签，便于信息分类。

这种结构支持记忆的层级化组织，并可通过内容过滤器实现跨命名空间搜索。

```python theme={null}
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="语言偏好"
)
```

有关记忆存储器的更多信息，请参阅 [持久化指南](/oss/python/langgraph/persistence#memory-store)。

## 在工具中读取长期记忆

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

<a id="write-long-term" />

## 从工具中写入长期记忆

```title="更新用户信息的工具示例" {highlight={16,18,24,30}} theme={null}
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` 是一个将数据存储在内存中的存储器。在生产环境中，通常应使用数据库或其他持久化存储。请查阅 [存储器文档](https://langchain-ai.github.io/langgraph/reference/store/) 获取更多选项。如果使用 **LangGraph Platform** 部署，平台将为您提供生产就绪的存储器。
2. `UserInfo` 类是一个 `TypedDict`，用于定义用户信息的结构。LLM 将据此格式化响应。
3. `save_user_info` 函数是一个允许代理更新用户信息的工具。在用户希望更新个人资料信息的聊天应用中非常有用。
4. `get_store` 函数用于访问存储器。您可以在代码的任何位置（包括工具和提示）调用它。此函数返回创建代理时传入的存储器。
5. `put` 方法用于将数据存储到存储器中。第一个参数是命名空间，第二个参数是键。这会将用户信息存储到存储器中。
6. `user_id` 通过配置传入。用于标识要更新信息的用户。
