如何用Function Calling解锁OpenAI的「真实世界」交互能力?(附Node.js 实战)

一、Function Calling:大模型的「手脚延伸器」

1.1 核心定义

Function Calling是OpenAI在2023年6月13日推出的革命性功能(对应模型版本gpt-3.5-turbo-0613和gpt-4-0613),允许开发者通过自然语言指令触发预定义函数,实现大模型与现实世界系统的交互。如同给语言模型安装「手脚」,使其不仅能思考,还能执行具体操作。

openai官方说明:https://platform.openai.com/docs/guides/function-calling?api-mode=chat#page-top

1.2 诞生背景

在传统AI应用中存在两大痛点:

  • 数据时效性:模型无法获取训练数据之外的实时信息(如天气、股票等)
  • 输出不可控:非结构化文本输出难以集成到业务系统,需要复杂的格式校验

典型场景如用户问「查最近的未读邮件」,模型需要调用邮件系统API才能响应。Function Calling通过结构化参数传递动态函数匹配,完美解决这些问题。


二、Function Calling开发指南

2.1 配置参数详解

在ChatCompletion API中新增两个核心参数:

参数类型说明
functionsArray函数描述数组(支持多个函数声明)
function_callString/Object调用模式控制:auto(自动)、none(禁用)、{name: "函数名"}(强制调用)
函数描述标准结构
{"name": "get_current_weather","description": "获取指定位置的当前天气","parameters": {"type": "object","properties": {"location": {"type": "string","description": "城市名称,如:北京"},"unit": {"type": "string","enum": ["celsius", "fahrenheit"]}},"required": ["location"]}
}

参数设计要点

  • 使用JSON Schema规范
  • 参数描述需清晰易懂(直接影响模型参数生成准确率)
  • 建议开启strict:true强制参数校验

三、底层原理与实战演练

3.1 工作原理

 

  1. 意图识别:模型解析用户query语义
  2. 函数匹配:比对预定义函数库选择最适配的function
  3. 参数生成:输出符合JSON Schema的参数结构
  4. 执行回调:开发者代码执行真实业务逻辑
  5. 结果整合:将函数执行结果反馈给模型生成最终回复

3.2 Node.js 实战:智能天气助手

const OpenAI = require('openai');const openai = new OpenAI({apiKey: "",baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"}
);const functions = [{name: "getCurrentWeather",description: "获取指定城市的当前天气",parameters: {type: "object",properties: {location: {type: "string",description: "城市名称,例如:北京"},unit: {type: "string",enum: ["celsius", "fahrenheit"],description: "温度单位"}},required: ["location"]}}
];const getCurrentWeather = (location, unit) => {return {temperature: 22,unit: unit || "celsius",description: "晴天,微风",location: location};
};async function llm(callback, messages) {//console.log(messages)const completion = await openai.chat.completions.create({model: "qwen-turbo", // 此处以qwen-plus为例,可按需更换模型名称。模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models//model: "qwen-plus",messages,stream: true,result_format: "message",incremental_output: true,functions,       // 传入函数描述 function_call: "auto" // 可选值:auto/none/{name: '函数名'}});let functionArgs = '', functionName = '';for await (const chunk of completion) {if (chunk.choices[0].finish_reason === "stop") {console.log("结束")}let functionCall = chunk.choices[0].delta.function_callif (functionCall?.name) {functionName = functionCall.name;}if (functionCall?.arguments) {functionArgs += functionCall.arguments;}if (chunk.choices[0].delta.content, chunk.choices[0].finish_reason === "function_call") {console.log(functionArgs)const parsedArgs = JSON.parse(functionArgs);const weatherResult = getCurrentWeather(parsedArgs.location, parsedArgs.unit);console.log(JSON.stringify(weatherResult))messages.push({role: "assistant",content: null,function_call: {name: functionName,arguments: functionArgs,},});messages.push({role: "function",name: functionName,content: JSON.stringify(weatherResult)})llm(callback, messages)return}callback(chunk.choices[0].delta.content, chunk.choices[0].finish_reason === "stop")}
}module.exports = { llm };

关键点说明

  • 函数返回结果需转换为字符串传入后续消息
  • 支持并行函数调用(同时处理多个function_call)
  • 建议添加错误重试机制保障稳定性

四、演进趋势

当前Function Calling已支持多函数并行调用,未来可能朝着这些方向发展:

  1. 动态函数加载:运行时动态注册新函数
  2. 权限控制系统:敏感操作的用户授权机制
  3. 执行环境沙盒:安全隔离的函数执行空间
  4. 可视化编排工具:低代码函数流程设计器

通过合理运用Function Calling,开发者可将大语言模型无缝嵌入现有业务系统,构建真正智能化的应用生态。建议从简单的信息查询类功能入手,逐步扩展到复杂的事务处理场景。

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

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

相关文章

鸿蒙ArkTS+ArkUI实现五子棋游戏

鸿蒙ArkTSArkUI实现五子棋游戏 前言 近期,鸿蒙系统热度飙升,引发了周围众多朋友的热烈探讨。出于这份浓厚的好奇心,我初步浏览了其官方文档,发现信息量庞大,全面消化需耗时良久并考验人的毅力。自踏入编程领域以来&am…

单元测试mock

一、背景 现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。 举例:Ticket类需要调用Flight类和Pas…

深度学习篇---深度学习中的范数

文章目录 前言一、向量范数1.L0范数1.1定义1.2计算式1.3特点1.4应用场景1.4.1特征选择1.4.2压缩感知 2.L1范数(曼哈顿范数)2.1定义2.2计算式2.3特点2.4应用场景2.4.1L1正则化2.4.2鲁棒回归 3.L2范数(欧几里得范数)3.1定义3.2特点3…

JVM常见概念之条件移动

问题 当我们有分支频率数据时,有什么有趣的技巧可以做吗?什么是条件移动? 基础知识 如果您需要在来自一个分支的两个结果之间进行选择,那么您可以在 ISA 级别做两件不同的事情。 首先,你可以创建一个分支&#xff…

Debug-037-table列表勾选回显方案

效果展示: 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能: 在图1中的列表中有三行数据,当点击“更换设备”按钮时,打开抽屉显示el-table组件如图2所示,可以直接回显勾选…

Python散点图(Scatter Plot):数据探索的“第一张图表”

在数据可视化领域,散点图是一种强大而灵活的工具,它能够帮助我们直观地理解和探索数据集中变量之间的关系。本文将深入探讨散点图的核心原理、应用场景以及如何使用Python进行高效绘制。 后续几篇将介绍高级技巧、复杂应用场景。 Python散点图(Scatter Plot):高阶分析、散点…

docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型

系统:没有限制,可以运行docker就行 磁盘空间:至少预留50GB; 内存:8GB docker版本:4.38.0 桌面版 下载ollama镜像 由于docker镜像地址,网络不太稳定,建议科学上网的一台服务器拉取ollama镜像&am…

JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础实战

学习来源:尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源:在这位大佬的基础上添加了一些东西,欢迎大家支持原创,大佬太棒了:JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础…

卷积神经网络 - 梯度和反向传播算法

在卷积网络中,参数为卷积核中权重以及偏置。和全连接前馈网络类似,卷积网络也可以通过误差反向传播算法来进行参数学习。本文我们从数学角度,来学习卷积神经网络梯度的推导和其反向传播算法的原理。 一、梯度:损失函数 L 关于第 …

鸿蒙NEXT项目实战-百得知识库03

代码仓地址,大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点: 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

【测试篇】关于allpairs实现正交测试用例保姆级讲解,以及常见的错误问题

前言 🌟🌟本期讲解关于测试工具相关知识介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不多说…

OpenCV图像拼接(4)图像拼接模块的一个匹配器类cv::detail::BestOf2NearestRangeMatcher

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::BestOf2NearestRangeMatcher 是 OpenCV 库中用于图像拼接模块的一个匹配器类,专门用于寻找两幅图像之间的最佳特征点匹配…

C++: AVL树(实现旋转操作)

前言 map/set容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set…

OpenCV中距离公式

一、各类距离公式总结 常见距离公式 欧氏距离: 曼哈顿距离(L1)‌: 切比雪夫距离(Chessboard)‌: 1、点与点距离(欧氏距离) ‌二维空间‌ 设两点坐标为 P1(x1,y1)、P2(x2,y2),其距离…

六十天前端强化训练之第二十四天之Vue 模板语法与 v-for 指令大师级详解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、模板语法与指令知识精讲 1.1 模板语法三大核心 1.2 常见指令全家福 1.3 v-for 深度解析 二、商品列表示例完整实现 2.1 完整可运行代码 2.2 代码解析 2.3 运行效果…

XSS跨站脚本攻击漏洞(Cross Site Scripting)

前提概要 本文章主要用于分享XSS跨站脚本攻击漏洞基础学习,以下是对XSS跨站脚本攻击漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。 XSS跨站脚本攻击漏洞描述 跨站脚本攻击(XSS)漏洞是一种常见且危害较…

用ArcGIS做一张符合环评要求的植被类型图

植被类型图是环境影响评价(环评)中的重要图件,需满足数据准确性、制图规范性和信息完整性等要求。本教程将基于ArcMap平台,从数据准备到成果输出,详细讲解如何制作符合环评技术规范的植被类型图。 ArcGIS遥感解译土地…

详解string类+迭代器

迭代器 概念:在 C 中,迭代器是访问容器(如数组、列表、向量、字符串等)元素的一种方式。迭代器提供了一种统一的接口,使得你可以使用相同的代码来遍历不同类型的容器。迭代器本质上是一个指针或者指针的封装&#xff0…

Sqoop安装部署

Apache Sqoop 简介 Sqoop(SQL-to-Hadoop)是 Apache 开源项目,主要用于: 将关系型数据库中的数据导入 Hadoop 分布式文件系统(HDFS)或相关组件(如 Hive、HBase)。 将 Hadoop 处理后…

软件工程之软件验证计划Software Verification Plan

个人主页:云纳星辰怀自在 座右铭:“所谓坚持,就是觉得还有希望!” 本文为基于ISO26262软件验证计划模板,仅供参考。 软件验证计划,包括: 1. 软件需求验证计划 2. 软件架构设计验证计划 3. 软件单…