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

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


http://www.kler.cn/a/590848.html

相关文章:

  • Linux 系统监控工具大全:从命令行到图形化,全面掌握系统性能监控
  • Spring Boot 事务详解
  • LangChain组件Tools/Toolkits详解(2)——装饰器@tool
  • SQL语言的散点图
  • 项目中pnpm版本和全局pnpm版本不一致
  • RGV调度算法(三)--遗传算法
  • 【Opencv中的Jpeg有损压缩】
  • C#中SerialPort 的使用
  • 计算机视觉算法实战——障碍物识别(主页有源码)
  • 使用 `xlsx` 库读取和写入 Excel 文件
  • 【愚公系列】《高效使用DeepSeek》014-行程计划
  • Java实现字符串大写字母转小写的多种方法及优化策略
  • 第29周 面试题精讲(1)
  • 《论语别裁》第01章 学而(29) 《三国演义》的幕后功劳
  • 【计算机视觉】工业表计读数(2)--表计检测
  • Spring Cloud Gateway 使用ribbon以及nacos实现灰度发布
  • 大语言模型-2.1-Transformer架构及详细配置
  • ubuntu安装NVIDIA显卡驱动及CUDA环境
  • DICOM医学影像数据访问控制与身份验证技术应用的重要性及其实现方法详解
  • 【AI学习从零至壹】Pytorch神经⽹络