LangChain的函数,工具和代理(一):OpenAI的函数调用

一、什么是函数调用功能

几个月前OpenAI官方发布了其API的函数调用功能(Function calling), 在 API 调用中,您可以描述函数,并让模型智能地选择输出包含调用一个或多个函数的参数的 JSON 对象。API函数“ChatCompletion” 虽然不会实际调用该函数;但是模型会生成这些基于函数参数的JSON对象,您可以使用它来调用代码中的实际函数。

也就是说当用户和ChatGPT对话的过程中需要调用某些外部的函数或者API时,我们可以让ChatGPT生成调用外部函数所需的参数,然后我们再使用这些参数再去实际的调用外部函数,目前OpenAl 对 gpt-3.5-turbo-0613 和 gpt-4-0613 模型进行了微调,使它们具备了以下函数调用功能:

1. 接受额外的参数,用户可以通过这些参数传入函数的描述。
2. 如果相关,则返回要使用的函数的名称,以及带有适当输入参数的 JSON 对象。

二,如何实现OpenAI的函数调用功能

在实现OpenAI的函数调用功能之前,我们先定义一个外部函数,当用户和ChatGPT对话时,ChatGPT会自动判断是否需要调用外部函数,当需要调用外部函数时ChatGPT会返回调用函数的json对象给用户:

import json# 查询天气的模拟函数示例
# 在生产中,这可能是您的后端 API 或外部 API
def get_current_weather(location, unit="fahrenheit"):"""Get the current weather in a given location"""weather_info = {"location": location, #城市"temperature": "72", # 温度"unit": unit, #温度单位"forecast": ["sunny", "windy"], #天气情况}return json.dumps(weather_info)

这里我们定义一个外部函数get_current_weather,他用来查询特定城市的天气情况,并返回一个jons对象作为查询结果。接下来我们需要定义一个该函数的描述对象,该描述对象后面会作为参数传递给ChatGPT:

#函数描述对象
functions = [{"name": "get_current_weather","description": "Get the current weather in a given location","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. San Francisco, CA",},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},},"required": ["location"],},}
]

下面我们来说明一下函数描述对象的主要成员:

  • name: 外部函数名称如get_current_weather
  • description:外部函数功能的描述
  • parameters:外部函数的参数集
  • parameters-type:外部函数的参数集的类型
  • properties:外部函数的具体参数集
  • location:具体的外部函数的参数
  • location-type:外部函数的参数的类型
  • location-description:外部函数的参数的描述
  • unit:具体的外部函数的参数
  • unit-type:外部函数的参数的类型
  • enum:外部函数的参数的枚举值
  • required:必填的参数

这里我们生成了一个外部函数的描述对象,该描述对象会告诉ChatGPT该外部函数的作用,以及我们需要在恰当的时候来调用该函数,至于什么时候才是“恰当的时候”这需要由ChatGPT根据用户对话的上下文来判断。接下来我们向ChatGPT询问一个关于天气的问题:

import openai
openai.api_key = "XXXXXXXXX"messages = [{"role": "user","content": "上海的天气怎么样?"}
]response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions
)print(response)

这里我们向ChatGPT提出了关于天气的问题:“上海的天气怎么样?”, 从ChatGPT的返回结果中我们看到"function_call",这告诉我们接下来我们该调用外部函数了,同时ChatGPT还返回了调用外部函数的参数location和unit,以及所需调用的外部函数名:get_current_weather,有意思的是这里返回的unit为“celsius”即摄氏度而非美国使用的"fahrenheit(华氏度)", 这似乎说明ChatGPT知道中国使用摄氏度作为温度的单位,下面我们询问一下美国城市的天气:

messages = [{"role": "user","content": "What's the weather like in Boston?" #波士顿 的天气怎么样?}
]response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions
)print(response)

这里我们用英语询问了美国城市波士顿的天气情况,从ChatGPT的返回结果中我们看到arguments中只包含了location,而没有包含unit, 而在我们的外部函数get_current_weather中unit为非必填参数,它有一个默认值为:unit="fahrenheit",因此在实际调用外部函数时我们只需将chatgpt返回结果中的arguments中取出对应的参数然后传递给外部函数即可,接下来我们从ChatGPT的返回结果中获取参数来实际调用外部函数get_current_weather:

args = json.loads(response_message["function_call"]["arguments"])
result=get_current_weather(args)
print(result)

 接下来我们来测试一下ChatGPT能否准确识别何时该调用外部函数,下面我们会对ChatGPT发送一个简单的问候语:hi,  当Chatgpt收到该问候语时不应该触发函数调用功能:

messages = [{"role": "user","content": "hi!",}
]response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,
)print(response)

从上面的chatgpt的返回结果中我们看到不存在先前的“function_call"内容即没有生成外部函数的调用参数,这说明此时我们不需要调用外部函数。

三、设置OPAI API的默认参数

openai的API函数ChatCompletion.create中存在一个function_call的参数,该参数的默认值为“auto”即让模型自己来选择是否需要调用外部函数:

messages = [{"role": "user","content": "hi!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call="auto",
)
print(response)

上面我们在openai.ChatCompletion.create的方法中加入了function_call="auto",意思是让模型根据上下文来确定是否调用外部函数,我们看到当我们向ChatGPT打招呼时,如输入“hi”时 ,chatgpt的返回结果中没有“function_call”的内容。这说明ChatGPT知道此时不应该调用外部函数。

messages = [{"role": "user","content": "hi!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call="none",#禁止调用外部函数
)
print(response)

上面当我们将function_cal设置为"none"时(即禁止chatGPT调用外部函数),chatGPT的返回结果中也不会出现“function_call”的内容。

messages = [{"role": "user","content": "What's the weather in Boston?",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call="none", #禁止调用外部函数
)
print(response)

在上面的代码中我们向ChatGPT询问了波士顿的天气,但是我们设置了function_call="none",也就是说虽然我们询问了波士顿的天气情况,但我们却禁止chatgpt调用外部函数,从chatgpt的返回结果中我们看到仍然没有“function_cal”的相关内容。

下面我们设置chatgpt强制调用外部函数,看看会发生上面情况:

messages = [{"role": "user","content": "hi!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call={"name": "get_current_weather"},#强制调用外部函数
)
print(response)

在上面的代码中我们在 ChatCompletion.create中设置了function_call={"name": "get_current_weather"}意思是让chatgpt强制生成调用get_current_weather函数的参数,但是我们向chatgpt发送的用户消息却是:hi!, 这时会让chatgpt产生困惑,因为用户消息中没有有关询问天气的内容,但是却要强制chatgpt去生成外部函数的调用参数,所以在chatgpt的返回结果中function_call中的arguments中给出了一个随机的location:San Francisco,CA。

下面我们向chatgpt询问波士顿的天气,并且让chatgpt强制调用get_current_weather,看看会发生什么情况:

messages = [{"role": "user","content": "What's the weather like in Boston!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call={"name": "get_current_weather"}, #强制调用外部函数
)
print(response)

从上面的chatgpt的返回结果中我们看到了“function_call”中的内容。这说明只要我们设置了chatgpt强制指定了外部调用函数时,它总会生成相应的函数参数。

四、外部函数的调用结果的应用

上面我们让chatgpt来判断是否应该调用外部函数,并且让chatgpt返回了调用外部函数的参数,接下来我们要做的是用chatgpt提供的参数去实际调用外部函数,并将外部函数的返回结果再喂给chatgpt,这样做的目的是让chatgpt来汇总所有的信息并产生最终对用户友好的返回信息。

#整合chatgpt的返回结果
messages.append(response["choices"][0]["message"])
#从chatgpt的返回结果中获取外部函数的调用参数
args = json.loads(response["choices"][0]["message"]['function_call']['arguments'])
#调用外部函数
observation = get_current_weather(args)messages.append({"role": "function","name": "get_current_weather","content": observation, #外部函数的返回结果}
)response = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",messages=messages,
)
print(response)

 这里我们看到ChatGPT最终返回了一个非常友好的回复,该回复是在外部函数调用结果的基础上经过整理后得到的。

五、关于token统计

我们知道chatgpt的API是通过token来收费的,这里我们在使用chatgpt的函数调用功能时我们创建了一个函数描述对象functions,因此functions也会作为上下文的一部分被统计token数,下面我们去掉ChatCompletion.create中的functions和function_call这两个参数看看最后chatgpt返回的总的token数是多少:

messages = [{"role": "user","content": "What's the weather like in Boston!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages
)
print(response)

从上面的返回结果中我们看到当我们去掉了ChatCompletion.create中的functions和function_call这两个参数时,总token数为48,而先前的总token数为99,这说明外部函数描述对象functions被统计了token数。

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

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

相关文章

一站式企业快递管理平台使用教程

因公寄件在企业中重要性的提升,催生出了企业快递管理平台。为什么这么说呢? 随着经济和快递行业的发展,因公寄件在企业中成了一件“常事”,寄文件合同、发票、节假日慰问品、样品等等,这种情况之下,因公寄件…

Vue3 设置点击后滚动条移动到固定的位置

需求&#xff1a; 点击不通过按钮&#xff0c;显示红框中表单&#xff0c;且滚动条滚动到底部 &#xff08;显示红框中表单默认不显示&#xff09; <el-button click"onApprovalPass">不通过</el-button> <div class"item" v-if"app…

pwn:[SWPUCTF 2021 新生赛]nc签到

题目 linux环境下显示为 配合题目的下载附件&#xff0c;发现过滤了一些&#xff0c;一旦输入这些会自动关闭程序 ls被过滤了&#xff0c;可以使用l\s cat和空格都被过滤了&#xff0c;cat可以换成c\at ,空格可以换成$IFS$9

Youtube0播放?运营教你需要的技巧、策略与工具!

对于有跨境意向的内容创作者或者品牌企业来说&#xff0c;YouTube是因其巨大的潜在受众群和商业价值成为最值得投入变现与营销计划的平台。 据统计&#xff0c;98% 的美国人每月访问 YouTube&#xff0c;近三分之二的人每天访问。但是&#xff0c;YouTube还远未达到过度饱和的…

酵母双杂交服务专题(一)

酵母双杂交系统是一种在酵母这种真核生物模型中执行的实验方法&#xff0c;用于探索活细胞内部蛋白质间的相互作用。这种技术能够敏感地捕捉蛋白质间的细微和短暂相互作用&#xff0c;通过检测报告基因的表达产物来实现。作为一种高度灵敏的技术&#xff0c;酵母双杂交系统被广…

Spring Cloud LoadBalancer 简单介绍与实战

前言 本文为SpringCloud的学习笔记&#xff0c;如有错误&#xff0c;希望各位高手能指出&#xff0c;主要介绍SpringCloudLoadBalancer的基本概念和实战 文章目录 前言什么是LoadBalancer负载均衡分类服务端负载均衡客户端负载均衡服务端负载均衡和客户端负载均衡的优缺点 常见…

评测|PolarDB MySQL 版 Serverless

评测&#xff5c;PolarDB MySQL 版 Serverless 目录 一、测试背景 1.1、云原生数据库 PolarDB Serverless新架构概念 1.2、Serverless资源弹性扩缩触发条件 二、PolarDB的Serverless能力与同类型产品进行对比 三、动态弹性升降资源的能力测试 3.1、测试资源 3.2、测试一…

ubuntu22.04在线安装redis,可选择版本

安装脚本7.0.5版本 在线安装脚本&#xff0c;默认版本号是7.0.5&#xff0c;可以根据需要选择需要的版本进行下载编译安装 sudo apt-get install gcc -y sudo apt-get install pkg-config -y sudo apt-get install build-essential -y#安装redis rm -rf ./tmp.log systemctl …

freeRTOS下载链接(sourceForge)

FreeRTOS Real Time Kernel (RTOS) download | SourceForge.net 文件名&#xff1a;FreeRTOSv202212.00.exe 双击后会自动变成这个样子的&#xff1a; 文件夹大小&#xff1a;506M 可以看到跟那个教程里面的文件结构是一模一样的&#xff0c;所以很可能是同一个最新版本的文件…

Linux(Centos)上使用crontab实现定时任务(定时执行脚本)

场景 Windows中通过bat定时执行命令和mysqldump实现数据库备份&#xff1a; Windows中通过bat定时执行命令和mysqldump实现数据库备份_mysqldump bat-CSDN博客 上面讲windows中使用bat实现定时任务的方式&#xff0c;如果是在linux上可以通过crontab实现。 cron是服务名称。…

怎样提升伦敦银买卖技巧?

如果投资者想提升伦敦银的买卖技巧&#xff0c;可以学习一些有用的技术分析方法。所谓技术分析&#xff0c;就是通过对行情过往价格和相关交易数据进行收集&#xff0c;用图表的方式解读白银市场&#xff0c;进而预测行情未来主线走势、判断价格细节变化、寻找重要支撑点阻力点…

TikTok Shop 与英国皇家邮政合作:为卖家提供“Click and Drop”服务

11 月 21 日&#xff0c;TikTok Shop 宣布与皇家邮政 建立新的合作伙伴关系 &#xff0c;为平台上的商家推出 Click & Drop。此次合作将使各种规模的商家能够通过将皇家邮政的 Click & Drop 与其 TikTok Shop 帐户集成来改善其履行体验并更有效地发出订单&#xff0c;…

科普:多领域分布式协同仿真

分布式协同仿真是一种在分布式计算环境中进行协同工作的仿真方法。使用该方法进行协同仿真时&#xff0c;仿真任务将被分发到多个计算节点上&#xff0c;并且这些节点可以同时工作以模拟完整的系统行为。分布式协同仿真已被广泛应用于工程、科学和军事领域&#xff0c;以便更好…

医保线上购药系统:代码驱动的医疗创新

医保线上购药系统&#xff0c;这是一个融合技术和医疗的创新典范。本文将通过简单的技术代码示例&#xff0c;为您揭示这一系统是如何通过技术驱动医疗创新&#xff0c;为用户提供更智能、便捷的健康管理体验的。 1. 前端界面开发 使用React框架&#xff0c;我们可以轻松构建…

深度探究数据要素市场,企业为什么要参与数据资产化建设

我国正在发展数字经济&#xff0c;培育数字要素市场&#xff0c;推进数据市场化。在十四五数字经济发展规划中就已经将数据要素列为数字经济深化发展的核心引擎。今天和大家分享关于数据要素的前世今生&#xff0c;您将了解以下知识点&#xff1a; 1.什么是数据要素&#xff1f…

可视化工作流管理流程及工具

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新…

广告屏LED屏断电检测远程控制开关方案应用钡铼技术S270

广告屏LED屏断电检测&#xff1a; 广告屏和LED屏在商业和公共场所的广泛应用中扮演着重要角色&#xff0c;但由于断电问题可能导致广告屏无法正常显示&#xff0c;进而影响广告宣传效果和客户体验。而S270作为一种高效稳定的远程控制开关&#xff0c;可以实现广告屏LED屏的断电…

Git 与 Maven:企业级版本管理与版本控制规范设计

一、背景 当今&#xff0c;许多开发人员熟悉 GitFlow 工作流程&#xff0c;但往往忽略了 GitFlow 如何与 Maven 版本控制结合&#xff0c;尤其是在管理 snapshot 和 release 版本时的最佳实践。本文旨在整合 GitFlow 工作流程与 Maven 版本管理&#xff0c;提出一个统一的企业…

案例012:Java+SSM+uniapp基于微信小程序的科创微应用平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

虾皮知虾数据分析软件:优化您的电商经营

在当今竞争激烈的电商市场&#xff0c;了解市场动态、分析竞争对手和产品趋势是成功经营的关键。虾皮知虾数据分析软件是一款强大的工具&#xff0c;为电商卖家提供了全面的数据采集和分析功能。本文将介绍虾皮知虾数据分析软件的特点和功能&#xff0c;以及如何利用它来优化您…