Function Call讲解:AI大模型走向实用化的关键一步

什么是Function Calling

在AI大模型的上下文中,”function calling” 是指AI模型能够直接调用预先定义好的函数来执行特定的任务,而不是仅仅基于文本生成来解决问题。这种能力使得AI可以主动地使用外部工具和资源来解决超出模型本身知识范围的问题,从而使AI的应用更加广泛和深入。

Function Calling的原理

需要说明的是,这并不代表AI大模型具备直接调用工具的能力,而是像“写代码”一样输出了被调用的函数(工具)名,以及对应的入参。就像调用http协议api接口一样,写出接口和要传递的参数,其实你可以认为本质上就是在调API接口,大模型只不过输出了要调用的接口URL和请求body体而已。当然,为了实现这一能力,对应的训练数据集是必不可少的,模型需要经过相关数据集的训练才能够稳定地支持Function Calling。

例如,填写一个表单用于收集个人信息。对于机器来说,它无法理解“我叫AI柠檬,今年 18 岁,家在上海市黄浦江边”这样非结构化的输入。只有通过大模型的识别,将其拆分为“姓名”、“年龄”、“地址”等明确的字段,机器才能识别相应的信息结构,并将这样结构化后的信息接入后续的流程。所以如今的表单这种组件,以及调用API接口时传入的json结构体,本质上是人机交互领域一个技术妥协的产物。而大模型function calling的出现,实现了将自然语言和机器可读的格式化语言进行对接和转换。

因此,Function Calling 的实现需要基于以下步骤:

  1. 函数定义:首先,需要定义能够被AI模型调用的函数。这些函数包含了实现特定任务的逻辑,比如查询数据库、调用API或者执行系统命令等。
  2. 接口连接:在AI模型和这些函数之间建立接口,使得AI模型可以通过某种方式(通常是通过API调用)来调用这些函数。
  3. 调用逻辑:当AI模型在处理问题过程中发现需要调用特定的函数时,它会生成调用指令,并附带必要的参数信息传递给对应的函数。
  4. 结果处理:函数执行完毕后,会将结果返回给AI模型,AI模型再根据这个结果生成最终的回答或采取下一步行动。

支持Function Calling的模型

目前,多个先进的AI大模型已经支持Function Calling功能,这其中包括但不限于:

  • OpenAI的GPT系列:从GPT-3.5开始,OpenAI就引入了Function Calling的功能,允许开发者为模型定义特定的功能,让模型能够根据上下文主动调用这些功能。
  • Anthropic的Claude:Claude模型同样支持Function Calling,这使得它能够与外部系统更紧密地集成。
  • 阿里的Qwen系列:大部分的Qwen系列模型都支持Function Calling,是国产大模型的集大成者。
  • DeepSeek系列:硅基流动平台上的满血版和蒸馏版模型也明确支持Function Calling。

如何使用Function Calling

使用Function Calling来实现AI大模型的自动化工具调用是一个逐步深入的过程:

  1. 熟悉环境:首先熟悉你所使用的AI平台提供的Function Calling功能,了解其支持哪些模型,支持哪些类型的函数调用、以及配置方式等。
  2. 定义函数:根据实际需求定义需要调用的函数,比如获取天气信息、处理图像等。
  3. 编写调用逻辑:编写代码逻辑,使得AI可以根据上下文判断何时调用哪些函数。
  4. 编写提示词:编写合适的tools提示词,有助于AI大模型正确判断出何时应该调用何种工具,这个需要具体情况具体分析,不断尝试和优化。
  5. 测试与优化:不断测试不同场景下的功能调用效果,根据反馈调整函数定义和调用逻辑。

实战案例

假设我们要实现一个功能,比如根据用户提问来返回天气信息。我们可以先在程序中定义一个获取天气信息的函数,然后在与AI模型交互时,让模型识别到用户询问天气的意图并完整补充所需的信息后调用这个函数。

  • 函数名:getWeather
  • 输入参数列表:
    • date:日期
    • city:城市名
  • 输出参数:某天气API接口服务响应json

输入提示词:”你是一个无微不至的生活起居助手,当需要天气相关的信息时,需要知道用户所在的城市,如果未知则需要询问用户。”

当用户询问“我明天应该穿什么”时,发送给AI大模型接口的入参应该是如下所示的:

{
  "functions": [
    {
      "name": "getWeather",
      "description": "获取当前天气情况",
      "parameters": {
        "type": "object",
        "properties": {
          "city": {
            "description": "城市名称",
            "type": "string"
          }
        },
        "required": ["city"]
      }
    }
  ],
  "messages": [
    {
      "role": "system",
      "content": "你是一个无微不至的生活起居助手,当需要天气相关的信息时,需要知道用户所在的城市,如果未知则需要询问用户。"
    },
    {
      "role": "user",
      "content": "我明天应该穿什么?"
    }
  ]
}

除了照例传入 messages 字段以外,我们还需要向AI大模型传递一个 functions 的列表。在这个列表中,我们使用 JSON Schema (文档)描述了AI大模型可以调用的方法 ,即 getWeather 。

此时,由于没有其他工具可以确定用户所在城市,因此AI大模型会根据提示词要求询问用户:“请告诉你所在的城市?”然后用户会回答它:“上海”,再次调用AI大模型接口。

{
  "functions": [
    {
      "name": "getWeather",
      "description": "获取当前天气情况",
      "parameters": {
        "type": "object",
        "properties": {
          "city": {
            "description": "城市名称",
            "type": "string"
          }
        },
        "required": ["city"]
      }
    }
  ],
  "messages": [
    {
      "role": "system",
      "content": "你是一个无微不至的生活起居助手,当需要天气相关的信息时,需要知道用户所在的城市,如果未知则需要询问用户。"
    },
    {
      "role": "user",
      "content": "我明天应该穿什么?"
    },
    {
      "role": "assistant",
      "content": "请告诉你所在的城市?"
    },
    {
      "role": "user",
      "content": "上海"
    }
  ]
}

那么接下来,AI大模型则会返回意图识别的结果,即要调用的函数和入参:

{
  "content": "{\"name\": \"getWeather\",\"arguments\": \"{\n  \"city\": \"上海\"\n}\"}",
  "role": "assistant"
}

格式化后即:

{
  "arguments": {
    "city": "上海"
  },
  "name": "getWeather"
}

然后我们的代码就可以根据调用的函数名和入参去执行响应的动作了,简直对开发者友好有木有!调用的外部接口返回后,再将返回的结果继续整合进AI大模型 messages 上下文中,再次调用AI大模型的接口传入,等待大模型最终的输出。

注:此时理论上就可以不传入functions了,不过视具体情况而定,有时需要较为复杂的工具链调用,那么就仍需传入。

{
  "messages": [
    {
      "role": "system",
      "content": "你是一个无微不至的生活起居助手,当需要天气相关的信息时,需要知道用户所在的城市,如果未知则需要询问用户。"
    },
    {
      "role": "user",
      "content": "我明天应该穿什么?"
    },
    {
      "role": "assistant",
      "content": "请告诉你所在的城市?"
    },
    {
      "role": "user",
      "content": "上海"
    },
    {
      "role": "assistant",
      "content": "{\"name\": \"realtimeWeather\",\"arguments\": \"{\n  \"city\": \"上海\"\n}\"}"
    },
    {
      "role": "function",
      "name": "getWeather",
      "content": "..."
    }
  ]
}

那么接下来就是激动人心的魔法时刻:

{
  "content": "当前上海的天气是晴天,温度在36度左右。明天预计会有雷阵雨,温度在26-35度之间。因此,建议你今天穿短袖和短裤,明天则需要带一把雨伞,并穿一些防水的衣物,同时也不要忘记防晒。",
  "role": "assistant"
}

结论

Function Calling 是AI大模型领域的一项重要进步,它不仅扩展了模型的应用范围,也提高了自动化处理问题的能力,更是人机交互技术的一大变革。开发者通过合理利用Function Calling,将AI作为大脑和专业工具结合,可以让AI更好地服务于实际业务需求,创造更多的价值,实现1+1>2。

参考资料

  1. OpenAI. Function calling and tool use with the API
  2. Anthropic. Claude’s capabilities
  3. Hugging Face. Integrating APIs and tools
  4. lobehub. Function Call: Chat 应用的插件基石与交互技术的变革黎明

创作声明:本文包含部分AI生成的内容,且已经过AI柠檬博主审视和人工修改,可放心食用

版权声明
本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。
本文地址: https://blog.ailemon.net/2025/04/09/function-call-introduction-ai-llm/
All articles are under Attribution-NonCommercial-ShareAlike 4.0

关注“AI柠檬博客”微信公众号,及时获取你最需要的干货。


Donate

WeChat DonateAlipay Donate

Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

12 − 3 =