先把当时的情况摆出来。prompt 模板里用 YAML 写 few-shot,仓库装了 yamllint 和 prettier 的 pre-commit 钩子,提交时把块标量的缩进重排,冒号后面多出空格,模型开始把示例当成键值对回答,评测从 88 掉到 79。

原因不止一个,得分开看。prettier 对 YAML 的多行标量重新缩进。还有一种是yamllint 的 indentation 规则和块标量冲突。

另外,prompt 和配置文件放在同一目录,被一起格式化。少数情况下是pre-commit 配置里没有 exclude 规则。

先看钩子配置里管了哪些文件

cat .pre-commit-config.yaml

只对提示词目录跑一次钩子复现改动

pre-commit run --files prompts/fewshot.yml

接着对比格式化前后的解析结果

python -c "import yaml;a=yaml.safe_load(open('prompts/fewshot.yml'));print(list(a.keys()))"

等前面都确认过,再在配置里排除提示词目录后重新提交

python -c "print('exclude: ^prompts/')"

别只看报错消失,验证要多做一步。提示词文件不再被钩子改写,git diff 里没有缩进变化,模型输出恢复成按示例格式回答,评测分数回到 88。

提醒一点。格式化工具不认识 prompt 的语义,多行文本被重排后模型看到的内容就变了;提示词应该当代码而不是配置来管,至少要从格式化范围里排除。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189