[大模型]什么是function calling?
什么是function calling?
大模型的 Function Calling(函数调用)是一种让大语言模型(如 GPT、Claude 等)与外部工具、API 或自定义函数交互的机制。
它的核心目的是让模型能够根据用户的需求,动态调用外部功能来完成更复杂的任务,例如查询实时数据、操作数据库、调用数学工具等。
为什么需要 Function Calling?
大模型本身是“静态”的,它的知识截止于训练数据的时间点,且无法直接访问外部系统(如网络、数据库)。通过 Function Calling,模型可以将用户的自然语言请求转化为结构化的函数调用请求,大模型会在每次回答问题之前先检查可以调用哪些工具,并评估用户的问题是否需要调用这些工具。如果需要,它便会调用相应的工具,并根据工具返回的结果来生成答案。
Function Calling不仅极大地扩展了大模型的应用范围,让大模型可以处理实时数据(天气、股票)、执行计算、操作本地文件等;还在一定程度上解决了模型的“幻觉”问题。
Function Calling 的工作原理
开发者预先定义一系列工具函数,并描述函数的功能和参数。
用户输入自然语言请求后,模型分析意图,判断是否需要调用函数。如果需要,模型会生成一个结构化请求(例如 JSON 格式),包含要调用的函数名称和参数。
开发者收到结构化请求后,执行对应的函数或 API 调用。然后将函数执行结果返回给模型,模型再生成最终的自然语言回复。

代码示例
1. 提前构造API
定义了一个函数 get_weather 用于模拟查询天气信息。该函数接收一个参数 location,根据传入的城市名称返回相应的天气信息,如果未找到对应城市,则返回“未找到该城市天气”。
def get_weather(location: str) -> str:weather_data = {"北京": {"temperature": 25, "humidity": "40%", "condition": "晴"},"上海": {"temperature": 28, "humidity": "65%", "condition": "多云"}}return json.dumps(weather_data.get(location, "未找到该城市天气"))
2. 定义函数描述(JSON Schema)
定义 JSON Schema用于描述 get_weather 函数的结构和参数要求。函数描述指定了函数的名称、描述以及参数的格式和要求,使得模型能够理解如何调用这个函数。
functions = [{"type": "function","function": {"name": "get_weather","description": "获取指定城市的实时天气信息","parameters": {"type": "object","properties": {"location": {"type": "string", "description": "城市名称,如北京"}},"required": ["location"]}}
}]
3. 用户提问
模拟用户的问题,询问北京今天的天气情况。
初始化了一个消息列表 messages,其中包含了用户的提问,用于构建对话历史。
user_question = "北京今天天气如何?"
messages = [{"role": "user", "content": user_question}]
4. 判断是否需要调用函数
调用 OpenAI 的 GPT-4 模型,传入用户的提问和函数描述。模型会根据提问判断是否需要调用函数 get_weather来获取答案。参数 tool_choice="auto" 表示让模型自动决定是否调用函数。
response = client.chat.completions.create(model="gpt-4",messages=messages,tools=functions,tool_choice="auto"
)
5. 执行函数调用并获取最终回答
先获取模型的响应消息,并将模型的回复添加到对话历史 messages 中。
assistant_message = response.choices[0].message
messages.append(assistant_message)
然后检查模型的回复是否触发了函数调用。
- 如果触发了函数调用,则提取参数并调用
get_weather函数获取天气信息,并将函数调用的结果封装为工具消息,添加到对话历史中。然后再次调用 OpenAI 模型,将函数结果作为上下文的一部分,生成最终的回答。 - 如果模型没有触发函数调用,则直接输出模型的回复。
if assistant_message.tool_calls:tool_call = assistant_message.tool_calls[0]if tool_call.function.name == "get_weather":# 提取参数并执行函数args = json.loads(tool_call.function.arguments)weather_result = get_weather(args["location"])# 将函数结果封装为工具消息messages.append({"role": "tool","tool_call_id": tool_call.id,"name": "get_weather","content": weather_result})# 7. 第二次调用大模型生成最终回答final_response = client.chat.completions.create(model="gpt-4",messages=messages)print("最终回复:", final_response.choices[0].message.content)
else:print("直接回复:", assistant_message.content)
完整代码
import os
import json
from openai import OpenAI# 初始化大模型客户端
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))def get_weather(location: str) -> str:weather_data = {"北京": {"temperature": 25, "humidity": "40%", "condition": "晴"},"上海": {"temperature": 28, "humidity": "65%", "condition": "多云"}}return json.dumps(weather_data.get(location, "未找到该城市天气"))functions = [{"type": "function","function": {"name": "get_weather","description": "获取指定城市的实时天气信息","parameters": {"type": "object","properties": {"location": {"type": "string", "description": "城市名称,如北京"}},"required": ["location"]}}
}]user_question = "北京今天天气如何?"
messages = [{"role": "user", "content": user_question}]response = client.chat.completions.create(model="gpt-4",messages=messages,tools=functions,tool_choice="auto"
)assistant_message = response.choices[0].message
messages.append(assistant_message) # 将模型回复加入对话历史if assistant_message.tool_calls:tool_call = assistant_message.tool_calls[0]if tool_call.function.name == "get_weather":# 提取参数并执行函数args = json.loads(tool_call.function.arguments)weather_result = get_weather(args["location"])# 将函数结果封装为工具消息messages.append({"role": "tool","tool_call_id": tool_call.id,"name": "get_weather","content": weather_result})# 7. 第二次调用大模型生成最终回答final_response = client.chat.completions.create(model="gpt-4",messages=messages)print("最终回复:", final_response.choices[0].message.content)
else:print("直接回复:", assistant_message.content)
相关文章:
[大模型]什么是function calling?
什么是function calling? 大模型的 Function Calling(函数调用)是一种让大语言模型(如 GPT、Claude 等)与外部工具、API 或自定义函数交互的机制。 它的核心目的是让模型能够根据用户的需求,…...
C语言高频面试题——嵌入式系统中中断服务程序
在嵌入式系统中,中断服务程序(ISR)的设计需遵循严格的规则以确保系统稳定性和实时性。以下是对这段代码的分析及改进建议: 代码分析 __interrupt double compute_area (double radius) { double area PI * radius * radius; pri…...
Java高频面试之并发编程-05
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:线程有哪些调度方法? 在Java中,线程的调用方法主要包括以下几种方式,每种方式适用于…...
野外价值观:在真实世界的语言模型互动中发现并分析价值观
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【Linux】47.高级IO(1)
文章目录 1. 高级IO1.1 五种IO模型1.2 高级IO重要概念1.2.1 同步通信 vs 异步通信1.2.2 阻塞 vs 非阻塞 1.3非阻塞IO1.3.1 fcntl1.3.2 实现函数SetNoBlock1.3.3 轮询方式读取标准输入1.3.4 I/O多路转接之select1.3.4.1 初识select:1.3.4.2 select函数原型1.3.4.3 理…...
notepad++技巧:查找和替换:扩展 or 正则表达式
notepad 有很多优点:多标签,代码高亮,我最喜欢的是查找和替换。 除了可以一次性查找所有打开文件,还可以使用 扩展 or 正则表达式。 例如: 去掉空行:正则表达式: ^\s*$\r\n ^ 表示行首。\s*…...
【图像标注技巧】目标检测图像标注技巧
介绍一些图像标注技巧。之前引用过别人的文章 yolo目标检测 技巧 trick 提升模型性能,deep research检测调研报告也可以进行参考。 拉框类的标注,如果你不确定哪种方法好,你可以把所标注区域的都剪切出来,然后站在屏幕一米之外眯…...
MuJoCo中的机器人状态获取
UR5e机器人xml文件模型 <mujoco model"ur5e"><compiler angle"radian" meshdir"assets" autolimits"true"/><option integrator"implicitfast"/><default><default class"ur5e">&…...
pnpm解决幽灵依赖问题
文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗?2. pnpm 解决了幽灵依赖问题吗?3. pnpm 是如何解决的?举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1:初始化项目并安装依赖步骤2…...
测试第四课---------性能测试工具
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
frp远程穿透配置
文章目录 准备工作服务端配置(toml)客户端配置(toml)访问内网服务使用ini文件配置 frp是一个高性能的反向代理应用,用于将位于内网的服务通过代理暴露到公网。以下是其基本使用步骤: 准备工作 拥有一台具有公网IP的服务器,作为frp的服务端。…...
【C++】新手入门指南(下)
文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南(上),继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…...
Linux系统编程 day9 SIGCHLD and 线程
SIGCHLD信号 只要子进程信号发生改变,就会产生SIGCHLD信号。 借助SIGCHLD信号回收子进程 回收子进程只跟父进程有关。如果不使用循环回收多个子进程,会产生多个僵尸进程,原因是因为这个信号不会循环等待。 #include<stdio.h> #incl…...
前后端分离项目在未部署条件下如何跨设备通信
其实我此前也不知道这个问题怎么解决,也没有想过—因为做的项目大部分都是前后端分离的,前端直接用后端的部署好的环境就行了。最近也是有点心高气傲开始独立开发,一个人又写前端又写后端也是蛮累的,即使有强有力的cursor也很累很…...
基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例
多光谱遥感数据包含可见光至红外波段的光谱信息,Python凭借其丰富的科学计算库(如rasterio、scikit-learn、GDAL),已成为处理此类数据的核心工具。本文以Landsat-8数据为例,演示辐射校正→特征提取→监督分类→精度评…...
vscode python 代码无法函数跳转的问题
TL; DR; python.languageServer 配置成了 None 导致 vscode python 代码无法函数跳转 详细信息 mac 环境下 vscode 正常 command 鼠标左键 可以跳转到定义或者使用位置,但是我的为何不知道失效了 我一开始以为是热键冲突,结果发现 mac 好像没办法定…...
SAS宏核心知识与实战应用
1. SAS宏基础 1.1 核心概念 1.1.1 宏处理器 宏处理器在SAS程序运行前执行,用于生成动态代码,可实现代码的灵活定制。 通过宏处理器,可基于输入参数动态生成不同的SAS代码,提高代码复用性。 1.1.2 宏变量 宏变量是存储文本值的容器,用&符号引用,如&var,用于存储…...
Unity 脚本使用(二)——UnityEngine.AI——NavMesh
描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询(spatial queries),例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本,并调整寻路和避免的全局行为。 静态属性࿰…...
从项目真实场景中理解二分算法的细节(附图解和模板)
遇到一个真实场景里使用二分算法的问题,本以为可以放心交给小师弟去做,结果出现了各种问题,在此梳理下二分算法的核心思想和使用细节。 文章目录 1.场景描述2.场景分析3.二分算法的精髓3.1 核心模板3.2 二分过程图解3.3 各种区间写法3.3.1 闭…...
金融图QCPFinancial
QCPFinancial 是 QCustomPlot 中用于绘制金融图表(如蜡烛图/K线图)的核心类。以下是其关键特性的详细说明: 一、主要属性 属性类型说明dataQSharedPointer<QCPFinancialDataContainer>存储金融数据的数据容器chartStyleQCPFinancial:…...
Jetson Orin NX 16G 配置GO1强化学习运行环境
这一次收到了Jrtson Orin NX, 可以进行部署了。上一次在nano上的失败经验 Jetson nano配置Docker和torch运行环境_jetson docker-CSDN博客 本次的目的是配置cuda-torch-python38环境离机运行策略。 Jetson Orin NX SUPER 1. 烧录镜像 参考链接在ubuntu系统中安装sdk manag…...
文档管理 Document Management
以下是关于项目管理中 文档管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述文档管理的理论框架、核心流程及实战应用: 一、文档管理的基本概念 1. 定义 文档管理是对项目全生命周期中产生的各类文档进行规范化管理的过程,包括创建、存储、版…...
【Pandas】pandas DataFrame truediv
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
Linux 内核中 cgroup 子系统 cpuset 是什么?
cpuset 是 Linux 内核中 cgroup(控制组) 的一个子系统,用于将一组进程(或任务)绑定到特定的 CPU 核心和 内存节点(NUMA 节点)上运行。它通过限制进程的 CPU 和内存资源的使用范围,优…...
Windows 同步-互锁变量访问
互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行(完全或根本不执行)。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说,你最终不会只更新变量的一部分;所有位都以…...
深度学习3.5 图像分类数据集
%matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l代码执行流程图 #mermaid-svg-WWhBmQvijswiICpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…...
js原型链prototype解释
function Person(){} var personnew Person() console.log(啊啊,Person instanceof Function);//true console.log(,Person.__proto__Function.prototype);//true console.log(,Person.prototype.__proto__ Object.prototype);//true console.log(,Function.prototype.__prot…...
从M个元素中查找最小的N个元素时,使用大顶堆的效率比使用小顶堆更高,为什么?
我们有一个长度为 M 的数组,现在我们想从中找出 最小的 N 个元素。例如: int a[10] {12, 3, 5, 7, 19, 0, 8, 2, 4, 10};从中找出 最小的 4 个元素。 正确方法:使用大小为 N 的「大顶堆」 原因分析: 我们想保留最小的 4 个元素…...
【知识】性能优化和内存优化的主要方向
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 前言 现在有很多论文,乍一看很高级,实际上一搜全是现有技术的堆砌,但是这种裁缝式的论文依然能发表在很好的会议和期…...
VS Code + GitHub:高效开发工作流指南
目录 一、安装 & 基本配置 1.下载 VS Code 2.安装推荐插件(打开侧边栏 Extensions) 3.设置中文界面(可选) 二、使用 VS Code 操作 Git/GitHub 1.基本 Git 操作(不输命令行!) 2.连接 GitHub(第一次使用) 三、克隆远程仓库到 VS Code 方法一(推荐): 方…...
