当前位置: 首页 > news >正文

如何用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_call
    if (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,开发者可将大语言模型无缝嵌入现有业务系统,构建真正智能化的应用生态。建议从简单的信息查询类功能入手,逐步扩展到复杂的事务处理场景。

相关文章:

  • C语言文件操作入门
  • Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例
  • H3C SecPath SysScan-AK 系列漏洞扫描系统
  • 微信小程序订阅消息发送消息,点击消息进入小程序页面
  • 河南大学计算机网络实验3
  • 解决:ModuleNotFoundError: No module named ‘_sqlite3‘
  • 外贸 B2B 平台没落?多语言批发系统正在崛起
  • 【css酷炫效果】纯CSS实现火焰文字特效
  • 总结 kotlin中的关键字和常用方法
  • 深入理解 JSON.stringify:优雅输出 JSON 数据
  • 机器人曲面跟踪Surface-Tracking
  • Python---文件操作
  • Leetcode 160 Intersection of Two Linked Lists
  • python+flask实现360全景图和stl等多种格式模型浏览
  • taro-vue2 如何使用国密加解密
  • stm32第六天继电器
  • CentOS配置永久静态IP
  • 3D点云目标检测——KITTI数据集读取与处理
  • 电脑管家如何清理内存及垃圾,提升电脑性能
  • 蓝桥杯数字接龙dfs
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 神十九都带回了哪些实验样品?果蝇等生命类样品已交付科学家
  • 新片|《我仍在此》定档5月,《新·驯龙高手》同步北美上映
  • 神十九乘组安全顺利出舱
  • 言短意长|政府食堂、停车场开放的示范效应
  • 2025上海车展 | 当智驾不再让人兴奋,汽车智能化暗战升级