如何控制 LLM 的输出格式和解析其输出结果?

如何控制 LLM 的输出格式和解析其输出结果?

💡 原文中文,约5000字,阅读约需12分钟。
📝

内容提要

文章介绍控制LLM输出格式并解析结果的方法:使用OpenAI的Function Calling将输出定义为函数参数以获得稳定JSON;用few-shot提供格式样例;GPT-4可用TypeScript类型声明。建议降低temperature提高稳定性,并对JSON错误做日志记录和字符串预处理容错。

🔎

延伸解读

Function Calling 的巧用与限制

文章指出 Function Calling 本意是让模型决定调用哪个函数,但其返回的函数参数是标准 JSON,因此可借用来稳定输出格式。即使 GPT-3.5 也能得到较稳定的 JSON。不过这种方法的前提是 API 支持 Function Calling,否则无法使用。这提示读者在选择方案时,需先确认所用模型或接口的能力,再决定是否采用此路径。

few-shot 与 TypeScript 声明的适用场景

当 API 不支持 Function Calling 时,few-shot 是备选方案:给出格式样例让模型模仿。文章提到对于 GPT-3.5,few-shot 输出 JSON 的稳定性不够好,可能出现不符合格式的情况。而 TypeScript 类型声明仅适用于 GPT-4,可在 Prompt 中定义输出结构并加注释说明字段。读者应根据模型版本和格式复杂度选择方法,而非一概而论。

容错处理是稳定解析的关键

文章强调生成式 AI 输出难以保证稳定,因此需要容错。建议降低 temperature 以提高稳定性,但会牺牲多样性,可灵活运用,比如出错后调低。对于 JSON 解析错误,建议用日志记录出错结果,找出规律后做字符串预处理,而非盲目重试浪费 token。作者还给出了一个针对特定错误模式的修复函数示例,并提醒读者应根据自己的 JSON 格式和错误情况编写容错逻辑。

❓

Q&A

如何让LLM输出稳定的JSON格式?

可以使用OpenAI的Function Calling功能,将期望的输出格式定义为函数的参数,并强制调用该函数,这样LLM会返回标准的JSON格式。即使GPT-3.5也能得到较稳定的JSON。

如果API不支持Function Calling,还有什么方法控制输出格式?

可以使用few-shot方法,在Prompt中给出一个或多个输出格式的样例,让LLM按照样例输出。对于简单格式可以用特殊字符分隔,对于JSON格式也可以提供样例,但GPT-3.5稳定性不够好。

GPT-4在控制输出格式上有什么特别的方法?

GPT-4可以使用TypeScript类型声明,在Prompt中用TypeScript类型定义输出格式,并可以添加注释说明字段,GPT-4会按照类型定义输出符合格式的JSON。

如何提高LLM输出格式的稳定性?

可以降低temperature参数的值,温度越低输出越稳定,但会降低多样性。可以在出错后降低temperature值重试。

LLM输出的JSON格式经常出错,如何容错处理?

建议用日志记录出错的结果,找出规律,然后进行字符串预处理,比如修复多余的逗号、引号等。可以编写类似parseJson的函数,尝试修复常见错误后再解析。

在ChatGPT网页版中如何控制输出格式方便复制?

可以将期望的输出放在Markdown代码块中,这样可以直接复制粘贴。但有时也不稳定,需要结合具体Prompt调整。

🏷️

标签

➡️

继续阅读