乐于分享
好东西不私藏

AI 编程系列七:AI 写代码时,Agent Harness 在背后做了什么?

AI 编程系列七:AI 写代码时,Agent Harness 在背后做了什么?
虎隐于程代码如山 · 行者无疆HU YIN / CODEISSUE 07
AI 编程系列七:AI 写代码时,Agent Harness 在背后做了什么?

AI 说:“代码写好了,测试也通过了。”

但它可能既没有创建文件,也没有运行测试。

在普通对话框里,AI 可以生成一段看起来正确的代码,也可以根据代码推测运行结果。可如果它没有接触文件系统、调用命令、读取输出,那么所谓的“完成”,可能只是一次语言生成。

这正是 AI 代码生成与 AI 编程 Agent 的分界线:前者给出答案,后者必须在真实环境中完成任务。

要跨过这条线,只靠模型不够。代码要写进文件,命令要经过权限判断并实际执行,运行结果还要重新送回 Agent。把这些环节串成闭环的,就是藏在模型背后的Agent Harness

上一篇提到:

AI Agent ≈ Model + Harness

模型负责理解任务、决定下一步做什么;Harness 提供工具、环境和反馈,让行动真正发生。

这次不讲抽象定义,我们直接拆解一段 Claude Code 的真实执行记录。

任务很简单:

写一个 Python 脚本,参数是 JSON 数组,数组元素为纯数字,脚本计算参数之和。

从收到要求到汇报完成,整个过程可以拆成五步:

理解 → 写入 → 执行 → 反馈 → 汇报
Claude Code 创建并运行 sum_json.py
第一步:理解——把要求变成行动方案

Claude Code 需要先把自然语言要求转换成代码方案:

  • 使用 Python 编写脚本;
  • 从命令行接收 JSON 数组;
  • 支持整数和小数;
  • 输出所有数字之和。

截图没有展示模型内部的推理过程,但生成的代码反映了最终选择:

import argparse import json import sys   def parse_numbers(value: str) -> list[int | float]:     try:         numbers = json.loads(value)

它用argparse接收参数,用json解析数组,再通过parse_numbers处理输入。

到这里,模型只是决定了“怎么做”。代码要进入真实项目,还需要 Harness 提供行动能力。

第二步:写入——让代码真正落到文件里

接下来,Claude Code 调用了 Write 工具:

Write(sum_json.py) └─ Wrote 32 lines to sum_json.py

这是 Harness 发挥作用的第一个直接证据。

模型生成代码,Harness 调用文件工具,把内容写入当前工作目录,形成一个 32 行的sum_json.py文件。

这和在聊天窗口里返回代码并不是一回事。后者还要由人复制、创建文件、粘贴并保存;前者已经改变了真实环境。

Agent 不只是在告诉你怎么做,它已经开始动手了。

第三步:执行——代码必须真的跑一次

文件写完后,Claude Code 没有马上宣布完成,而是调用 Bash:

python3 /Users/huzi/coding/meeting-demo/sum_json.py '[1, 2, 3.5]' && \ python3 /Users/huzi/coding/meeting-demo/sum_json.py '[]'

这条命令运行了两组输入:

  1. [1, 2, 3.5]
    ,验证整数和小数混合的情况;
  2. []
    ,验证空数组这个边界情况。

截图里还有一行:

Allowed by auto mode classifier

它说明工具调用还经过了当前执行策略的权限判断。模型提出要运行命令,Harness 负责把调用交给权限机制,并在获得允许后执行。

所以,“Agent 会运行命令”至少包含两件事:模型决定运行什么,执行系统决定能不能运行,并负责把命令交给真实环境。

第四步:反馈——别猜,让环境给答案

Python 进程返回了两行输出:

6.5 0

对应:

[1, 2, 3.5] → 6.5 [] → 0

这不是模型阅读代码后推测的结果,而是 Python 真实运行后的输出。

Harness 把输出送回任务上下文,Agent 才能判断:文件能不能执行,程序输出是否符合预期,下一步应该继续修改还是结束任务。

这条反馈通道决定了 Agent 能不能形成闭环。如果返回的是报错,它可以读取错误、修改代码、再次运行;如果结果符合预期,它才有依据汇报完成。

没有反馈,Agent 只能执行动作;有了反馈,它才能根据结果继续工作。

第五步:汇报——“完成”必须有执行记录支撑

收到结果后,Claude Code 在最终回复中说明:

已创建脚本:sum_json.py

随后给出使用方法:

python3 sum_json.py '[1, 2, 3, 4]' # 输出:10

它还补充了小数示例:

python3 sum_json.py '[1.5, 2, 3.2]' # 输出:6.7

最后汇报:

测试已通过。

这里要分清“真实测试”和“使用示例”:Bash 实际执行并返回的是6.50106.7是最终回复里补充的示例。

真正支撑“测试已通过”的,不是这句话本身,而是前面发生过的工具调用和执行反馈。

Harness 提供的,不是工具列表,而是执行闭环

把五步连起来,就能看清模型和 Harness 的分工:

理解:模型把要求转换成代码方案   ↓ 写入:文件工具创建 sum_json.py   ↓ 执行:权限判断通过后,命令工具运行脚本   ↓ 反馈:环境返回真实结果 6.5 和 0   ↓ 汇报:Agent 根据执行记录说明结果

在这次任务中,我们能直接观察到 Harness 提供的四项能力:

文件工具:把代码写进真实文件 命令工具:在真实环境中运行程序 权限控制:约束工具调用能否执行 反馈通道:把程序输出送回 Agent

单独看,它们只是几个工具和接口。连起来,它们才构成 Agent 的执行闭环:

决策 → 行动 → 观察 → 再决策

所以,判断一个 AI 编程工具是否真的完成了任务,不能只看它最后说了什么。还要看文件是否发生变化、命令是否实际执行、结果是否返回,以及它的结论能否被执行记录验证。

模型让 AI 知道下一步该做什么,Harness 让这一步真实、可控、可验证地发生。

下一篇,我们进入 Harness Engineering:当任务从一个脚本变成真实项目,怎样设计这套执行闭环,才能让 Agent 少走弯路,也不把“做过了”误当成“做对了”。


后续持续更新 AI 编程实战技巧。

往期文章请查看:AI 编程系列

关注本号,不错过 AI 编程干货,转发收藏,开发遇到问题随时翻阅。

虎隐于程代码如山 · 行者无疆