在 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. opengauss Need repair修复

    问题描述:opengauss集群在做切换的时候,或者增删节点的时候,很容易发生节点repair,找不到主库的情况,这种情况需要把主库使用primary角色启动,然后build重建从库,就可以恢复集群 ...

  2. Taro 滚动切换tab页

    import React, { Component } from 'react' import { View, Text, ScrollView } from '@tarojs/components' ...

  3. python使用flask框架生成excle返回前端(包含图片、表格、表头灰色、表格加边框)

    python使用flask框架生成excle文档,文档中包含图片和表格,其中表格要包含图片.表格.表头灰色.表格加边框,照片和表格不重叠. 逻辑:获得图片的高度,根据高度计算表格从第几行开始插入. 效 ...

  4. 网易数帆内核团队:memory cgroup 泄漏问题的分析与解决

    memory cgroup 泄露是 K8s(Kubernetes) 集群中普遍存在的问题,轻则导致节点内存资源紧张,重则导致节点无响应只能重启服务器恢复:大多数的开发人员会采用定期 drop cach ...

  5. git 更新某个目录或文件

    不多说直接贴代码 更新文件 $ git fetch remote: Counting objects: 8, done. remote: Compressing objects: 100% (3/3) ...

  6. windows10 idea springboot项目部署

    windows10 idea springboot项目部署 一,springboot项目 本次项目在原项目的基础之上进行了二次开发:添加了index.html页面 根据配置文件配置数据库 先创建数据库 ...

  7. 【MySQL】01 概念与介绍

    视频节选自 :P1 - P7 https://www.bilibili.com/video/BV1xW411u7ax  用户浏览的页面 - 服务器 - 数据库 所有访问的本质的东西,就是访问数据,数据 ...

  8. 【Linux】快速文件交互 lrzsz

    首先需要安装依赖: yum install -y lrzsz 没有此依赖,Linux提示找不到命令: [root@localhost ~]# rz -bash: rz: 未找到命令 [root@loc ...

  9. 【Vue】08 Webpack Part4 使用Vue

    新建一个目录创建Vue项目: cd .. mkdir webpack-vue cd webpack-vue 安装Vue cnpm install vue 保持之前的目录结构: 在Main.js中引用V ...

  10. Springboot实现HTML表单from简单的接收信息

    HTML< from >元素 from可向Web服务器提交请求 普遍格式: <from action="服务器地址" method="请求方式" ...