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

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

大语言模型(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)生成调用参数,例如:
    {"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时,若开启函数调用功能,模型的输出可能是 “自然语言回答” 或 “函数调用指令”,而非单纯的文本生成。

总结

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

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

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

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]:"""获取指定城市、日期的天气信息"""# 实际应用中这里会调用真实的天气APIweather_data = {"city": city,"date": date,"weather": "晴天","temperature": "25°C","wind": "微风"}return weather_datadef search_flight(departure: str, destination: str, date: str) -> List[Dict[str, Any]]:"""搜索指定日期从出发地到目的地的航班"""# 实际应用中这里会调用航班搜索APIflights = [{"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. 代码输入参数解释
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"}}
}

关键点

  • roleassistant,表示这是模型的回复。
  • 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"]  # 直接返回模型的文本回答

函数调用的完整流程

  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 调用完成。
http://www.xdnf.cn/news/1154197.html

相关文章:

  • 【并集查找 二分图】P6185 [NOI Online #1 提高组] 序列|省选-
  • 【已解决】GitHub SSH 连接失败解决方案:Permission Denied (publickey) 错误修复指南
  • HarmonyOS 网络请求优化实战指南:从0到1写出流畅不卡顿的应用!
  • EXPLAIN:你的SQL性能优化透视镜
  • C/C++数据结构之单向链表
  • 7-大语言模型—指令理解:指令微调训练+模型微调
  • FFmpeg 图片处理
  • 第三章-提示词-中级:进阶技巧与实践指南(12/36)
  • Spring Boot中REST与gRPC并存架构设计与性能优化实践指南
  • 测试学习之——Pytest Day4
  • Cosmos:构建下一代互联网的“区块链互联网
  • 黑马教程Webday6
  • 从零开始的云计算生活——番外5,使用ELK实现对应用日志的监控
  • HTML Style 对象深度解析:从基础到高级应用
  • client-go: k8s选主
  • 【Linux】1. Linux操作系统介绍及环境搭建
  • 20250720-6-Kubernetes 调度-nodeName字段,DaemonS_笔记
  • MySQL笔记3
  • 西门子 S7-1500 系列 PLC CPU 选型全指南:从类型到实战
  • 30天打牢数模基础-K均值聚类
  • 最大子数组和问题-详解Kadane算法
  • MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案
  • 爬虫实战案例(两个)
  • 笔试——Day13
  • LeetCode 1712.将数组分成三个子数组的方案数
  • LVS(Linux Virtual Server) 集群
  • 【AI】文生图文生视频
  • 基于单片机的危险气体远程检测报警系统设计
  • 周末总结(2024/07/19)
  • 前端面试专栏-工程化:28.团队协作与版本控制(Git)