Function Call发展历程与使用

大模型的 Function Call(函数调用)功能,经历了从简单的工具调用到复杂的智能体协作的演变过程。以下是其发展历程的关键阶段:


Function Call 的演进:从规则到智能体网络 - visual selection.png

1. 早期探索:规则与模板匹配

最初的对话系统(如1966年的 ELIZA 和1995年的 ALICE)主要依赖规则匹配模板响应,缺乏真正的语义理解和动态执行能力。


2. 自然语言理解(NLU)与对话系统

进入2000年代,随着 NLU 技术的发展,聊天机器人开始具备意图识别上下文管理能力,能够处理多轮对话和基础任务(如预约、查询)。


3. 大模型崛起与 Function Call 的萌芽

随着 GPT 系列模型的发布,尤其是 GPT-3 和 Codex 的出现,研究者发现大模型具备通过自然语言生成代码或模拟函数执行的能力。这为 Function Call 的正式提出奠定了基础。


4. Function Call 正式登场(2023年)

2023年6月,OpenAI 在 GPT-4 和 GPT-3.5-turbo 中正式引入了 Function Calling 功能,使模型能够根据用户输入生成结构化的函数调用请求(如 JSON),从而调用外部 API 或工具。

这标志着大模型从“文本生成器”向“行动执行者”的转变,能够完成如天气查询、航班预订、数据库查询等任务。


5. 框架支持与生态建设

微软推出了 Semantic Kernel,一个支持 Function Call 的框架,使开发者能将本地函数与大模型结合,构建“混合智能体”——既能推理又能行动的系统。


6. 多智能体协作与协议标准化

随着 Function Call 的普及,出现了模型之间协作的需求。2024年起,Model Context Protocol(MCP) 被提出,作为一种开放协议,支持不同模型和服务之间统一调用函数,实现“即插即用”的 AI 工具生态。

MCP 的出现解决了以下问题:

  • 不同模型 Function Call 格式不统一的问题;
  • 工具调用与上下文管理割裂的问题;
  • 多智能体之间协作困难的问题。

7. 应用深化与智能化升级

Function Call 被广泛应用于:

  • 插件系统(如 ChatGPT Plugins);
  • 记忆管理系统(如 MemGPT);
  • 多模态交互系统(结合语音、图像等);
  • 企业自动化流程(如 CRM、ERP 系统集成)。

8. 未来趋势:从单体到“智能体网络”

Function Call 正推动 AI 从“单一大模型”向“多智能体协作网络”演进。通过 MCP 等协议,未来的 AI 系统将实现:

  • 跨平台、跨模型的函数调用;
  • 动态任务分配与协作;
  • 安全、可扩展的智能体生态。

总结

Function Call 的发展历程可以概括为:

阶段 特征 代表技术/事件
初期 规则匹配、模板响应 ELIZA、ALICE
中期 NLU + 对话管理 意图识别、上下文保持
近期 大模型 + 函数调用 GPT-4 Function Call、Semantic Kernel
当前 协议化、多智能体协作 MCP、MemGPT、插件系统
未来 智能体网络、生态互联 多模型协作、动态任务编排

Function Call 的演进不仅提升了大模型的实用性,也为其在复杂现实场景中的落地奠定了基础。


使用

Function Call(函数调用)与外部 API 的交互过程,通常遵循一个标准化的流程,使得大模型能够动态调用外部服务,获取实时数据或执行特定任务。

1. 定义函数接口

开发者首先需要明确大模型需要调用的外部服务,定义函数的签名(包括函数名、参数、返回值等),并以 JSON Schema 的形式提供给模型。例如,定义一个获取天气的函数:

{
  "name": "get_current_weather",
  "description": "获取当前天气信息",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "城市名称"
      },
      "unit": {
        "type": "string",
        "enum": ["celsius", "fahrenheit"],
        "description": "温度单位"
      }
    },
    "required": ["location"]
  }
}

2. 用户输入与模型解析

用户提出问题时,模型会分析用户意图,判断是否需要调用外部函数。例如,用户询问:“今天北京天气如何?”,模型识别到需要调用 get_current_weather 函数,并提取参数 location="北京"。

3. 生成函数调用请求

模型生成结构化的函数调用请求(通常是 JSON 格式),包含函数名和参数:

{
  "name": "get_current_weather",
  "arguments": {
    "location": "北京",
    "unit": "celsius"
  }
}

4. 外部 API 的实际调用

模型本身并不直接执行函数,而是将函数调用请求返回给开发者。开发者在自己的代码中解析请求,调用实际的外部 API。例如,使用 Python 的 requests 库调用天气 API:

import requests

def get_current_weather(location, unit='celsius'):
    api_key = 'YOUR_API_KEY'
    url = f"https://api.weatherprovider.com/current?q={location}&units={unit}&appid={api_key}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        raise Exception("Failed to fetch weather data")

# 调用函数
weather_data = get_current_weather("北京")

5. 返回结果给模型

开发者将 API 返回的数据(如天气信息)再次输入模型,模型根据这些数据生成自然语言回复给用户:

今天北京天气晴朗,气温25摄氏度。

完整代码示例

import openai
import json
import requests

# 定义函数
def get_current_weather(location, unit='celsius'):
    api_key = 'YOUR_API_KEY'
    url = f"https://api.weatherprovider.com/current?q={location}&units={unit}&appid={api_key}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        raise Exception("Failed to fetch weather data")

# 函数描述
functions = [
    {
        "name": "get_current_weather",
        "description": "获取当前天气信息",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string"},
                "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            },
            "required": ["location"]
        }
    }
]

# 用户消息
messages = [
    {"role": "user", "content": "今天北京天气如何?"}
]

# 调用 OpenAI API
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=messages,
    functions=functions,
    function_call="auto"
)

# 解析函数调用
function_call = response.choices[0].message.function_call
if function_call:
    function_name = function_call.name
    function_args = json.loads(function_call.arguments)
    
    # 调用实际函数
    weather_data = get_current_weather(**function_args)
    
    # 将结果返回给模型
    messages.append({
        "role": "function",
        "name": function_name,
        "content": json.dumps(weather_data)
    })
    
    # 再次调用模型生成回复
    final_response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-0613",
        messages=messages
    )
    
    print(final_response.choices[0].message.content)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容