问题与目标
“让 Agent 记住一切”听起来方便,却会带来上下文膨胀、跨用户串线和错误事实长期传播。短期消息、任务进度、用户偏好和知识库证据具有不同生命周期,不能都放进聊天历史。
本篇区分 Thread 内短期记忆、结构化任务状态、跨 Thread 长期记忆和外部知识。示例用 Checkpointer 保存会话,用 Store 保存用户偏好,并由服务端 Context 提供用户身份。
核心概念
| 数据 | 生命周期 | 典型内容 | 建议位置 |
|---|---|---|---|
| 短期上下文 | 单个 Thread | 消息、最近工具结果 | Graph State + Checkpointer |
| 任务状态 | 单个任务 | 步骤、审批、重试、产物 ID | 结构化 State |
| 长期记忆 | 跨 Thread | 用户偏好、稳定资料 | Store + 命名空间 |
| 知识事实 | 文档版本周期 | 规则、手册、制度 | RAG 知识库 |
长期记忆不是把全部聊天复制到数据库。应明确谁写入、何时更新、怎样过期、如何删除,以及它是用户声明、系统事实还是模型推断。
可运行实现
bash
python -m pip install "langchain>=1,<2" "langgraph>=1,<2" "langchain-openai>=1,<2"
python
from dataclasses import dataclass
from langchain.agents import create_agent
from langchain.tools import ToolRuntime, tool
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.store.memory import InMemoryStore
@dataclass(frozen=True)
class Context:
user_id: str
@tool
def save_reply_style(style: str, runtime: ToolRuntime) -> str:
"""保存用户明确要求的回复风格。"""
user_id = runtime.context.user_id
runtime.store.put(("preferences", user_id), "reply_style", {"style": style[:30]})
return "saved"
@tool
def get_reply_style(runtime: ToolRuntime) -> str:
"""读取当前用户保存的回复风格。"""
item = runtime.store.get(("preferences", runtime.context.user_id), "reply_style")
return item.value["style"] if item else "not_set"
agent = create_agent(
model="provider-model-name",
tools=[save_reply_style, get_reply_style],
context_schema=Context,
checkpointer=InMemorySaver(),
store=InMemoryStore(),
)
config = {"configurable": {"thread_id": "u-17:conversation-1"}}
agent.invoke(
{"messages": [{"role": "user", "content": "以后请用简洁风格回答。"}]},
config,
context=Context(user_id="u-17"),
)
result = agent.invoke(
{"messages": [{"role": "user", "content": "我喜欢怎样的回复?"}]},
config,
context=Context(user_id="u-17"),
)
print(result["messages"][-1].text)
生产中使用持久 Checkpointer 与 Store,并在服务端从认证信息创建 Context。不要让模型从参数中指定要读取哪个用户的命名空间。
长会话接近上下文上限时,保留最近消息和未完成任务状态,对较早消息做版本化摘要。摘要可能有误,关键业务事实仍应回到数据库或知识库核验。
常见问题与排查
Thread ID 相同就共享长期记忆
Thread 只组织短期状态。长期 Store 使用独立命名空间;跨线程读取必须由认证用户 ID 控制。
自动保存模型推断的用户信息
默认只保存用户明确声明或业务系统确认的信息。模型推断应标记来源和置信度,并提供查看、更正与删除能力。
摘要后丢失未完成审批
审批、步骤和产物 ID 应放在结构化任务状态,不能依赖自然语言消息摘要恢复。
把知识库内容写入用户记忆
文档事实有版本和权限,应留在 RAG 系统。记忆可以保存用户偏好或最近使用的文档 ID,而不是复制整个来源。
小结
记忆设计首先是生命周期和权限设计。Checkpointer 保存 Thread 内状态,Store 保存跨会话记忆,知识库保存有来源的事实;分开之后才能安全裁剪、更新和删除。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


