前面二十八篇,我们讨论了 Prompt、状态机、文件系统、验证和控制层。它们其实都在做同一件事:把模糊任务封装成有状态、有接口、有约束、可验证的工程对象。
这正是面向对象长期处理的问题。不同的是,过去对象内部运行确定性代码,现在 Harness 内部运行具有不确定性的 LLM。
1. 面向对象的核心是边界
面向对象不只是把代码写进 class,而是用状态、行为和接口建立边界:
对象 = 状态 + 行为 + 接口 + 边界 \text{对象}=\text{状态}+\text{行为}+\text{接口}+\text{边界} 对象=状态+行为+接口+边界
对象保存自己的状态,通过方法提供行为。private 保护内部状态,public 规定外部入口。一个对象由此明确:它拥有什么、能够做什么、外部如何访问,以及哪些条件必须始终成立。
2. LLM 使对象内部变得不确定
传统方法由程序员完整实现,相同输入通常产生相同或可预测的结果。LLM 提供的却是候选输出的概率分布:
y ∼ p θ ( y ∣ x ) y\sim p_\theta(y\mid x) y∼pθ(y∣x)
同一任务可能得到不同实现;语言完全通顺,也可能遗漏要求、误解目标或虚构事实。因此,LLM 不能被视为可靠的 solve() 方法。它负责生成候选结果,却不能自行宣布任务完成。
AI 工程的核心问题,因而不是如何调用模型,而是如何封装它的不确定行为。
3. Harness 是面向对象的扩展
传统对象主要封装状态和行为。Harness 还要封装权限、契约、验证和失败处理:
Harness = 状态 + 动作 + 权限 + 契约 + 验证器 + 证据 \text{Harness} =\text{状态}+\text{动作}+\text{权限}+\text{契约}+\text{验证器}+\text{证据} Harness=状态+动作+权限+契约+验证器+证据
| 面向对象 | AI Harness |
|---|---|
| 状态 | 项目文件与任务状态 |
| 方法 | Agent 可以执行的动作 |
private / public |
权限与工具接口 |
| 类型与不变量 | 结构约束与持续条件 |
| 前置、后置条件 | 启动条件与验收要求 |
| 异常 | 退出并交还控制权 |
| 对象责任 | 结果、日志与证据 |
Harness 与对象相似,但多了一项任务:控制一个不能保证每次产生相同结果的执行者。
4. Prompt 不是边界
"不要修改其他文件""不要破坏接口""提交前检查代码",都只是语言要求,模型可能遵守,也可能遗漏。
真正的工程边界必须在模型之外执行:文件权限限制修改范围,类型检查保护接口,编译器和测试验证结果,退出条件决定何时交还控制权,日志记录已经发生的事情。
Prompt 是软约束,权限、类型和验证器才是硬边界。Harness 不是更长的 Prompt,而是把自然语言要求转换成可执行契约的控制层。
5. 生成结果不等于接受结果
把硬约束记为 C C C,验证器记为 V V V。候选解 y y y 只有满足以下条件,才能被系统接受:
C ( y ) = 1 , V ( y ) ≥ τ C(y)=1,\qquad V(y)\geq\tau C(y)=1,V(y)≥τ
合法 SQL 不一定查询了正确数据,代码能够编译也不代表业务逻辑正确。因此,完整的 AI 求解对象至少包含生成器、约束、搜索和验证器。
失败记录、修改日志和当前状态还要成为下一轮输入,使 Agent 根据已经发生的结果继续推进。所谓收敛,不是模型越来越自信,而是未通过的验收条件逐渐减少,直到结果被接受或任务退出。
6. 从访问边界到责任边界
AI 系统不仅要限制访问,还要明确谁定义验收标准、谁批准高风险动作、谁解释失败以及谁承担后果。权限、日志、证据包和人工接管,既控制行为,也保存责任链条。
Agent 可以负责执行,但不能自动获得定义目标和承担后果的权力。
AI 时代没有抛弃面向对象,而是把它从确定性程序扩展到不确定执行。Prompt 负责表达要求,Harness 负责阻止不合格结果进入系统。
AI 并不缺少生成答案的能力。真正稀缺的,是把现实任务封装成具有状态、接口、验证和责任边界的对象。
参考文献
- Meyer, B. Object-Oriented Software Construction. 2nd ed., Prentice Hall, 1997.
- Beurer-Kellner, L., Fischer, M., & Vechev, M. "Prompting Is Programming: A Query Language for Large Language Models." 2022. https://arxiv.org/abs/2212.06094
- Scholak, T., Schucher, N., & Bahdanau, D. "PICARD: Parsing Incrementally for Constrained Auto-Regressive Decoding from Language Models." EMNLP , 2021. https://aclanthology.org/2021.emnlp-main.779/