别只盯着模型:聊聊 Agent Harness
从一个现象说起 用 AI 写代码的人大概都有过类似的体验:同一个模型,放在网页聊天框里改一个复杂项目,它给你贴一大段代码,粘哪儿你自己想;换到 Claude Code 这类编码工具里,它能自己读文件、跑测试、看报错、再来一轮,几分钟后交回来一个能跑的 diff。 模型明明是同一个,差别在哪? 在模型外面那一层:谁来维持任务状态、给它什么工具、允许它碰哪些文件、上下文快满了怎么办。这层东西有个名字,harness。 这个词原本是赛马用的马具,套在马身上,把马力变成人能驾驭的速度。放到 AI 语境里,它指包裹模型的整套工程脚手架。 harness 里都有什么 把一个 agent 产品拆开看,大致几层: 调度循环:最核心的部分。收任务、调模型、执行工具、看结果、决定下一步,直到任务完成或需要人介入。 工具层:文件读写、shell、搜索、浏览器。每个工具的定义、描述、错误信息都是设计出来的。 上下文管理:什么时候压缩历史、裁掉什么、哪些信息要挪到外部存储。 权限与沙箱:哪些操作直接放行、哪些要人确认、危险命令怎么拦。 记忆:跨会话记什么、忘什么。 骨架用伪代码写出来其实很短: while not task_done: response = model.call(context, tools) if response.wants_tool: result = sandbox.execute(response.tool_call) # 权限检查在这 context.append(result) else: break # 模型认为任务完成 跑得起来,demo 一小时就能写完。但生产级 harness 的复杂度全在省略号里:工具调用失败怎么重试、上下文超限怎么压缩、用户中途打断怎么恢复、两个工具并发改同一个文件怎么办。工程量和这个 while 循环完全不在一个量级。 判断一个 harness 的成色,我的经验是别看它顺利的时候多流畅,看它出错的时候怎么表现:重试有没有上限,错误信息有没有传回给模型,会不会带着坏状态继续跑。 五个常见误区 误区一:harness 就是个 API 封装 最低配确实如此,所以很多人低估了它。但"能跑"和"能用"之间隔着大量脏活:权限模型、上下文管理、失败恢复、可观测性。Anthropic 在 Building Effective Agents 里反复强调别急着上复杂框架,先把简单模式的可靠性做扎实。这句话反过来读,就是说简单模式做到可靠本身就很难。 误区二:上下文窗口够大,就不用管上下文了 窗口从 128K 涨到 200K 再到 1M,于是有人觉得历史记录一股脑塞进去就行。但窗口大不等于注意力够用。长上下文有个被反复观察到的现象(有人叫它 context rot):信息越多,模型对中段内容的利用越差,关键细节容易被淹没。 ...