LLM什么时候才能输出固定格式(JSON?)
AI摘要: 本文探讨了如何让LLM输出固定格式(如JSON)的方法,包括万能prompt大法、推理后处理方案(正则表达式)和推理中处理方案(动态限制解码)。文章分析了每种方法的优缺点及适用场景,并指出当前研究的局限性。
基于概率统计建模,llm展示了非凡的潜力。但是同样由于token的概率性输出,成为llm落地的一个小绊脚石。这里讨论一下几种常见的让llm规范输出目标格式内容的方法,不清楚当前最新研究进展是否有突破。
万能prompt大法
通过在prompt里面指定写明"要求json格式,不要多余输出","输出格式严格要求{xxx: xxx, yyy: yyy}"等等。得益于目前llm日渐提升的指令遵循能力,构造一个好的Prompt能大概率生成JSON格式或者其他指定格式的输出。
推理后处理方案: 正则表达式
很多时候llm依然会掺杂一些无聊的车轱辘话:"好的,我将严格遵循json规范输出,结果为{xxx: xxx, yyy: yyy}",这个时候可以选择使用正则表达式匹配进行后处理,提取出所有文本中有json内容的部分。
推理中处理方案: 动态限制解码
如果一定要100%要求json,容不得一点点差错,可以考虑动态限制解码。
在模型推理输出每一个token的时候,动态调整输出词的概率,比如模型第一个词打算开始输出车轱辘话"好的,我将遵循……"的"好"字时候,我们直接将"{"字符的概率拉到100%,让模型强制输出json的第一个字符,后续解码的时候,如果采样输出的token会导致json不合法,就降低该token的概率,提高使json合法的概率的token的概率。
不过似乎了解到,这种方案会一定程度降低模型智能,而且需要自己部署llm来token级别的控制,稍有些麻烦。
此外,llm的安全性输出也可以考虑这种方案,如果模型输出的内容可能产出违禁词,那么就强制修改token的概率,避免生成违禁词。