大语言模型调用方式与函数调用

大语言模型(LLM)的调用方式与函数调用(尤其是 LLM 场景下的 "函数调用能力")是两个相关但不同的概念。前者指 "如何与大语言模型交互以获取其能力",后者指 "大语言模型如何调用外部工具(如 API、函数)来增强自身能力"。以下分别详细解释,并说明两者的关联。

一、大语言模型的调用方式

大语言模型的调用方式,核心是 "用户 / 系统如何触发模型的计算逻辑,获取模型输出",本质是 "人与模型(或系统与模型)的交互方式"。常见的调用方式可分为基础调用场景化调用两类,具体如下:

1. 基础调用方式(核心交互逻辑)

指直接基于模型本身的接口或部署方式进行调用,核心是传递 "输入文本" 并获取 "模型生成的文本"。

  • API 调用(最常用)

    模型由第三方平台(如 OpenAI、Anthropic、阿里云等)部署,通过公开 API 接口提供服务。用户无需关心模型的底层训练、部署细节,只需按 API 规范传递参数即可调用。

    • 特点:门槛低(无需本地部署资源)、依赖网络、受平台接口限制(如调用次数、参数范围)。
    • 示例:调用 OpenAI 的gpt-4o接口时,通过 HTTP 请求传递prompt(输入文本)、temperature(生成随机性)等参数,模型返回生成的文本。
  • 本地部署调用

    将模型(如 LLaMA、Qwen 等开源模型)下载到本地服务器或终端,通过模型框架(如 Transformers、vLLM)直接调用。

    • 特点:需自行解决硬件资源(如 GPU 显存)、可定制化(修改模型参数、调整推理逻辑)、无网络依赖。
    • 示例:用transformers库加载Qwen-7B模型,通过model.generate()方法输入文本,获取生成结果。
  • 嵌入调用(Embedding 调用)

    针对模型的 "文本嵌入" 能力(将文本转为向量)的调用,用于语义检索、相似度计算等场景(非生成式任务)。

    • 特点:输出是向量而非文本,需配合向量数据库使用。
    • 示例:调用 OpenAI 的text-embedding-3-large接口,将 "今天天气如何" 转为向量,用于匹配相关文档。
2. 场景化调用方式(基于基础调用的扩展)

在基础调用的基础上,结合业务场景增加预处理或后处理逻辑,让调用更贴合实际需求。

  • 对话式调用

    以 "多轮对话" 形式调用模型:每次调用时不仅传递当前问题,还传递历史对话上下文(如 "用户问 A→模型答 B→用户问 C",第三次调用需传入 "A-B-C" 的历史),模型根据完整上下文生成连贯回答。

    • 示例:ChatGPT 的聊天界面,本质是持续通过 API 传递对话历史,获取最新回复。
  • 指令式调用

    以 "指令(Instruct)" 形式约束模型输出:在输入中明确要求模型的输出格式(如 "用表格总结""分 3 点回答"),模型根据指令调整生成逻辑。

    • 示例:输入 "请用 JSON 格式输出'苹果、香蕉的单价',键为水果名,值为价格",模型生成符合格式的 JSON 文本。

二、大语言模型的 "函数调用"(核心:模型调用外部工具)

大语言模型的 "函数调用" 是模型的一种能力:指模型根据输入需求,自主判断是否需要调用外部函数(如 API、数据库查询、工具函数等),并将函数返回结果整合到最终回答中。其核心是 "模型突破自身知识局限,借助外部工具完成任务"。

1. 函数调用的核心逻辑

传统函数调用(如编程中的func(a,b))是 "明确的参数传递 + 固定逻辑执行";而 LLM 的函数调用是 "模型通过语义理解决定是否调用→生成调用参数→执行函数→用结果生成回答",流程如下:

  1. 用户输入问题:如 "北京今天的 PM2.5 指数是多少?"(模型自身无实时数据,需调用外部工具)。

  2. 模型判断需求:分析问题后,确定 "需要调用实时天气 API"。

  3. 生成函数调用指令 :按预设格式(如 JSON)生成调用参数,例如:

    html 复制代码
    {
      "name": "get_weather_data",
      "parameters": {"city": "北京", "indicator": "PM2.5"}
    }
  4. 执行函数并获取结果 :系统调用get_weather_data接口,返回 "北京今天 PM2.5 指数为 58"。

  5. 模型整合结果生成回答:将接口返回的信息整理为自然语言(如 "北京今天的 PM2.5 指数是 58,空气质量良好")。

2. 函数调用的关键要素
  • 函数定义(Schema) :需提前告诉模型 "可调用的函数有哪些、参数格式是什么"。例如:
    "你可以调用get_stock_price(stock_code: str)函数,参数stock_code为股票代码(如'600036'),返回该股票当前价格。"
  • 格式约束 :模型生成的调用指令需符合机器可解析的格式(如 JSON),避免歧义(例如用<FunctionCall></FunctionCall>标签包裹)。
  • 结果处理:模型需能理解函数返回的结构化数据(如 JSON、表格),并转化为自然语言。
3. 典型应用场景
  • 实时信息查询:调用天气、股票、新闻 API(解决模型 "知识截止日期" 问题)。
  • 数据计算:调用计算器、Excel 函数(如 "计算 12345×67890",模型调用计算函数而非自行口算)。
  • 工具操作:调用邮件发送函数("给张三发邮件,内容是'明天开会'")、数据库查询函数("查近 3 天的订单量")。

三、大语言模型调用方式与函数调用的关联

函数调用是大语言模型调用方式的 "高级扩展"------ 基础调用仅依赖模型自身能力,而函数调用通过 "基础调用 + 外部函数执行" 扩展了模型的能力边界:

  • 基础调用(如 API 调用)是函数调用的 "载体":模型生成的函数调用指令,需通过基础调用(如 API 请求)传递给系统,再由系统执行外部函数。
  • 函数调用是基础调用的 "增强手段":例如,用 API 调用gpt-4o时,若开启函数调用功能,模型的输出可能是 "自然语言回答" 或 "函数调用指令",而非单纯的文本生成。

总结

  • 大语言模型调用方式:解决 "如何让模型工作"(交互形式),核心是 "输入→模型计算→输出文本 / 向量"。
  • 大语言模型的函数调用:解决 "模型如何做得更好"(能力扩展),核心是 "模型决策→调用工具→整合结果"。

简单说:调用方式是 "模型的使用通道",函数调用是 "模型通过通道调用外部工具的能力"------ 前者是基础交互,后者是基于前者的能力升级。

四、案例(伪代码,为说明机制)

python 复制代码
import openai
import json
from typing import List, Dict, Any, Optional, Union

# 配置OpenAI API密钥
openai.api_key = "your_api_key"

# 定义可调用的函数
def get_weather(city: str, date: str) -> Dict[str, Any]:
    """获取指定城市、日期的天气信息"""
    # 实际应用中这里会调用真实的天气API
    weather_data = {
        "city": city,
        "date": date,
        "weather": "晴天",
        "temperature": "25°C",
        "wind": "微风"
    }
    return weather_data

def search_flight(departure: str, destination: str, date: str) -> List[Dict[str, Any]]:
    """搜索指定日期从出发地到目的地的航班"""
    # 实际应用中这里会调用航班搜索API
    flights = [
        {
            "flight_number": "CA1234",
            "departure": departure,
            "destination": destination,
            "date": date,
            "departure_time": "08:30",
            "arrival_time": "11:00",
            "price": 850
        },
        {
            "flight_number": "MU2567",
            "departure": departure,
            "destination": destination,
            "date": date,
            "departure_time": "13:15",
            "arrival_time": "15:45",
            "price": 920
        }
    ]
    return flights

# 函数签名定义,用于告知模型可调用的函数及其参数
FUNCTIONS = [
    {
        "name": "get_weather",
        "description": "获取指定城市、日期的天气信息",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {
                    "type": "string",
                    "description": "城市名称,如'北京'"
                },
                "date": {
                    "type": "string",
                    "description": "日期,格式'YYYY-MM-DD'"
                }
            },
            "required": ["city", "date"]
        }
    },
    {
        "name": "search_flight",
        "description": "搜索指定日期从出发地到目的地的航班",
        "parameters": {
            "type": "object",
            "properties": {
                "departure": {
                    "type": "string",
                    "description": "出发城市,如'上海'"
                },
                "destination": {
                    "type": "string",
                    "description": "目的城市,如'北京'"
                },
                "date": {
                    "type": "string",
                    "description": "日期,格式'YYYY-MM-DD'"
                }
            },
            "required": ["departure", "destination", "date"]
        }
    }
]

def execute_function_call(function_call: Dict[str, Any]) -> Dict[str, Any]:
    """执行函数调用并返回结果"""
    function_name = function_call["name"]
    parameters = function_call["parameters"]
    
    if function_name == "get_weather":
        return get_weather(**parameters)
    elif function_name == "search_flight":
        return search_flight(**parameters)
    else:
        return {"error": f"未知函数: {function_name}"}

def chat_with_functions(user_message: str) -> str:
    """与支持函数调用的大语言模型对话"""
    # 第一步:发送用户消息和可用函数列表给模型
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-1106",
        messages=[{"role": "user", "content": user_message}],
        functions=FUNCTIONS,
        function_call="auto"  # 让模型决定是否调用函数以及调用哪个函数
    )
    
    response_message = response["choices"][0]["message"]
    
    # 情况1:模型决定调用函数
    if response_message.get("function_call"):
        function_call = response_message["function_call"]
        
        # 执行函数调用
        function_response = execute_function_call(function_call)
        
        # 第二步:将函数调用结果再次发送给模型,获取最终回答
        second_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo-1106",
            messages=[
                {"role": "user", "content": user_message},
                response_message,
                {
                    "role": "function",
                    "name": function_call["name"],
                    "content": json.dumps(function_response)
                }
            ]
        )
        
        return second_response["choices"][0]["message"]["content"]
    
    # 情况2:模型直接返回回答
    else:
        return response_message["content"]

# 示例使用
if __name__ == "__main__":
    # 测试天气查询
    weather_question = "明天北京的天气如何?"
    print(f"问题: {weather_question}")
    print(f"回答: {chat_with_functions(weather_question)}\n")
    
    # 测试航班查询
    flight_question = "2025年7月25日从上海到北京有哪些航班?"
    print(f"问题: {flight_question}")
    print(f"回答: {chat_with_functions(flight_question)}")    

这个实现包含了大语言模型函数调用的核心组件:

  1. 函数定义 :代码中定义了两个示例函数get_weathersearch_flight,分别用于获取天气信息和搜索航班。

  2. 函数签名FUNCTIONS列表描述了函数的名称、参数和用途,这些信息会被传递给模型,帮助模型理解可用工具。

  3. 调用决策:模型根据用户问题决定是否需要调用函数。如果需要,会返回函数名称和参数。

  4. 执行函数execute_function_call函数负责根据模型的决策执行对应的工具函数。

  5. 结果整合:将函数执行结果再次发送给模型,模型会结合结果生成最终回答。

示例场景与代码解释

假设用户提问:"2025 年 7 月 25 日从上海到北京的天气如何?"

1. 代码输入参数解释
python 复制代码
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-1106",  # 使用支持函数调用的模型版本
    messages=[{"role": "user", "content": user_message}],  # 用户问题
    functions=FUNCTIONS,  # 传递前面定义的函数列表(get_weather和search_flight)
    function_call="auto"  # 让模型自动决定是否调用函数及调用哪个
)
2. 模型返回结果分析

当执行这段代码时,模型可能返回两种类型的结果:

情况 1:模型决定调用函数

如果模型判断需要调用函数获取信息,response_message的结构如下:

python 复制代码
{
    "role": "assistant",
    "function_call": {
        "name": "get_weather",  # 模型选择调用的函数名
        "parameters": {         # 模型生成的函数参数
            "city": "北京",
            "date": "2025-07-25"
        }
    }
}

关键点

  • roleassistant,表示这是模型的回复。
  • function_call字段包含函数名和参数,这是模型根据用户问题和可用函数列表自主生成的。
  • 模型正确识别用户需要北京的天气,并根据FUNCTIONS定义的参数格式生成了合法的日期格式。
情况 2:模型直接回答(无需函数调用)

如果用户问题不需要外部工具(如 "解释量子力学"),模型会直接返回文本:

python 复制代码
{
    "role": "assistant",
    "content": "量子力学是研究微观粒子行为的物理学分支..."
}

此时function_call字段不存在,直接通过response_message["content"]获取答案。

3. 代码后续处理逻辑

在示例代码中,通过以下逻辑区分两种情况并处理:

python 复制代码
if response_message.get("function_call"):
    # 执行函数调用并将结果再次发送给模型
    function_response = execute_function_call(function_call)
    second_response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-1106",
        messages=[
            {"role": "user", "content": user_message},  # 原始问题
            response_message,  # 模型的函数调用建议
            {
                "role": "function",  # 新增函数调用结果
                "name": function_call["name"],
                "content": json.dumps(function_response)
            }
        ]
    )
    return second_response["choices"][0]["message"]["content"]
else:
    return response_message["content"]  # 直接返回模型的文本回答

函数调用的完整流程

  1. 用户提问:"2025 年 7 月 25 日从上海到北京的天气如何?"
  2. 模型分析 :发现需要天气信息,决定调用get_weather函数。
  3. 生成函数调用 :返回{"name": "get_weather", "parameters": {"city": "北京", "date": "2025-07-25"}}
  4. 执行函数 :代码调用get_weather("北京", "2025-07-25"),获取天气数据。
  5. 结果反馈 :将天气数据(如{"city": "北京", "date": "2025-07-25", "weather": "晴天", ...})再次发送给模型。
  6. 生成最终回答:模型结合天气数据生成自然语言回复(如 "北京 2025 年 7 月 25 日天气晴朗,温度 25°C...")。

关键点总结

  • 模型的 "决策能力":GPT-3.5 Turbo 1106 及更高版本能根据问题内容和可用函数列表,自主判断是否需要调用函数、调用哪个函数、传递什么参数。
  • 函数参数的生成 :模型会根据FUNCTIONS中定义的参数类型和描述,生成合法的参数值(如日期格式转换)。
  • 多轮交互:函数调用本质是 "用户→模型→工具→模型→用户" 的多轮交互,通过两次 API 调用完成。
相关推荐
haiyu_y4 小时前
Day 57 经典时序模型(1)——差分、ACF/PACF 与 AR/MA/ARMA
人工智能·深度学习·ar
duyinbi75174 小时前
【深度学习】使用YOLOv8-MFMMAFPN进行泡沫检测的完整实现
人工智能·深度学习·yolo
AI科技星4 小时前
引力与电磁的动力学耦合:变化磁场产生引力场与电场方程的第一性原理推导、验证与统一性意义
服务器·人工智能·科技·线性代数·算法·机器学习·生活
hkNaruto4 小时前
【AI】AI学习笔记:OpenAI Tools完全指南:从原理到实战入门
人工智能·笔记·学习
狮子座明仔4 小时前
MiMo-V2-Flash 深度解读:小米 309B 开源 MoE 模型如何用 15B 激活参数吊打 671B 巨头?
人工智能·语言模型·自然语言处理
紧固件研究社4 小时前
从标准件到复杂异形件,紧固件设备如何赋能制造升级
人工智能·制造·紧固件
木头左4 小时前
贝叶斯深度学习在指数期权风险价值VaR估计中的实现与应用
人工智能·深度学习
反向跟单策略4 小时前
期货反向跟单—高频换人能够提高跟单效率?
大数据·人工智能·学习·数据分析·区块链
哎吆我呸4 小时前
Android studio 安装Claude Code GUI 插件报错无法找到Node.js解决方案
人工智能
咕噜企业分发小米4 小时前
独立IP服务器有哪些常见的应用场景?
人工智能·阿里云·云计算