AiRobotNews 人工智能机器人技术网

你的 Agent Harness 应该会自我修复

你的 Agent Harness 应该会自我修复

AI agent 在生产环境里失败的时候,你的可观测性工具会告诉你它到底做了什么,而对于该怎么修,几乎什么都不会说。

你会拿到一份干净的运行 trace:每一次模型调用、每一个触发的工具、每一步耗时、每一步花了多少 token。

拿不到的,是它为什么坏、哪一处改动能修好它,以及任何「下周不会再犯」的保证。

于是你只好一段一段地翻 trace,猜出一个理论,手写一个补丁,然后祈祷它没有把原本正常的东西弄坏。

接着新模型上线,带来一批新的失败模式,你又得把这套手工流程从头跑一遍。

真正的瓶颈不在可观测性,而在 trace 落到你屏幕上之后要发生的一切。

agent 失败后的链路追踪,以及之后仍然需要人工完成的修复循环

Cursor 最近分享了他们在 agent 外围那层 harness 上投入了多少工程——也就是包在裸模型外面的提示词、工具和检查。同一个模型,换成更好的 harness,结果会好得多,而这项工作永远不会真正结束。

这恰恰是所有可观测性平台止步的地方:它回答了「发生了什么」,然后把「为什么发生」「该改什么」「怎么防止再发生」原样退还给你。

今天大多数团队就卡在这个缺口里。这篇要讲的是它为什么反复被撕开,以及最终要怎样才能合上。

为什么现有可观测性在大规模下会失灵

大多数 agent 可观测性平台交付一条 trace 就结束了。

你拿到 span 树、延迟数字、token 成本和一个看板。你拿不到的仍然是:为什么失败、该修什么、以及「不会再坏」的保证。

  • 「发生了什么」→ 平台能处理
  • 「为什么发生」→ 人工
  • 「这里是修复方案」→ 人工
  • 「这次不会再坏了」→ 人工

在 2023 年,这是一个合理的产品。但对今天在生产里跑 agent 的团队,这是一个错误的抽象层。

问题是会自己滚大的:每次模型升级都引入新的失败模式,每加一个工具就多一批边界情况。harness 变复杂的速度,快过任何团队手工跟踪和修复的速度。

下面这套栈就是用来干这件事的。

从链路到修复的整条工具栈

Opik:面向 Agent 时代的可观测性与评测

Opik 是一个开源的日志、调试与优化平台,面向 AI agent 和 LLM 应用。它立在一个前提上:这个循环应该被自动化,而不是靠堆人力。

(原文注明本篇由 Comet ML 赞助,Opik 是他们的产品。)

Opik 平台界面

四层栈

Opik 的架构是一条连起来的流水线:

链路追踪 → Ollie 诊断 → Ollie 提出修复 → 应用修复并验证 → 测试套件把这次失败锁成回归测试 → 回到链路追踪。

下面逐层说。

四层闭环:追踪、诊断、修复验证、回归固化

第 1 层:链路追踪

每一次 LLM 调用、工具调用、检索步骤,都靠一个装饰器自动打点。

import opik

@opik.track
def my_agent(query: str):
    # your agent logic here
    ...

开箱支持 LangGraph、CrewAI 以及 50 多个框架。每条 trace 都会记录当时生效的 agent 配置,方便你之后重跑某个失败输入时完整复现。

自动追踪的调用链

第 2 层:Ollie

别的可观测性平台停在「这是你的 trace」。Opik 则由 Ollie 把 trace 一路推到改好的代码。

Ollie 是内置在 Opik 里的编码 agent,一个 agent,带着完整上下文。

Ollie 编码 agent

在完全没有代码访问权限的情况下,Ollie 也能读 span 树、识别失败模式、解释跨每一次 LLM 调用的因果链。你问它「为什么最终回答忽略了检索到的上下文」,它会走完整棵 span 树,把根因翻出来。

在项目根目录运行 opik connect,Ollie 就升级到完整的改码模式:

  • 读你的源文件
  • 定位到具体哪几行该负责
  • 提出一份 diff,没有你的明确批准,什么都不改

批准之后,Ollie 会用原始失败 trace 里的确切输入重跑你的 agent,把新的 trace 流式输出出来做并排对比,并把这次原始失败锁成测试套件里的一个回归用例。

坏 trace → 根因 → diff → 批准 → 重跑 → 回归锁定。

从坏 trace 到回归锁定的完整流程

第 3 层:测试套件

常见的评测流程是:建一个带标注的数据集,定义一个数值指标,比浮点数。这套东西适合研究者,它不匹配工程师对「质量」的思考方式。

Opik 用大白话写的断言替掉它:

suite = opik.TestSuite("crm-agent-v2")
suite.add_assertion("The response must include specific deal details, not just a count")
suite.add_assertion("The response must never reveal unauthorized information")
suite.run_tests()

底层会把这些转成 LLM-as-a-judge 的检查,每个用例给出干净的通过/失败。

测试套件的断言与结果

真正改变工作流的是这一点:你每调试一个失败 trace,它都会自动变成一个测试用例。套件从真实的生产失败里长出来,而不是由某个人提前编好的场景。

于是每一轮下来,harness 都更难被弄坏。

但即使测试套件在长大,你仍然需要一个在发布前安全试验改动的地方——那就是第 4 层。

第 4 层:Agent 沙箱

大多数 playground 是提示词 playground:改一下 system prompt,重跑一次 LLM 调用。这回答的是错误的问题。

生产上真正的问题是:我改这一处,整个 agent 图会怎样。

Opik 的 Agent Sandbox 在 UI 里端到端跑完整打点的 agent。改提示词、换模型、加工具,然后看整个系统在完整 span 树上怎么反应。每次沙箱运行都会产出一条完整的 Opik trace。

非开发岗——产品经理、领域专家、QA——都可以安全地试配置,不用碰 git。

飞轮跑起来是什么样

这四层不是四个独立功能,是一个循环。

用 @opik.track 打点,声明一个 opik.Config。生产上出错。Ollie 读 trace、读你的源码,提出修复。你批准。Ollie 在沙箱里用原始失败输入重跑 agent。修复通过。存成一个新的 Blueprint。环境指针提升到 staging。原始失败被锁成一条回归测试。

修复与回归固化的飞轮

下一次失败进入同一个循环。

每一轮下来,harness 都更难被弄坏。

把环闭上

当 agent 还简单的时候,止步于 trace 的可观测性是说得通的。可一旦它们进了生产,真正的工作是 trace 之后的一切,而这部分工作正是 Opik 替你跑完、而不是留给你自己扛的地方。

这整套东西都开源发布:追踪、Ollie、测试套件、Agent 沙箱,一个 6 种算法的 Agent Optimizer,以及 50 多个框架集成;项目在 GitHub 上已过 19.3K 星(按现在的仓库数据是 2.27 万星,Apache-2.0,最新版本 2.2.105)。

自托管三条命令:

git clone https://github.com/comet-ml/opik
cd opik
./opik.sh

Cursor 描述的那个手工循环,正是 Opik 想自己闭合的部分——从一条坏 trace 一直到一条锁定的回归测试。

如果你在生产里跑 agent,值得看一眼。

去 Comet ML 和 Opik 看看 →

作者在文末留了个问题:你的 agent 栈现在处于什么可观测性状态,调试循环又断在团队的哪一环?

资料来源