当前位置: 首页 > 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.lryc.cn/news/594517.html

相关文章:

  • 从磁记录到数据中心:磁盘原理与服务器架构的完整技术链路
  • CVE-2022-41128
  • 六边形滚动机器人cad【7张】三维图+设计书明说
  • 从零搭建智能搜索代理:LangGraph + 实时搜索 + PDF导出完整项目实战
  • 【超越VGGT】π3-利用置换等变方法去除3r系列的归纳偏置
  • TypeScript 中替代 Interface 的方案
  • 一文速通《二次型》
  • UE5多人MOBA+GAS 26、为角色添加每秒回血回蓝(番外:添加到UI上)
  • 图的表示法以及实现
  • zabbix服务器告警处理
  • 【windows 终端美化】Windows terminal + oh-my-posh 来美化命令行终端
  • C++ 桶排序、基数排序、堆排序
  • Beamer-LaTeX学习(教程批注版)【6】
  • selenium4 web自动化测试
  • 对LLM某一层进行优化:通过眼动数据发现中间层注重语句内在含义,进而对中间层参数优化
  • 《拆解WebRTC:NAT穿透的探测逻辑与中继方案》
  • Flink高频考点:Checkpoint与Savepoint的高可用实战指南
  • 【详细笔记】两类曲线积分转换
  • PostgreSQL 字段类型速查与 Java 枚举映射
  • Shell脚本-grep工具
  • 【超分辨率专题】OSEDiff:针对Real-World ISR的单步Diffusion
  • 以“融合进化 智领未来”之名,金仓Kingbase FlySync:国产数据库技术的突破与创新
  • 基于单片机倾角测量仪/角度测量/水平仪
  • 浅谈 Vue 的双向数据绑定
  • 安全信息与事件管理(SIEM)系统架构设计
  • ABP VNext + Playwright E2E:前后端一体化自动化测试
  • MCP的inspector、了解具有上下文记忆功能的MCP——OpenMemory MCP
  • Node.js 中基于请求 ID 实现简单队列(即时阻止策略/排队等待策略)
  • Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?
  • 16.TaskExecutor启动