LangChain 为 OpenWiki 0.4.0 加入自我纠错记忆机制
Building Self-Correcting Memory in OpenWiki
LangChain 发布 OpenWiki 0.4.0,为这个代码知识库加入 claims 运行时,让 wiki 中的事实性断言与支撑它的代码证据建立版本化关联,证据变化时断言被标记为 stale 并在后续更新中重新校验或修正。
原文给出 claims 运行时与评测数据,读者可据此判断智能体记忆如何随代码变更自我纠错。
记忆存在遗忘问题
记忆系统的优劣取决于其遗忘能力。
关于智能体记忆的大多数讨论都集中在创建记忆并使其日后可被检索。长期记忆引入了另一个常被忽视的有趣问题。当事实来源发生变化时,曾经正确的事实可能变得过时,而记忆系统却没有可靠的方式来察觉这一点。随着时间推移,这会导致记忆系统因记忆漂移和记忆污染等问题而退化。
这个问题在像 OpenWiki 这样的记忆系统中尤为明显,因为其事实来源是随时间演进的代码。起初,wiki 可能准确地描述了 API 行为或存在的各种功能,但随着代码变化,这些行为和功能也可能改变。如果关于它们的文档知识不与代码保持同步,那么 wiki 的这些部分就会变得过时。
为了让 OpenWiki 具备遗忘和自我纠正的能力,我们需要一种方式,不仅保留 wiki 所相信的内容,还要保留这些信念背后的证据。这使 OpenWiki 能够察觉支持某项主张的证据何时发生了变化,并识别出 wiki 中哪些部分可能需要重新审视。
为 wiki 的信念提供依据
第一步是让 OpenWiki 持久记录它所做出的实质性事实主张。这意味着当智能体编写 wiki 页面时,它还必须识别该页面中的主张以及代码中支持这些主张的证据。
举个例子,如果 wiki 说失败的任务默认会重试三次,OpenWiki 会记录这一主张以及支持它的代码。
{
"statement": "Failed tasks are retried three times by default.",
"evidence": [
"repo://src/scheduler.ts#L393-L404"
]
}随后运行时为支持性证据记录一个版本,以便日后可以再次验证该主张。这样做就在 wiki 中的每项主张与支持它的代码之间建立了链接。OpenWiki 不再把 wiki 当作一堆文本,而是可以追踪单个主张及其所依赖的证据。
知晓知识何时过时
一旦某项主张与证据建立了链接,OpenWiki 就能通过比较最初支持该主张的源版本与当前存在的版本来检测该证据何时发生变化。如果两者不同,该主张就会被标记为过时。
过时的主张并不一定意味着该主张是错误的。它意味着 OpenWiki 不能再安全地假定该主张仍然为真,除非再次检查源。许多代码变更并不会立即让依赖它的主张失效,但确实构成了重新审视它的理由。
OpenWiki 无需为此持久保存单独的状态标志。存储的证据版本足以在每次更新时重新验证该主张的新鲜度,因此不确定性会一直持续,直到证据被重新检查。

纠正过时的主张
检测过时知识只有在系统有办法纠正它时才有用。
当 OpenWiki 判定某项主张过时时,它可以检查当前的支持性证据,并判断该主张是真还是假。如果该主张仍然为真,OpenWiki 可以刷新证据版本。如果该主张现在为假,则 wiki 内容及其支持性证据会一并更新。
重要的行为是,过时的声明会一直保持过时状态,直到该验证真正发生。随着时间推移,这会形成一个自我纠正的反馈循环。对源头的更改会使先前可信的声明变为过时,而这种不确定性会一直持续,直到每条声明再次得到验证。Wiki 更新会让文档重新与当前的真实情况保持同步。
这与从头重新生成 wiki 不同。OpenWiki 会持久保存它已经知道的内容,跟踪哪些声明已经过时,并在源头持续演变的过程中纠正这些声明。
将声明连接到 OKF v0.2
声明为 OpenWiki 提供了每个页面所相信内容的内部记录,以及支持它的带版本证据。Open Knowledge Format (OKF) v0.2 使页面级结果可移植,并可在 OpenWiki 之外进行检查。
OpenWiki 将声明证据投射到每个页面的 OKF sources 元数据中,用 generated 记录哪个生产者最后更改了页面正文,并且只有在页面的完整声明集已经过协调、重新检查并持久化之后,才添加 verified。该 wiki 的根索引声明了 okf_version: "0.2",使这个 Markdown 包能够被其他消费 OKF 的工具识别。
这带来了有用的职责分离。声明决定各个信念是否仍然可信。OKF 传达包含这些声明的文档的来源、证据来源和验证历史。详细的声明和精确的证据版本保留在 OpenWiki 的 sidecar 中,而可移植的 Markdown 则作为 OKF front matter 的一部分暴露标准信任摘要。
这在实践中如何运行
过时检测会在每次 wiki 更新开始时运行,早于 agent 执行任何操作。运行时遍历完整的声明集,并将每条声明持久化的证据版本与当前源头进行比较。这是一个确定性的检查,不调用模型,因此即使 wiki 累积了数千条声明,它也能保持快速。
agent 从不自行扫描声明集。当它在更新期间读取某个页面时,该页面上任何过时的声明都会与内容一起被呈现出来,并且它会在已经进行的工作中解决这些问题:重新验证声明并刷新其证据,或者同时纠正声明和 wiki 文本。任何未解决的内容都会保持标记,留待未来更新处理,而不是被悄悄丢弃。
实际效果是,更新成本随代码变更量而变化,而不是随 wiki 持有的声明数量而变化。
评估遗忘能力
为了衡量这一点,我们构建了一个评估,通过一系列 git 提交回放一个代码仓库,并在预定义的检查点更新 wiki。这些不同的提交引入了新功能、对现有行为的更改、错误修复和回滚。
每次更新后,我们评估 wiki 中的事实性声明,并将每条声明分类为以下之一:
- Supported:该声明得到当前检查点代码的支持。
- Stale:该声明在较早的检查点上是准确的,但代码此后已更改,因此它不再成立。
- Hallucinated:该声明在仓库历史上的任何时刻都从未为真。
- Unverified:该声明无法根据代码得到确认或反驳。
我们在有和没有 OpenWiki claims runtime 的情况下运行了相同的序列。
| Baseline (n = 2000) | Claims (n = 2000) | |
|---|---|---|
| Supported | 92.9% | 97.8% |
| Stale | 3.5% | 0.5% |
| Hallucinated | 0.7% | 0% |
| Unverified | 2.9% | 1.7% |
在每次更新中,我们看到过时声明从基线中的 80 条下降到使用 claims runtime 时的 9 条,而幻觉声明从 15 条下降到 0 条。
我们也在单个运行中直接观察到了这种自我纠正行为。在一个例子中,一次代码变更导致 wiki 中 17% 的声明在第一个检查点变为过期。到下一个检查点时,过期声明已恢复到 0%,受支持的声明从 77% 回升至 98%
| 检查点 | 受支持 | 过期 | 幻觉 | 未验证 |
|---|---|---|---|---|
| T1 | 77% | 17% | <1% | 5% |
| T2 | 98% | 0% | <1% | 2% |
这正是我们最关心的行为。claims runtime 让 OpenWiki 能够识别现有知识何时可能不再可信,在多次更新中持续保留这种不确定性,并在代码持续演进的过程中稍后加以纠正。
是什么让记忆能够自我纠正
记忆系统必须能够说明自己相信什么以及为什么相信。更重要的是,当曾经有效的内容变得过期时,系统必须能够遗忘并自我纠正。
claims runtime 为 OpenWiki 提供了这种能力。Claims 将 wiki 知识与源证据持久地关联起来,因此当证据发生变化时,受影响的声明会被标记为过期。之后的 wiki 更新便能够验证或自我纠正过期声明,而无需从头重建 wiki。
在这种模型中,遗忘并不完全是删除旧记忆。相反,它关乎知道某个信念何时不应再被信任。这让 OpenWiki 能够主动遗忘,并与其所代表的源代码一同演进,而不是逐渐偏离它。
试用 OpenWiki 0.4.0
如果你已经在使用 OpenWiki,升级到 0.4.0 将自动开始为你的 wiki 生成 claims,并在下一次更新时迁移到 OKF v0.2。查看仓库或通过我们的官方文档了解更多关于 OpenWiki 的信息:
今天就试用:
npm install -g openwiki@latest
openwiki --init来源:LangChain Blog · langchain.com