在 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 这个函数,用于计算两个数的乘积,并且它需要两个数字参数 ab

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 这个函数,并且给出了函数的参数 ab

接下来,我们只需在本地为它执行 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)是什么?的更多相关文章

  1. 理解js中的函数调用和this

    概述 这是我看typescript的时候看引用资源看到的,原文在这里:Understanding JavaScript Function Invocation and "this" ...

  2. 在chrome开发者工具中观察函数调用栈、作用域链与闭包

    在chrome开发者工具中观察函数调用栈.作用域链与闭包 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量 ...

  3. 在chrome开发者工具中观察函数调用栈、作用域链、闭包

    在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象,闭包,this等关键信息的变化.因此,断点调试对于快 ...

  4. 引用js文件中的函数调用

    开发中遇到一个问题,代码demo如下: test.js文件内容: var b = getHomeCity(); Test.html文件内容: <!DOCTYPE html> <htm ...

  5. JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)

    一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...

  6. 2.4 OpenEuler中C语言中的函数调用测试

    2.4 OpenEuler中C语言中的函数调用测试 任务详情 在X86_64架构下实践2.4中的内容 通过GDB查看寄存器的内容,把教材中的图填入具体的值 把2.4的C代码在OpenEuler中重新实 ...

  7. C++中构造函数调用构造函数

    今天想做道矩阵的题目时,却卡在一些编程细节上了,找了好久才发现原来是在构造函数处出了问题,然后上网百度了下,发现这篇文章说得很好:从一道题谈C++中构造函数调用构造函数,很棒! 还补充一点: 看来自己 ...

  8. Jquery中parentsUntil函数调用最容易犯的三个错误

    来自 :http://jquery01.diandian.com/post/2012-01-16/14500044 Jquery中parentsUntil函数调用最容易犯的三个错误 Jquery的pa ...

  9. VS开发】C中调用C++文件中定义的function函数

    [VS开发]C中调用C++文件中定义的function函数 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 精要一揽 C调用 ...

  10. NCF 中如何将Function升级到FunctionRender

    简介 历史的车轮在不断的向前推进,NCF也在不断的迭代更新,只为成为更好的NCF 如果你之前没有用过NCF可以跳过这个文档,直接去下载最新的NCF源码进行实践. NCF仓库地址:https://git ...

随机推荐

  1. Legacy (线段树优化建图)

    题目链接:Legacy - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题解: 考虑题目中一个点向区间连边,如真的对区间中的每一点分别连边后跑最短路,时间空间都要炸. 因为是一个点向 ...

  2. xlookup与vlookup的区别

    区别还是很大的,vlookup暂时扔不了.

  3. 【ClickHouse】0:clickhouse学习3之时间日期函数

    官方文档: https://clickhouse.tech/docs/zh/sql-reference/functions/date-time-functions/ 常用的clickhouse时间函数 ...

  4. PLSQL 无法查询带中文的WHERE条件

    今天遇到一个坑爹的问题,plsql无法查询带where条件的语句,是因为plsql中Oracle的客户端字符集和服务器上的不一样造成的,需要新增系统环境变量,特意记录下解决办法. 第一步:查询服务器上 ...

  5. Grafana Loki查询加速:如何在不添加资源的前提下提升查询速度

    Grafana Loki查询加速:如何在不添加资源的前提下提升查询速度 来自Grafana Loki query acceleration: How we sped up queries withou ...

  6. ASP.NET Core 程序集注入(二)

    public void ConfigureServices(IServiceCollection services) { string strValue = Configuration.GetSect ...

  7. openGL之多线程渲染

    随着Vulkan的引入,我们的图形技术的发展到达了一个新的顶点,但是呢,我们的老干爹OpenGL作为落日余晖,他在一些Vulkan才有的新功能上,也提供了一些支持,现在我们来讨论一下OpenGL之多线 ...

  8. css3实现背景三角形样式

    话不多说上效果图: css: font-family: PingFang-SC-Heavy, PingFang-SC; font-weight: 800; color: #2160AD; border ...

  9. 机器学习:详解多任务学习(Multi-task learning)

    详解多任务学习 在迁移学习中,步骤是串行的,从任务\(A\)里学习只是然后迁移到任务\(B\).在多任务学习中,是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有 ...

  10. linux一行执行多条命令 shell

    要实现在一行执行多条Linux命令,分三种情况: 1.&& 举例: lpr /tmp/t2 && rm /tmp/t2 第2条命令只有在第1条命令成功执行之后才执行.当 ...