同问,如何限制 LLM 响应结构

查看 29|回复 3
作者:TyCoding   
其实即便不是 JSON 这种复杂的结构化数据,即使我在 prompt 中限定 “不要返回任何其他解释文字”,再一定概率上仍然会返回解释文字内容,
例如我只是想实现一个 auto suggestion 的需求,返回给我一个[]数组即可,测试中用 gpt-4o 也无法避免会返回解释文字
Prompt:
You need to summarize my previous chat and give 6 similar [questions] that users may ask. Please answer in the array format of ["answer","answer"...], and the [answer] is limited to 20 characters.
Response:
An astrolabe is an ancient tool used by astronomers and navigators to measure the altitude of celestial bodies and calculate their positions in the sky.
["What is a sextant?","How does a compass work?","What is a sundial?","Explain an armillary sphere.","Define an orrery.","What is a quadrant?"]
这种情况可能我直接手动处理一下就好了,
但是同样如果我想要实现复杂的需求,例如我想让 gpt 生成 echarts 的 js 代码,用于直接渲染图表,这种成本就很高了,如果我在 prompt 中写大量的限制可能也没有预期效果并且很浪费 token
frankyzf   
试试让大模型用 markdown 格式返回代码或 JSON ,然会只处理 markdown 里面的代码或 JSON 会不会好些
neteroster   
其实如果用开源模型的话有很多方法可以做到。
例如说 llama.cpp 就可以用 grammar ,这是直接从采样器上面做限制的,效果会很好。除此之位还有一众更强大的推理约束工具,例如 guidance ( https://github.com/guidance-ai/guidance ), outline ( https://github.com/outlines-dev/outlines ), sglang ( https://github.com/sgl-project/sglang ),它们不止可以限制 json 输出,甚至可以限制输出满足特定的正则表达式 / 形式文法。
对于在线模型,如果不是复杂的结构,有一些办法,比如 Anthropic 的 API 支持先填充 LLM 响应的前面一部分,对于你这个例子来说,你可以指定前面部分就是 "[",这样模型就会立即开始输出,然后 stop 序列设置成 "]",就会在输出到 "]" 立即截断并返回。
neteroster   
@neteroster 对了,在线 API 还有一点忘记提了,就是做 few-shot 。如果你的任务文本不太长,可以先用前面的对话给 LLM 一些例子
您需要登录后才可以回帖 登录 | 立即注册

返回顶部