用 AI 写生成长期运行的软件

5 月 28 日
 Perchouli

最近有个账号在各种 harness 相关的评论里推广他的 skill ,recursive-mode ,做法主要是上下文持久化,流水线,闭环验证。前天还有篇论文方案类似,更系统些。AI 模型能写一次性软件了,但 AI 写不好需要长期持续运行与运维的软件基础设施。论文提出了 meta-engineering harness ,是个七层架构:

层级 (Layer) 核心模块 (Core Module) 包含内容与机制 (Components & Mechanisms)
Layer 7 (第 7 层) Calibration (校准) 回顾、回归升级、契约模板更新
Layer 6 (第 6 层) Verification (验证) 对抗性测试、审查网关、QA 、CI
Layer 5 (第 5 层) Execution (执行) coding agents, migration agents, UI agents
Layer 4 (第 4 层) Context / memory (上下文/记忆) AGENTS.md, markdown brain, spec 记录
Layer 3 (第 3 层) Contract (契约) two-pass compilation, invariants
(两遍编译、不变量)
Layer 2 (第 2 层) Role / orchestration (角色/编排) builder, verifier, reviewer, arbiter
Layer 1 (第 1 层) Model (模型) Claude, Codex, Gemini

第三层契约 Contract ,代码质量取决于契约的完备性。论文里给了契约的例子.

{
  "module": "NGPayments",
  "version": "1.0.0",
  "api": {
    "base_path": "/ng/payments",
    "auth": "Supabase Bearer token; JWT identity authoritative",
    "endpoints": [
      {
        "method": "POST",
        "path": "/ng/payments/intent/:invoiceId",
        "returns": [
          "client_secret",
          "payment_intent_id",
          "payment_type",
          "amount_cents"
        ],
        "side_effects": [
          "store payment_intent_id on invoice",
          "set invoice.payment_status = processing"
        ],
        "errors": [
          "403",
          "404",
          "409",
          "422",
          "502"
        ]
      },
      {
        "method": "POST",
        "path": "/ng/payments/confirm/:invoiceId",
        "stripe_verification": "retrieve PaymentIntent and assert status == succeeded before DB write",
        "side_effects_on_success": [
          "set invoice payment status",
          "set service request status",
          "set paid_at",
          "clear payment_intent_id"
        ],
        "side_effects_on_failure": [
          "reset invoice.payment_status to unpaid",
          "clear payment_intent_id"
        ]
      },
      {
        "method": "GET",
        "path": "/ng/payments/status/:invoiceId",
        "returns": [
          "payment_status",
          "payment_type",
          "amount_cents",
          "currency",
          "paid_at"
        ]
      }
    ]
  },
  "invariants": [
    "PaymentIntent uses transfer_data.destination",
    "no platform fee",
    "server verifies Stripe success before DB write",
    "paid is terminal",
    "processing blocks duplicate intents",
    "amount derived from quote_data.total"
  ],
  "known_gap_identified_after_deployment": [
    "final invoice calculation omitted offline deposits",
    "discount calculation not encoded in original contract"
  ]
}

第二层不同的角色:

另外有个回顾代理( Retro agent )在第七层,不负责执行单次编程任务,是审查历史失败记录(回顾,retros )来进行系统级的反馈与改进。人类工程师负责最终审批与治理。

核心的流水线( Pipeline )有 7 个环节:

  1. 接收契约(实现端): 实现代理( Implementation agent )接收通过预流水线阶段编译好的结构化契约 。

  2. 接收契约(测试端): 测试代理( Test agent )同步接收同一份编译好的结构化契约 。

  3. 编写代码: 实现代理根据契约规范开始编写具体的业务代码 。

  4. 编写测试: 测试代理根据契约规范独立编写对抗性测试用例 。

  5. CI: 系统运行上述对抗性测试,对实现代理编写的代码进行行为检验 。

  6. 失败路由: 测试未通过,相关的失败结果会被自动路由至仲裁器( Arbiter ) 。

  7. 分类与决策: 仲裁器将收集到的失败结果分类为代码漏洞( Bug )、规范缺失( Spec gap )、环境噪音( Noise )或契约歧义( Contract ambiguity ),并由该分类结果直接决定下一步采取何种纠正措施 。

提到 Over-specification (过度规定)可能导致下游的 AI 代理(实现代理和验证代理)会将契约中所有的需求视为强制性( mandatory )命令 。如果契约中包含了系统环境不支持、或者业务根本不需要的复杂需求,AI 代理会强行尝试实现和测试这些幻觉需求,导致开发周期浪费、代码冗余,或由于无法通过自动化测试而陷入死循环。还举了失败例子,代码完全符合契约,也不代表代码满足了真实的业务需求。

高质量的 AI 代码是一个不断自我完善的闭环。AI 代码质量的保障已经从模型层面的能力问题,演变为系统工程层面的验证与治理问题。人类工程师的角色也从编写代码转为“设计契约、处理异常、并监督/改进这个自动编写和测试代码的生产系统”。

论文总结的缺陷和现在 AI vibe coding 遇到的问题类似:

2613 次点击
所在节点    程序员
2 条回复
i67c6NJ0r33nC667
5 月 28 日
还有一点就是不能用单个模型,最好是多个先进模型之间互相对齐再修正
Perchouli
5 月 29 日
@409164 不同的大模型是能缓解。也提出对抗独立性是结构层面,最好能有形式层面的独立。大模型训练的数据高度重合,还需要增加非 LLM 的验证机制,比如静态代码分析、形式化验证,最终的人类业务逻辑审查。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1216271

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX