GPT 中的函数调用(function call)是什么?
在 OpenAI ChatGPT API 和 Google Gemini API 中我们可以看到函数调用的功能。这个功能是做什么用的?下面大概讲解。
以 Google Gemini API 函数调用 一节中的内容为例,该章节举了一个例子:
大语言模型(LLMs)往往无法进行准确的数学运算。比如说,给 Gemini 两个数 \(a\) 和 \(b\),让它计算 \(a \times b\) 的值。Gemini 给出的值往往和实际计算值有所出入。
model = genai.GenerativeModel('gemini-pro')
chat = model.start_chat()
a = 2312371
b = 234234
response = chat.send_message(
f"What's {a} X {b} ?"
)
print(response.text)
Gemini 给出的值是:
549899573314
而 \(a \times b\) 的实际值是 541635908814
,Gemini 的计算并不正确。
我们会想:既然 Gemini 算不正确,但是这种小事我们用 Python 就能算正确了呀。能不能让 Gemini 像我们一样使用 Python 来进行计算呢?
答案是可以。
只要我们在本地定义好 Gemini 需要调用的函数,再向 Gemini 声明我们为它定义了哪些函数、函数的功能是什么,以及函数的参数有哪些,Gemini 就可以在它认为需要调用这些函数的时候,以对话的形式向我们请求调用这些函数。
比如说,我们希望 Gemini 的乘法运算能更准确一点,于是我们为它定义一个乘法函数:
def multiply(a, b):
return a * b
我们还要告诉 Gemini 我们为它定义了 multiply
这个函数,用于计算两个数的乘积,并且它需要两个数字参数 a
和 b
:
calculator = glm.Tool(
function_declarations=[
# 在这里进行函数声明
glm.FunctionDeclaration(
name='multiply', # 函数名
description="Returns the product of two numbers.", # 功能描述
# 在这里进行参数声明
parameters=glm.Schema(
type=glm.Type.OBJECT,
properties={
# 需要两个参数 a 和 b,类型为 NUMBER
'a':glm.Schema(type=glm.Type.NUMBER),
'b':glm.Schema(type=glm.Type.NUMBER)
},
required=['a','b'] # 声明必要参数,这里 a 和 b 都是必要的
)
)
])
这样,Gemini 就知道了我们为它准备了一个函数 multiply
,用于乘法运算。
现在,我们再次询问 Gemini \(a \times b\) 的值:
model = genai.GenerativeModel('gemini-pro', tools=[calculator])
chat = model.start_chat()
a = 2312371
b = 234234
response = chat.send_message(
f"What's {a} X {b} ?",
)
Gemini 在分析完我们的问题之后发现它要计算 \(a \times b\) 的值,并且还发现我们已经为它定义了一个函数 multiply
用于乘法运算。所以,它在生成回答之前,会先向我们请求调用 multiply
这个函数。我们在 response.candidates
这个属性中可以看到它请求调用的函数名:
response.candidates
[index: 0
content {
parts {
function_call {
name: "multiply"
args {
fields {
key: "b"
value {
number_value: 234234
}
}
fields {
key: "a"
value {
number_value: 2312371
}
}
}
}
}
role: "model"
}
finish_reason: STOP
]
可以看到,在 function_call
属性中,它请求了 multiply
这个函数,并且给出了函数的参数 a
和 b
。
接下来,我们只需在本地为它执行 multiply
这个函数,并把函数的返回值传递给它即可:
fc = response.candidates[0].content.parts[0].function_call # 获取 Gemini 请求的函数调用相关信息
if fc.name == 'multiply': # 判断函数调用的名字是否为 multiply
result = mutiply(fc.args['a'], fc.args['b']) # 执行函数调用
# 最后,将函数调用的结果传递给 Gemini
response = chat.send_message(
glm.Content(
parts=[glm.Part(
# 在这里传入函数调用的结果
function_response = glm.FunctionResponse(
name='multiply',
response={'result': result}
)
)]
)
)
GPT 中的函数调用(function call)是什么?的更多相关文章
- 理解js中的函数调用和this
概述 这是我看typescript的时候看引用资源看到的,原文在这里:Understanding JavaScript Function Invocation and "this" ...
- 在chrome开发者工具中观察函数调用栈、作用域链与闭包
在chrome开发者工具中观察函数调用栈.作用域链与闭包 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量 ...
- 在chrome开发者工具中观察函数调用栈、作用域链、闭包
在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象,闭包,this等关键信息的变化.因此,断点调试对于快 ...
- 引用js文件中的函数调用
开发中遇到一个问题,代码demo如下: test.js文件内容: var b = getHomeCity(); Test.html文件内容: <!DOCTYPE html> <htm ...
- JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)
一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...
- 2.4 OpenEuler中C语言中的函数调用测试
2.4 OpenEuler中C语言中的函数调用测试 任务详情 在X86_64架构下实践2.4中的内容 通过GDB查看寄存器的内容,把教材中的图填入具体的值 把2.4的C代码在OpenEuler中重新实 ...
- C++中构造函数调用构造函数
今天想做道矩阵的题目时,却卡在一些编程细节上了,找了好久才发现原来是在构造函数处出了问题,然后上网百度了下,发现这篇文章说得很好:从一道题谈C++中构造函数调用构造函数,很棒! 还补充一点: 看来自己 ...
- Jquery中parentsUntil函数调用最容易犯的三个错误
来自 :http://jquery01.diandian.com/post/2012-01-16/14500044 Jquery中parentsUntil函数调用最容易犯的三个错误 Jquery的pa ...
- VS开发】C中调用C++文件中定义的function函数
[VS开发]C中调用C++文件中定义的function函数 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 精要一揽 C调用 ...
- NCF 中如何将Function升级到FunctionRender
简介 历史的车轮在不断的向前推进,NCF也在不断的迭代更新,只为成为更好的NCF 如果你之前没有用过NCF可以跳过这个文档,直接去下载最新的NCF源码进行实践. NCF仓库地址:https://git ...
随机推荐
- CF911G 题解
考虑分块. 如果你做过未来日记就会知道一个很明显的做法--值域并查集. 先考虑整块: 块内没有 \(x\) 则跳过本次操作. 块内有 \(x\) 没有 \(y\) 则令 \(fa[x] = y\) 块 ...
- ComfyUI进阶篇:ComfyUI核心节点(一)
ComfyUI进阶篇:ComfyUI核心节点(一) 前言: 学习ComfyUI是一场持久战.当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点.面对各种各样的工作流和复杂的节点种类,可 ...
- Java开发常见问题分析和处理方案
程序Bug的产生,通常分为三种类型 逻辑漏洞: 低级错误,程序执行后无法达到想要效果. 越界访问: 访问了非法区域,造成程序崩溃. 条件考虑不全面: 你以为你万无一失,但你永远都不知道输入参数究竟是什 ...
- Eggjs 设置跨域请求 指定地址跨域 nodejs
首先egg自身框架没有直接设置允许跨域请求的功能和接口,所以需要第三方包来设置跨域请求! 先安装第三方包来设置跨域,使用egg-cors // npm npm i egg-cors --save // ...
- PowerBuilder编程新思维6.5:外传1(PowerPlume的设计与规划)
<第五部分 Otherside 意外的宝藏> 每一颗种子都有发芽的梦想.PowerPlume(孔雀翎)开发交流群:286502392 PowerBuilder编程新思维6.5:外传1 ...
- 机器学习策略篇:详解处理数据不匹配问题(Addressing data mismatch)
处理数据不匹配问题 如果您的训练集来自和开发测试集不同的分布,如果错误分析显示有一个数据不匹配的问题该怎么办?这个问题没有完全系统的解决方案,但可以看看一些可以尝试的事情.如果发现有严重的数据不匹配问 ...
- npm和yarn 命令比较
命令比较 npm init | yarn init:创建一个新包 npm run | yarn run:运行 package.json 中定义的脚本 npm test | yarn test:测试一个 ...
- 解决Prism中对话框服务中对话框开启时回调函数不会触发的问题
解决办法 新建一个类DialogServiceExtend,然后在再注册 public class DialogServiceExtend : DialogService { public Dialo ...
- nvidia官方AI框架软件的命令行操作接口 —— NVIDIA GPU Cloud (NGC) CLI
NVIDIA GPU Cloud (NGC) CLI 安装介绍地址: https://org.ngc.nvidia.com/setup/installers/cli 安装好后需要输入自己的NVIDIA ...
- 【转载】 windows python3 安装 openai gym 的 atari_py
版权声明:本文为CSDN博主「dai1056318647」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/dai ...