哲学起手:大语言模型的“裸奔”与人类工程师的“潜意识防线”
在剖析具体的代码与架构之前,我们必须先从认知科学与系统论的层面,彻底认清人类开发者与 AI 智能体之间的鸿沟。
当一个人类程序员坐在屏幕前敲击键盘时,他真的只是在“输出代码”吗?
Birgitta Böckeler 在她的文章中极其敏锐地点出:人类开发者在写代码时,其思维深处其实实时运行着一个庞大且复杂的“隐式套件”。
- 审美的边界: 当人类看到一个超过 300 行的臃肿函数时,会产生本能的“审美厌恶(aesthetic disgust)”并自觉停下重构。
- 社会化责任与恐惧: 人类知道自己的名字会永远刻在
git blame的历史记录里。这种社会维度的问责机制,让人类在修改核心逻辑时充满敬畏感,如履薄冰。 - 微观的反馈闭环: 人类敲下两行代码,就会下意识地按下
Cmd+S,并用眼角余光扫一眼终端里 LSP(语言服务器协议)抛出的红色波浪线。 - 组织记忆的承载: 人类知道系统里有哪些“祖传代码”是不能碰的,也知道“在这家公司,我们不这么写代码”的潜规则。
然而,当我们将一个哪怕是 GPT-5 或 Claude 4.6 Opus 级别的顶级模型接入代码库时,这个至关重要的隐式套件瞬间就蒸发了。
LLM 没有社会责任感,不知恐惧为何物;它没有组织记忆,更没有对复杂度的本能厌恶。用 Böckeler 的精辟总结来说:“LLM 只是在处理 Token(they think in tokens)”。
如果我们不加干预,直接让一个 LLM 去读取和修改代码,那本质上就是让模型在没有任何操作系统(OS)、没有内存保护机制的情况下“裸奔”。
这牵扯出了软件开发领域最核心的哲学冲突:软件工程,本质上是一个高度依赖状态管理(State Management)、边界约束和历史文脉的“确定性游戏”;而大语言模型,偏偏是一个极度缺乏物理实体、没有长效记忆的“非确定性概率生成器”。
Anthropic 巧妙地用了一个比喻来形容长周期 Agent 的困境:这就好比一个软件项目由一群采取“轮班制”的工程师来开发,而接班的工程师对上一班发生的事情毫无记忆。因为 LLM 的每一次 API 调用(Session)都是独立的、无状态的。你如果不对它进行物理级别的约束,它前一秒还在写前端 UI,下一秒就可能因为一个幻觉生成的变量,决定把底层的数据库表结构给删了。
这就好比你拥有了一台动力无穷的 F1 赛车引擎(LLM),但如果你不给它配上坚固的底盘、精准的转向轴以及防抱死刹车系统(这些统称为 Harness),把它直接扔上赛道,它唯一的结局就是以极高的速度撞墙粉碎。
因此,Harness Engineering(套件工程)的本质,就是一场逆向工程——我们要把人类大脑中潜意识的防线(隐式套件)抽离出来,变成代码化、显性化的“控制论系统(Cybernetic Governor)”。
在 Böckeler 提出的心智模型中,一个真正可用的 Agent 架构,必须建立两条绝对硬核的防线:
- 前馈引导(Feedforward / Guides):收敛状态空间的“防暴盾”
我们不能等模型犯错。在 Agent 行动之前,Harness 必须通过强引导(例如注入严格的代码规范AGENTS.md、强制运行环境脚手架脚本),将其接下来可能采取的非确定性行为,死死压缩在一个极小的合法状态空间内。 - 反馈传感(Feedback / Sensors):强制物理接地的“电击项圈”
由于 LLM 活在纯文本的“潜空间(Latent Space)”里,它极其容易陷入逻辑自洽的幻觉中。Harness 必须在环境里部署密集的计算型传感器(如测试用例、Linter、类型检查器)。一旦 Agent 越界,立刻用毫秒级、绝对确定性的真实报错信息去“电击”它,强制将它的视角从高维概率空间拉回冰冷的物理现实(Grounding)。
从“隐式套件”到“显式控制”,这不是在写什么微调提示词(Prompt Tuning),这是在构建未来 AI 时代的操作系统内核。
二、 架构级剖析:Anthropic 是如何用“状态机”强行接管“概率论”的?
在 Anthropic 尝试用 Claude 构建复杂的、包含数百个组件的 Web 应用(如完整克隆一个 Claude.ai 前端)时,他们遇到了一道几乎让所有 Agent 框架折戟的叹息之墙:长周期崩溃(Long-Running Collapse)。
当 Agent 运行到第 50 步或者耗时数小时后,它会不可避免地陷入三种绝望的死局:
- 目标偏移(Goal Drift): 彻底忘记了自己最初是要实现一个登录页面,转而去疯狂优化一个无关紧要的 CSS 动画。
- 幻觉盲信(Hallucinated Confidence): 在破坏了核心的路由文件后,没有做任何测试,就沾沾自喜地输出:“项目已完美竣工”。
- 级联灾难(Cascading Failures): 为了修复一个微小的拼写错误,Agent 越改越错,最终把整个项目的依赖树连根拔起。
面对这些绝境,Anthropic 没有选择“再给模型加一层反思(Reflexion)Prompt”,也没有去乞求更高阶的模型能力。相反,他们用纯正的软件工程思维,在模型外部构建了一套重型装甲(Harness)。
这套 Harness 的架构精髓,可以凝练为三大核心机制:
核心机制一:状态固化(State Pinning)——对抗目标的熵增
物理学告诉我们,孤立系统总是趋向于无序(熵增)。而长上下文中游荡的 LLM,就是软件工程里最大的“孤立系统”。只要让它自由发挥,它的目标一定会随着 Token 的堆积而逐渐模糊。
为了对抗这种“目标的熵增”,Anthropic 引入了一种极其粗暴但极为有效的架构设计:切断大包大揽,强行固化中间状态。
- 分离“规划器”与“执行器”: 他们设计了一个极其纯粹的
Initializer Agent(初始化智能体)。这个智能体绝对不写一行功能代码,它的唯一任务是生成一个包含了数百个微小节点的feature_list.json文件。 - 外部化记忆(Externalized Memory): 这绝不仅仅是一个 To-Do 列表,这是在进行状态的硬编码。因为大模型的 Context Window(上下文窗口)是流动的、不可靠的,Harness 必须把“当前项目的进度(State)”从大模型的隐空间(Latent Space)里抠出来,钉死在文件系统里。
- 强前馈控制: 负责写代码的
Coding Agent每次被唤醒,Harness 都会强迫它先读取这个 JSON。Agent 的主观自信在这里毫无意义,只有 Harness 验证 JSON 中的状态标志从false变为true时,状态机才会向前拨动一格。
架构洞见: Harness Engineering 的第一法则就是“不信任模型的记忆”。优秀的 Harness 会将复杂任务降维,把原本由模型内部维护的“隐式状态”,强行接管为受版本控制的“显式文件状态”。
核心机制二:强制空间感知(Spatial Anchoring)——打破“盲人摸象”的幻觉
你有没有想过,当一个 Coding Agent 准备修改 src/components/Button.tsx 时,它脑子里的那个文件结构是从哪来的?
答案是:大部分时候,是它“猜”出来的。
模型习惯于通过概率去推测常见的工程目录,这就导致它经常在没有确认当前路径的情况下,向一个根本不存在的目录写入代码。
为了打破这种“盲人摸象”的幻觉,Anthropic 在其 Harness 中植入了极其严格的环境感知传感器(Feedback Sensors)。
- 把 Agent 降级为系统调用(Syscall): 在 Anthropic 的架构里,Agent 绝对不允许直接获得文件系统的修改权限。Agent 输出的所有命令,都必须经过 Harness 这个“操作系统内核”的拦截与鉴权。
- 强制的感知循环: 每当接班的 Coding Agent 醒来,Harness 会强制它执行
pwd(查看当前路径)、ls(列出目录)、甚至是git log(查看上一个轮班的 Agent 做了什么)。就像一个失忆症患者每天醒来,必须先阅读昨天的日记一样。 - 端到端真实测试反馈: 当 Agent 认为前端 UI 写好时,Harness 会在沙盒中启动 Puppeteer,像真实人类一样去点击浏览器,并将报错日志(甚至是浏览器截图)狠狠地砸在 Agent 脸上。
架构洞见: 在 Harness Engineering 中,Agent 输出的代码仅仅是“假设(Hypothesis)”,而 Harness 从物理环境中提取的运行时报错和文件状态,才是绝对的“地表真理(Ground Truth)”。优秀的 Harness 会通过密集的计算型反馈,将模型强行“锚定(Anchor)”在物理现实中。
核心机制三:分支与回溯(Branching & Backtracking)—— Harness 里的时间旅行
这是长周期 Agent 架构中最令人惊叹,也是传统 Prompt 工程绝对无法做到的防线。
如果 Agent 在第 40 步犯了一个致命错误,并试图在 41 到 50 步疯狂修补却越弄越糟,该怎么办?
人类程序员在这个时候会怎么做?人类会绝望地叹口气,然后敲下 git reset --hard。
但大模型没有这种“止损”的直觉,它会像一个赌徒一样,试图用更多的代码去弥补上一个代码造成的 Bug,最终导致(Cascading Failures)级联灾难。
Anthropic 在构建 Harness 时深刻认识到了这一点。因此,他们在外围包裹了一套极其坚固的快照回滚机制(Snapshot Reversion):
- 高频 Git Checkpoint: 每当 Agent 通过了一个微小测试,完成了一个子节点,Harness 就会在底层自动执行一次
git commit,将这完美的一刻冻结。 - 断路器(Circuit Breaker)与强制时间回溯: Harness 会持续监控 Agent 的轨迹。如果 Harness 发现 Agent 在同一个任务上连续失败了 3 次(或者消耗了超过阈值的 Token),Harness 的断路器就会“啪”的一声切断 Agent 的运行。接着,Harness 会执行最高权限:将代码库状态、测试环境状态强行回滚到上一个干净的 Checkpoint,然后向 Agent 注入新的上下文重新开始。
架构洞见: 这就是 Harness Engineering 最暴力的美学——用系统工程的确定性,去抹杀模型的非确定性错误。 既然我无法阻止你犯错,那我就赋予系统“时间回溯”的能力。只要我的快照打得足够密,你的灾难性故障就永远无法逃逸。
三、 范式转移:从 TDD(测试驱动开发)到 HDD(套件驱动开发)
过去的二十年里,软件工程界的最高法则之一是 Martin Fowler 等人极力推崇的 TDD(测试驱动开发)。它的核心理念是:先写测试,再写业务代码,测试是用来防止人类犯错的“安全网”。
但在 AI Agent 时代,这个逻辑被彻底颠覆了。
对于 LLM 来说,测试代码不再仅仅是“安全网”,而是它在黑暗中摸索前行的“唯一视觉器官”与“方向盘”。
这催生了一种全新的工程流派——HDD(Harness-Driven Development,套件驱动开发)。
在传统开发中,如果你的测试没写好,顶多是线上多几个 Bug;但在 Agent 时代,如果你的 Harness(测试套件与运行环境)存在漏洞,Agent 就会像一辆没有传感器的自动驾驶汽车,不仅会偏离航线,还会以 200 Token/秒 的速度把你的整个代码库撞得稀巴烂。
HDD 的核心开发流转变为以下四步:
- 构建沙盒边界(Define the Boundary): 在让 Agent 写第一行代码前,先配置好 Docker 容器、隔离的数据库和网络白名单。切断 Agent 毁灭宿主环境的物理可能性。
- 铺设高密度传感器(Deploy Sensors): 编写极其严苛的自动化测试、部署强类型的语言检查(如 TypeScript/Rust 的严格模式)、配置极度敏感的 Linter。在 HDD 中,测试越吹毛求疵,Agent 干活就越聪明。 因为计算型报错(Computational Feedback)是打破模型幻觉的唯一解药。
- 释放 Agent 并捕获轨迹(Capture Trajectory): 让 Agent 在套件中运行。
更多推荐



所有评论(0)