OpenAI Function calling

news2024/9/21 0:31:40

开篇

原文出处

最近 OpenAI 在 6 月 13 号发布了新 feature,主要针对模型进行了优化,提供了 function calling 的功能,该 feature 对于很多集成 OpenAI 的应用来说绝对是一个“神器”。

Prompt 的演进

如果初看 OpenAI 官网对function calling的介绍,似乎不足以体现它的重要性。为了更进一步理解它的作用,我们先来简单回顾一下在使用 OPenAI 时 Prompt 是如何演进的。

Prompt 1.0

prompt 1.0

还记得 chatGPT 在最一开始大火时,除了 AI 强大的能力作为一个吸引点之外,“低门槛的要求使得所有人都可以使用”也扮演着至关重要的角色。也正是如此,大家不再对 AI 感到陌生,借助和 AI 对话,随便一个 Prompt 就可以让使用者直接或间接的获得帮助。

但是随着使用深度的增加,大家慢慢发现chatGPT有时会思维发散,往往不能聚焦关键问题,甚至会“无言乱语”。

在此之上,1.0 版本的 Prompt 出现,它要求对话开始前需要设定上下文。在这样的提示下,AI 能够有较好的表现,并且不再发散,可以解决较为简单的问题。

Prompt 2.0

prompt 2.0

随着使用场景的复杂化,单纯的设置一个上下文给chatGPT已经远远不够。你必须给“足”上下文,最简单的方式就是提供exmaple,这种做法的背后逻辑和 COT(Chain of Thought)是一样的。

2.0 版本的 Prompt 是使用最广泛的也是最可靠的。

Prompt 3.0

prompt 3.0

3.0 版本的 Prompt 并非比 2.0 要高级,只是在需求上不一样。因为随着大量 AI 工具和 OpenAI 集成,想要充分利用 AI 的能力,让更多的系统和模块和你结合,就必须得提取参数或者返回特定的输出。

因此,3.0 聚焦更多的是集成。

Function calling

Prompt 在迭代到 3.0 版本后,AI 的缺点已经一览无遗。虽然chatGPT有大量的知识储备,但它的数据都是预训练的,由于不能联网,所以它并不是“无所不知”的。

因此,集成第三方系统对模型的赋能就成为了当下众多 AI 应用的首要方案。可赋能就代表得知道用户到底要知道什么,这就是 3.0 版本的努力方向。但是 3.0 的版本其实并不能非常稳定的输出特定格式,或者即便格式可以固定,json 数据的类型也不能很好的控制。比如上面的 3.0 例子里,不是所有的 AI 模型都能稳定输出price: 1500,也有可能是$1500(Bard)。
也许你会觉得1500$1500的差异并不大,大不了可以处理一下前缀之类的问题,那就大错特错了。因为这是作为 不同模块(或系统)链接的桥梁,就如同 API 之间集成的契约一般,必须有严格的定义。

一个典型的例子就是前段时间大火的Auto-GPT, 在 3.5 turbo 的模型下,它很难完成一个任务,往往会陷入无限的循环,主要的原因就是它需要非常严格的上下文衔接来集成各种 command,但凡有一丁儿点的差异都会导致“连接”失败。

在此背景下,function calling出现了。

它允许用户定义一个或多个 function 描述,该描述满足 API doc 的规范,定义了参数的类型和含义。AI 在经过 function calling 的调教后,可以准确的理解这种规范并按照上下文去决定是否可以“命中”该方法,如果“命中”,则会返回该方法的参数。

到此它已经解决了参数提取的问题,但并没有结束。此时开发者可以利用这个参数去集成第三方系统,获取特定的信息然后把结果反馈给模型,这样模型就有了这个方法的输入和输出,看起来像是模型“执行”了该方法,而实际是模型被动的获取了它没有的知识。

最后,AI 根据新获得的知识和信息,给用户输出最后的结果。

Example: DB 搜索

假设我们想利用 AI 在 DB 层建立搜索接口,我们可以按照以下步骤:

    1. 将 DB 的 meta 数据作为上下文,定义 ask_database 的方法规范
{
  "functions": [
    {
      "name": "ask_database",
      "description": "Use this function to answer user questions about music. Output should be a fully formed SQL query.",
      "parameters": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "SQL query extracting info to answer the user\\'s question.SQL should be written using this database schema:\"Table name: album_tb; Columns: album(string), published_at(string), likes(string)\".The query should be returned in plain text, not in JSON."
          }
        },
        "required": ["query"]
      }
    }
  ]
}
    1. 设定 system 上下文,提示模型如果 user 的 prompt 无法命中 function 的话就不要强行“脑补”

这很有用,说明不是所有的 Prompt 都需要被 function 来解析,有点类似 if else,这样可以回归到正常的对话中。

{
  "role": "system",
  "content": "Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."
}
    1. 提问
{
  "role": "user",
  "content": "What are the top 2 the albums"
}
    1. 模型命中 function 并且返回解析的参数
{
  "role": "assistant",
  "content": null,
  "function_call": {
    "name": "ask_database",
    "arguments": "{\n  \"query\": \"SELECT * FROM album_tb ORDER BY likes DESC LIMIT 5\"\n}"
  }
}
    1. 查询 DB,将数据返回给我模型(赋能)
{
  "role": "function",
  "name": "ask_database",
  "content": "[{\"album\":\"Tanya\",\"published_at\":\"2000-01-01\",\"likes\":\"10000\"},{\"artist\":\"Im OK\",\"published_at\":\"1999-01-01\",\"likes\":\"20000\"}]"
}
    1. 模型根据新的知识储备响应用户的 Prompt
{
  "role": "assistant",
  "content": "The top 2 albums are \"Im OK\" with 20,000 likes and \"Tanya\" with 10,000 likes."
}
    1. 再次提问,测试新的知识储备是否被模型深刻理解
{
  "role": "user",
  "content": "What are the most popular one"
}
    1. 模型可以准确的在新的知识储备进行搜索
{
  "role": "assistant",
  "content": "The most popular album is \"Im OK\" with 20000 likes."
}

完整的 API 请求如下:

{
	"model": "gpt-3.5-turbo-0613",
	"messages": [
		{
			"role": "system",
			"content": "Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."
		},
		{
			"role": "user",
			"content": "What are the top 2 the albums"
		},
		{
			"role": "assistant",
			"content": null,
			"function_call": {
					"name": "ask_database",
					"arguments": "{\n  \"query\": \"SELECT * FROM album_tb ORDER BY likes DESC LIMIT 5\"\n}"
				}
		},
		{
			"role": "function",
			"name": "ask_database",
			"content": "[{\"album\":\"Tanya\",\"published_at\":\"2000-01-01\",\"likes\":\"10000\"},{\"artist\":\"Im OK\",\"published_at\":\"19999-01-01\",\"likes\":\"20000\"}]"

		},
		{
			"role": "user",
			"content": "What are the most popular one"
		}
	],
	"functions": [
		{
			"name": "ask_database",
			"description": "Use this function to answer user questions about music. Output should be a fully formed SQL query.",
			"parameters": {
				"type": "object",
				"properties": {
					"query": {
						"type": "string",
						"description": "SQL query extracting info to answer the user\\'s question.SQL should be written using this database schema:\"Table name: album_tb; Columns: album(string), published_at(string), likes(string)\".The query should be returned in plain text, not in JSON."
					}
				},
				"required": [
					"query"
				]
			}
		}
	]
}

模型

OpenAI 在 6 月 13 号的 release 中,专门针对 function calling 发布了新的模型,无论是价格还是上下文的长度都有比较大的变化,以下为 3.5(免费)的模型列表:

release

最后

function calling 对与模型精准的理解 Prompt 和集成外部知识储备系统绝对是一个强大的工具,未来 Prompt 的趋势肯定也会朝着个方向去设计,拭目以待吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/902584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络-物理层(三)编码与调制

计算机网络-物理层(三)编码与调制 在计算机网络中,计算机需要处理和传输用户的文字、图片、音频和视频,它们可以统称为消息 数据是运输信息的实体,计算机只能处理二进制数据,也就是比特0和比特1。计算机中…

不含数字的webshell绕过

异或操作原理 1.首先我们得了解一下异或操作的原理 在php中,异或操作是两个二进制数相同时,异或(相同)为0,不同为1 举个例子 A的ASCII值是65,对应的二进制值是0100 0001 的ASCII值是96,对应的二进制值是 0110 000…

CSS加载失败的6个原因

有很多刚刚接触 CSS 的新手有时会遇到 CSS 加载失败这个问题,但测试时,网页上没有显示该样式的问题,这就说明 CSS 加载失败了。出现这种状况一般是因为的 CSS 路径书写错,或者是在浏览器中禁止掉了 CSS 的加载,可以重新…

Linux/Ubuntu 的日常更新,如何操作?

我安装的是Ubuntu 20.04.6 LTS的Windows上Linux子系统版本,启动完成后显示: Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.15.90.4-microsoft-standard-WSL2 x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.c…

使用mysql:5.6和owncloud镜像构建个人网盘

一、拉取镜像 使用docker拉取mysql:5.6和owncloud的镜像 [rootexam ~]# docker pull mysql:5.6 [rootexam ~]# docker pull owncloud 运行镜像生成容器实例 [rootexam ~]# docker run -d --name mydb1 --env MYSQL_ROOT_PASSWORD123456 mysql:5.6 a184c65b73ff993cc5cf86f…

保姆级教程:从0到1搭建Stable Diffusion XL完整工作流进行AI绘画 | 【人人都是算法专家】

Rocky Ding 公众号:WeThinkIn 写在前面 【人人都是算法专家】栏目专注于分享Rocky在AI行业中对业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习💪 大家好,我是Rocky。 之前Rocky详细介绍了Stable Diffusion(SD&#…

Scratch 之 RPG 引擎制作教程(1) / 地图行走

大家好,又和大家见面了,那么我们这期讲的就是RPG游戏的地图以及人物的行走。 我发现大家并不是很懂RPG游戏引擎,也就是说这种引擎对于技术的要求还是比较高的。为了让更多人直接上手制作RPG游戏,我打算开启这一系列教程。 这个教程…

又一个 Python 图形界面库,简单好用

迷途小书童的Note 读完需要 10分钟 速读仅需 4 分钟 1 环境 python 3.9.16nicegui 1.3.9 2 前言 在现代计算机应用程序开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。然而,GUI 开发往往需要大量的代码和复杂的布局&am…

损失函数——感知损失

感知损失(Perceptual Loss)是一种基于深度学习的图像风格迁移方法中常用的损失函数。与传统的均方误差损失函数(Mean Square Error,MSE)相比,感知损失更注重图像的感知质量,更符合人眼对图像质量…

webshell实践复现

目录 一.Nginx负载均衡(反向代理及负载均衡配置以省略) 1.环境搭建 2.复现 二.webshell实践 1:异或操作绕过 2:取反绕过 3:php语法绕过 一.Nginx负载均衡(反向代理及负载均衡配置以省略) 注…

EndNote(四)【文献引文格式、同步、智能分组、引文报告、文献笔记导出】

参考文献格式:(官网引文格式下载文章引文格式更新-word) 官网引文格式下载 网址:Downloads | EndNote 点击output styles: 下下来之后,放在这个路径下: 双击看一下: ok. 比如我们要…

Java面试题(1) 为什么重写 equals() 就一定要重写 hashCode() 方法?

目录 一、问题分析1.equals() 的实现2.equals() 和 hashCode() 的关系3.存在的问题 二、完整回答 一、问题分析 1.equals() 的实现 关于这个问题,首先需要深入了解一下 equals() 这个方法。 String 类 equals() 源码如下: public boolean equals(Obj…

Linux —— 进程间通信(System V)

目录 一,共享内存 申请共享内存 shmget 控制共享内存 shmctl 关联共享内存 shmat / 去联共享内存 shmdt 二,消息队列 创建或打开消息队列 msgget 发送消息 msgsnd / 接收消息 msgrcv 控制消息 msgctl 三,信号量 创建或打开信号量 s…

java八股文面试[java基础]——面相对象特点

三大特点: 封装 继承 多态 面试题:java如何实现多继承(除了使用接口之外) 实现多继承有三个方法: 多层继承内部类接口 知识来源: 【基础】面向对象_哔哩哔哩_bilibili 【2023年面试】Java面向对象有哪些…

Vue--BM记事本

效果如下&#xff1a; 用到了如下的技术&#xff1a; 1.列表渲染&#xff1a;v-for key的设置 2.删除功能&#xff1a;v-on调用参数 fliter过滤 覆盖修改原数组 3.添加功能&#xff1a;v-model绑定&#xff0c;unshift修改原数组添加 html文件如下&#xff1a; <!DOCTYPE …

1.进程控制

1.进程概念 进程是管理事务的基本单元 2.并发并行 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多条指令在多个处理器上同时执行。并发(concurrency)&#xff1a;指在同一时刻只能有一条指令执行&#xff0c;但多个进程指令被快速的轮换执行&#xff0c;使得在宏观上…

7-5 特殊a串数列求和

分数 20 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 给定两个均不超过9的正整数a和n&#xff0c;要求编写程序求aaaaaa⋯aa⋯a&#xff08;n个a&#xff09;之和。 输入格式&#xff1a; 输入在一行中给出不超过9的正整数a和n。 输出格式&#xff1a; 在一行中…

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基…

华为网络篇 多区域OSPF-32

难度2复杂度2 目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 OSPF是一种具有区域概念的路由协议&#xff0c;为什么需要分区域&#xff1f;像RIP那样都在一个区域配置也不多这样简单点不是更好吗&#xff1f;OSPF它是一种功能十分强大的IG…

基于Java+SpringBoot+Vue的学校田径运动会管理系统【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…