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

【大语言模型】-- Function Calling函数调用

在这里插入图片描述
文章目录

文章目录

  • 为什么需要function calling函数调用
  • 理解Function Calling的基本工作流程
  • 快速理解Function Calling的基本调用
  • Function Calling 核心概念深度理解
  • 系列文章

为什么需要function calling函数调用

  1. 大模型的三个主要局限性
    (1)事实可靠性缺陷:参数化记忆静态且更新滞后,常产生幻觉、张冠李戴或无法追溯来源,难以满足高精度场景需求。
    (2)可解释性与可控性不足:决策过程呈黑箱,对输出逻辑、置信度与偏见缺乏直观解释,导致关键领域难以审计、纠错或合规。
    (3)资源与情境局限:训练与推理算力、显存和能耗巨大,端侧部署受限;同时上下文长度有限,长程依赖、多模态融合及实时增量学习仍受硬约束。

  2. Function Calling 如何解决这些问题
    (1)事实可靠性:模型不再依赖静态参数记忆,而是实时调用搜索引擎、数据库或知识库 API,将动态结果直接注入上下文,显著降低幻觉率。
    (2)可解释性与可控性:调用链以结构化 JSON 形式显式输出,每一步函数名、输入参数、返回结果均可审计、重放与单元测试;失败时可重试或降级,避免黑箱输出无法追踪。
    (3)资源与上下文压力:复杂计算、大数据查询或长文档处理被离线下载到专用服务,模型仅负责轻量级调度与总结,可减少 50-80% 的上下文长度及 GPU 算力消耗,同时支持缓存、批量与异步并行,显著降低延迟与成本。

理解Function Calling的基本工作流程

Function Calling 把大模型从“生成答案”变成“调度工具”,核心流程只有四步:
(1)用户提问
用户给出自然语言请求(“查明天北京天气并总结穿衣建议”)。
(2)模型生成调用方案
大模型评估可用函数,输出结构化 JSON:

[{"name": "get_weather", "arguments": {"city": "北京", "date": "2025-06-25"}}]

(3)执行函数(模型之外)
外部系统(框架或客户端)解析 JSON,调用真实 API,得到返回:

{"temp": 32, "humidity": 65, "desc": "晴"}

(4)模型汇总回答
把函数返回拼回上下文,模型再生成自然语言结论:“明天北京晴,最高 32 ℃,建议短袖+防晒。”
流程可循环(多函数、多轮调用)。
在这里插入图片描述

快速理解Function Calling的基本调用

“天气查询 + 穿衣建议”的完整示例(依赖:openai ≥ 1.0 + requests)。

  1. 定义工具(真实天气 API)
import json, requests, openaiclient = openai.OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")def get_weather(city: str, date: str) -> dict:"""调用免费演示接口返回天气字典"""# 此处用 wttr.in 免费接口,无需 keyurl = f"https://wttr.in/{city}?format=j1"try:data = requests.get(url, timeout=5).json()# 取指定日期的天气(简化:若 date==today 则取 current)if date == "today":w = data["current_condition"][0]else:w = data["weather"][0]["hourly"][6]  # 随便取 06:00 数据return {"temp": int(w["tempC"]),"humidity": int(w["humidity"]),"desc": w["weatherDesc"][0]["value"]}except Exception as e:return {"error": str(e)}
  1. 注册工具(让模型看懂)
tools = [{"type": "function","function": {"name": "get_weather","description": "获取指定城市、日期的天气信息","parameters": {"type": "object","properties": {"city": {"type": "string", "description": "城市名,如 Beijing"},"date": {"type": "string", "description": "日期,如 today、2025-06-26"}},"required": ["city", "date"]}}
}]
  1. 使用工具(两阶段循环)
def chat(user_q: str):messages = [{"role": "user", "content": user_q}]# ① 模型决定是否调用response = client.chat.completions.create(model="local", messages=messages, tools=tools, temperature=0)choice = response.choices[0]# ② 若有调用 → 执行+回灌if choice.message.tool_calls:call = choice.message.tool_calls[0]args = json.loads(call.function.arguments)weather = get_weather(args["city"], args["date"])# 回传结果messages.append(choice.message)  # 助手调用messages.append({"tool_call_id": call.id,"role": "tool","name": "get_weather","content": json.dumps(weather)})# 再请求一次,让模型整合结果final = client.chat.completions.create(model="local", messages=messages, temperature=0.3)return final.choices[0].message.contentreturn choice.message.content  # 无需调用时直接返回答案# 4. 测试
if __name__ == "__main__":print(chat("明天上海天气怎么样?请给出穿衣建议。"))

定义工具 → 注册 JSON 说明书 → 两阶段循环(模型写调用单→客户端执行→结果回灌)
在这里插入图片描述
示例脚本:

# main.py
import json
import random
from typing import Listtry:import openai
except ImportError:raise SystemExit("请先 pip install openai")# ---------------- 配置区 ----------------
# ① 本地 LM Studio 地址(默认端口 1234)
client = openai.OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
MODEL = "local"          # LM Studio 加载的任意 GGUF 模型名
# ---------------------------------------# ========== 1. 定义工具 ==========
def get_weather(city: str, date: str) -> dict:"""模拟天气 API,返回 dict"""# 伪随机,只要 city 相同结果就相同,方便复现rng = random.Random(city + date)temp = rng.randint(15, 35)humidity = rng.randint(40, 90)desc = rng.choice(["晴", "多云", "小雨"])return {"temp": temp, "humidity": humidity, "desc": desc}# ========== 2. 注册工具 ==========
tools = [{"type": "function","function": {"name": "get_weather","description": "获取指定城市和日期的天气信息","parameters": {"type": "object","properties": {"city": {"type": "string", "description": "城市名,如 Shanghai"},"date": {"type": "string", "description": "日期,如 today、2025-06-27"}},"required": ["city", "date"]}}
}]# ========== 3. Function Calling 两阶段循环 ==========
def chat(user_query: str) -> str:messages = [{"role": "user", "content": user_query}]# ① 意图理解 & 函数选择response = client.chat.completions.create(model=MODEL,messages=messages,tools=tools,temperature=0)choice = response.choices[0]# 若无调用,直接返回答案if not choice.message.tool_calls:return choice.message.content or ""# ② 执行函数 & 回灌结果call = choice.message.tool_calls[0]args = json.loads(call.function.arguments)weather = get_weather(args["city"], args["date"])# 把助手调用+函数返回追加进上下文messages.append(choice.message)messages.append({"tool_call_id": call.id,"role": "tool","name": "get_weather","content": json.dumps(weather)})# ③ 再次请求,让模型整合结果final = client.chat.completions.create(model=MODEL,messages=messages,temperature=0.3)return final.choices[0].message.content or ""# ========== 4. 简单 CLI ==========
if __name__ == "__main__":print("=== 本地 Function Calling 演示 ===")print("输入 q 退出\n")while True:q = input("你:").strip()if q.lower() == "q":breakans = chat(q)print(f"AI:{ans}\n")

Function Calling 核心概念深度理解

Function Calling 的本质是把大模型从“生成下一个 token”的纯文本引擎,升级为“生成下一段调用”的符号化决策器;它借助语义-符号对齐、工具模式注册与可验证执行三层机制,实现对外部世界的可靠操作,同时保持生成式接口的易用性。

系列文章

【大语言模型】-- OpenAI定义的五个AGI发展阶段
【大语言模型】-- Fine-tuning 微调
【大语言模型】-- 私有化部署
【大语言模型】-- Prompt Engineering 提示工程
【大语言模型】-- Function Calling函数调用
【大语言模型】-- RAG
【大语言模型】-- Agent
【大语言模型】-- 一些概念

http://www.dtcms.com/a/601431.html

相关文章:

  • STM32项目分享:花房环境监测系统
  • 第1章 认识Qt
  • JDK 25 重大兼容性 Bug
  • MyBatis多表联查返回List仅一条数据?主键冲突BUG排查与解决
  • c 做网站方便吗手机企业wap网站
  • el-table有固定列时样式bug
  • Vue项目中 安装及使用Sass(scss)
  • 珠海本地网站设计公司什么网站可以发布信息
  • UEFI+GPT平台一键安装Windows方法
  • GPT‑5 全面解析与开发者接入指南
  • 站优云seo优化页面模板这样选
  • dism++功能实操备份与还原
  • 动态型网站建设哪里便宜app开发需要用到哪些工具
  • 网站建设的什么是网站建设的第一阶段佛山市房产信息网
  • React 18
  • CVPR 2025|电子科大提出渐进聚焦Transformer:显著降低超分辨率计算开销
  • CTFHub Web进阶-Linux:动态装载
  • Nginx域名与SSL证书配置完整流程
  • 美食网站要怎么做自己做相册的网站
  • 全国 网站备案 数量电子设计工程官网
  • 一、UDP以太网帧格式
  • 网络协议设计原则简介和资料推荐
  • 有哪些程序网站品牌和商标的区别
  • C语言编译器选择指南 | 初学者实用教程
  • 小智机器人MCP
  • 对于给不良网站发律师函如何做收银系统哪个软件好
  • 网站管理工作总结安阳县事业单位招聘2021
  • RK-Android11-修改系统的鼠标光标
  • vs2022 IDE扩展无法卸载/VSI 插件卸载及实例清理
  • 华为OD机试 双机位A卷 - 智能驾驶 (JAVA Python C++ JS GO)