大语言模型(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 的函数调用是 “模型通过语义理解决定是否调用→生成调用参数→执行函数→用结果生成回答”,流程如下:
- 用户输入问题:如 “北京今天的 PM2.5 指数是多少?”(模型自身无实时数据,需调用外部工具)。
- 模型判断需求:分析问题后,确定 “需要调用实时天气 API”。
- 生成函数调用指令:按预设格式(如 JSON)生成调用参数,例如:
{ "name": "get_weather_data", "parameters": {"city": "北京", "indicator": "PM2.5"} }
- 执行函数并获取结果:系统调用
get_weather_data
接口,返回 “北京今天 PM2.5 指数为 58”。 - 模型整合结果生成回答:将接口返回的信息整理为自然语言(如 “北京今天的 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
时,若开启函数调用功能,模型的输出可能是 “自然语言回答” 或 “函数调用指令”,而非单纯的文本生成。
总结
- 大语言模型调用方式:解决 “如何让模型工作”(交互形式),核心是 “输入→模型计算→输出文本 / 向量”。
- 大语言模型的函数调用:解决 “模型如何做得更好”(能力扩展),核心是 “模型决策→调用工具→整合结果”。
简单说:调用方式是 “模型的使用通道”,函数调用是 “模型通过通道调用外部工具的能力”—— 前者是基础交互,后者是基于前者的能力升级。
四、案例(伪代码,为说明机制)
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)}")
这个实现包含了大语言模型函数调用的核心组件:
函数定义:代码中定义了两个示例函数
get_weather
和search_flight
,分别用于获取天气信息和搜索航班。函数签名:
FUNCTIONS
列表描述了函数的名称、参数和用途,这些信息会被传递给模型,帮助模型理解可用工具。调用决策:模型根据用户问题决定是否需要调用函数。如果需要,会返回函数名称和参数。
执行函数:
execute_function_call
函数负责根据模型的决策执行对应的工具函数。结果整合:将函数执行结果再次发送给模型,模型会结合结果生成最终回答。
示例场景与代码解释
假设用户提问:"2025 年 7 月 25 日从上海到北京的天气如何?"
1. 代码输入参数解释
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
的结构如下:
{
"role": "assistant",
"function_call": {
"name": "get_weather", # 模型选择调用的函数名
"parameters": { # 模型生成的函数参数
"city": "北京",
"date": "2025-07-25"
}
}
}
关键点:
role
为assistant
,表示这是模型的回复。function_call
字段包含函数名和参数,这是模型根据用户问题和可用函数列表自主生成的。- 模型正确识别用户需要北京的天气,并根据
FUNCTIONS
定义的参数格式生成了合法的日期格式。
情况 2:模型直接回答(无需函数调用)
如果用户问题不需要外部工具(如 "解释量子力学"),模型会直接返回文本:
{
"role": "assistant",
"content": "量子力学是研究微观粒子行为的物理学分支..."
}
此时function_call
字段不存在,直接通过response_message["content"]
获取答案。
3. 代码后续处理逻辑
在示例代码中,通过以下逻辑区分两种情况并处理:
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"] # 直接返回模型的文本回答
函数调用的完整流程
- 用户提问:"2025 年 7 月 25 日从上海到北京的天气如何?"
- 模型分析:发现需要天气信息,决定调用
get_weather
函数。 - 生成函数调用:返回
{"name": "get_weather", "parameters": {"city": "北京", "date": "2025-07-25"}}
。 - 执行函数:代码调用
get_weather("北京", "2025-07-25")
,获取天气数据。 - 结果反馈:将天气数据(如
{"city": "北京", "date": "2025-07-25", "weather": "晴天", ...}
)再次发送给模型。 - 生成最终回答:模型结合天气数据生成自然语言回复(如 "北京 2025 年 7 月 25 日天气晴朗,温度 25°C...")。
关键点总结
- 模型的 "决策能力":GPT-3.5 Turbo 1106 及更高版本能根据问题内容和可用函数列表,自主判断是否需要调用函数、调用哪个函数、传递什么参数。
- 函数参数的生成:模型会根据
FUNCTIONS
中定义的参数类型和描述,生成合法的参数值(如日期格式转换)。 - 多轮交互:函数调用本质是 "用户→模型→工具→模型→用户" 的多轮交互,通过两次 API 调用完成。