一、背景铺垫:当“天才助手”变成“薛定谔的猫”

那是2025年春天的一个深夜,上海金山的软件园里,我的办公室依然亮着灯。屏幕上,一个复杂的微服务模块重构任务已经拖了三天。这一次,我把希望寄托在了新接入的顶级代码大模型上。我深吸一口气,在聊天框中键入了精心构思的、长达三页的指令:项目背景、架构图、待重构的OrderProcessor类的详细问题分析、目标代码风格、甚至包括团队里那位苛刻的CTO的审美好恶。我按下回车,心中默念:“这次总该行了吧。”

AI的回复迅速而流畅,它生成的新代码结构清晰,甚至添加了我没明确要求但确实需要的日志。我心中一喜。然而,当我要求它继续为这个新类编写单元测试时,情况急转直下。它似乎完全“忘记”了刚刚生成的类结构,开始询问一些基础属性,随后生成的测试代码牛头不对马嘴。我试图在后续提示中提醒它,但上下文窗口已被新的对话挤满,关键的类定义消失在历史中。我不得不再次将整个类代码粘贴给它,但测试覆盖率依然惨不忍睹。更糟糕的是,当我第二天想让它基于昨天的成果继续优化时,一切又得从头开始解释。那个被宣传为“天才编程助手”的AI,在我手中表现得像一只“薛定谔的猫”——在你观察(提问)的那一刻之前,你永远不知道它是“活”的(能正确工作)还是“死”的(会胡言乱语)。

这种经历绝非个例。我和我的团队,乃至整个开发者社区,都陷入了对“完美指令”的无限追逐中。我们撰写越来越长的“咒语”,学习各种提示框架(如CRISPE、RTF),试图通过语言的艺术来禁锢AI的“心智”。我们期望它能像一位人类高级工程师那样,通读并理解我们提供的所有文档,在心中构建完整的项目蓝图,然后一丝不苟地执行。但我们忽略了最根本的一点:AI并不是人

二、问题浮现:我们究竟在与什么对话?

问题的根源,在于一个深刻的认知错位。我们习惯了与人类协作的模式:理解 → 设计 → 实现。人类工程师可以阅读需求文档,在脑中形成模型,记住项目的关键约束,并在长达数天或数周的任务中保持这种上下文。因此,我们自然地将这套模式套用在AI身上,用详细的文档和规范来“喂养”它,期待它能全局理解并记忆。

然而,当前基于Transformer架构的大语言模型(LLM)及其驱动的智能体(Agent),其核心工作模式是截然不同的:观察(当前有限的上下文窗口)→ 尝试(基于概率生成最可能的下一个词或行动)→ 获得反馈(来自环境或用户)→ 修正。它不会像人类一样进行线性的、深度的阅读理解,也无法建立真正意义上的长期记忆或全局心智模型。它的每一次“思考”都极度依赖于当下被提供的提示词(Prompt)和上下文(Context)。它的行为,本质上由其“所处的即时信息环境”所决定

这就解释了所有令人抓狂的现象:

  • “金鱼记忆”:对话稍长,它就忘了最初的目标。
  • “幻觉调用”:信誓旦旦地要调用一个不存在的API函数。
  • “行为漂移”:在长任务中,后期行为逐渐偏离初始指令。
  • “无法复盘”:任务中断后,无法从断点继续,必须重头再来。

于是,我意识到,当AI行为失控、结果不一致时,根源往往不是模型本身不够聪明,而是 Agent 在“裸奔”——它被直接抛入一个复杂、多变、充满歧义的任务环境中,却缺乏一个能持续引导、约束、记录和保障其行为的系统性支撑。我们一直在对“驾驶员”(AI)喊话,却从未想过为它打造一辆方向盘、仪表盘、刹车和导航系统都完好的“汽车”。Harness Engineering 要解决的,正是这个“造车”的问题。

三、探索分析:寻找失控的“缰绳”

“Harness”一词,原意是马具、缰绳。这个概念精准地捕捉了精髓:我们需要的不是更响亮的吆喝,而是一套精巧、可靠的约束与引导系统。我的探索从一次痛苦的复盘开始。我回顾了那个失败的订单处理器重构任务,试图将问题拆解:

  1. 上下文管理失控:我把所有信息(背景、代码、规范)一次性塞给了AI,导致关键信息在后续对话中被挤占。AI没有优先级概念,它平等地“遗忘”所有信息。
  2. 行动缺乏验证:AI生成代码后,我只是“觉得”看起来不错,没有强制它通过一个自动化测试环节。它的行动没有即时、客观的反馈闭环。
  3. 状态完全丢失:整个重构过程是“对话态”的,一旦关闭窗口或开始新话题,所有中间状态灰飞烟灭。任务不具备可暂停、可恢复性。
  4. 知识加载笨拙:所有规范都冗长地写在初始提示里,AI在处理具体细节(比如Python的装饰器用法)时,可能已经“忘记”了前面关于架构的原则。

这四条,恰恰对应了构建一个稳定AI工作环境必须解决的四个核心问题。我查阅了OpenAI的GPT工程实践、Anthropic的Claude控制研究,以及业内如LangChainLlamaIndex等框架的设计哲学。它们不约而同地指向同一个方向:将智能体的“智力”(LLM)与其“行为环境”(Harness)分离。LLM作为决策引擎,而Harness则提供感知、记忆、行动和安全的保障。

一个清晰的类比在脑中形成:如果把LLM比作一颗强大的“CPU”,那么 Harness 就是它的“操作系统”。这个操作系统负责管理资源(动态调度上下文)、调度任务(有序调用工具)、持久化状态(将内存写入硬盘)、并提供安全沙箱(防止越界操作)。目标也从“让这次回答更好”,转变为:每次AI犯错,你都应该设计一个系统机制,让它未来不再犯同样的错误。这标志着思维从“战术性提示”到“战略性系统设计”的关键转变。

四、解决方案:构建Harness工程的四大支柱

基于上述分析,我着手设计并实践Harness Engineering的完整体系。它围绕以下四个核心支柱展开,我将以构建一个“代码重构自治智能体”为例,具体说明。

支柱一:上下文治理——从“信息倾倒”到“智能投喂”
目标不再是塞入更多上下文,而是动态、精准地组装上下文。我为重构智能体设计了一个“上下文管理器”。它不会在任务开始时加载整个万行代码库,而是:

  1. 首先,根据用户指令“重构legacy.py”,只加载该文件。
  2. 当AI开始分析process_data函数时,管理器自动检索并加载与该函数有调用关系的其他模块片段。
  3. 在AI需要参考代码规范时,才将rules/python-style.md的相关章节插入上下文。
  4. 在长任务中,系统会自动总结已完成步骤的核心结论,作为“短期记忆”替换掉原始的、冗长的中间对话,确保任务目标(“重构”)始终在上下文窗口的显要位置。

这彻底解决了“中途失忆”和“上下文污染”问题,让AI始终聚焦于当前最相关的信息。

支柱二:工具编排——从“空想”到“可验证的行动”
不让AI“幻想”自己做了什么,而是强制其行动通过工具执行,并接受验证。我为核心操作封装了工具:

  • analyze_code.py:AI调用它来获取代码的客观诊断报告,而非依赖自己的主观判断。报告是结构化的JSON,明确指出函数过长、存在魔数等问题。
  • run_tests.sh:这是安全阀。任何代码修改后,AI必须调用此工具运行测试套件。工具会返回明确的通过/失败信号和日志。AI必须根据这个反馈决定是继续前进还是回滚修复。
  • rollback.py:当测试连续失败达到阈值(如3次),AI会自动调用此工具回滚代码,并将任务状态标记为“需人工介入”,防止错误扩散。

工具化将AI的“软性建议”变成了“硬性操作”,并为每一步行动建立了反馈闭环。

支柱三:状态持久化——从“对话”到“可恢复的进程”
这是实现长周期自治的关键。我设计了一个progress.json文件作为智能体的“记忆面包”。

{
  “project”: “order-system”,
  “target_file”: “legacy.py”,
  “current_phase”: “refactoring_function”,
  “current_target”: “process_data”,
  “completed_steps”: [“analysis”, “extract_helper_function_1”],
  “next_suggestions”: [“rename_variables”, “add_type_hints”],
  “attempt_count”: 0,
  “last_error”: null
}

无论AI是因为网络中断、上下文溢出还是主动暂停,只要重新启动这个智能体,它读取progress.json后,就能立刻知道自己是谁、在做什么、做到了哪一步、接下来该做什么。任务从此变成了一个可停止、可恢复的持久化进程

支柱四:渐进式披露——从“巨无霸Prompt”到“模块化Skill”
遵循“最小权限原则”,只在需要时,才授予AI必要的知识与权限。我摒弃了编写单一庞大Prompt的做法,转而采用Skill(技能)的模块化设计。

.skills/
└── code-refactor-agent/
    ├── SKILL.md              # 核心“宪法”:定义工作流、原则、激活条件
    ├── rules/                # 知识库,按需加载
    │   ├── python-style.md
    │   └── refactor-patterns.md
    ├── tools/                # 能力集
    │   ├── analyze_code.py
    │   └── run_tests.sh
    └── progress.json         # 状态记忆

SKILL.md不再是操作手册,而是“宪法”和“交通图”。它规定:“当执行‘代码重构’时,你必须遵循‘分析-修改-测试’循环;修改前必须调用分析工具;修改后必须调用测试工具;状态必须持久化。” 具体的“法律条文”(代码规范)和“工具说明书”(重构模式)则放在独立的rules/目录下,仅在AI处理具体问题时才被加载进上下文。这极大提升了上下文效率,并使整个系统变得高度模块化和可维护。

实战工作流:AI如何在Harness中自治运行

  1. 激活:我发出指令“请使用code-refactor-agent优化legacy.py”。系统加载SKILL.mdprogress.json
  2. 计划:若无进度,AI调用analyze_code.py工具,获得诊断报告,并据此初始化progress.json中的任务队列。
  3. 执行循环
    a. AI读取progress.json,得知当前目标为“重构process_data函数”。
    b. 它按需加载rules/refactor-patterns.md中“提取函数”和“消除魔数”的范例。
    c. 生成重构后的代码。
    d. 强制性动作:调用run_tests.sh。这是Harness控制力的体现。
    e. 测试通过:提交代码,更新progress.json(记录完成),重置attempt_count
    f. 测试失败:分析错误日志,attempt_count加1。若小于3,则尝试修复;若等于3,则调用rollback.py,并将状态置为“暂停”,等待我处理。
  4. 恢复:即使这个循环因故中断数小时,我只需重新激活code-refactor-agent,它便能无缝接续。

五、总结反思:范式转移与核心收获

回顾从深夜调试的挫败感到设计出自治重构系统的全过程,我的认知完成了一次升级。Harness Engineering标志着一个根本性的范式转变:

  • 过去(Prompt Engineering):我扮演“教官”,面对一个聪明但注意力涣散的新兵,不断琢磨如何下达更清晰、更详细的口头指令,并为其每一次走神而懊恼。
  • 现在(Harness Engineering):我成为“系统架构师”,我的工作是为这位能力超群但特性迥异的“数字同事”设计一个完整的、自洽的、可持续运行的作业环境。在这个环境里,有清晰的流程(Skill宪法)、客观的仪表盘(工具)、不会丢失的记事本(状态持久化)、和按需领取的说明书(渐进式披露)。

核心收获与可复用方法论:

  1. 环境大于指令:最有效的控制,不是告诉AI“不要做什么”,而是将它置于一个“想做错都难”的环境中。
  2. 闭环高于开环:为AI的每一个关键行动建立可验证的反馈闭环(如测试),将主观判断转化为客观信号。
  3. 状态外置:永远不要依赖AI的内部“记忆”,将所有任务状态以结构化形式持久化到外部系统。
  4. 模块化设计:将知识、能力、流程解耦,通过Skill机制进行组合,使系统易于理解、调试和扩展。

如果重来:我会更早地放弃对“完美Prompt”的执念,转而系统性地思考:这个任务需要为AI配备哪些“传感器”(上下文检索工具)、“执行器”(代码/命令执行工具)和“黑匣子”(状态记录)?什么样的流程能确保它即使“心不在焉”也能走在正确的轨道上?

给读者的建议:不必一开始就追求构建复杂的多智能体系统。可以从一个具体的、你经常需要AI协助的重复性任务开始(例如代码审查、生成数据库迁移脚本、撰写API文档)。尝试为这个任务设计一个最简单的Harness:定义一个清晰的SKILL.md,封装一个关键的工具(如运行linter),并添加一个progress.json文件。你会立刻感受到,AI从一个时灵时不灵的“魔法黑箱”,变成了一个可靠、可控的“自动化组件”。最大的价值,将不再是AI单次回答的惊艳程度,而是你能够构建并运营一个确定、可靠、可长期自治的智能系统。这正是AI工程化从玩具走向生产力的核心阶梯。

结语

Harness Engineering的本质,是为我们强大的AI伙伴配上一套量身定制的“操作系统”和“安全带”。它不试图改变AI的“天性”,而是通过精妙的系统设计,引导其天性在正确的方向上稳定发挥。当我们完成这种思维转换,AI将不再是一场场结局难料的对话魔术,而会进化为一个拥有“肌肉记忆”、值得信赖的数字同事,与我们共同构建更复杂、更宏伟的数字世界。驯服不确定性的过程,也是我们重新理解智能、设计系统与拓展自身能力边界的过程。这,或许是人机协同走向深水区的第一座桥梁。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐