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

现在很多人对于如何使用像 ChatGPT 这样的 LLM 已经比较有经验了,可以使用各种不同的 Prompt 得到自己想要的结果。但有时候我们的使用场景不局限于手动操作,而是需要结合程序去调用 API,并且解析 API 的返回结果,从而实现一些自动化的功能。但是 LLM 的输出不确定性很大,所以我们需要想办法去控制 LLM 的输出格式,从而让程序得到稳定的输出,并且进一步对输出结果进行解析。

方法一:使用 Function Calling

Function Calling 是 OpenAI 不久前退出的针对 GPT API 的一个功能,可以让 LLM 决定在输出最终结果前,是否需要调用某个特定函数。比如说有用户问今天天气是什么,那么 LLM 在输出结果前,会先输出一个中间结果,告诉你需要调用天气相关的函数,并且传入这个函数的参数是"今天"。这样你就可以去调用天气函数,拿到结果后告诉 LLM,再输出最终结果给用户。

这个功能本意不是用来控制格式输出的,但是它在告诉我们该调用什么函数时,为了方便解析,给我们输出的是一个标准 JSON 格式,即使是 GPT-3.5,也能得到比较稳定的 JSON 格式。所以我们可以利用这个特性,来控制 LLM 的输出格式。

我们可以把要 ChatGPT 输出的内容定义成一个函数,但我们实际上不需要执行这个函数,只要 LLM 给我们的输出结果。

举例来说,我希望 ChatGPT 给我输出的格式是一个 Object:

{

"name": "John",

"age": 30,

"city": "New York"

}

我们可以在调用 GPT 的时候定义一个函数,将函数的参数格式和要输出的 JSON 格式对应起来

{

"name": "getUserInfo",

"description": "Get user information",

"parameters": {

"type": "object",

"properties": {

"name": {

"type": "string",

"description": "User's fullname"

},

"age": {

"type": "number",

"description": "User's age"

},

"name": {

"type": "string",

"description": "User's city"

},

},

"required": ["name", "age", "city"]

}

}

然后在调用 GPT 的时候,我们可以这样写(参考图一)

这样我们就可以得到一个稳定的 JSON 格式的输出结果。这种方法的局限在于必须 API 支持 Function Calling。

Function Calling 的具体用法可以参考 OpenAI 的文档:

platform.openai.com/docs/guides/gp...

方法二:使用 few-shot,给出输出格式样例

如果 API 不支持 Function Calling,那么我们可以使用 few-shot 的方式,给出一个甚至多个输出格式的样例,让 LLM 按照这个样例去输出结果。

比如我在翻译时,会让 LLM 翻译两次,一次直译一次意译,然后采用意译的结果。这种情况下我不需要用 JSON 格式,只需要简单的用特殊字符将两次结果隔开,然后按照特殊字符一分割,就可以得到意译的结果。

Prompt 参考图二

如果是 JSON 格式,也可以用 few-shot 说明,但是对于 GPT-3.5,稳定性不够好,有时候会出现不符合格式的情况。

Ensure that your response can be parsed by Python json, use the following format as an example:

{

"name": "John",

"age": 30,

"city": "New York"

}

相关推荐
沐雪架构师42 分钟前
Docling将pdf转markdown以及与AI生态集成
人工智能·pdf
kevin 144 分钟前
扫描件、PDF、图片都能比对!让文档差异无所遁形
大数据·人工智能·pdf
算家云1 小时前
腾讯最新开源HunyuanVideo-Foley本地部署教程:端到端TV2A框架,REPA策略+MMDiT架构,重新定义视频音效新SOTA!
人工智能·音视频·算家云·hunyuanvideo·模型部署教程·镜像社区
小王爱学人工智能1 小时前
迁移学习的案例
人工智能·机器学习·迁移学习
源雀数智1 小时前
源雀SCRM开源:企微文件防泄密
java·人工智能·企业微信·流量运营
Honeysea_701 小时前
容器的定义及工作原理
人工智能·深度学习·机器学习·docker·ai·持续部署
fantasy_arch1 小时前
SVT-AV1 svt_aom_motion_estimation_kernel 函数分析
人工智能·算法·av1
Acrel136119655141 小时前
别让电能质量问题拖后腿:工业场景中电能治理的战略意义
大数据·人工智能·能源·创业创新
長琹1 小时前
AES加密算法详细加密步骤代码实现--身份证号码加解密系统
网络·数据库·人工智能·python·密码学
一只鱼丸yo1 小时前
70B大模型也能在笔记本上跑?揭秘让AI“瘦身”的黑科技
人工智能·科技·机器学习·语言模型