1 项目背景
业务场景
客服回复生成系统上线后,产品经理要求新增"敏感词过滤"功能——生成的回复中绝对不能出现"假一赔十"、“绝对安全”、"包治百病"等承诺性词汇。小陈尝试在 prompt 中加入"禁止使用以下词汇"的指令,但模型还是会偶尔输出这些词——LLM 并不能 100% 遵循 prompt 中的否定指令。
另一个需求是"业务术语白名单"——医疗客服场景中,药品名称必须使用标准名。“阿莫西林"不能被模型自由发挥写成"阿莫仙"或"阿莫灵”。
小陈意识到,只有在生成的最底层——每个 token 被选中的那一刻——做拦截,才能真正杜绝这些问题。这需要深入generate()的源码,理解LogitsProcessor和StoppingCriteria的机制。
痛点
model.generate()一行代码背后是一个复杂的多策略调度系统:
generate() ├── GenerationConfig 合并(用户参数 + model.generation_config + 默认值) ├── 根据参数选择解码策略: │ ├── greedy_search() (do_sample=False, num_beams=1) │ ├── sample() (do_sample=True) │ ├── beam_search() (num_beams &g