五、OpenAi之函数调用(Function Calling)(一)

在这里插入图片描述

1.函数调用(Function Calling)

学习如何使大语言模型连接到外部工具

1.1介绍

在API调用中,您可以描述函数规范,让模型智能地选择输出包含参数的JSON对象,过程中你以调用一个或多个函数。聊天补全API自身不能调用函数;而是,让模型生成JSON,使用它调用函数代码

最新的模型(gpt-3.5-turbo-0125和gpt-4-turbo-preview)已通过训练,可以检测何时应该调用函数(取决于输入),并使用模型对符合函数签名的JSON进行响应。拥有这项能力的同时也伴随着风险。我们强烈建议在采取可能影响世界范围内的用户行为之前建立用户确认流程(例如:发邮件、发布网络、购物等待)

1.2常用案例

函数调用可以使你更可靠的从模型获得结构化的数据。可以这样:

  • 创建一些助理,通过调用外部的APIs来回答一些问题(例如:像ChatGPT的插件)
    • 例如:可以定义函数:send_email(to:string, body:string)或get_current_weather(location:string, unit:‘celsius’|‘fahrenheit’)
  • 转换自然语言到API调用
    • 例如:转换“我的最主要的客户都有谁?” get_customers(min_revenue: int, created_before: string, limit: int) 并调用你系 统内部的API
  • 从文本中提取结构化的数据
    • 例如:定义一个函数调用:extract_data(name: string, birthday: string) 或 sql_query(query: string)

等等还有很多…

函数调用的基本步骤如下:

  1. 调用模型时,将“用户查询”和“多个函数”定义在“函数参数”中
  2. 模型可以选择调用一个或多个函数;这样,内容将是遵循自定义模式的字符串化JSON对象(注意:模型可能会产生幻觉参数)
  3. 在你的代码中将string解析成JSON对象,用之前提供的参数(如果存在)调用函数
  4. 追加函数的返回作为一个新的消息再次调用模型,然后让模型归纳结果并返回给用户

1.3支持模型

目前,不是所有模型的版本都是用函数调用数据训练的。支持函数调用的模型有:

  • gpt-4, gpt-4-turbo-preview
  • gpt-4-0125-preview
  • gpt-4-1106-preview
  • gpt-4-0613
  • gpt-3.5-turbo
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106
  • gpt-3.5-turbo-0613

另外, 以下模型支持并行的函数调用:

  • gpt-4-turbo-preview
  • gpt-4-0125-preview
  • gpt-4-1106-preview
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106

2.并行函数调用

并行函数调用就是模型一起执行多个函数调用的能力,允许这些函数的效果和结果的调用被并行的解析。如果函数调用要花很长的时间,并行调用就显得非常有用。例如,模型可能要调用函数同时返回三个不同地点的天气,在tool_calls数组中,要包含三个函数调用,并作为一个消息结果返回,每个调用含有一个ID.为响应这些函数调用,增加三个消息至会话中,每个消息包含一个函数调用的结果,从tool_calls引用id,并用tool_call_id表示。

在下面例子中,我们仅定义一个函数get_current_weather。模型调用了函数多次,并将调用函数的返回结果再次发送给模型,由模型决定下一步的返回消息。它会返回一个面向用户的消息,告诉用户一些地区的温度。根据查询结果,可能会在调用一次函数。

如果你想强制模型调用一个指定的函数,你可以设置tool_choice参数,指定具体的函数名。你也可以强制模型生成面向用户的消息,设置参数:tool_choice: none。请注意:参数默认设置为:tool_choice: auto ,含义是由模型决定是否调用函数,调用哪一个函数。

2.1多个函数调用案例

# @Time : 2024/2/15 11:22
# @Author : NaiveFrank
# @Version : 1.0
# @Project : python_tutorial
from openai import OpenAI
import json# 加载 .env 文件到环境变量
from dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv())# 初始化 OpenAI 服务。会自动从环境变量加载 OPENAI_API_KEY 和 OPENAI_BASE_URL
client = OpenAI()# 例子模拟函数调用的硬编码,返回相同数据格式的天气
# 在实际生产中,可以是后台API或第三方的API fahrenheit-华氏温度
def get_current_weather(location, unit="fahrenheit"):"""返回指定地区的实时天气"""if "北京" in location.lower():return json.dumps({"location": "北京", "temperature": "16", "unit": unit})elif "上海" in location.lower():return json.dumps({"location": "上海", "temperature": "22", "unit": unit})elif "承德" in location.lower():return json.dumps({"location": "承德", "temperature": "12", "unit": unit})else:return json.dumps({"location": location, "temperature": "未知"})def run_conversation():# 第一步:发送会话和函数调用给模型messages = [{"role": "user", "content": "北京、上海、承德3地的天气现在是什么样的?"}]tools = [{"type": "function","function": {"name": "get_current_weather","description": "返回指定地区的温度","parameters": {"type": "object","properties": {"location": {"type": "string","description": "承德市双桥区",},"unit": {"type": "string", "enum": ["celsius", "华氏温度"]},},"required": ["location"],},},}]response = client.chat.completions.create(model="gpt-3.5-turbo-0125",messages=messages,tools=tools,tool_choice="auto",  # auto 默认值,明确给出)response_message = response.choices[0].messagetool_calls = response_message.tool_calls# 第二步: 检查模型是否需要调用一个函数if tool_calls:# 第三步: 调用函数# 注意:返回的JSON消息不一定有效,一定要检查错误available_functions = {"get_current_weather": get_current_weather,}  # 这个例子只有一个参数调用,当然也可以有多个messages.append(response_message)  # 将助理的回复加入到消息中# 第四步: 将每一个函数调用及其相应的响应发送给模型for tool_call in tool_calls:function_name = tool_call.function.name  # 返回函数调用名function_to_call = available_functions[function_name]  # 返回JSON不一定有效,使其有效function_args = json.loads(tool_call.function.arguments)  # 将函数所用的参数解析为JSONfunction_response = function_to_call(  # 调用函数并传指定参数location=function_args.get("location"),unit=function_args.get("unit"),)"""函数调用返回结果加入新的会话"tool_call_id": tool_call.id, -> 函数返回的ID"role": "tool", -> role 类型为tool"name": function_name, -> 动态解析的函数调用名"content": function_response, -> 内容为函数调用返回结果"""messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,})# 模型理解函数返回的响应后,并返回一个新的响应second_response = client.chat.completions.create(model="gpt-3.5-turbo-0125",messages=messages,)return second_responseprint(run_conversation())

输出结果:

ChatCompletion(id='chatcmpl-8sMdpiaEJhSQhmbN9ONbd1ZR2pefZ', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='目前,北京的气温是16摄氏度,上海的气温是22摄氏度,承德的气温是12摄氏度。', role='assistant', function_call=None, tool_calls=None))], created=1707967437, model='gpt-3.5-turbo-0125', object='chat.completion', system_fingerprint='fp_69829325d0', usage=CompletionUsage(completion_tokens=49, prompt_tokens=177, total_tokens=226)
)

2.2Tokens

在底层,函数被训练成模型的语法注入到系统消息中。这意味着函数长度也要遵循模型的上下文限制,并作为输入的token进行计费。如果遇到上下文限制,我们建议限制函数的数量或函数参数长度。

如果定义了许多函数,也可以使用精调来减少使用的token数量。

OpenAi之函数调用(Function Calling)(二)

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

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

相关文章

地理信息数据要素价值

文章目录 前言一、地理信息数据成为生产要素的重要内涵二、推动地理信息数据要素价值实现的重点及方式(一)公共地理信息数据(二)企业地理信息数据前言 面对数字经济发展新形势新需求,我们将统筹发展与安全,推动数据资源向数据资产转变,发挥时空数据作为新型生产要素价值…

【上海游戏业:创新与商业的结合】

上海游戏业:创新与商业的结合 我国游戏产业在近年来蓬勃发展,不同城市都涌现出许多优秀的游戏公司。为全面了解中国游戏业的发展情况及地区特色,本文选择分析游戏业较为发达的上海、广州、北京、深圳、成都、杭州、福建七个城市。这些城市在…

SQL拆分字段内容(含分隔符)

问题描述: 在做数据迁移的过程中,我们希望对表中的某个字段根据分隔符进行拆分,得到多条数据,原代码有点意思,因此记录一下。 我们假设某条数据如下: IDSTRS1公司名称不能小于四个字,行业类别…

基于Spring Boot的古典舞在线交流平台设计与实现,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1758349555560165377

25.原型链和原型(非常重要),听说你还没搞懂??

1. 对原型、原型链的理解 在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性,它的属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后&a…

w28DVWA-csrf实例

DVWA-csrf实例 low级别 修改密码&#xff1a;修改的密码通过get请求&#xff0c;暴露在url上。 写一个简单的html文件&#xff0c;里面伪装修改密码的文字&#xff0c;代码如下&#xff1a; <html><body><a href"http://dvwa:7001/vulnerabilities/csr…

MySQL学习Day15——MySQL安装与使用

一、Linux下的MySQL的安装与使用: 卸载MySQL: 1.关闭当前MySQL服务:systemctl stop mysql.service 2.查看当前mysql安装状况:rpm -qa | grep -i mysql 3.卸载上述命令查询出的已安装的程序:yum remove mysql-xxx mysql-xxx mysql-xxxx 4.删除mysql相关文件: (1)查找相关文…

[ai笔记7] google浏览器ai学习提效定制优化+常用插件推荐

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第7篇分享&#xff01; 工欲善其事必先利其器&#xff0c;为了ai学习的效能提升&#xff0c;放假期间对google浏览器做了一次系统整改&#xff0c;添加了一些配置和插件&#xff0c;这里既有一些显示、主…

Codeforces Round 919 (Div. 2)题解(A-E)

https://codeforces.com/contest/1920 A Satisfying Constraints 链接&#xff1a;A - Satisfying Constraints 代码 #include <bits/stdc.h> using namespace std; int main() {int T;cin >> T;while(T--){int n;scanf("%d", &n);vector<int&…

C#一维数组排序方法:选择排序法

目录 一、数组元素常见的排序法 1.选择排序法 二、实例1&#xff1a;选择排序法 1.源码 2.生成效果 一、数组元素常见的排序法 常见的排序法&#xff1a;选择排序法、冒泡排序法、快速排序法、直接插入法、希尔排序法、Array.Sort方法。 1.选择排序法 通过遍历实现排序&…

D. Divisible Pairs

思路&#xff1a;我们预处理出每个数分别摸上xy的值&#xff0c;用map存一下&#xff0c;然后遍历每个数&#xff0c;如果a b是x的倍数的话&#xff0c;那么他们模x的值相加为x&#xff0c;如果a - b是y的倍数的话&#xff0c;那么他们的模y的值相等。 代码&#xff1a; voi…

BUGKU-WEB bp

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 提示说&#xff1a;弱密码top1000&#xff1f;z???(爆破?)先看看源码有没有提示 相关工具 Burp Suit 爆破top1000字典&#xff0c;点击下载 解题步骤 随便测试账号密码admin、admin 得到提…