何雨宸 EN

笔记

不报错的错误答案

微调后的 0.5B 模型写对 SQL 的比例是 82.6%。真正让我担心的是另外那 16.4%:能正常执行,返回的却是错误的结果。

我微调了一个 0.5B 的模型来写 SQL,并且通过实际执行 SQL 来打分。写对的比例从 42.7% 涨到 82.6%,这是你会放上幻灯片的那个数字。我在意的数字是 16.4%:这些答案能正常执行,返回的却是错误的结果行。只有 1.0% 的答案根本跑不起来,所以最直观的护栏(用 schema 校验 SQL)几乎拦不住这类错误。

Qwen2.5-0.5B-Instruct,未微调(Q4_K_M)
  • 42.7% 正确
  • 41.9% 能运行,结果错误
  • 15.3% 无法运行
LoRA 微调后(Q4_K_M)
  • 82.6% 正确
  • 16.4% 能运行,结果错误
  • 1.0% 无法运行
391 道留出测试题(来自 b-mc2/sql-create-context),每一道都在三个生成的 SQLite 数据库上执行模型生成的 SQL,并把结果行与参考查询比对。来源:llm-finetune-lab,results/。

我逐条读了其中 30 个错误答案,最常见的问题是字符串常量被改了:“nouvelair”变成了“nouvelle-air”。一条“标记没有出现在问题里的常量”的规则,会命中 18.8% 的错误答案,只命中 0.3% 的正确答案,而且不需要额外的推理。再加上“5 次采样结果必须一致”的检查,静默错误率从 16.4% 降到 9.1%,同时仍然回答了 76.2% 的问题。这更好了,但仍高于 5% 的目标;这个目标是我自己设的假设,仓库里也是这么写的。

所以我写下的决定是:不要把它作为自主作答系统上线,而是做成给人复核的 SQL 建议工具。教训是:准确率告诉你模型多常答对,而产品决策取决于它是怎么答错的。要去测量那些你看不见的失败。

评分方法、对这 30 个案例的逐条审查、护栏对比表,以及什么情况会改变这个决定,都在 llm-finetune-lab README 里。