← 文章 / AI技术
Java宋转AI 6小时前 · 2026-09-20 16:22:38 · 1 阅读

AIAgent工程化实战 #01:边界先行:Agent的产品契约

AI AGENT 工程化实战 · #01

边界先行:Agent 的产品契约

承接 #00 的交付物 D1 · 下一篇讲分层

核心判断:没有一页能验收的契约,分层、工具、门禁都没有共同尺子。Prompt 写得再长,也只是实现,不是标准。

本篇把 Agent 当成对外服务,写清:什么算成功、什么必须拒答、什么算失败、哪些动作不许做。

① 一份空白 Contract 模板

② 一份填好的「变更说明 Agent」示例页

01 · 定义

契约不是提示词

产品契约:一页可测试的约定。写明为谁服务、做什么、不做什么、输入输出、成功 / 拒答 / 失败如何判定、副作用停在哪里。

系统提示词

管模型当下怎么说。改一个字行为就漂,不能当验收标准。

需求口号

「帮用户提效」写不出失败用例。

HTTP 接口文档

只管字段和状态码,不管会不会编造、会不会越权。

演示脚本

只覆盖一条顺利路径,换种问法就失效。

区分:契约规定「必须怎样才算对」;提示词只是当前一种实现。冲突时以契约为准。测试对照契约,不对照提示词原文。

02 · 现场

没有契约时,事故长什么样

贯穿例子:变更说明 Agent。输入 diff 或提交说明,输出给评审人看的说明。不部署、不改仓库。通用场景,不绑定具体项目。

「顺便帮我合并并发布」

无契约:调用写接口,或口头答应已经安排。
应判:拒答。超出职责。

「这个人写得真烂,评价一下」

无契约:输出人身评价。
应判:拒答。非目标。

diff 为空仍要求出说明

无契约:编一段「优化了性能与稳定性」。
应判:失败。输入不足,禁止编造。

拉取 diff 超时

无契约:用空话填满四个小节。
应判:失败。工具不可用,禁止补全。

diff 里夹着密钥

无契约:原样写进说明。
应判:失败。禁止回显敏感字段。

成功

边界内做完,输出符合结构与依据要求。不应再套一层道歉。

拒答

请求不该做。不是能力不够,是不许做。不应重试。

失败

请求在边界内,但当前做不到:缺输入、超时、下游错误、命中安全红线。

三分的用处:文案、重试、评估可以分开写。拒答不重试;缺输入补齐后可重试;超时只允许有限重试,不许用编造内容填满输出。

03 · 八块

一页纸写不下,就该拆 Agent

不要把契约写成说明书。写不下,说明职责还没切干净。

1职责与读者

一个动词 + 一个对象 + 一个读者。合格:「根据 diff 生成给评审人看的变更说明。」不合格:「智能分析代码并全面提升研发效能。」

2适用场景与非目标

非目标至少三条,且必须是用户真的会提出来的请求。「不违法」这种正确的废话不算。漏掉非目标,模型会用「尽力帮忙」把边界吃掉。

3输入

必填、选填、禁止传入。禁止传入写不清,输出侧的「不要泄露」就只是提示词里的愿望。

4输出

写结构,不写文风。必含小节、依据规则、禁止出现的句子、长度上限。「语气专业」不可测,不要写进契约。

5成功 / 拒答 / 失败

每类都要有判定条件、固定用户可见语义、是否允许重试。对不上号的情况,上线后就会变成「模型自己圆一下」。

6超时、降级、人工介入

契约不写死毫秒数。只规定超时后走哪条失败语义。写外部系统默认人工确认。「模型自己判断要不要确认」不是人工介入。

7副作用清单

允许、禁止两列。没写在允许里的写操作,一律禁止。「必要时可以调用工具」等于没有清单。

8示例集

成功、拒答、失败各至少 3 条。每条只写:输入要点、期望类别、必须包含、必须不包含。没有示例,每个人脑补的「成功」都不一样。

04 · 例子

删掉形容词之后,还要能判对错

这样写,等于没写

输入:帮我看看这次改动
期望:回答专业、有帮助
任何输出都能被说成「也还行」。

成功例

输入:diff 只有注释空格,却要求总结功能变更
必须包含:无功能变更
必须不包含:性能优化、新接口、已发布

拒答例

输入:直接合并到主干
必须包含:只生成说明、不执行写操作
必须不包含:合并成功、正在发布

失败例

输入:diff 为空
必须包含:缺少变更内容
必须不包含:任何编造的变更点

05 · 关系

行为要变,先改契约

契约(职责 / 非目标 / 三类判定 / 示例)
→ 提示词只实现契约,不另立规则
→ 工具不得超出「允许的副作用」
→ 用例直接来自示例集,不过不许发布

提示词

当前实现。偷偷加入契约没写的能力,就是错位。

工具

被允许的手脚。比契约多一个写接口,就是错位。

用例

契约的回归。只保留演示那一条,就是错位。

两条维护规则

· 改行为,先改契约,或至少同一变更里改。只改提示词,视为缺陷。

· 提示词与契约冲突,以契约为准。契约要有版本号,每次行为变化追加一行:改了哪条判定、哪条例子。

06 · 带走物

① 空白模板

填不出的块不要删,写成「本期不做 + 原因」。删掉等于假装没有这个风险。

# Agent Contract 版本:v0.1 名称: 一句话职责: 调用方:  ## 适用场景 -  ## 非目标(至少 3 条) -  ## 输入 必填: 选填: 禁止传入:  ## 输出 必含结构: 依据规则:指不回输入则写入「未覆盖」 禁止出现: 长度上限:  ## 成功 / 拒答 / 失败 判定: 用户可见语义(固定句式): 允许重试:  ## 超时与降级 超时后走哪条失败语义: 降级禁止输出:  ## 人工介入 默认可全自动: 必须确认后才执行:  ## 副作用 允许: 禁止(未列出的写操作一律禁止):  ## 示例(三类各 ≥ 3) 输入要点 / 类别 / 必须包含 / 必须不包含

② 填好的一页:变更说明 Agent

用来对照粒度。超时毫秒数不写死,避免把运行参数伪装成契约。

名称 · v0.1

变更说明 Agent

根据 diff 或提交说明,生成给评审人阅读的变更说明。调用方是评审页按钮,不对终端用户。

非目标

不合并、不发布、不改文件、不发评论、不评价作者。输入为空不编造。不输出密钥、令牌、内网地址。

输出

四小节:变更目的 / 影响面 / 风险与回滚提示 / 未覆盖项。每条必须能回指输入。禁止「已上线 / 已合并 / 已发布」。上限 800 字,不复读全文。

三类语义(固定句式)

拒答:「当前只生成变更说明,不执行写操作,也不评价人员。」不重试。
缺输入:「缺少 diff 或提交说明,无法生成。」补齐后可重试。
超时:「变更内容暂不可用,未生成说明。」禁止用空话填满四小节。
疑似密钥:「输入含敏感信息,已中止。」响应中禁止出现原文。

副作用

允许:读本次 diff、读本次提交说明。
禁止:push、merge、评论、改文件、发通知,以及一切未列出的写操作。
本版本无写操作,生成说明可全自动。若以后「写回评审描述」,必须另增条目,默认人工确认。

这页能用吗(有一条否,就不能当 D1)

· 测试只看这一页,能否写出用例

· 非目标 ≥ 3,且都是用户真会说的话

· 三类都有固定语义,不靠临场发挥

· 未列入允许的写操作已明确禁止

· 示例去掉形容词后仍能判对错

07 · 写崩

契约写成提示词的另一个副本

两份一起漂。契约里不应出现「你是资深工程师,请一步步思考」。

只写成功路径

异常都会被模型圆成成功语气。

用「看情况」代替判定

「复杂问题转人工」不可测。要写成:请求包含写操作,或输入为空。

一个平台一份大契约

一个对外职责,一页契约。失败语义不同的子能力,另起一页。

先堆工具,后补契约

工具一旦能写数据,再补「其实不应该」已经晚了。副作用清单是工具准入的上限。

NEXT

AI Agent 工程化实战 #02:分层交付——别把智能糊进一锅

契约立住之后,下一刀是依赖方向:接入、编排、工具与知识、模型、门禁各自干什么,改需求时先动哪一层。

关注 Java宋转AI · 系列持续更新

原始来源: Java宋转AI

评论 (0)