Agent Harness
Agent Harness 指包裹模型、让它能够完成任务的运行时:执行循环、工具定义与执行、上下文组装、状态持久化、权限与沙箱、结果验证和可观测性。同一个模型放进不同的 Harness,任务成功率可能差别很大。本文以编码 Agent 为例说明各模块的职责和它们之间的关系。
1. 面试核心
先记住这几条,再读正文2. 模块与职责
| 模块 | 职责 | 编码 Agent 中的例子 |
|---|---|---|
| 执行循环 | 调用模型、分发工具调用、判断停止 | 最大步数、超时、重复调用检测 |
| 工具层 | 定义工具契约,校验参数并执行 | 读文件、搜索、编辑、运行命令、测试 |
| 上下文组装 | 每轮选择放入窗口的信息 | 系统规则、仓库指令、相关代码、最近的工具结果 |
| 上下文压缩 | 窗口接近上限时整理历史 | 摘要旧对话,保留目标、已改文件和未解决错误 |
| 状态与会话 | 保存进度,支持中断后恢复 | 会话日志、待办列表、Git 提交作为检查点 |
| 权限与沙箱 | 区分读、写、执行、联网、发布的风险 | 写文件前确认,命令在容器或受限目录执行 |
| 验证 | 用外部证据判断完成 | 运行测试、类型检查、构建,失败时把输出写回 |
| 扩展机制 | 按需加载额外能力 | Skills、MCP 服务器、子 Agent、Hook |
| 可观测性 | 记录轨迹、用量和错误 | 每步的工具调用、耗时、Token、退出原因 |
这些模块和模型解耦:换模型时大部分 Harness 代码不变,但提示词、工具描述和预算参数需要重新评测。
3. 一次修改任务的链路
以“修复一个失败的单元测试”为例:
- 组装上下文:系统提示描述可用工具和规则;读取仓库指令(如
AGENTS.md);用户描述的失败现象。 - 探索:模型调用搜索和读文件工具,定位测试和被测函数。Harness 对大输出截断或分页,避免一次读入整个仓库。
- 修改:模型提出编辑。Harness 检查路径是否在工作区内、是否需要用户确认,然后应用修改并返回 diff。
- 验证:模型调用测试命令,Harness 在沙箱中执行并返回退出码与关键输出。失败则继续循环。
- 保存进度:长任务中,Harness 把待办、已改文件和最近的测试结果写入会话状态;上下文压缩时这些信息必须保留。
- 停止:测试通过且模型给出总结,或触发步数、预算上限。
链路中真正保证结果可靠的是第 4 步:完成依据来自测试与构建输出,而不是模型声明。
4. 长任务的处理
单个上下文窗口装不下的任务,需要 Harness 把进度保存在窗口之外:
- 外部进度文件:用待办列表或进度文件记录已完成和剩余工作,新会话先读取它。
- 增量提交:每完成一个可验证的单元就提交,出错时可以回退,新会话也能从 Git 日志了解历史。
- 环境初始化脚本:让新会话能用一条命令启动服务和测试,不必重新摸索环境。
- 子 Agent:把搜索或独立子任务放到子 Agent 的独立上下文中,只把结论返回主循环,见多 Agent 协作。
5. 常见问题
5.1 Harness 和 Agent 框架有什么关系
LangGraph、Claude Agent SDK、OpenAI Agents SDK 等框架提供 Harness 的部分或全部模块,例如循环、状态检查点、工具注册和追踪。自研 Harness 通常出于对上下文策略、权限模型或部署环境的特殊要求。选型时比较的是这些模块是否满足需求,而不是框架名称。
5.2 Hook 在 Harness 中做什么
Hook 在固定事件上执行确定性代码,例如工具调用前检查命令、写文件后运行格式化、会话结束时做清理。它把必须执行的规则从提示词中移出:提示词只能让模型倾向遵守,Hook 一定会运行。
6 · 面试题卡片
6.1 什么是 Agent Harness?一个标准的 Harness 包含哪些核心模块?
出现公司:小红书、字节跳动、凌脉、科大讯飞、阿里云
考察重点
- 模型与运行时的职责边界。
- 按调用链路列出模块,并说明每个模块解决的问题。
参考回答
Harness 是模型之外让 Agent 能运行的全部工程部分。模型只根据上下文生成下一步;Harness 决定给模型看什么、执行它提出的动作、保存进度、阻止越权操作并判断是否完成。
按一次调用链路,核心模块有:执行循环(调用模型、分发工具、停止条件)、工具层(契约、参数校验、执行)、上下文组装与压缩、状态与会话持久化、权限与沙箱、结果验证(测试、构建等外部证据),以及轨迹和用量的可观测性。扩展机制如 Skills、MCP 和子 Agent 用来按需增加能力。
6.2 如果让你从零设计一个 Coding Agent,你会怎么设计?
出现公司:百度、字节跳动、蚂蚁、美团
考察重点
- 以可验证结果为中心组织循环。
- 代码库上下文、长任务进度、权限与沙箱的设计。
参考回答
先定工具集:搜索(grep、文件名)、读文件(分页)、编辑(基于字符串替换或补丁,返回 diff)、运行命令。循环采用 ReAct,设置步数、超时和预算上限。
上下文方面,系统提示放工具说明和通用规则,启动时加载仓库指令;代码按需检索而不是整体塞入;窗口接近上限时压缩历史,但保留目标、已修改文件、失败输出和待办。完成判断依赖测试、类型检查和构建结果,失败输出写回循环。
安全方面,读操作默认允许,写文件和执行命令按风险分级确认,命令在容器或受限目录中运行,网络和凭据单独授权。长任务把进度写入文件并增量提交,支持中断后恢复。最后记录每步轨迹,用一组真实修复任务评测成功率和成本。
6.3 Harness 和上下文工程有什么区别?模型变强后 Harness 还重要吗?
出现公司:百度、阿里淘天
考察重点
- 上下文工程是 Harness 的一个模块。
- 模型能力提升会改变哪些 Harness 设计,哪些职责不会消失。
参考回答
上下文工程解决“每一轮给模型看什么”:选择、排序、压缩和隔离信息。Harness 还包括工具执行、权限与沙箱、状态持久化、验证和观测,这些不依赖上下文内容。
模型变强后,一些补偿模型弱点的结构可以简化,例如过细的工作流拆分、固定的提示模板、多轮自我检查。但执行动作、权限控制、外部验证和故障恢复是运行时职责,模型本身无法提供。因此每次换模型都应重新评测,删除不再带来收益的结构,保留安全和验证相关的部分。