拥有你的 Harness,才能拥有你的 Memory(记忆)


快速阅读

在构建 AI Agent 的过程中,Agent Harnesses(脚手架框架)已经成为了主流,并且它们与 Agent 的 Memory(记忆)紧密相连。如果你选择了一个封闭的 Harness——特别是隐藏在专有 API 后面的那种,你实际上就将 Agent 的记忆控制权拱手让给了第三方。

记忆对于打造优秀、有粘性的 Agent 体验来说至关重要。将记忆锁定在单一的平台中不仅危险,还会带来极高的迁移成本。因此,Memory(记忆)以及承载它的 Harness(脚手架)应该是开源的。只有开源,你才能真正拥有、控制并塑造属于自己的 Agent 记忆体系和数据飞轮。

Agent Harnesses 是构建 Agent 的基础,且不可替代

过去三年,构建 Agent 系统(智能体系统)的“最佳”方式发生了翻天覆地的变化。当 ChatGPT 刚问世时,我们只能做一些简单的 RAG 链(比如早期的 LangChain)。随着模型逐渐变强,它们能够创建更复杂的流(如 LangGraph)。直到它们变得非常强大,便催生了一种全新的架构:Agent harnesses(智能体脚手架)。

目前典型的 Agent Harnesses 包括:Claude Code、Deep Agents、Pi(OpenClaw 的底层驱动)、OpenCode、Codex 以及 Letta Code 等等。

有人认为,大语言模型(LLM)最终会吸收并取代所有的脚手架功能。其实不然。实际发生的情况是,我们在 2023 年需要的一些早期脚手架功能现在确实不需要了,但它们被其他类型的脚手架取而代之。

根据定义,Agent 就是一个不断与工具和数据源进行交互的 LLM。在这个 LLM 的外围,永远都需要一个系统来促成、管理这种交互。证据何在?当 Claude Code 的源代码被泄露时,人们发现了足足 512,000 行代码——这些代码本身就是它的 Harness。即便世界上最强模型的创造者,也在脚手架上投入了巨大的精力。

哪怕是 OpenAI 和 Anthropic API 中内置的“网络搜索”功能,它们其实也不是“模型本身的一部分”,而是一个轻量级的 Harness,位于 API 后端,纯粹通过工具调用(tool calling)来调度模型与搜索 API。

Harnesses 与记忆(Memory)紧密相连

Sarah Wooders 曾写过一篇很棒的博客,指出“记忆不是一个插件,它就是 Harness 本身”。我完全同意这种看法。

总有人觉得记忆是一个独立于特定 Harness 的服务。但至少在现阶段,这种想法是不成立的。

Harness 的很大一部分职责就是处理上下文(Context)。正如 Sarah 所说:

要求在 Agent Harness 中“插入”记忆,就像要求在一辆车上“插入”驾驶功能一样。管理上下文,即管理记忆,是 Agent Harness 的核心能力与职责。

记忆本质上是一种上下文的形式。短期记忆(对话中的消息、大型工具调用的结果)由 Harness 处理;而长期记忆(跨会话的记忆)也需要 Harness 来读取和更新。Sarah 还列举了 Harness 与记忆相关联的许多其他方面:

  • AGENTS.md 或 CLAUDE.md 文件是如何加载到上下文中的?
  • 技能(skill)的元数据是如何展示给 Agent 的?(在系统提示词里?还是在系统消息中?)
  • Agent 可以修改自己的系统指令吗?
  • 在记忆压缩(compaction)之后,什么留存,什么丢失了?
  • 交互是否被存储并且可查询?
  • 记忆的元数据如何呈现给 Agent?
  • 当前工作目录是如何表示的?暴露了多少文件系统信息?

现阶段,记忆这一概念仍处于起步期。目前长期的记忆通常并不包含在最小可行性产品(MVP)里。你需要先让 Agent 运转起来,然后再考虑个性化。这意味着整个行业仍在摸索阶段,也尚未形成通用的记忆抽象标准。未来当记忆变得更加清晰、最佳实践出现后,独立的记忆系统也许会变得合理,但绝不是现在。目前,“Harness 如何管理上下文和状态,最终就是构建 Agent 记忆的基础”。

如果你不拥有 Harness,你就不拥有你的记忆

Harness 与记忆是深度绑定的。如果你使用封闭的 Harness(尤其是 API 后端的),你就失去了对记忆的所有权。

这种情况有几种表现形式:

  • 有点糟糕:如果你使用有状态的 API(比如 OpenAI 的 Responses API,或者 Anthropic 的服务端压缩),你其实是在他们的服务器上存储状态。如果你想切换模型并恢复之前的对话流,这就不可能做到了。
  • 非常糟糕:如果你使用完全封闭的 Harness(比如使用闭源 Claude Code 的 Claude Agent SDK),这个 Harness 会以一种你完全未知的方式处理记忆。它可能在客户端创建了某些 artifact,但它们的结构是什么?Harness 怎么使用它们?一切都是黑盒,因此完全无法迁移到另一个 Harness 上。
  • 最糟糕的情况:整个 Harness,包括长期记忆,全部被封闭在一个 API 之后。

在这个极端情况下,你对记忆拥有零所有权,也毫无可见度。你不仅不知道 Harness 的运作方式(意味着你不知道怎么使用记忆),你甚至连记忆本身都不拥有!或许有些部分通过 API 暴露给你,或许什么也没有——你对此毫无控制力。

当人们说“模型会吸收越来越多 Harness 的功能”时,这其实意味着——这些关于记忆的部分,都将隐藏在模型提供商的专有 API 之后。

这是一个极其令人担忧的趋势——这意味着,记忆将会被死死锁定在单一平台和单一模型中。

模型提供商有着极大的动机这么做。他们已经开始行动了。Anthropic 推出了 Claude Managed Agents,将所有的东西都封装在 API 之后,把你锁定在他们的生态里。

即使没有将整个 Harness 放在 API 后面,他们也在一步步这么做。比如:尽管 Codex 是开源的,但它生成的却是一份加密的压缩摘要,这份摘要在 OpenAI 的生态系统之外完全无法使用。他们为什么要这么做?因为记忆太重要了,记忆能带来单靠模型无法实现的“锁定效应”(Lock-in)。

记忆至关重要,它是天然的锁定

虽然记忆的发展还很早期,但所有人都清楚它的价值。正因为有了记忆,Agent 才能在与用户的互动中不断进步,并让你建立起数据飞轮。它让你的 Agent 能够为每个用户提供个性化服务,塑造出契合用户欲望和习惯的独特体验。

没有记忆,你的 Agent 任何人只要拿到相同的工具就可以轻易复制。 有了记忆,你就拥有了专有的数据集——一份包含用户交互与偏好的无价之宝。这份数据集使你能够提供差异化且越来越智能的体验。

直到今天,切换模型提供商还相对容易,因为它们的 API 大同小异。你可能需要微调一下提示词,但这不算难。因为大家目前大都是**无状态(stateless)**的。

可一旦涉及状态,切换的难度将呈指数级上升。因为记忆太重要了,一旦切换,你就失去了这些记忆。

说个小故事:我自己有一个内部的邮件助手。它建立在 Fleet(我们用于构建企业级 OpenClaw 的零代码平台)之上。这个平台内置了记忆功能,过去几个月我在使用过程中积累了大量习惯。但几周前,我的 Agent 被意外删除了。我当时气疯了!我试图用同一个模板重新创建一个,但体验感大幅下降——我不得不重新教它我的所有偏好、语气以及各种细枝末节。

虽然邮件 Agent 被删令人沮丧,但也让我深刻意识到:记忆的力量是多么强大,用户的粘性是多么高。

拥抱开源记忆与开源 Harness

记忆必须被开源,必须由开发这些智能体体验的人亲自掌控。它允许你建立起一套真正由你控制的专有数据集。

记忆(以及承载它的 Harness)应该与底层模型提供商分离开来。你应该保留尝试和切换任何最适合你应用场景的模型的选择权。模型提供商则天然有动机通过记忆来制造生态锁定。

这就是为什么我们开始开发 Deep Agents 的原因。Deep Agents:

  • 完全开源
  • 与模型无关(Model agnostic)
  • 使用诸如 agents.md 和 skills 这样的开放标准
  • 拥有针对 Mongo、Postgres、Redis 等数据库的插件来存储记忆
  • 支持通过 LangSmith Deployment 进行自托管,可以部署在任何云端
  • 支持自带数据库作为记忆存储库
  • 兼容任何标准的 Web 托管框架

为了拥有你自己的记忆,你必须使用一个开源的 Harness。

🔗 原文链接:Your harness, your memory