如何给你的 Agent 加上记忆

---
title: "如何给你的 Agent 加上记忆"
author: "Jake Broekhuizen (@jakebroekhuizen)"
source_url: "https://x.com/jakebroekhuizen/status/2069828911501021337"
published_at: "2026-06-24T17:04:02.000Z"
fetched_at: "2026-06-25T12:54:08Z"
updated_at: "2026-06-25T12:55:14Z"
language: "zh"
review_status: "draft"
---

![](https://pbs.twimg.com/media/HLlyq1BaAAA3dhR.png)

# 如何给你的 Agent 加上记忆

构建一个让你的 agent 能从过去动作中学习的[循环](https://www.langchain.com/blog/the-art-of-loop-engineering),可以创造出会和用户一起成长的、令人愉悦的 agent 式体验。这通常被称为[**记忆**](https://docs.langchain.com/oss/python/concepts/memory)。有了记忆,用户就不必不断重复同样的纠正;agent 在第一次被告知该怎么正确做事之后,就能把它记住。

具体实现还在演进,但抽象很简单。为了实现记忆,你需要在后台跑一个过程,寻找 agent 出错的地方,或本可以学到新信息的地方,然后把这些信息提取、泛化成某种数据结构。这里还有很多细节尚未解决。本文会走一遍这个过程的一个具体实现。它会用到:

- [LangSmith Observability](https://docs.langchain.com/langsmith/observability) 作为 trace(轨迹)存储
- [LangSmith Engine](https://docs.langchain.com/langsmith/engine) 作为分析 trace 的过程
- [LangSmith Context Hub](https://docs.langchain.com/langsmith/use-the-context-hub) 作为记忆存储

### 什么是记忆?

记忆是 agent 可以跨运行检索的持久上下文,用来指导它的行为。它可以包含事实、偏好、过往交互、指令、技能、示例,以及学到的模式。

[trace](https://docs.langchain.com/langsmith/observability-concepts#traces)、转录文本或日志,都是“发生了什么”的有用证据。只有当相关经验被转换成一种上下文,agent 能在之后某次运行中检索它,并用它改变自己的行为时,它才成为记忆。

为了判断什么该放在哪里,把记忆分成两个范围会很有帮助:短期(或“工作”)记忆和长期记忆。

[**短期记忆**](https://docs.langchain.com/oss/python/concepts/memory#short-term-memory)是 agent 正在处理眼前任务时可用的上下文:当前会话线程(thread)、最近消息、工具结果、检索到的文档、中间推理产物,以及 agent 完成当前工作所需的临时文件或状态。

[**长期记忆**](https://docs.langchain.com/oss/python/concepts/memory#long-term-memory)是会在当前运行结束后继续存在的上下文:事实、偏好、示例、工作流、策略、指令和技能。它们应该在之后仍然可用,并随着时间塑造 agent 的行为。

两者之间是一套读写循环。在一次运行中,只要 harness 把相关上下文提供给 agent,agent 就能从长期记忆中受益。这可能通过组装 prompt、从存储中检索、工具访问、文件、运行时状态,或其他上下文加载机制来完成。随着运行展开,工作记忆会变化。运行结束后,trace 会给我们留下“发生了什么”的证据。大多数证据应该保留为历史,但其中一部分可能包含有用信号:一个 agent 应该记住的偏好、一条需要澄清的指令、一个应该变成规则的工具使用模式,或一个应该更新的技能。

思考长期记忆时,一个有用方式是把它分成语义记忆、情景记忆和程序性记忆。这套分类[借自认知科学](https://arxiv.org/abs/2309.02427),也常被映射到语言 agent 系统里。

- [**语义记忆**](https://docs.langchain.com/oss/python/concepts/memory#semantic-memory)是 agent 知道什么:事实、偏好和通用知识。
- [**情景记忆**](https://docs.langchain.com/oss/python/concepts/memory#episodic-memory)是 agent 经历过什么:过往交互、示例、动作和结果。
- [**程序性记忆**](https://docs.langchain.com/oss/python/concepts/memory#procedural-memory)是 agent 应该如何行动:指令、工作流、策略、技能和工具使用规则。

![](https://pbs.twimg.com/media/HLlzpBCa4AAgbON.jpg)

agent 行为中很多最明显的改进,都来自*程序性*记忆。当一个 agent 反复把答案格式写错、以错误顺序调用工具、委派给错误的 subagent,或忽略语气规则时,修复方式往往是程序性的:把规则写得更清楚,改变 agent 遵循的步骤,或者把这类行为移到一个更具体、专门负责该任务的 skill 里。

### 高层记忆流程

从高层看,一个运转良好的 agent 记忆循环有三部分:捕获 trace、分析 trace、更新记忆。

**1. 捕获 trace**

trace 是证据层。一个埋点良好的 trace 会记录 agent 完成任务时走过的路径:用户输入、模型调用、工具输入与输出、检索到的文档、路由决策、延迟、错误,通常还包括用户反馈。

这很重要,因为不同于传统的确定性软件,你往往只有检查 agent 的轨迹之后,才知道它到底是怎么表现的。意外行为可能来自一个薄弱的 prompt、缺失的工具、令人困惑的工具 schema、糟糕的检索、过期上下文、过宽的指令,或一个悄悄把工作送到错误地方的路由决策。检查 trace 能让你把这些原因隔离出来。

**2. 分析 trace**

trace 被捕获之后,下一步是找出有用信号。有些信号来自明确反馈或 eval 失败。有些来自反复出现的模式:同样的坏输出、同样的无效工具调用、同样的路由错误,或同样被忽略的指令。

难点在诊断。同一个症状可能指向不同修复。如果 agent 忽略了一条语气规则,可能是这条规则太模糊,放错了地方,缺失于相关 skill,或与另一条指令冲突。

**3. 更新记忆**

一旦理解了信号,系统就应该决定未来上下文是否需要改变。这可能意味着修一个问题,比如澄清一条指令或改变一条路由规则;也可能意味着记住某个有用的东西,比如用户偏好、一个成功示例,或 agent 之后应该复用的模式。

![](https://pbs.twimg.com/media/HLlz-aRaMAIIE_B.jpg)

### 如何用 LangSmith 做这件事

你可以用 LangSmith 完成整个 agent 记忆循环:

- **捕获 trace:** LangSmith Observability
- **分析 trace:** LangSmith Engine
- **更新记忆:** LangSmith Context Hub

在 LangSmith 里,tracing 提供捕获这一步。tracing 项目会给你一个丰富的轨迹存储,保存 agent 曾经走过的路径,让你可以检查并理解 agent 为什么会那样表现。

LangSmith Engine 是把这些 trace 转成改进信号的后台过程。它不要求你手动检查每一次运行,而是分析 trace 中反复出现的问题,诊断可能的根因,并提出能改进未来行为的具体修改——它可能会添加一条规则,把某条指令移到更接近相关工作流的位置,创建一个新示例,更新一个 skill,或修改一条路由策略。

Context Hub 是这些修改变成持久 agent 上下文的地方。它提供了一个带版本管理的位置,用来管理你的 agent 所使用的指令、工具和技能,因此记忆就不只是散落在应用代码里的临时 prompt 修改。

一旦上下文被更新,之后的运行会把它重新加载进 agent。这就闭合了循环——trace 被捕获,Engine 提取改进信号,Context Hub 存储记忆,下一次运行从更新后的上下文开始。

![](https://pbs.twimg.com/media/HLl0JraWQAAk80m.jpg)

### 有用记忆的设计原则(来自经验)

有几条原则可以帮助这个循环更可靠:

1. **不是所有东西都应该成为记忆更新。** 大多数 trace 数据应该保留为历史。有些应该变成数据集示例、eval、代码修改或工具 schema 修复。只有很小一部分应该变成持久上下文。
2. **确保未来的运行真的会读到这次更新!** 如果运行时会缓存 prompt、工具或技能,那么记忆提交需要一条刷新路径。否则系统可能存下了正确更新,却仍然带着过期上下文继续运行。
3. **用 eval 保护重要行为。** 如果一条记忆更新重要到会塑造未来行为,通常就值得有一种方法来检测这个行为什么时候退化。

### 致谢

感谢 @sydneyrunkle 和 @hwchase17 的认真审阅和反馈