Featured image of post 意图对齐:AI 编程时代被忽视的核心工程能力

意图对齐:AI 编程时代被忽视的核心工程能力

探讨在 AI 编程时代,人与 AI 之间意图对齐的重要性。分析 Vibe Coding 和 Harness Engineering 范式下,模糊自然语言、匮乏上下文、缺乏验证闭环、过长上下文等因素如何导致意图与结果的差距,并给出实践建议。

前言:当"代码"不再等于"意图"

在过去几十年的软件工程实践中,“我们的代码"就是"我们意图"的直接体现。我们亲手设计架构、定义接口、编写逻辑、调试边界。每一行代码都是思维的具象化。即便存在沟通偏差,也主要发生在人与人之间。而一旦进入编码阶段,意图便牢牢锚定在代码之中。

因此,传统意义上的"意图对齐”,往往止步于需求理解的一致性。然而,在 Vibe Coding 与 Harness Engineering 等新兴范式席卷开发流程的今天,这一等式被彻底打破。

代码不再是意图的载体,而是 AI 对你意图的"翻译结果"。

这意味着,“意图对齐"的矛盾点从"人与人"转移到了"人与 AI"之间。而且要求更高、容错更低。你不能再依赖"边写边想"或"代码即文档"的模糊默契,而必须近乎 100% 精确地向 AI 传达以下信息:

  • 执行顺序:先做什么?后做什么?哪些步骤不可并行?
  • 技术选型:用什么框架?依赖哪个版本?是否允许引入新库?
  • 架构规约:模块边界在哪?哪些是禁区?数据流如何约束?
  • 开发方式:普通开发方式,还是测试驱动开发?(TDD)
  • 上下文资产:知识库存放在哪?已有接口契约是什么?
  • 环境限制:运行时资源上限?网络策略?安全合规红线?
  • 验证标准:如何才算"完成”?测试覆盖哪些路径?失败语义如何定义?是否需要 E2E?

缺失任何一环,AI 都可能基于其训练数据中的"常见模式"进行合理但错误的推断。这正是早期 Vibe Coding 最为诟病的问题:自作主张,自以为是。而这些缺失的信息,就是"意图与结果差距"的根源。

意图与结果的差距:诸多的因素都会导致不好的产出

在 Vibe Coding 的实践中,我们常常陷入一种错觉:只要把想法"说"出来,AI 就能"懂"并"做对"。但现实是:意图 ≠ 指令指令 ≠ 实现实现 ≠ 正确

模糊不清的自然语言

自然语言擅长传递情绪与方向,却极度缺乏工程所需的精确性。毕竟自然语言本来就是用于高效的"人与人沟通",没人会喜欢事无巨细地描述早餐的配料、火候、口感及其对身体的长期影响。

“优化一下性能”、“让代码更清晰”、“处理得健壮些”……这类表述在人类协作中倒是常见,但在人机交互中却是灾难的起点。AI 无法感知你的潜台词,只能依据概率选择"最可能"的解释(来自训练数据)。而这个解释,往往与你的真实意图南辕北辙。

匮乏的上下文知识

AI 对你的系统一无所知,除非你明确告诉它:

  • 哪些服务是核心链路,哪些是边缘功能?
  • 字段的意义是什么,哪些是不能修改的,禁区在哪里?
  • 这个接口的 RPC 调用路径是什么?
  • 缓存失效后,是降级,还是返回错误?
  • 缓存的过期时间是否要加入 20% 随机浮动,避免缓存击穿?

这些"组织内部常识",如果你不显式地注入上下文,AI 便会用过去训练它的通用模式填补空白。结果往往是错误的降级策略、越权的数据访问,或与现有契约冲突的接口变更,最终污染架构、埋下隐患。

没有反馈,没有澄清,没有调查,没有验证

“模糊的自然语言"和"匮乏的上下文"并不是最严重的问题。真正危险的是缺乏人机协同的验证闭环。当前的 AI 并不会主动反馈不确定性,也不会自行查阅知识库。这一切依赖开发者主动设计交互流程

  • 强制澄清:遇到模糊或拿不准的地方,是选择 A 方案还是 B 方案,不能擅自作主,必须询问我们。
  • 上下文补全:我们告知 AI 的信息一定是不全面的,AI 必须能够自己去指定位置进行调查。
  • 自我验证:当信息足够多时,能不能把它们串联起来,形成合理的方案?需要 AI 具备自我验证的能力。

过长的上下文,导致"腐化"产生幻觉

前面说到上下文信息匮乏会导致意图理解出现偏差。但过度冗长的信息,反而可能造成意图理解的错误。大模型的上下文容量是有限的,信息处理能力也是有限的。随着信息量的增多,AI 的注意力机制开始"失焦”。早期的关键约束被稀释,后期的临时补充被过度强调。你会发现一个很明显的问题:最早告诉他的规则,到后面却被他"遗忘"了。同时,过多的上下文迫使大模型进行压缩,必定导致信息的进一步失真。

控制好信噪比,我们要做的是:

  • 上下文信息的精准 > 堆砌
  • 结构化的描述
  • 聚焦的重点是什么?

最后:实践

我们首先要在上下文中定义一个基础规范。你甚至可以把它加入到你的 skill 中:

  1. 需求有歧义就先问,不要根据"常见做法"擅自添加用户未要求的任务。
  2. 如果用户描述存在多种理解方式,必须先询问澄清,不要替用户乱猜。
  3. 50 行能解决的问题,就别写成 200 行。代码不要过度封装、过度抽象。
  4. 尽量只做局部修改,不要一开始就大面积重构。不要把一个小任务改成大手术。
  5. 如果任务非常复杂,分步骤实施,控制上下文总量,避免出现"腐化"。

更多关于从提示词到工程约束的范式转变,请参阅我的文章 Vibe Coding:Harness Engineering。想了解上下文腐化如何影响 AI 编程会话,可以看看 我的 GSD 体验。关于 Vibe Coding 的实用工作流,请参阅 Vibe Coding 时代的 Git Worktree。而关于规范驱动开发的实践,请阅读 我的 OpenSpec 体验