前两周面了一家硅谷背景的 AI 基础设施团队,考官抓着大模型结构化输出的容错刨根问底。
面试官发难:考官指着屏幕上的 Python 代码:“我们需要大模型提取实体并返回纯 JSON 供后端解析,怎么彻底防止它偶尔在开头输出一段‘好的,这是为您生成的回复:’或者把 Markdown 反引号带进去?”
我心里怎么想的:我强忍住想笑的冲动:“这不就是我们日常调教大模型的基本功吗?恐吓它、教育它、多给两个 Few-shot 样例,它不就老实了?!”
我嘴上怎么答的:“呃,在 Prompt 里加粗强调:‘【死命令】:只许输出纯 JSON,严禁输出任何多余废话或 Markdown 符号,违者扣分!’”
面试官的反应:考官推了推眼镜,眼神里满是看破红尘的无奈:“不管你怎么用感叹号恐吓大模型,在概率采样的世界里,它总有千分之一的几率抽风,你的后端解析就会在半夜报 500。”
后来进了大厂跟组里负责推理引擎的 Tech Lead 聊起这事,才发现我当时有多天真。靠自然语言 Prompt 永远无法保证 100% 确定性。大厂的做法是走底层约束解码(Grammar-Guided Decoding),比如通过 Outlines、Jsonformer 或者模型官方原生的 Structured Outputs API,直接在 Logits 采样阶段把所有非合规字符的概率强行置零!