想让 AI Agent 更强?先搞懂 Harness Engineering
为什么你的 AI Agent 总是失败——而且这不是 Model 的错关于为什么聪明的 AI 系统在生产环境中依然会崩溃的令人不适的真相——以及那个最终能修复它的工程学科。我在凌晨 2 点终于认输了。过去三周我一直在打磨 prompt、切换到最新旗舰 Model、并且执着地调 RAG chunking 方法。我的 AI agent 在沙盒环境里表现很棒。但一上生产一团糟。它会忘记两步之前自己定下的决定在交付一个坏结果前还会自信地宣布“成功”。任务成功率顽固地卡在 68%。无论我怎么折腾 Model都推不动到 70% 以上。是不是很熟悉 最后我才意识到我遇到的不是一个 model 问题而是一个 systems 问题。在分清这两者之前一切都不会改变。AI Engineering 的三个阶段——以及为什么大多数团队停在第二阶段LLM 应用的成熟悄然把我们带过了三个不同的思维阶段。我接触过的大多数团队都停在第一或第二阶段却不断被第三阶段的问题“反咬”。阶段 1Prompt EngineeringModel 理解我了吗大家都是从这里起步。你会发现 LLM 是极其敏感的“概率整形”机器——精心设置的 role、few-shot 示例、合适的 format 约束输出瞬间变样。看起来像魔法而且确实很强。对于封闭、单轮的任务好的 prompting 不可或缺。但我很快撞上了天花板。无论我把指令写得多漂亮我都无法凭空给 Model 添一条它没有的知识我也让它记不住三次 tool 调用之前发生的事当真实世界不如人意时我也没法阻止它自信地编造数据。⚠️ Gotcha 以为更复杂或更花哨的 prompt 能弥补事实根基缺失或实时上下文不足。它做不到。阶段 2Context EngineeringModel 拥有事实吗认清那个局限后我一头扎进了 contextRAG pipelines、动态检索、tool 输出回流、精心注入的对话历史。我开始执着于 Model 在做决策时“看得到什么”。这的确是一次突破——客观地说没错。在合适的时间给到合适的信息Agent 变得聪明太多。但 Context Engineering 依然解决不了一件事execution drift执行漂移。Agent 会先制定一个绝妙的计划完美执行第一步却在第二步误解了 tool 的返回值随后悄悄偏航在接下来的十二步一路走偏。最可怕的是系统毫无察觉。它只是继续自信地执行一个早在很久之前就悄然变错的计划。⚠️ 常见误区把 Context Engineering 等同于基于 vector database 的 RAG。真正的上下文管理远不止如此——包括动态 state 注入、tool 响应总结、策略性的历史截断。RAG 只是起点。阶段 3Harness EngineeringModel 能否持续做对的事从这里开始事情变得有趣——同时也会让那些以为“更好的 Model 就是答案”的人感到谦卑。Harness Engineering 是在 Model 周围搭建“脚手架”的工程学科——用确定性的系统去监督 Model 的行为、捕捉失败、强制约束并在它漂移时把它拉回正轨。这个名字来自物理世界的“安全带/缰绳”harness缰绳、安全绳、控制的基础设施。说的正是这个意思。改变我一切的心智模型Agent Model Harness这是那个来自 LangChain 的重构视角彻底解锁了我的思考Agent Model Harness你代码库里几乎所有能让 Agent 真正在生产可用、又不是“调用基础 Model API 本身”的东西都是 Harness。我总用这个类比想象你派一位初级员工去主持一场关键的客户会议。Prompting 是告诉 TA 会议议程“先问好、介绍产品、收集需求。”Context 是给 TA 一份资料包“这是客户背景、价目表和会议目标。”The Harness 是其他一切随身清单、强制的中途与你对齐、全程录音、越界纠偏机制、以及会议纪要的严格验收标准。再好的“事前交底”也代替不了“问责与控制”的基础设施。意识到前两个阶段让 Model“想得更好”而 Harness Engineering 让它“可靠地行动”这件事终于把我从 70% 拉了出来。通过重构 task decomposition、state management、critical step validation、failure recovery在不换 Model、不改 prompt 的前提下我把任务成功率拉到了 95%。成熟 Harness 的六个架构层Harness 不是一个文件、也不是一个巧妙的 wrapper。它是分层架构每一层对应一种失败类型。我的思考框架如下Layer 1Information BoundariesCognitive ScopeModel 在“即时上下文里看见什么”几乎比任何因素都更决定它的表现。冗余数据不会让 Model 更聪明——只会让它分心。更糟的是当你把不同信息类型系统规则、当前任务状态、外部证据混成一坨非结构化内容时Model 会丢掉约束关键规则会被淹没成它不再关注的噪声。Harness 必须显式定义并分类 Model 能“看到”的东西它的 role、当前目标、成功标准以及不同信息类型的结构化隔离。Layer 2Tool SystemActuation没有 toolsLLM 就只是文本预测器配上合适的 tool system它才是能与真实世界互动的 Agent。但我早期犯过一个关键错误给了太多 tools。十五个 tool 加详尽文档听上去很强实际上只会分散注意力让 Model 幻造不存在的参数或误用它几乎没理解的 API。Harness 必须控制“什么时候用 tool”而不仅仅是“给哪些 tool”。当该搜索时要阻止 Model 盲猜当答案已在手时要阻止它乱搜。还有这一点是不可协商的永远不要将原始的 tool 输出直接回灌到 LLM。来自某个 API 的 50 项 JSON 响应会污染你的上下文。Harness 必须在反馈给 Model 前对 tool 返回做过滤、解析与总结。Layer 3Execution OrchestrationPlanning RoutingLLM 常常不是输在“单点技能”而是输在“把这些技能线性串起来”。我称之为“意识流式执行”——在步骤之间跳来跳去、跳过校验、没凑齐材料就提前生成最终输出。Harness 会铺好严格的轨道Understand Goal → Assess Information → Fetch Missing Info → Analyze → Generate → Verify → Output这不只是脚手架而是把项目管理的责任从“概率模型”移交给“确定性系统”。步骤的先后不该由 Model 决定那套结构该属于 Harness。Layer 4Memory and StateContinuity无状态的 Agent 每一轮都在“失忆”。如果没有显式的 state 管理你基本上在多步任务的每一步都在“从零开局”。我会维持三种严格分隔的 memoryCurrent Task State——我们走到哪一步了什么在等待什么已确认Conversational Intermediate Results——本轮会话中我们已经得出的中间结论是什么Long-Term Memory / User Profiles——跨会话持久化的全局偏好与上下文。Layer 5Evaluation and ObservabilitySelf-Awareness⚠️ 曾狠狠坑到我的点把 task state 和对话历史混为一谈。结果就是无限膨胀且非结构化的上下文窗口任务越往后 Model 表现越差。务必严格分离。原始的 Agent 会在这一层“壮观地”失效。它生成输出、宣布成功但完全没有机制去判断输出是否真的正确。让 Agent 自评自己的工作等于给它装了“乐观偏差放大器”。它会把坏掉的代码评成“能跑”会把并未回答到点子的回复评为“满意”。Harness 需要独立、自动化的验证机制。不是事后的人审——那太慢也不具备规模化。自动化输出验证、集成测试环境、细致的 logging、指标追踪与错误归因统统属于这一层。系统必须持续“向自己证明”它的行为是正确的而不是“想当然地以为”。Layer 6Constraints, Validation, and RecoveryResilience在生产里失败是默认态。API 会超时、JSON 会裂开、搜索会不准。没有恢复机制的 Agent等于每次出错都要人来“全量重启”。这里 Harness 需要三样东西Constraints用硬规则明确 Agent 绝对禁止做的事。Validation输出前/输出后的闸门检查schema 校验、格式检查、约束验证。Recovery重试逻辑、回退路径、以及回滚到上一次稳定状态的能力。隐秘的敌人Context Anxiety当任务拉长到几十个步骤会发生一件怪事。Anthropic 的研究者把它称为 Context Anxiety。当上下文窗口逼近极限Model 会开始丢细节、忘大目标表现得像是在“赶工”。它会幻造本不曾得到的结论、跳过校验步骤呈现出一种“迫不及待”而导致草率的状态。天真的解法是 context compression上下文压缩总结历史、把总结塞回去、继续。我试过了它确实能减 token但并不能重置 Model 的“认知状态”或“注意力稀释”。真正有效的解法反而激进彻底重启 Agent。Anthropic 把它叫做 Context Reflect。当上下文变得过大时你把压缩总结交给一个全新的 Agent 实例——干净的上下文不带任何累积的困惑。这就像处理内存泄漏时与其疯狂做垃圾回收不如直接重启进程。同样地我也不再一开始就把整个 tool 库丢给 Agent。Harness 使用 progressive disclosure起初只给最小的 tool stub当 Model 表达要用某个能力的意图时Harness 再动态注入详细文档与参数 schema。所谓“上下文优化”不是给更多信息而是按需、在恰当的时机给到对的信息。分离 Generation 与 Evaluation支撑自治的架构我遇到过的最重要的架构洞见之一来自 Anthropic 如何构建“真正自治”的 Agent——它们能在无人审阅的情况下连续数小时产出完整可用的成果。诀窍是严格的“三分法”The Planner把模糊的人类请求翻译成严谨的工程规格说明。The Generator拿着规格一步步去执行实现。The Evaluator作为完全独立的 QA 实体——在功能上与 Generator 解耦。Evaluator 不只是读 Generator 的代码。它要与“渲染后的输出”互动。在 UI 工作里它会点击界面、检查视觉布局、核对交互状态。它是对“真实世界”做验证而不是对 Generator 的“世界表征”做验证。OpenAI 走得更远。随着 Agent 写代码的速度超过了工程师审 PR 的速度他们给 Agent 搭了一个全自动的 CI/CD pipeline。Agent 在隔离的沙盒里运行自己的代码、用 headless browsers 截图、读取自己的执行日志并反复迭代直到它能在无人参与的情况下验证部署是正确的。“Done” 不再意味着“我把文本生成完了”而是“我跑过代码、看过日志、找到 bug、修好它并在沙盒里验证过部署”。结论关于生产级 AI 系统的真相可浓缩为我在实战中学到的一切基础 Model 的聪明才智决定它在基准榜单上的理论上限而 Harness Engineering 的扎实程度决定这些智能能否在混沌的真实世界里“活下来、修得好、交付价值”。Model 不是你的瓶颈。过了某个点之后它从来都不是你的瓶颈。把 70% 成功率拉到 95%把 demo 变成产品——差的就是 Harness。如果这些内容对你有启发我长期写作 AI systems engineering、实用 ML 基础设施以及把 demo 和生产系统区分开的那些真实世界模式。若这是你的兴趣欢迎关注。这里给大家精心整理了一份全面的AI大模型学习资源包括AI大模型全套学习路线图从入门到实战、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等资料免费分享扫码免费领取全部内容1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 2026行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。7. 资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容

相关新闻

法式乳酪月饼怎样一次成功?铝箔杯配方、成型与烘烤要点

法式乳酪月饼怎样一次成功?铝箔杯配方、成型与烘烤要点

法式乳酪月饼看起来像一款固定配方,实际会因乳酪、果泥、巧克力或坚果馅的含水量不同而改变成型。铝箔杯能提供承托,但装杯量、边缘整理和冷却时间仍要逐项测试。 一、先把失败点排查拆成可记录的状态 本篇重点是失败点排查。试样时可固定一种铝箔杯&…

2026/10/15 12:24:48 阅读更多 →
Arduino边沿检测宏实现:从轮询到事件驱动的高效防抖方案

Arduino边沿检测宏实现:从轮询到事件驱动的高效防抖方案

1. 从“轮询”到“事件”:为什么我们需要边沿检测 在嵌入式开发,尤其是Arduino项目中,我们经常需要处理来自按钮、传感器等数字输入引脚的状态变化。最直观、最“新手”的做法是什么?没错,就是在 loop() 函数里不停地…

2026/10/15 12:24:51 阅读更多 →
【Python量化实战 #02】Python拉取股票历史K线做回测:stock_history与pandas数据处理

【Python量化实战 #02】Python拉取股票历史K线做回测:stock_history与pandas数据处理

系列:Python 行情数据接入笔记(持续更新) 本文:#02 历史 K 线与回测灌数 前置:先完成 #01 的安装与鉴权 回测要复现,数据口径就得稳定。本篇围绕 stock_history:按区间或按条数拉历史行情&#…

2026/10/15 12:49:26 阅读更多 →

最新新闻

CCNA必学:交换机MAC地址静态绑定与端口安全实战指南

CCNA必学:交换机MAC地址静态绑定与端口安全实战指南

1. 从一个真实故障说起:为什么MAC地址绑定不是选修课刚入行那会儿,我在一个中小型企业的网络改造项目里踩过一个经典的坑。当时办公区一台接入层交换机下面挂了二十多台设备,某天开始间歇性断网,用户反馈时好时坏,重启…

2026/10/15 23:47:01 阅读更多 →
vue3+taro+Nutui 开发小程序(一):用 TaoToken 统一 Key 打通多端调试链路

vue3+taro+Nutui 开发小程序(一):用 TaoToken 统一 Key 打通多端调试链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 23:47:01 阅读更多 →
FPGA实现8x8二维DCT:从算法选型到硬件架构全复盘

FPGA实现8x8二维DCT:从算法选型到硬件架构全复盘

最近刚把一个二维离散余弦变换(DCT)的FPGA实现完整跑通,8x8块,行变换-转置-列变换两级流水,行为仿真和上板实测结果一致,误差控制在允许范围内。DCT这东西,教科书上几行公式就能写完&#xff0c…

2026/10/15 23:47:01 阅读更多 →
Cursor 如何添加免费的大模型:把 Base URL 改到 TaoToken 的完整配置与验证

Cursor 如何添加免费的大模型:把 Base URL 改到 TaoToken 的完整配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 23:47:01 阅读更多 →
Linux eventfd:内核级事件计数器原理与C++ RAII封装

Linux eventfd:内核级事件计数器原理与C++ RAII封装

1. 为什么 eventfd 不是“另一个 pipe”,而是内核级事件计数器的优雅接口在 Linux 系统编程中,当开发者第一次听说 eventfd 时,常会下意识把它和 pipe、socketpair 或 signalfd 归为一类——“不就是个用于线程/进程间通知的文件描述符嘛”。…

2026/10/15 23:47:01 阅读更多 →
子网划分原理与实战:从课后题1理解网络分段本质

子网划分原理与实战:从课后题1理解网络分段本质

1. 这道题不是“做作业”,而是打开网络世界的第一把钥匙“计算机网络原理 课后题1”——看到这行字,很多人第一反应是翻教材、查答案、抄个IP地址配个子网掩码就完事。但我在某高校连续带了七年《计算机网络原理》实验课,带过三百多名学生&am…

2026/10/15 23:46:00 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →