返回博客列表
agent人工智能harness29 分钟

从 Prompt 到 Harness:Agent 是如何一步步学会“自我约束”的

过去几年,大语言模型的发展有一个非常容易被忽略的变化:

我们真正进步的,并不只是模型本身越来越聪明,而是我们越来越擅长给模型建立“约束”。

最早,我们相信一个足够好的 Prompt 就可以让 AI 按照我们的要求工作。

后来,我们发现仅靠 Prompt 不够,于是给模型增加了思考过程;再后来,我们给它工具、函数调用、MCP、Skills、记忆、代码执行环境、测试系统、浏览器和各种反馈回路。

最终,我们逐渐得到今天所谓的 Agent

但如果把这些技术抽象到一起,会发现它们背后其实存在一个非常统一的思想:

Agent 并不是简单地让模型“自己做事情”,而是在模型之外建立一个 Harness,不断规定它应该如何行动、如何获取信息、如何验证自己的行为,以及失败以后如何重新行动。

换句话说:

Agent = Model + Harness。

而 Harness 的核心任务,就是把一个概率性的语言生成器,变成一个能够在约束环境中不断行动、验证和修正的执行系统。

这可能才是 Agent 这几年真正的发展主线。

一、最早的 Agent:其实只是一段 Prompt

最初的大语言模型并没有今天意义上的 Agent。

我们通常只是把一段指令放进 Prompt:

你是一名专业程序员,请帮我修复这个 Bug。 请仔细分析问题。 不要编造 API。 如果不确定,请告诉我。 输出最终代码。

看起来已经非常像一个 Agent 了。

但实际上,这里面几乎没有任何真正的“控制”。

模型依然只有一个动作:

生成下一段 Token。

它没有真正的文件系统,没有真正的数据库,没有编译器,没有浏览器,也没有一个外部机制能够判断它说的到底对不对。

于是出现了一个非常核心的问题:

模型知道“应该正确”,并不意味着它能够做到正确

例如:

text
请使用 Next.js 16 最新 API。

模型可能非常自信地写出一个实际上属于 Next.js 13 的 API。

因为模型真正拥有的知识并不是:

“Next.js 16 的 API 是什么?”

而更接近:

“根据我见过的文本,什么样的 Token 序列最可能出现在这里?”

这就是幻觉问题最底层的原因之一。

Prompt 可以告诉模型规则,却不能保证模型遵守规则。

所以早期所谓的 Prompt Engineering,本质上是在研究:

如何用自然语言最大程度地改变模型的概率分布。

这非常有用,但它天然存在上限。

二、第二阶段:让模型“先想一遍”

接下来出现了一个极其重要的变化:

不要让模型直接回答。

而是:

text
问题
 ↓
思考
 ↓
检查
 ↓
答案

这就是 Reasoning Model 的核心思想。

DeepSeek-R1 是这个阶段非常具有代表性的公开案例。DeepSeek 在 R1 的后训练中大量使用强化学习,并强调推理过程中存在大量反思与验证;官方 API 也将 reasoning content 与最终 content 分开。

这时候模型的行为从:

text
Input → Output

变成:

text
Input
  ↓
Reasoning
  ↓
Output

看起来只是多了一段文本。

但从 Harness 的角度来看,它实际上引入了一个非常重要的概念:

中间状态。

模型不再必须一步从问题跳到答案。

它可以先提出假设:

text
我认为答案可能是 A。

然后重新检查:

text
如果答案是 A,那么条件 X 是否成立?

再发现:

text
等等,X 不成立。

最后:

text
所以 A 不正确,应该重新推导。

这就是所谓的 self-verification / self-correction 的雏形。

DeepSeek 官方文档也明确说明,思考模式是在输出最终答案之前先生成推理过程,以提升最终答案的准确性。

三、但“思考”依然不是验证

这里有一个非常重要的区别。

很多人会把:

思考得更多

理解成:

验证得更多。

实际上两者完全不同。

如果让模型:

text
请仔细思考这个问题。

它可能只是生成了更多 Token。

甚至可能出现:

text
错误假设
 ↓
非常详细的推理
 ↓
非常自信的错误答案

因此真正重要的不是:

模型有没有思考。

而是:

模型有没有获得检查自己答案的能力。

这也是 Harness 开始真正发挥作用的地方。

四、第三阶段:Function Calling——给模型一双“手”

当模型开始具备 Reasoning 之后,下一个问题就出现了:

如果模型认为自己需要验证某件事情,它应该去哪里验证?

于是我们开始给模型工具。

例如:

text
模型
 ↓
我要计算 12345 × 67890
 ↓
调用 calculator
 ↓
得到结果
 ↓
继续推理

或者:

text
模型
 ↓
我要查询数据库
 ↓
调用 SQL Tool
 ↓
得到真实数据
 ↓
继续推理

或者:

text
模型
 ↓
我要检查代码
 ↓
调用 TypeScript Compiler
 ↓
得到类型错误
 ↓
修改代码

这一步非常关键。

因为模型第一次拥有了:

语言世界之外的反馈。

之前模型只能说:

“我觉得这个 API 存在。”

现在它可以:

text
import ...
↓
TypeScript
↓
error TS...

它不需要“相信自己”。

现实环境会告诉它答案。

于是 Agent 开始从:

text
Think → Answer

变成:

text
Think
 ↓
Act
 ↓
Observe
 ↓
Think
 ↓
Act
 ↓
Observe
 ↓
Answer

这已经非常接近现代 Agent 的基本循环。

五、MCP:把“工具”变成了标准化接口

Function Calling 解决了:

模型可以调用工具。

但还有一个问题:

工具从哪里来?

如果每个 Agent 都需要自己定义:

text
github_search()
github_issue()
github_pr()
notion_search()
database_query()
browser_open()
...

生态很快就会碎片化。

MCP(Model Context Protocol)解决的正是这一层问题。

它把 AI 应用与外部数据源、工具以及工作流之间的连接标准化。官方定义中,MCP 可以让 AI 应用连接本地文件、数据库、搜索引擎、计算器等外部能力。

于是 Agent 不再只是:

“我知道很多东西。”

而变成:

“我可以去很多地方获取事实。”

例如:

text
LLM
 │
 ├── MCP → GitHub
 │
 ├── MCP → Database
 │
 ├── MCP → Browser
 │
 ├── MCP → Figma
 │
 └── MCP → Documentation

这实际上是把模型从一个封闭的语言系统,变成了一个开放的执行系统

六、Skills:不仅告诉 Agent“有什么工具”,还告诉它“什么时候、怎么用”

MCP 更像是:

这里有一把锤子。

而 Skill 更接近:

当你遇到钉子的时候,应该拿这把锤子,并按照下面的流程操作。

这就是 Skills 的重要意义。

一个 Skill 往往包含:

text
什么时候触发
↓
需要读取什么上下文
↓
应该使用什么工具
↓
按照什么步骤执行
↓
哪些事情禁止做
↓
完成后如何验证

因此 Skill 本质上已经不是简单的知识库。

它更像是:

一份可以被模型执行的行为规范。

这也是为什么现在越来越多 Agent 系统开始出现:

text
AGENTS.md
SKILL.md
CLAUDE.md
rules/
instructions/
workflows/

这些东西看起来都是 Markdown。

但它们真正改变的并不是模型的知识。

而是:

模型的行为轨迹。

近期关于 Skill-Use 的研究甚至把 Skill 使用拆成了 Trigger、Compliance 和 Boundary 三个部分:模型是否正确触发 Skill、是否遵守流程,以及是否避免执行禁止操作。实验结果也表明,Skill 的效果高度依赖 Harness,而不是模型本身的固定能力。

这其实非常能说明问题:

一个模型有多强,和一个 Agent 有多可靠,是两件不同的事情。

七、真正的转折点:不要让 AI 判断自己“做对了没有”

到这里,我们已经拥有:

text
Prompt
Reasoning
Tools
MCP
Skills

但仍然存在一个致命问题:

谁来判断 Agent 做得对不对?

如果最后还是:

text
AI:
“我检查过了,代码没问题。”

那么实际上什么都没有改变。

因为:

让模型自己评价自己的答案,依然属于模型内部闭环。

真正可靠的 Harness,需要把验证过程尽可能放到模型之外。

于是出现了:

text
Agent
 ↓
生成代码
 ↓
TypeScript
 ↓
ESLint
 ↓
Unit Test
 ↓
E2E Test
 ↓
Browser
 ↓
真实环境

这就是现代 Coding Agent 非常重要的思想:

不要让 AI 直接解决问题,让 AI 生成一个可以被机器验证的解决方案。

八、代码为什么特别适合成为 AI 的 Harness?

因为代码有一个非常特殊的属性:

它可以被机器验证。

例如 AI 说:

我已经把类型修好了。

不需要相信它。

直接:

bash
tsc --noEmit

AI 说:

页面应该可以正常运行。

不需要相信它。

直接:

bash
pnpm build

AI 说:

登录流程没有问题。

不需要相信它。

直接:

bash
playwright test

于是我们获得了一个非常漂亮的反馈循环:

text
┌───────────────┐
│      LLM      │
└───────┬───────┘
        │
        ▼
   修改代码
        │
        ▼
┌───────────────┐
│ Type Checker  │
└───────┬───────┘
        │
     Fail?
      /   \
    Yes    No
    │       │
    ▼       ▼
  修复    E2E Test
            │
         Fail?
          /   \
        Yes    No
        │       │
        ▼       ▼
      修复     Done

这时候 Agent 的可靠性不再完全依赖:

“模型有多聪明。”

而开始依赖:

“我们能不能建立一个足够强的反馈系统。”

九、AI Workflow 的本质:把“回答问题”变成“通过测试”

这也是为什么现代 AI Workflow 越来越像软件工程。

传统 AI:

text
Question
 ↓
LLM
 ↓
Answer

现代 Agent:

text
Goal
 ↓
Plan
 ↓
Generate
 ↓
Execute
 ↓
Observe
 ↓
Validate
 ↓
Repair
 ↓
Validate
 ↓
...
 ↓
Success

这里最重要的不是 Plan。

甚至也不是 Generate。

而是:

Validate

因为只要存在一个可靠的验证器,Agent 就拥有了一个明确的优化方向:

继续行动,直到通过验证。

这和传统软件工程中的测试驱动开发非常接近。

不是:

“我觉得代码应该没问题。”

而是:

“测试通过了,所以在当前测试覆盖范围内,它满足了这些可验证条件。”

这也是 Harness 的核心:

把模糊的自然语言目标转换成可验证的状态。

十、Harness 可以被理解成“模型的现实世界”

如果把 LLM 看成一个大脑,那么 Harness 就非常像:

text
大脑
 +
眼睛
 +
耳朵
 +
手
 +
工具
 +
记忆
 +
环境
 +
规则
 +
反馈

一个裸 LLM 只能预测:

text
接下来应该说什么?

而一个 Agent Harness 让它面对:

text
接下来应该做什么?
↓
做完以后发生了什么?
↓
结果符合预期吗?
↓
如果不符合,应该怎么办?

所以:

Agent 的本质不是让模型拥有“自主意识”,而是给模型建立一个可行动、可观察、可反馈的闭环。

十一、Next.js 的 AGENTS.md:一个非常有代表性的最新案例

这个趋势甚至已经开始反过来改变框架本身。

2026 年的 Next.js 已经把 AI Agent 当成了一等使用者。

Next.js 官方现在会将与安装版本匹配的文档直接放进:

text
node_modules/next/dist/docs/

然后通过项目根目录的 AGENTS.md 告诉 Agent:

text
Before any Next.js work, find and read the relevant doc in
node_modules/next/dist/docs/.

Your training data is outdated —
the docs are the source of truth.

也就是说:

不要相信模型训练时记住的 Next.js。

而应该:

text
当前项目
 ↓
当前 package.json
 ↓
当前安装的 Next.js
 ↓
当前版本对应的本地文档
 ↓
Agent

Next.js 官方文档明确解释了这一设计:安装 next 时会将版本匹配的文档放在 node_modules/next/dist/docs/,而 AGENTS.md 的作用就是要求 Agent 在写代码之前读取这些文档。

这其实是一个非常漂亮的 Harness。

因为它解决的是 Agent 最常见的问题之一:

模型知道 Next.js,但不知道你现在使用的是哪个 Next.js。

更有意思的是,Next.js 团队的评估显示,这种“始终可用的版本匹配上下文”在其评测中优于依赖 Agent 自己决定是否检索 Skill 的方案。

这说明了一个很重要的 Harness 原则:

不要把关键验证交给模型自己决定是否进行。

如果“读取文档”非常重要,就应该把它设计成流程的一部分。

十二、甚至“PUA Agent”也可以从 Harness 的角度理解

所谓 PUA,并不应该简单理解成“骂 Agent”。

真正值得关注的是它背后的控制思想:

text
你说完成了?
↓
证据呢?
↓
运行测试。
↓
失败了?
↓
继续修。
↓
再测试。
↓
还有问题?
↓
继续。

它把 Agent 从:

“完成任务”

变成:

“证明任务已经完成”。

这两个目标完全不同。

前者优化的是:

text
生成一个看起来像完成了的答案

后者优化的是:

text
产生一个能够通过验证的结果

这就是 Harness 思维。

十三、世界模型:Harness 开始从“文字规则”走向“物理反馈”

如果继续沿着这条路线发展,会出现一个更加有趣的方向:

World Model。

在文本世界里:

text
Agent
 ↓
文字
 ↓
文字反馈

而在物理世界:

text
Agent
 ↓
动作
 ↓
物理世界
 ↓
状态变化
 ↓
传感器
 ↓
反馈

例如一个模型学习机器人控制。

它可能预测:

text
如果向前移动 10cm,
物体应该移动到这里。

然后真正执行。

如果现实世界告诉它:

text
物体没有移动。

那么这个错误就是一个非常强的监督信号。

它不能靠一句:

“我觉得应该移动。”

来覆盖现实。

物理世界本身就是 Validator。

这就是为什么世界模型、机器人、模拟器、游戏环境会成为 AI 发展的重要方向。

十四、为什么游戏特别适合训练 Agent?

因为游戏天然提供了:

text
状态 State
动作 Action
奖励 Reward
失败 Failure
目标 Goal
环境 Environment

这几乎就是一个完美的 Agent Harness。

例如:

text
Agent:
我要通过这个关卡。

Game Engine:
你可以选择:
↑
↓
←
→
攻击
跳跃

Agent:
跳跃。

Game Engine:
失败。

Agent:
重新规划。

Agent:
攻击 + 跳跃。

Game Engine:
成功。
Reward = +1

这和现实世界的 Agent Loop 非常相似:

text
Observe
 ↓
Think
 ↓
Act
 ↓
Observe
 ↓
Evaluate
 ↓
Retry

只不过游戏引擎提供了一个成本低、反馈快、状态明确的世界。

因此游戏并不仅仅是 AI 的娱乐应用。

它本质上是:

一个廉价、可重复、可自动评分的世界模型实验场。

十五、Remotion 也是一种很有意思的 Harness

再看一个看起来完全不同的例子:

AI + Remotion 视频生成。

如果让 AI:

“帮我做一个科技感视频。”

那么结果很难验证。

但是如果把任务变成:

text
AI
 ↓
生成 React / Remotion Code
 ↓
TypeScript
 ↓
Render
 ↓
生成视频
 ↓
检查视频帧
 ↓
发现问题
 ↓
修改 Code
 ↓
重新 Render

事情就完全不同了。

AI 不再直接“描述一个视频”。

它生成:

一个可以被渲染器执行的程序。

而 Render Engine 就变成了 Validator。

于是:

text
Natural Language Goal
        ↓
       LLM
        ↓
   Program / Code
        ↓
    Type Checker
        ↓
     Renderer
        ↓
     Video
        ↓
      Judge
        ↓
      Repair

这其实和 Coding Agent 完全是同一种思想。

只是 Validator 从:

text
TypeScript Compiler

换成了:

text
Browser / Renderer / Vision Model / Video Evaluator

十六、于是我们可以重新定义 Agent

如果把这些案例全部放在一起:

| 技术 | 实际增加了什么 | | ---------------- | ---------------------- | | Prompt | 行为规则 | | Chain of Thought | 中间推理状态 | | Reasoning Model | 更强的内部搜索/反思 | | Function Calling | 外部行动能力 | | Tools | 外部验证与信息获取 | | MCP | 标准化工具/数据连接 | | Skills | 程序化行为规范 | | Memory | 跨任务状态 | | Code Execution | 可执行反馈 | | Type Checker | 形式约束 | | Unit Test | 局部行为验证 | | E2E Test | 系统行为验证 | | Browser | 真实环境反馈 | | AGENTS.md | 持久化行为规则 | | World Model | 模拟环境反馈 | | Game Engine | 可重复的环境与奖励 | | Remotion | 将创意转换为可执行程序 | | Evaluator | 外部质量判断 |

你会发现:

它们并不是互相独立的技术。

它们全部在解决同一个问题:

如何限制一个概率模型的行为,使它最终产生我们真正想要的结果?

十七、Harness 的真正定义

所以,我更愿意把 Harness 定义为:

Harness 是包围在模型外部的一层控制系统,它负责提供上下文、约束模型行为、管理工具、执行动作、获取环境反馈、验证结果,并在失败时驱动模型重新尝试。

它至少可以拆成几个部分:

text
┌──────────────┐
                 │     Goal     │
                 └──────┬───────┘
                        ↓
┌────────────────────────────────────────┐
│               HARNESS                  │
│                                        │
│  Context ───────→ LLM                  │
│                    │                   │
│  Rules ───────────→│                   │
│                    ↓                   │
│                 Decision                │
│                    │                   │
│                    ↓                   │
│                  Tools                 │
│                    │                   │
│                    ↓                   │
│                Environment             │
│                    │                   │
│                    ↓                   │
│                 Feedback               │
│                    │                   │
│                    ↓                   │
│                Evaluator               │
│                    │                   │
│               ┌────┴────┐              │
│               │         │              │
│             Pass       Fail            │
│               │         │              │
│               ↓         └────→ Retry   │
│             Done                       │
└────────────────────────────────────────┘

因此:

Prompt 是 Harness 的最早形态。

Agent 是 Harness + Model 的系统化形态。

而现代 Agent 的竞争,也正在逐渐从:

谁的模型参数更多?

转向:

谁能设计出更好的 Harness?

十八、真正重要的不是“让 AI 更聪明”,而是“让错误变得昂贵”

这是整个发展史中最值得注意的一点。

一个没有 Harness 的模型:

text
犯错
 ↓
输出
 ↓
结束

一个有 Harness 的 Agent:

text
犯错
 ↓
测试失败
 ↓
获得反馈
 ↓
重新思考
 ↓
修改
 ↓
再次测试
 ↓
……

Harness 并没有消灭模型犯错的能力。

它做的是另外一件事情:

让错误无法轻易通过系统。

这是一种非常工程化的思想。

软件工程从来没有假设程序员不会犯错。

所以我们建立:

text
Type System
Linter
Compiler
Unit Test
Integration Test
E2E Test
CI
Code Review
Production Monitoring

AI 现在正在逐渐获得完全类似的一套东西。

所以未来的 Agent,很可能不会是:

一个越来越聪明、什么都知道的超级模型。

而更可能是:

一个普通模型 + 极其优秀的 Harness。

十九、从“模型中心”走向“系统中心”

过去我们评价 AI:

text
GPT-4 比 GPT-3 强
R1 比某模型强
新模型 Benchmark 更高

但 Agent 时代,这种评价方式正在变得越来越不完整。

因为最终效果可能是:

text
Model A + Harness A = 80%
Model B + Harness B = 85%

Model A + Harness B = 95%
Model B + Harness A = 72%

这时候你很难再说:

B 是一个更强的模型。

因为真正决定任务成功率的,是整个系统。

2026 年已经出现了直接研究 Harness 本身的工作。例如 MemoHarness 将 Agent Harness 定义为管理上下文、工具、编排、记忆、解码和输出处理的外部控制层,并尝试让 Harness 从执行经验中持续学习。

甚至更进一步,Harness-R1 开始研究让一个专门的模型根据 Agent 的失败轨迹去修改其运行时 Harness,也就是:

text
Agent 失败
 ↓
分析失败轨迹
 ↓
修改 Harness
 ↓
重新运行
 ↓
观察成功率
 ↓
继续优化 Harness

这意味着一个非常有意思的递归:

我们不再只训练模型,也开始训练“如何控制模型”。

二十、最终可能形成一个“验证递归”

如果把整个 AI 发展史继续往前推,我们甚至可以得到这样一个循环:

text
模型生成答案
      ↓
Harness 验证答案
      ↓
发现错误
      ↓
Harness 修改上下文 / 工具 / 流程
      ↓
模型重新执行
      ↓
再次验证
      ↓
发现 Harness 本身存在问题
      ↓
优化 Harness
      ↓
……

于是:

text
Model
  ↓
Agent
  ↓
Harness
  ↓
Meta-Harness
  ↓
Self-Improving Harness

这可能是 Agent 下一阶段真正值得关注的方向。

二十一、所以 Agent 到底是什么?

如果一定要用一句话总结:

Agent 不是一个“会自己做事的 LLM”,而是一个被 Harness 包围的 LLM。

它通过:

text
Context
+
Rules
+
Reasoning
+
Tools
+
Memory
+
Environment
+
Verification
+
Feedback

形成一个闭环。

而这个闭环最重要的性质不是:

AI 能不能一次性给出正确答案。

而是:

AI 能不能发现自己的错误,并且在外部反馈的约束下不断逼近正确答案。

这也是为什么我们会看到一条非常清晰的发展路线:

text
Prompt
  ↓
Instruction
  ↓
Chain of Thought
  ↓
Reasoning
  ↓
Function Calling
  ↓
Tools
  ↓
MCP
  ↓
Skills
  ↓
Code Execution
  ↓
Tests
  ↓
E2E
  ↓
Environment
  ↓
World Model
  ↓
Self-improving Harness

表面上看,这是十几个完全不同的技术。

但从更高的抽象层来看,它们其实都在做同一件事情:

把“生成答案”变成“在约束环境中搜索正确答案”。

结语:AI 的终点可能不是更大的模型,而是更好的“笼子”

我们曾经认为:

AI 不够聪明,所以要训练更大的模型。

后来我们发现:

即使模型很聪明,它仍然会犯错。

于是我们开始给它思考。

然后给它工具。

给它搜索。

给它浏览器。

给它代码执行环境。

给它 MCP。

给它 Skills。

给它数据库。

给它编译器。

给它测试。

给它模拟器。

给它真实世界。

最后甚至开始研究:

如何让 Harness 自己学习。

这条路线的终点并不是把 AI 变成一个永远不会犯错的神。

恰恰相反。

我们逐渐接受了一个更加现实的工程事实:

模型一定会犯错。

真正重要的是:

不要让错误直接变成最终结果。

让模型思考。

让模型行动。

让环境反馈。

让程序验证。

让测试拒绝。

让 Agent 修复。

让它再次运行。

直到结果满足约束。

这或许就是 Agent Engineering 最核心的思想:

不是相信 AI,而是构建一个让 AI 必须不断证明自己的系统。

而所谓 Harness,本质上就是这样一个系统。

它不是限制 AI 的“笼子”。

它更像是 AI 能够可靠工作的轨道

没有轨道,模型只能自由生成。

有了轨道,模型才真正开始执行。

而当轨道本身也能够从失败中学习时,我们才可能真正走向下一代 Agent。

加载评论中...