Skip to content
Published on

什么是框架工程(Harness Engineering)— 模型是固定输入,你交付的是它周围的一切

分享
Authors

同一个模型,为什么结果不一样

假设两个团队用同一个基础模型自动化同一类任务。一个团队的智能体接到 issue 后能产出通过测试的补丁,另一个团队的智能体在类似的 issue 上翻了一圈文件,卡在半路。这个对比是为了说明而构造的例子,但这个格局本身,运营过智能体的团队都不会陌生。既然模型相同,差异就来自模型之外。

把模型之外有什么写下来,清单比想象的长。暴露了哪些工具、多少个。工具失败时返回给模型什么。最多重试几次、依据什么停下来。每一轮往上下文窗口里放什么、丢掉什么。智能体能写到哪些路径。以及结果好不好由谁、按什么标准来判定。这整张清单以代码的形式存在、被部署,并左右任务成功率。

框架:围绕模型的整个执行系统

Lilian Weng 在 2026 年 7 月写的那篇文章给这张清单起了名字。框架是包裹基础模型、协调其执行的系统:决定模型如何思考与规划、如何调用工具与行动、如何感知与管理上下文、把产物存到哪里、如何评估结果的那一整层,都是框架。

本系列把这条边界之内的东西分成六个旋钮来讲。

  • 工具表面 — 暴露给模型的工具集合及其 schema。给多少个,用什么名字和描述。
  • 失败返回格式 — 工具失败时,是把异常字符串原样丢回去,还是把原因加可选替代方案结构化返回。
  • 循环 — 重试上限、停止条件、卡住时的升级路径。
  • 上下文策略 — 放什么、去掉什么、什么时候做摘要。
  • 权限 — 智能体能读写的范围,尤其是评估代码是否在这个范围之内。
  • 评估者 — 判定结果的打分器。它决定整个系统的上限。

前提只有一个。对大多数团队来说,模型是固定输入。既不训练基础模型也不做微调的团队,能动手的就是这六样,而这六样也已经足够多了。

"提示词工程"这个名字遮住了什么

这项工作长期以来的名字是提示词工程。这个名字并没有错,但它严重低估了范围。在上面六个旋钮里,提示词没有作为独立条目出现在任何一处。系统提示词是上下文策略的一部分,工具描述文案是工具表面的一部分。能用代码定义的空间远大于能用句子指示的空间,而真正大幅移动成功率的决定,大多在前者。

Anthropic 在 2024 年 12 月发布的智能体构建指南从工具这一侧点破了这件事。就像人有 UI 一样,智能体的接口就是工具定义,所以在工具设计上要花与提示词同等的功夫。同一篇文章还写道,在他们自己的 SWE-bench 工作中,花在优化工具上的时间比花在整体提示词上的还多。

失败返回格式也是同一类例子。在把异常字符串原样返回的框架里,模型倾向于重复同一个调用;在把失败原因和当前可尝试的替代方案结构化返回的框架里,下一次调用就会不一样。这种差异靠打磨提示词是买不来的,它完全是代码侧的决定。

工作流也好,智能体也好,框架都在那里

同一篇 Anthropic 文章把智能体式系统分成两类。工作流是把 LLM 与工具编排在预先确定的代码路径上;智能体则让模型自己决定下一步行动和工具使用。文章还建议从最简单的方案开始,只在需要时增加复杂度。很多问题,单次调用加上检索和示例就真的够用了。

从框架的视角重读这个区分,会得到这样的结论:工作流同样需要工具表面、失败返回格式、权限和评估者。越往智能体那头走,循环的主导权越移向模型,重试上限、停止条件、上下文策略的分量就急剧增大。无论哪一种,你部署的都是框架——而能说清自己部署了什么,管理才算开始。

旋钮不是各转各的

把六个旋钮写成代码,就是本系列的目录。

harness = {
    "tools": ["read_file", "write_file", "run_tests"],      # 第 3 篇:工具表面
    "on_error": "cause_plus_alternatives",                  # 第 3 篇:失败怎么返回
    "loop": {"max_retries": 3, "stop": "goal_check"},       # 第 4 篇:循环与停止条件
    "context": {"policy": "playbook", "budget": 12000},     # 第 2 篇:上下文预算
    "permissions": {"write": ["src/"], "deny": ["eval/"]},  # 第 6 篇:奖励作弊与权限
    "evaluator": "rubric_v3",                               # 第 5 篇:评估者瓶颈
}

要注意的是旋钮之间互相纠缠。提高重试上限的决定与失败返回格式纠缠在一起:没有原因的重试只是以更高的代价重复同一次失败。增加工具的决定与上下文预算纠缠在一起:工具的 schema 也吃 token。而所有旋钮都与评估者纠缠在一起:判定哪种组合更好的是评估者,评估者弱,比较本身就不成立。所以本系列逐个讲旋钮,但总会回到同一个问题:这次改动变好了,你凭什么知道?

亲手练习

这个博客有一个把框架工程做成游戏的框架工程 RPG:亲手组装刚才看到的六个旋钮,通关 27 个场景。第 1 层"观测与指纹"对应本文的内容。想打牢提示词侧的基本功,还有提示词工程练习工具

参考资料