记录一下那天晚上的排查过程。运营侧的提示词模板里写了 {{ product }},调用方漏传这个变量,Jinja2 默认渲染成空串,换成 Handlebars 后直接输出 undefined 四个字母,模型把它当产品名复述,回复里出现「undefined 支持七天无理由」。
刚开始盯着「默认值写在文档里但没有落到模板或代码」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。模板引擎对缺失变量的处理策略不一致,一个给空串一个给字面量。还有一种是没有在渲染前做必填变量校验。
另外,变量名大小写与调用方不一致,取值失败被当成缺失。
动手时先列出模板里声明的全部变量
python -c "from jinja2 import meta,Environment;e=Environment();print(meta.find_undeclared_variables(e.parse(open('tpl.j2',encoding='utf-8').read())))"
随后开启未定义变量严格模式复现
python -c "from jinja2 import Environment,StrictUndefined;print(Environment(undefined=StrictUndefined).from_string('{{ product }}').render())"
给变量加默认值兜底
python -c "from jinja2 import Environment;print(Environment().from_string('{{ product | default(\"该商品\", true) }}').render())"
等前面都确认过,再在渲染前做一次必填校验
python -c "req={'product','price'};got={'product'};print('missing=', req-got)"
别只看报错消失,验证要多做一步。缺变量时渲染直接报错并指出名字,补齐后输出与预期一致,回答里不再出现 undefined 这类字面量。
提醒一点。默认值是兜底不是解决方案,缺变量要尽早炸出来,否则模型会把占位词当事实写进对用户的答复里。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
