问题出现得很突然,日志倒是留得挺全。提示词模板从 v11 升到 v12 时新增了 {order_no} 占位符,线上出问题回滚到 v11,调用方仍按 v12 传参,渲染直接抛 KeyError: order_no,整个问答接口 500。

刚开始盯着「模板里花括号被当成变量,JSON 示例也被渲染」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。模板渲染用 str.format,多余变量不影响但缺变量必抛。少数情况下是回滚只换了模板版本,没有同步调用方的参数集合。

另外,版本元数据没有声明必填变量列表,无法校验。

复现渲染异常拿到具体缺的变量名

python -c "print('{a}{b}'.format(a=1))"

接着改用宽松替换,缺变量保留占位符并告警

python -c "import re;print(re.sub(r'\{(\w+)\}',lambda m:'{'+m.group(1)+'}' if m.group(1) not in ctx else str(ctx[m.group(1)]),tpl))"

再往下在版本元数据里登记必填变量并做启动校验

python prompt_lint.py --versions v11,v12 --strict

回滚时同时回滚参数构造逻辑

python deploy.py --prompt v11 --params v11 --canary 5

怎么算真的好了,看的是同一批现象。回滚后渲染不再抛 KeyError,缺失变量在日志里以告警形式出现,问答接口 500 归零。

补一句。回滚要连参数契约一起回滚,模板与调用方是两个版本维度,只回一个等于制造新的不兼容。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189