Ontology 工程
Ontology·Harness 工程不包含于 AWS Labs AIDLC 官方方法论 中,而是 engineering-playbook 的独立扩展内容。融合 DDD 与 2026 年 Agentic AI 最佳实践,强化企业级 AI 可信性。在落地官方 AIDLC 时,可选择性引入此轴。
"Prompt Engineering is Ontology Engineering" — 2026 AI 社区共识
AIDLC 可信性的第一轴 Ontology 工程,将 DDD 的 Ubiquitous Language 提升为 AI 可机械理解与遵循的 形式化 schema (typed world model)。这是在根本上阻断 AI 代理幻觉 (hallucination)、保障领域正确性的方法。
1. 什么是 Ontology
1.1 作为 Typed World Model 的 Ontology
Ontology 是将领域知识形式化的 "typed world model"。如果说 DDD 的 Ubiquitous Language 是团队内部沟通用的非形式共识,Ontology 则将其转换为 AI 可机械理解与遵循的结构化 schema。
核心特征:
- 形式性: 明确定义实体、关系与约束
- 类型安全: 所有领域概念由类型系统表达
- 可校验性: 约束可自动校验的结构
- 可进化性: 通过运维数据持续精炼
1.2 与 DDD Ubiquitous Language 的关系
| 方面 | Ubiquitous Language | Ontology |
|---|---|---|
| 形式性 | 非形式共识 (自然语言) | 形式化 schema (类型定义) |
| 范围 | 团队内部沟通 | AI 代理 + 团队 + 代码 |
| 校验 | 手动评审 | 自动约束校验 |
| 进化 | 文档更新 | 基于反馈循环的自动精炼 |
| AI 理解 | 不可 (隐式上下文) | 可 (显式结构) |
DDD 的 Aggregate、Entity、Value Object、Domain Event 成为 Ontology 的 基础构件。差别在于它们的关系与约束以机器可读的形式表达。
2. 为什么需要 Ontology
2.1 AI 代理失败的根本原因
AI 代理失败的根本原因不是模型能力不足或提示词不准确,而是 架构中缺乏语义结构 (semantic structure)。
典型失败模式:
- 上下文丢失: 当用户、订单、任务、规则的定义散落在提示中时,AI 会失去上下文
- 幻觉生成: 缺乏显式约束时,AI 会生成 "逻辑上看似合理" 但错误的推理
- 一致性缺失: 同一概念在不同会话中的定义不同,导致不可预测的行为
2.2 Ontology 解决的问题
1. 防止幻觉
- 所有领域概念显式定义,消除 AI 任意解读的空间
- 实体间关系形式化,无法生成不存在的连接
2. 保证领域正确性
- 不变量 (invariant) 编码到 Ontology 中,违反时自动检测
- 领域事件的状态迁移路径显式化,阻止错误的状态转换
3. 上下文一致性
- Ontology 注入到 AI 代理的 context window,成为所有生成工作的标尺
- 跨会话、跨代理保证相同的领域理解
2.3 实战证据
整合基于 HITL (Human-in-the-Loop) 的 Ontology 反馈循环时:
- 准确率提升 31%
- False Positive 减少 67%
- 错误率 8.3% → 1.2% (31 天内达成)
未应用反馈循环时: 投入 $28K,错误率 8.3%→7.9%,改善微乎其微。
3. Ontology 结构
3.1 DDD 概念到 Ontology 的映射
domain_ontology:
aggregates:
Payment:
description: "支付处理的事务边界"
invariants:
- "amount 必须大于 0"
- "status 迁移: CREATED → PROCESSING → COMPLETED | FAILED"
- "FAILED 状态下重试最多 2 次"
entities:
- PaymentMethod:
type: "enum"
values: ["CARD", "BANK", "WALLET"]
- Customer:
attributes:
- customerId: "UUID"
- tier: "enum[BASIC, PREMIUM, ENTERPRISE]"
value_objects:
- Money:
currency: "ISO 4217"
amount: "decimal(19,4)"
invariants:
- "amount >= 0"
- "currency 不能为 null"
domain_events:
- PaymentCreated:
trigger: "收到支付请求"
data: ["paymentId", "amount", "customerId"]
timestamp: "ISO 8601"
- PaymentCompleted:
trigger: "PG 授权完成"
data: ["paymentId", "pgTransactionId"]
- PaymentFailed:
trigger: "PG 拒绝或超时"
data: ["paymentId", "errorCode", "reason"]
relationships:
- "Payment CONTAINS PaymentMethod (1:1)"
- "Customer INITIATES Payment (1:N)"
- "Payment EMITS PaymentCreated (1:1)"
- "Payment EMITS PaymentCompleted | PaymentFailed (1:1, mutually exclusive)"
constraints:
- "同一 Customer 的并发支付最多 3 笔"
- "PROCESSING 状态最长保持 30 秒,超时自动转为 FAILED"
- "PaymentMethod 变更仅在 CREATED 状态下允许"
3.2 Knowledge Source 分层
构建 Ontology 时,应对知识源的可信度进行分层管理。
| 优先级 | 来源 | 示例 | 可信度 | 使用方式 |
|---|---|---|---|---|
| 1 | 实际实现代码 / PR | awslabs/ai-on-eks、Helm chart 源码 | 最高 | 以实际可运行代码为准 |
| 2 | 项目 GitHub issue / release | NVIDIA/KAI-Scheduler、ai-dynamo/dynamo | 高 | 开发者间的事实交换 |
| 3 | 官方文档 | docs.nvidia.com、docs.aws.amazon.com | 中 | 通论,可能存在更新延迟 |
| 4 | 博客 / 教程 | Medium、AWS Blog | 低 | 特定时间点的快照 |
构建 Ontology 时 仅参考官方文档 (Official Documentation),AI 会把 "逻辑上看似合理的推理" 误当作 "已验证的事实"。
真实案例:
- 问题: AWS EKS Auto Mode 官方文档写明 "AWS 管理 GPU 驱动" → AI 跳跃到 "无法安装 GPU Operator" → 对比表、架构、推荐项全部被污染
- 原因: 未查阅实际实现仓库 (awslabs/ai-on-eks PR #288),仅凭官方文档的通论推理
- 结果: "技术上不可能" 这一错误前提在整份文档中蔓延,12+ 张对比表和架构建议全部出错
原则: AI 生成的技术文档必须与 实际实现代码进行交叉校验 (cross-validation)。官方文档中的 "不可以" 可能只是 "尚未文档化"。
3.3 规则模板分层
Ontology 超越单纯 schema,扩展为 可执行规则。
rule_templates:
validation_rules:
- rule_id: "PAYMENT_AMOUNT_POSITIVE"
condition: "Payment.amount > 0"
error_message: "支付金额必须大于 0"
severity: "ERROR"
- rule_id: "PAYMENT_STATUS_TRANSITION"
condition: |
IF current_status == "CREATED" THEN next_status IN ["PROCESSING", "FAILED"]
ELIF current_status == "PROCESSING" THEN next_status IN ["COMPLETED", "FAILED"]
ELSE invalid_transition
error_message: "支付状态迁移错误"
severity: "ERROR"
business_rules:
- rule_id: "MAX_CONCURRENT_PAYMENTS"
condition: "COUNT(Payment WHERE customer_id = X AND status = 'PROCESSING') <= 3"
error_message: "同时处理中的支付超过最大限制"
severity: "WARNING"
action: "QUEUE_PAYMENT"
这些规则模板:
- 代码生成时: 自动转换为校验逻辑
- 测试生成时: 自动推导边界条件测试用例
- 运行时: 作为守护栏 (guardrail) 发挥作用
4. 三层反馈循环: 活的 Ontology
Ontology 并非一次性定义就结束的静态 schema,而是 通过运维数据与研发经验持续进化的活模型。
4.1 反馈循环结构
4.2 各循环的角色
| 循环 | 周期 | 触发器 | Ontology 变化 | 示例 |
|---|---|---|---|---|
| Inner Loop | 分钟级 | 测试失败、Harness 违反 | 新增 / 修改约束 | 发现遗漏 invariant: 新增 "amount > 0" 约束 |
| Middle Loop | 日级 | PR 评审中的重复模式 | 更新实体 / 关系 schema | 重复错误模式 → 新增 Value Object |
| Outer Loop | 周级 | 运维事件、SLO 违反 | 重新设计领域模型结构 | P99 延迟上升 → 重新定义 Aggregate 边界 |
4.3 Inner Loop: 即时约束精炼
场景: AI 生成代码的测试失败
# AI 生成代码 (第 1 次尝试)
def create_payment(amount: float, customer_id: str):
payment = Payment(
amount=amount, # 忽略了 amount 可能为负数
customer_id=customer_id,
status="CREATED"
)
return payment
# 测试失败
def test_negative_amount():
with pytest.raises(ValueError):
create_payment(-100, "customer-123")
# AssertionError: ValueError not raised
# 新增 Ontology 约束
invariants:
- "amount > 0"
# AI 重新生成代码 (第 2 次尝试)
def create_payment(amount: float, customer_id: str):
if amount <= 0:
raise ValueError("支付金额必须大于 0")
payment = Payment(...)
return payment
效果: 分钟级精炼约束,防止同类错误复发。
4.4 Middle Loop: Schema 结构改进
场景: 在 PR 评审中发现重复模式
## PR 评审指标 (7 天)
- "Currency mismatch" 错误: 12 次
- "Amount precision loss" 错误: 8 次
- 共通模式: Money 被当作 float 处理导致精度丢失
## Ontology 更新
value_objects:
- Money:
currency: "ISO 4217"
amount: "decimal(19,4)" # float → decimal 变更
invariants:
- "amount >= 0"
- "currency 不能为 null"
效果: 重复错误模式反映到 Ontology schema 中,从结构上被阻断。