当前位置: 首页 > news >正文

如何控制 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"
}

a690aa868a904269a152dd6f4732ca7b.jpg

 3760afbbb28b48b4ae70038efc3ecabd.jpg

 

http://www.lryc.cn/news/217220.html

相关文章:

  • 【Linux】 ps 命令使用
  • C++二分查找算法的应用:长度递增组的最大数目
  • 提示3D标题编辑器仍在运行怎么解决,以及3D标题编辑器怎么使用
  • 1. PPT高效初始化设置
  • el-cascader级联选择器选中一个全选中问题
  • Opencascad(C++)-创建自定义坐标系
  • MySQL数据库入门到大牛_01_数据库概述
  • Web - Servlet详解
  • postgresql 触发器如何生成递增序列号,从1开始,并且每天重置
  • “第五十九天”
  • IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
  • 【Linux网络编程_TCP/UDP_字节序_套接字 实现: FTP 项目_局域网聊天项目 (已开源) 】.md updata:23/11/03
  • Leetcode刷题详解——全排列
  • JSONP 跨域访问(1), 简介, 原理, 实验, 缺点
  • velero备份k8s集群
  • 描述低轨星座的特点和通信挑战,以及它们在5G和B5G中的作用。
  • Spring Boot实践 --windows环境下 K8s 部署 Docker
  • Linux 将Qt程序打包为AppImage包
  • 修复国产电脑麒麟系统开机出现initramfs 问题
  • 机器人控制算法—如何使用C++读取pgm格式的栅格地图并转化为ROS地图格式的data?
  • 牛客项目(五)-使用kafka实现发送系统通知
  • 计算机网络——第一章时延部分深入学习、相关习题及详细解析
  • CSS3媒体查询与页面自适应
  • UG\NX二次开发 超长的对象属性值,怎么设置
  • 流媒体服务实现H5实时预览视频
  • C++适配器
  • 基于openresty waf二次开发多次匹配到的ip再做拉黑
  • 新一代构建工具Vite-xyphf
  • Flink源码解析三之执行计划⽣成
  • Flutter 常见错误记录总结