代码作为业务规则约束
自然语言规则为什么不够精确?
- 歧义来源: 业务规则、办事流程、决策逻辑若只用自然语言描述,概念边界难以界定;
- 追问示例: “合理的退款请求”“紧急情况”这类概念的边界很难界定;
- 边界示例: “购买后 7 天内可退款”看似清楚,但“7 天”是自然日还是工作日、“购买”是下单时间还是发货时间都无从确定;
- 对照: 代码提供无歧义、可执行的表达——要么成功运行,要么抛出错误,不存在模棱两可;
自然语言规则与代码化规则各自优势是什么?
| 形式 | 优势 | 局限 |
|---|---|---|
| 写在系统提示词 | 可基于规则向用户解释政策、可寻找变通方案(改签而非取消)、可在调用工具前初判可行性 | 存在理解偏差 |
| 编码为校验工具 | 精确无歧义、执行确定(相同输入相同输出)、适合多条件布尔组合/时间计算/跨数据源验证 | 不擅长向用户解释意图 |
- 实践: 两者结合——系统提示词保留自然语言规则供理解与沟通,关键决策点配备代码化校验工具作为“守门员”;
- 真正的价值: 代码化规则的意义不在优化 token 效率,而在防止不可逆的错误操作(取消订单、转出资金、删除数据);
- 定位: 这是元能力作用在“业务规则”这一层,见 代码作为元能力;
参数如何充当思考的 checklist?
- 设计: 不另设独立校验工具,而是让执行工具内部先校验;
- 做法: 工具描述列出完整政策并要求“调用前先查询订单详情、逐条核对”;
- 引导参数: 提供可选的
expected_*参数(如expected_cabin_class、expected_has_insurance),促使模型把判断依据显式写出; - 强制效果: 为填好这些参数,模型必须先调查询工具获取订单详情并逐一确认条件——填参数的过程本身就是强制性 checklist;
- 行为收益: 模型查到“经济舱且未购保险”时,很可能在准备调用过程中就注意到相关规则,从而根本不发起调用,直接告诉用户“无法取消,可考虑先购买保险或改签”;
- 边界: 这一层只引导思考、减少无效调用,不承担安全责任——
expected_*只是模型的自我陈述,服务端从不把它当事实;
为什么服务端真值校验才是守门员?
- 关键设计: 舱位等级、保险状态、预订时间、航段使用情况、航班状态全部由服务端查数据库获得,当前时间来自服务端时钟;
- 硬规则: 没有任何一条政策事实来自模型自报的参数;
- 理由: 模型可能产生幻觉,也可能被提示注入操纵——同一上下文中的 Agent 难以自证清白;
- 反例: 若把
cabin_class、has_insurance乃至current_time设计成模型填写的参数,模型只要(或被诱导)报错一个值,守门员就形同虚设; - 原则: 最后一道防线必须建立在模型无法伪造的数据之上——独立性不仅指独立的模型,更指独立的数据来源;
- 稽核设计: 模型自报值与真值不一致时记录告警,用于发现错误认知或潜在注入;
def cancel_reservation(reservation_id, cancellation_reason):
r = db.get_reservation(reservation_id) # 政策事实一律查库
now = server_clock.now() # 时间取服务端时钟
if r.any_segment_used: return reject("有已使用航段")
if (now - r.booking_time) <= 24h: return execute()
if r.flight_status == "cancelled_by_airline": return execute()
if r.cabin_class == "business": return execute()
if r.cabin_class in ("basic_economy", "economy"):
return execute() if r.has_insurance else reject("需购买保险")
return reject("不符合取消政策")
三重保障如何组合?
- 第一重: 系统提示词的自然语言规则,帮助理解与解释;
- 第二重: 工具描述与参数设计作为 checklist,引导模型调用前显式核对;
- 第三重: 服务端基于数据库真值的代码化校验作为最后守门员;
- 分工: 前两重减少错误的发生,第三重确保错误不会变成不可逆的损失;
- 实验观察: 在 τ-bench 航空客服场景下,小参数量模型(Qwen3-4B)采用三重保障后显著优于纯自然语言规则的控制组——任务成功率、政策违规次数、无效工具调用次数均有改善,并观察到模型在准备参数时自主识别违规、直接向用户提议替代方案;
- 必要稽核: 统计
expected_*自报值与数据库真值不一致的比例,验证服务端真值校验拦截错误认知的必要性;