【AI大模型】Function Calling
目录
什么是Function Calling
示例 1:调用本地函数
Function Calling 的注意事项
支持 Function Calling 的国产大模型
百度文心大模型
MiniMax
ChatGLM3-6B
讯飞星火 3.0
通义千问
几条经验总结
什么是Function Calling
Function Calling 是一种函数调用机制,在使用 大模型进行prompt 提问时,大模型现有的知识库不一定有能力立即回答你的问题,但我们在提问时可以告诉大模型,我们有几个函数,让它结合我们的提问告诉程序,应该去调用哪个函数,并从给的提问中解析出参数。程序会根据大模型返回的函数和入参生成一个结果。然后程序将 最初的提问和函数调用结果一并发给 大模型进行 prompt ,这个时候,大模型就能回答出我们的问题了。
举例:
1. 我们调用API向大模型提问:推荐北京五道口附近的咖啡店。同时告诉大模型,我们定义了一个函数,这个函数需要参数是:地名、关键词
2. 大模型从我们的提问中解析出地名、关键词和函数的对应关系返回。如:地点搜索函数,入参是 北京五道口,咖啡店。
3. 程序根据大模型返回的参数调用 高德API返回咖啡店的位置信息。、
4. 程序将咖啡店的位置信息和最初的提问一并告诉大模型。
5. 大模型基于程序给的信息就能回答出这个问题了。
Function Calling 完整的官方接口文档:https://platform.openai.com/docs/guides/function-calling
示例 1:调用本地函数
需求:实现一个回答问题的 AI。题目中如果有加法,必须能精确计算。
# 初始化
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import json_ = load_dotenv(find_dotenv())client = OpenAI()def print_json(data):"""打印参数。如果参数是有结构的(如字典或列表),则以格式化的 JSON 形式打印;否则,直接打印该值。"""if hasattr(data, 'model_dump_json'):data = json.loads(data.model_dump_json())if (isinstance(data, (list))):for item in data:print_json(item)elif (isinstance(data, (dict))):print(json.dumps(data,indent=4,ensure_ascii=False))else:print(data)def get_completion(messages, model="gpt-3.5-turbo"):response = client.chat.completions.create(model=model,messages=messages,temperature=0.7,tools=[{ # 用 JSON 描述函数。可以定义多个。由大模型决定调用谁。也可能都不调用"type": "function","function": {"name": "sum","description": "加法器,计算一组数的和","parameters": {"type": "object","properties": {"numbers": {"type": "array","items": {"type": "number"}}}}}}],)return response.choices[0].messagefrom math import *prompt = "Tell me the sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10."
# prompt = "桌上有 2 个苹果,四个桃子和 3 本书,一共有几个水果?"
# prompt = "1+2+3...+99+100"
# prompt = "1024 乘以 1024 是多少?" # Tools 里没有定义乘法,会怎样?
# prompt = "太阳从哪边升起?" # 不需要算加法,会怎样?messages = [{"role": "system", "content": "你是一个数学家"},{"role": "user", "content": prompt}
]
response = get_completion(messages)# 把大模型的回复加入到对话历史中。必须有
messages.append(response)print("=====GPT 第一次回复=====")
print_json(response)# 如果返回的是函数调用结果,则打印出来
if (response.tool_calls is not None):# 是否要调用 sumtool_call = response.tool_calls[0]if (tool_call.function.name == "sum"):# 调用 sumargs = json.loads(tool_call.function.arguments)result = sum(args["numbers"])print("=====函数返回结果=====")print(result)# 把函数调用结果加入到对话历史中messages.append({"tool_call_id": tool_call.id, # 用于标识函数调用的 ID"role": "tool","name": "sum","content": str(result) # 数值 result 必须转成字符串})# 再次调用大模型print("=====最终 GPT 回复=====")print(get_completion(messages).content)
=====GPT回复===== {"content": null,"role": "assistant","function_call": null,"tool_calls": [{"id": "call_4Crnxkt4kj0bOspDxIiAJ6lD","function": {"arguments": "{\"numbers\":[1,2,3,4,5,6,7,8,9,10]}","name": "sum"},"type": "function"}] } =====函数返回===== 55 =====最终回复===== The sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, and 10 is 55.
划重点:
- Function Calling 中的函数与参数的描述也是一种 Prompt
- 这种 Prompt 也需要调优,否则会影响函数的召回、参数的准确性,甚至让 GPT 产生幻觉
Function Calling 的注意事项
划重点:
- 只有
gpt-3.5-turbo-1106
和gpt-4-1106-preview
及更高版本的模型可用本次课介绍的方法 - 使用模型别名
gpt-3.5-turbo
和gpt-4-turbo
会调用最新模型,但要防范模型升级带来的负面效果,做好充足测试 - 函数声明是消耗 token 的。要在功能覆盖、省钱、节约上下文窗口之间找到最佳平衡
- Function Calling 不仅可以调用读函数,也能调用写函数。但官方强烈建议,在写之前,一定要有真人做确认
支持 Function Calling 的国产大模型
- 国产大模型基本都支持 Function Calling 了
- 不支持 FC 的大模型,某种程度上是不大可用的
百度文心大模型
官方文档:文心千帆文档首页-百度智能云
百度文心 ERNIE-Bot 系列大模型都支持 Function Calling,参数大体和 OpenAI 一致,支持 examples。
MiniMax
官方文档:MiniMax-与用户共创智能
- 这是个公众不大知道,但其实挺强的大模型,尤其角色扮演能力
- 如果你曾经在一个叫 Glow 的 app 流连忘返,那么你已经用过它了。现在叫「星野」
- 应该是最早支持 Function Calling 的国产大模型
- V2 版 Function Calling 的 API 和 OpenAI 完全一样,但其它 API 有很大的特色
ChatGLM3-6B
官方文档:ChatGLM3/tools_using_demo at main · THUDM/ChatGLM3 · GitHub
- 最著名的国产开源大模型,生态最好
- 早就使用
tools
而不是function
来做参数,其它和 OpenAI 1106 版之前完全一样
讯飞星火 3.0
官方文档:星火认知大模型Web API文档 | 讯飞开放平台文档中心
和 OpenAI 1106 版之前完全一样
通义千问
官方文档:如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心
和 OpenAI 接口完全一样。
几条经验总结
在传统与 AI 之间徘徊:
- 详细拆解业务 SOP,形成任务 flow。每个任务各个击破,当前别幻想模型一揽子解决所有问题
- 不是所有任务都适合用大模型解决。传统方案,包括传统 AI 方案,可能更合适
- 一定要能评估大模型的准确率(所以要先有测试集,否则别问「能不能做」)
- 评估 bad case 的影响面
- 大模型永远不是 100% 正确的,建立在这个假设基础上推敲产品的可行性
相关文章:

【AI大模型】Function Calling
目录 什么是Function Calling 示例 1:调用本地函数 Function Calling 的注意事项 支持 Function Calling 的国产大模型 百度文心大模型 MiniMax ChatGLM3-6B 讯飞星火 3.0 通义千问 几条经验总结 什么是Function Calling Function Calling 是一种函数调用机…...
零钱兑换 - LeetCode 热题 85
大家好!我是曾续缘🤪 今天是《LeetCode 热题 100》系列 发车第 85 天 动态规划第 5 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount &…...

基于web的垃圾分类回收系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,公告管理,运输管理,基础数据管理 用户账户功能包括:系统首页,个人中心,运输管理,公告…...

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用
文章目录 内链的重要性WordPress SEO插件:Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域,SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中,内链建设是构建良好网站结构和提升…...
spring中那些地方使用了反射
1、依赖注入(Dependency Injection) Spring Boot通过反射机制将bean注入到相应的属性或构造函数中。当我们在Spring Boot中使用如Autowired这样的注解时,Spring容器会利用反射机制找到相应的bean并注入到对应的属性或构造函数中。 2、Bean的…...

1 机器人软件开发学习所需通用技术栈(一)
机器人软件工程师技术路线(如有缺失,欢迎补充) 1. 机器人软件开发工程师技术路线 1.1 基础知识 C/C编程:掌握C/C语言基础,包括数据结构、算法、内存管理等。操作系统:了解Linux或Windows等操作系统的基本…...

Java(十二)——Comparable接口与Comparator接口
文章目录 Comparable与Comparator接口Comparable接口Comparator接口 Comparable与Comparator接口 我们可能会遇到这样的问题:怎么对一个对象数组进行排序? 比如对一个狗类对象数组进行排序,而想到这,我们又会有一个问题ÿ…...

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统
株洲中车时代电气股份有限公司(下称中车时代电气)是中国中车旗下股份制企业,其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲,走好两条钢轨,走出两条钢轨。中车时代电气秉承“双…...

笔记 | 软件工程01:从程序到软件
1 软件工程知识域 2 程序 2.1 何为程序及程序的质量要求 何为程序: 理解:软件工程可能就是在弥补OOP语言与自然语言之间还存在的鸿沟 2.1.1 程序质量的内在和外在体现 2.1.2 程序质量的语法和语义体现 2.2 编写代码的基本原则 2.3 程序质量保证方法 …...

废品回收小程序开发,助力商家拓展回收市场
随着互联网的快速发展,废品回收行业也走向了数字化发展,废品回收小程序成为了拓展市场的重要方式。在当下万亿元下的回收市场中,废品回收小程序的发展也能够发挥重要作用,提高市场回收效率,提高大众的回收意识…...

JVM类加载机制和双亲委派
类加载机制 java文件需要编译成字节码文件(.class文件),jvm是通过类加载机制,将.class文件加载进内存,经过验证连接->初始化直到使用该对象的过程就是类加载机制,当new对象的时候,jvm首先去常量池寻找该类的符号引用…...
【PyCharm】无法创建虚拟环境,提示:has no attribute CPython3macOsBrew
报错信息: AttributeError: module virtualenv.create.via_global_ref.builtin.cpython.mac_os has no attribute CPython3macOsBrew报错原因: 可能含有多个virtualenv,发生冲突了。 解决方法: 终端执行以下命令: p…...
华为OD刷题C卷 - 每日刷题 12(数组连续和,求最多可以派出多少支团队)
1、(数组连续和): 这段代码是解决“数组连续和”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于计算给定数组中有多少个连续区间的和大于等于给定值x。 main方法首先读取数组的长度n和阈值x&…...

2.1 初识Windows程序
Windows程序设计是一种面向对象的编程。Windows操作系统以数据结构的形式定义了大量预定义的对象作为操作系统的数据类型。Windows动态链接库提供了各种各样的API接口函数供Windows应用程序调用。一个Windows应用程序是运行在Windows操作系统之上的。这些API接口函数的调用所实…...
EDI系统的使用场景
EDI全称Electronic Data Interchange,中文名称是电子数据交换。EDI系统是专为企业间的电子数据传输而设计的,需要满足的基本功能包括:支持AS2、OFTP、SFTP等EDI传输协议,能够生成和解析符合X12、EDIFACT、VDA等EDI报文标准下的报文…...

韩国Neowine推出第三代强加密芯片ALPU-CV
推出第三代加密芯片;是ALPU系列中的高端IC;是一款高性能车规级加密芯片;其加密性更强、低耗电、体积小;使得防复制、防抄袭板子的加密性能大大提升,该芯片通过《AEC-Q100》认证,目前已经在国产前装车辆配件…...
golang结构与接口方法实现与交互使用示例
1.定义结构 // 结构定义 type VideoFrame struct {id inthead []bytelen int64data []byte } 2.实现结构方法 // 生成结构字段的get与set方法 // func (v *VideoFrame) Id() int {return v.id }func (v *VideoFrame) SetId(id int) {v.id id }func (v *VideoFrame) He…...

C# 判断字符串不等于空的示例
在C#中,要判断一个字符串是否不等于空(即它既不是null也不是空字符串""),方法有如下几种,如下。 方法1 使用逻辑运算符和string.IsNullOrEmpty方法 string myString "123"; // 假设要检查的字…...
直方图中最大的矩形
#include<iostream> #include<algorithm> using namespace std; const int N 100010; //l[i], r[i]表示第i个矩形的高度可向两侧扩展的左右边界 int h[N], q[N], l[N], r[N]; typedef long long LL; int main() { int n; while(scanf("%d"…...

分布式锁redisson
1:pom.xml添加依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.21.1</version> </dependency>2-1:方法一:读取默认ym…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...