2026/4/6 18:23:45
网站建设
项目流程
Harness Engineering 给 AI Agent 设计“缰绳 马鞍 跑道护栏 反馈镜子”的工程方法。它不是优化模型本身而是构建一整套让 Agent跑得稳、跑得久、不跑偏的运行控制系统。先说结论如果只用一句话解释 Harness Engineering它是在模型之外给 Agent 搭建一整套“可读、可控、可验证、可恢复”的运行环境。它关心的重点不是模型参数多不多Prompt 写得花不花换哪个底座更强而是Agent 为什么会半路跑偏为什么会“嘴上说做完了实际没做”为什么长任务越跑越乱为什么接了很多工具以后系统反而更不稳定怎么让同样的错误别反复发生这就是 Harness Engineering 想解决的问题。说明本文主要从 AI coding / agent 工程实践语境讨论 Harness Engineering强调其工程含义不追求术语的唯一标准定义。一、为什么会需要 Harness Engineering1.1 一个人人都能秒懂的场景想象你雇了一个天才实习生打字极快精力无限什么都懂一点永远不抱怨加班听起来很美好。 但真实工作里你很快会发现它有这些毛病症状具体表现偷懒多步骤任务做到一半就说“已完成”其实只做了前几步迷失长任务里忘了初始目标来回试已经失败过的方法自我感觉太好让它评估自己写的代码常常会说“没问题”哪怕明显有 bug上下文混乱对话一长、信息一多就开始草草收尾无视规矩团队有明确规范它仍按自己熟悉的风格乱写这些问题很多时候不是因为模型不够聪明而是因为它缺少一套外部约束和反馈系统。在一些长任务开发实验里研究者就观察到类似现象 当上下文越来越长、接近窗口上限时模型往往不是更认真地把任务收尾而是更容易出现“仓促结束”、“提前停止”这类行为。这个问题本质上不是智商问题而是运行环境设计问题。1.2 从“怎么问”到“怎么搭环境”过去两三年里AI 工程实践的关注重点大致经历了一个逐层外扩的过程阶段核心问题设计对象类比Prompt Engineering“该怎么问”发给模型的指令文本告诉厨师“中火煎 3 分钟”Context Engineering“该让模型看到什么”模型推理时可见的上下文给厨师备好食材、菜谱和注意事项Harness Engineering“整个运行环境怎么设计”Agent 外部的约束、反馈、验证和执行系统设计整个厨房的动线、安全规范、质检流程可以粗略理解成一种逐层扩展的关系Prompt 是最内层Context 更外一层Harness 再往外扩展到整套运行控制环境也就是说Prompt 解决“说什么”Context 解决“给什么”Harness 解决“整个系统怎么让它稳定做成”。二、Harness Engineering 到底是什么2.1 更准确的隐喻马具不只是接口层“Harness” 这个词本身就很有意思。它原本更接近缰绳马鞍挽具驾驭装置所以 Harness Engineering 最贴切的隐喻不是“给模型装饰一下”而是给一匹力量很大、速度很快、但方向感不稳定的马配上一整套能驾驭它的东西。LLM / Agent 很像这种“烈马”能力很强自主性更强但并不天然可靠不天然遵守你的项目规则不天然知道什么时候该停、什么时候该验证、什么时候该求助Harness 的价值就是让它的能力真正可驾驭。一个很有启发性的技术类比是模型像 CPU上下文窗口像 RAM而 Harness 更像围绕 Agent 的运行控制层。这个类比不是严格定义但很好理解模型负责推理上下文提供工作记忆Harness 负责组织流程、约束行为、保存状态、校验结果、处理异常2.2 一个更稳妥的定义如果用工程语言来定义Harness Engineering 是围绕 AI Agent 构建的一整套约束、上下文管理、反馈回路与执行控制机制目的是让模型在明确边界内稳定、可靠、可追踪地完成复杂任务。它关心的核心是怎么组织任务怎么限制行为怎么管理上下文怎么验证结果怎么处理中途失败怎么让同类错误别反复发生一句更大白话的话就是Harness 不是让模型更聪明而是让模型真正能上生产。2.3 它不是什么这点很重要。Harness 很容易和别的概念混在一起。容易混淆的概念它主要做什么和 Harness 的区别MLOps模型训练、部署、版本、推理基础设施Harness 更关注 Agent 的执行控制AI Gateway统一接入、鉴权、限流、路由那是请求入口Harness 更偏任务运行层Prompt Engineering优化单次提问措辞Harness 关注整套执行环境Agent 框架 / 编排框架提供工具、节点、流程积木框架是工具Harness 更像方法论 工程体系简单说MLOps 管模型生命周期平台工程管底座Harness 管 Agent 在真实任务里怎么被组织、约束、验证和兜底。三、Harness Engineering 的三根支柱为了便于理解可以把 Harness 的重点归纳成三类能力读得懂管得住学得会也就是可读性防御机制反馈回路支柱一可读性——让 Agent 读得懂你的系统Agent 在每次会话开始时其实对你的项目几乎一无所知。你不明确告诉它这个项目是什么技术栈代码目录怎么分哪些规则不能碰改完代码要跑什么命令什么算完成它就会按自己的“默认世界观”来做事。这就是为什么越来越多团队开始使用类似AGENTS.md这样的文件。什么是AGENTS.md可以把它理解成给 Agent 看的项目说明书。如果 README 是给人看的那AGENTS.md就是专门给 AI Agent 看的。一个简单例子# AGENTS.md## 项目概览这是一个 Next.js 14 TypeScript 全栈项目使用 App Router。## 技术栈- 框架Next.js 14App Router不要用 Pages Router- 语言TypeScript严格模式- 样式Tailwind CSS不要用 CSS Modules- 数据库Prisma PostgreSQL- 测试Vitest Testing Library## 开发命令- 安装依赖pnpm install- 开发服务器pnpm dev- 运行测试pnpm test- 类型检查pnpm typecheck- 代码检查pnpm lint## 代码规范- 组件使用函数式组件 Hooks禁止 Class 组件- 文件命名kebab-case- 不允许 any 类型## 架构约束- 所有 API 路由放在 app/api/ 下- 业务逻辑放在 lib/ 下- 环境变量通过 env.ts 统一管理禁止硬编码## 验证方式改完代码后必须执行1. pnpm typecheck2. pnpm lint3. pnpm test一个关键点不是信息越多越好很多人第一次做这件事容易犯一个错把所有文档、所有规则、所有历史都一股脑塞给模型。实际经验通常刚好相反全量灌输不如渐进披露。更好的做法是AGENTS.md只保留最关键规则详细设计和规范放到docs/让 Agent 按需查阅而不是一次塞满如果是 monorepo也可以分层放项目根目录/AGENTS.md├── packages/│ ├── web/AGENTS.md│ └── api/AGENTS.md这样 Agent 在不同子目录下读取到的规则更精准。支柱二防御机制——让 Agent 跑在轨道里而不是靠自觉Harness 的一个核心认知是软约束不够关键流程必须有硬约束。什么叫软约束“请先做计划再执行”“请不要跳过测试”“请遵守团队规范”这些写在 Prompt 里有用但不可靠。因为模型会忘、会忽略、会在压力下跳过。什么叫硬约束没计划就不允许进入下一阶段改了文件必须先跑测试没验证通过就不能宣称完成某些目录根本不允许写入这类约束一旦写进执行层Agent 就绕不过去。例子一状态机锁定执行阶段复杂任务最好不要一口气跑到底而是显式分阶段researchplanexecuteverify示意代码如下from enum import Enumclass AgentPhase(Enum): RESEARCH research PLAN plan EXECUTE execute VERIFY verifyclass PhaseStateMachine: ALLOWED_TRANSITIONS { AgentPhase.RESEARCH: [AgentPhase.PLAN], AgentPhase.PLAN: [AgentPhase.EXECUTE, AgentPhase.RESEARCH], AgentPhase.EXECUTE: [AgentPhase.VERIFY], AgentPhase.VERIFY: [AgentPhase.EXECUTE, AgentPhase.PLAN], } PHASE_PERMISSIONS { AgentPhase.RESEARCH: [read_file, search_code, list_files], AgentPhase.PLAN: [read_file, create_plan], AgentPhase.EXECUTE: [read_file, write_file, run_command], AgentPhase.VERIFY: [run_tests, run_lint, run_typecheck], }这样做的好处不是“显得高级”而是任务进度清晰可以局部重试可以强制先想后做可以阻止 Agent 一上来就乱改例子二防“嘴上完成实际上没做”很多 Agent 最大的问题不是不会做而是会“提前宣布胜利”。所以需要在执行层检查你说完成了有没有真实工具调用记录你改了代码有没有跑测试你说创建成功了外部系统里真的存在吗示意逻辑class ToolCallValidator: def validate_completion(self, agent_output, tool_call_log): if agent_output.claims_done and not tool_call_log.has_calls: return ForcedAction( actionretry, reason你声称任务已完成但没有工具调用记录。 ) if tool_call_log.has_file_writes and not tool_call_log.has_test_runs: return ForcedAction( actionrun_tests, reason检测到文件修改但未运行测试。 )例子三防止反复撞墙Agent 还很容易出现一个问题已经失败两三次了还在重复同样的动作。这时候就需要循环失败检测class LoopDetector: def __init__(self, max_retries3): self.failure_log [] self.max_retries max_retries def record_failure(self, action: str, error: str): self.failure_log.append({action: action, error: error}) def should_break(self, proposed_action: str) - bool: same_failures [ f for f in self.failure_log if f[action] proposed_action ] return len(same_failures) self.max_retries这和传统后端里的熔断器思路很像连续失败自动打断强制换路径例子四权限边界只要 Agent 能写文件、调 API、执行命令就必须有权限边界。class PermissionBoundary: FORBIDDEN_PATHS [.env, secrets/, config/production/, .git/] def check_file_access(self, file_path: str, operation: str): for forbidden in self.FORBIDDEN_PATHS: if file_path.startswith(forbidden): raise PermissionDeniedError( f禁止{operation}文件{file_path} )不要把“别碰生产配置”“别动密钥”这种话只写在提示词里。真正高风险的地方要靠代码层拦住。支柱三反馈回路——让 Agent 在犯错后越来越稳Harness 不是只负责“挡错”还要负责“吃一堑长一智”。一个非常关键的经验是生成和评估最好分开。因为 Agent 自己评自己往往容易“放水”。方法一自动化验证最基础的一层反馈回路就是写完代码自动跑 typecheck自动跑 lint自动跑测试不过就打回示意代码class FeedbackLoop: def run_verification(self, changed_files: list[str]): results [] type_result self.run_command(pnpm typecheck) results.append((typecheck, type_result)) lint_result self.run_command(pnpm lint) results.append((lint, lint_result)) test_result self.run_command(pnpm test) results.append((test, test_result)) return VerifyResult( passedall(r.success for _, r in results), details[ { check: name, passed: r.success, output: r.stdout[-500:], errors: r.stderr[-500:] if not r.success else None } for name, r in results ] )这一步看起来很普通但它是 Harness 最低成本、最高收益的能力之一。方法二把执行和评审拆开更进一步可以让一个 Agent 负责执行另一个 Agent 负责审查。流程大概像这样Agent A写代码 / 做实现 ↓Agent B按标准评审 / 找问题 ↓Agent A根据反馈修复 ↓再次验证示意代码async def dual_agent_review(task, executor, reviewer): MAX_ROUNDS 3 for _ in range(MAX_ROUNDS): result await executor.execute(task) review await reviewer.review( task_descriptiontask.description, code_diffresult.diff, review_criteria[ 是否完成所有要求, 是否有 bug, 是否遵循规范, 是否存在安全隐患, ] ) if review.is_good_enough(): return result task task.with_feedback(review.comments) return EscalateToHuman(result, review)它不一定非要上“多智能体架构”那么重哪怕只是换一个独立会话来审查效果通常都比“自己写自己夸”要好。方法三错误经验持久化Harness 最宝贵的一点是每一次错误都应该变成下一次的系统改进。比如维护一份经验文件# .harness/lessons-learned.md## 2026-03-20: Prisma 迁移必须在测试前执行- 问题修改 schema 后没跑 migrate- 修复在验证步骤中加入 migrate 检查- 状态已纳入硬约束## 2026-03-18: 不要在 middleware 中直接 throw- 问题导致页面白屏- 修复补充框架约束说明- 状态已写入 AGENTS.md形成一个闭环Agent 犯错→ 分析根因→ 更新文档 / 约束 / 验证→ 下次自动带上→ 同类错误减少这才是 Harness 真正的“工程化”。四、怎么从零搭一个最小可用的 Harness如果你今天就想开始不需要一上来搞复杂平台。先做一个最小可用版本就够了。第一步写一个AGENTS.md先别追求完美先把最关键的三类信息写清楚WHAT项目是什么、技术栈是什么HOW常用命令、开发流程、验证方式RULES哪些规范必须遵守、哪些目录禁止改这是让 Agent“读得懂系统”的第一步。第二步加一条硬约束比如最简单也最值回票价的一条只要改了业务代码就必须跑测试。如果是自己写 Agent 运行层可以这么做def post_edit_guard(agent, edited_files): src_files [f for f in edited_files if f.startswith(src/)] if not src_files: return result agent.execute(pnpm test --run) if not result.success: agent.feedback(f测试失败\n{result.stderr}\n请修复后重新运行。) return RetrySignal()这一条就能消灭很多“我已经做完了但其实没验证”的问题。第三步引入反馈回路最小版本就是Agent 写代码→ 自动 lint test→ 失败则反馈→ Agent 修复→ 再验证→ 直到通过或升级人工很多团队光做到这一步稳定性就会明显提升。第四步处理长任务的上下文问题长任务里一个常见坑是会话越来越长上下文越来越脏模型越来越不愿意认真收尾这时与其无限压缩上下文不如考虑结构化交接 新会话继续。示意代码class ContextManager: MAX_CONTEXT_UTILIZATION 0.6 async def run_with_reset(self, agent, task): subtasks self.decompose_task(task) for subtask in subtasks: if agent.context_utilization self.MAX_CONTEXT_UTILIZATION: handoff_doc await agent.generate_handoff( prompt总结1.已完成 2.当前进度 3.下一步 4.注意事项 ) agent agent.fresh_session() agent.load_context(handoff_doc) await agent.execute(subtask)核心思路是不要让一个会话死扛到底而是让任务可交接、可重置、可续跑。第五步形成持续改进飞轮当 Agent 出错时不要只骂模型不行。更有价值的问题是是不是缺信息是不是缺约束是不是缺验证是不是缺回退机制然后把它变成系统改进Agent 犯错→ 归因→ 补文档 / 补约束 / 补验证 / 补权限→ 记录经验→ 下次同类问题更少这就是 Harness Engineering 最核心的工作方式。五、一个完整执行时序长什么样假设 Agent 收到一个任务“修复src/login.tsx中的登录 bug”整个过程可能像这样1. Harness 启动新会话加载 AGENTS.md初始化状态为 RESEARCH2. Agent 请求读取 login.tsx3. Harness 检查RESEARCH 阶段允许 read_file放行4. Agent 想直接改代码5. Harness 检查RESEARCH 阶段不允许 write_file拒绝6. Agent 转而请求进入 PLAN 阶段7. Harness 校验状态迁移合法允许进入 PLAN8. Agent 生成修复计划9. Harness 允许 create_plan10. Agent 请求进入 EXECUTE11. Harness 允许状态迁移12. Agent 修改 login.tsx13. Harness 记录到文件修改事件14. Harness 自动触发验证守卫15. Harness 强制进入 VERIFY运行 typecheck / lint / test16. 若全部通过则任务完成否则把错误反馈给 Agent 重试这里会看到一个很关键的分工Agent 负责推理和执行Harness 负责约束和裁判Agent 不一定知道状态机代码长什么样 但它会真实感受到哪些动作被允许哪些动作会被拦下什么才算完成。六、真实工程实践给了我们什么启发关于 Harness Engineering最近一批公开分享有一个共同结论很多时候Agent 的瓶颈不只在模型能力更在运行环境设计。从这些实践里至少能提炼出几条一致经验1项目说明必须对 Agent 友好如果项目结构复杂、规范隐含、命令分散、禁区不明确Agent 很容易走错路。所以“让项目可被 Agent 读取”本身就是第一层工程能力。2关键流程必须靠硬约束不要只靠提示词提醒尤其是这些事改代码后必须验证高风险目录禁止写任务必须分阶段不能跳过测试直接宣布完成只写在 Prompt 里远远不够。3验证层越扎实Agent 越能被放心放权Agent 真正能承担更多执行工作不是因为“它看起来很聪明”而是因为外面有足够厚的验证层类型检查测试Lint安全扫描代码评审人工兜底这和传统工程里“自动化程度越高越需要可靠门禁”是一个道理。4同一个模型在不同 Harness 下表现差异会很大这是很多团队越来越清楚感受到的一点底层模型一样Harness 不一样最终产出质量可能差很多。也就是说Harness 不是“附属包装”而是会直接影响 Agent 的可用性、稳定性和上限。5Harness 不是一劳永逸而是跟模型一起演化模型变强后有些外层补丁会变得多余但新的能力边界出现后又会催生新的约束和验证需求。所以 Harness 不是“搭完收工”而是一个持续迭代的系统模型变强→ 某些旧约束变冗余→ 拆掉不必要的部分→ 暴露新的问题边界→ 新增新的 Harness 机制→ 继续演化这很像一套随着 Agent 能力变化而不断重构的“运行控制层”。七、给后端工程师的对标翻译如果你是后端 / Go / 平台工程背景可以这样理解Harness 概念后端里更像什么AGENTS.mdREADME 开发规范 contributor guide状态机约束工作流引擎 / Saga / Temporal权限边界RBAC 沙箱 ACL工具调用验证中间件 / AOP / 网关后置校验自动验证回路CI/CD 质量门禁多 Agent 评审Code Review / 审批流上下文重置无状态服务 会话持久化循环失败检测熔断器 / 重试策略Harness 整体面向 Agent 的执行控制系统所以对后端工程师来说Harness 不是一个玄学词。它更像工作流引擎 状态机 工具沙箱 验证器 补偿机制 可观测执行框架只不过这里被管理的“执行者”不再是固定代码而是 LLM / Agent。八、今天就能开始做的 5 件事不用等平台团队不用等架构升级今天就能做。序号行动耗时效果1写一个最小版AGENTS.md10 分钟Agent 不再总按默认习惯乱来2加一条硬约束改完代码必须跑测试30 分钟大幅减少“宣称完成但没验证”3把执行和评审拆开每次多 5 分钟更容易发现自我评估遗漏的问题4记录 Agent 的典型错误持续同类问题不必一错再错5让人审计划不是盯每一行代码改变协作方式更接近高效的人机分工九、一句话收束Harness 的本质到底是什么Harness Engineering 最值得记住的一点是模型已经足够强了接下来的竞争越来越多是在“谁更会设计它的运行环境”。前几年我们在研究怎么和模型说话怎么给模型更多上下文而现在越来越多团队开始研究怎么让模型在工程系统里稳定跑起来怎么让它别跑偏怎么让它犯过的错别再犯怎么让它从“能演示”变成“能交付”所以如果非要用一句最短的话来定义它Harness Engineering不是让模型更聪明而是让模型真正可驾驭、可上线、可交付。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】