news 2026/4/18 3:31:35

开源模型应用:Qwen2.5-7B实现天气查询工具调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源模型应用:Qwen2.5-7B实现天气查询工具调用

开源模型应用落地:Qwen2.5-7B实现天气查询工具调用

一、前言

在大语言模型(LLM)的实际应用中,仅依赖模型内部知识已难以满足对实时性、准确性与动态数据获取的需求。例如,用户询问“今天北京的天气如何?”时,模型无法通过训练数据得知当前真实气象状况。为解决这一问题,工具调用(Tool Calling)机制应运而生。

本文将基于阿里云开源的大语言模型Qwen2.5-7B-Instruct,结合高性能推理框架vLLM,构建一个支持外部工具调用的本地化推理服务,并实现一个真实的天气信息查询功能。整个过程涵盖环境搭建、模型加载、工具定义、结构化输出解析及多轮对话处理,帮助开发者掌握从零构建具备外部能力扩展性的AI应用的核心方法。


二、核心技术栈解析

2.1 Qwen2.5-7B 模型特性

Qwen2.5 是通义千问团队推出的最新一代大语言模型系列,其中Qwen2.5-7B-Instruct是经过指令微调的70亿参数版本,专为任务理解和交互式对话优化。

核心优势:
  • 强大的结构化输出能力:原生支持 JSON 格式的函数调用(Function Calling),便于与外部系统集成。
  • 长上下文支持:最大可处理131,072 tokens的输入,适合复杂文档分析和长对话记忆。
  • 多语言覆盖广泛:支持中文、英文、法语、西班牙语等超过29种语言,适用于国际化场景。
  • 专业领域增强:在数学、编程等领域引入专家模型训练策略,显著提升逻辑推理能力。
  • 高效生成性能:单次最多生成8,192 tokens,响应速度快,适合高并发服务部署。

该模型特别适合作为企业级轻量级AI助手的基础底座,在保证推理速度的同时提供高质量的任务执行能力。


2.2 vLLM:高性能推理加速引擎

vLLM 是由加州大学伯克利分校开发的开源大模型推理和服务框架,其核心创新在于PagedAttention技术——借鉴操作系统内存分页管理思想,高效管理注意力缓存(KV Cache),大幅提升吞吐量。

关键特性:
  • 吞吐量比 HuggingFace Transformers 提升14–24倍
  • 支持连续批处理(Continuous Batching)、CUDA图优化、量化等高级特性
  • 原生支持 OpenAI API 接口协议,易于集成到现有系统
  • 自 0.4.0 版本起全面支持Tools / Function Calling

⚠️ 注意:本文示例要求 vLLM 版本 ≥0.4.0,否则LLM.chat()不支持tools参数,会导致调用失败。


2.3 工具调用(Tool Calling)机制原理

工具调用允许大模型在推理过程中主动识别并触发外部程序或API,从而突破“静态知识库”的限制,实现以下能力:

能力说明
实时信息获取查询天气、股票、新闻等动态数据
外部计算执行执行数学运算、代码解释、数据库查询
系统控制控制智能家居设备、调用工作流引擎
数据持久化写入日志、更新状态、发送通知

工作流程如下:

用户提问 → LLM 判断需调用工具 → 输出结构化JSON请求 → 主程序解析并执行 → 返回结果给LLM → LLM生成自然语言回答

这种“思考→行动→反馈”模式,是构建智能代理(Agent)的关键基础。


三、前置条件与环境准备

3.1 硬件与软件要求

项目要求
GPU 显卡至少1张 NVIDIA A10/A100/V100 或 RTX 4090,显存 ≥ 24GB
CUDA 版本≥ 12.2
Python 环境3.10
操作系统CentOS 7 / Ubuntu 20.04+
存储空间≥ 20GB(用于存放模型文件)

推荐使用 Tesla V100 或更高配置以确保稳定运行。


3.2 模型下载

Qwen2.5-7B-Instruct 可通过以下两个官方渠道获取:

方式一:ModelScope(魔搭)推荐
git clone https://www.modelscope.cn/qwen/Qwen2.5-7B-Instruct.git
方式二:Hugging Face

访问地址:https://huggingface.co/Qwen/Qwen2.5-7B-Instruct

✅ 建议优先选择 ModelScope,国内访问更稳定,且支持断点续传。


3.3 创建 Conda 虚拟环境并安装依赖

# 创建独立环境 conda create --name qwen_tool python=3.10 conda activate qwen_tool # 安装必要包 pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple pip install transformers torch sentencepiece tiktoken

🔍 若已有旧版 vLLM,请升级至最新版:

bash pip install --upgrade vllm

可通过以下命令验证版本是否符合要求:

pip show vllm

输出中应包含Version: 0.4.0或更高。


四、技术实现:构建天气查询工具

4.1 功能需求说明

目标:当用户提问如“上海现在的天气怎么样?”时,模型能自动提取城市名,调用get_current_weather(city)函数获取模拟天气数据,并最终生成自然语言回复。

关键技术点: - 定义工具函数及其参数规范(OpenAPI Schema) - 配置模型支持 Tool Calling - 解析模型输出的 JSON 结构 - 将工具返回结果重新输入模型进行最终回答生成


4.2 完整代码实现

# -*- coding: utf-8 -*- import json import random import string from vllm import LLM, SamplingParams # 模型路径请根据实际位置修改 model_path = "/data/model/Qwen2.5-7B-Instruct" def generate_random_id(length=9): """生成随机 tool_call_id""" characters = string.ascii_letters + string.digits return ''.join(random.choice(characters) for _ in range(length)) # 模拟天气查询API def get_current_weather(city: str) -> str: """返回指定城市的模拟天气信息""" return f"目前{city}多云到晴,气温28~31℃,吹轻微的偏北风。" def chat(llm, sampling_params, messages, tools=None): """封装vLLM的聊天接口""" outputs = llm.chat( messages, sampling_params=sampling_params, tools=tools ) return outputs[0].outputs[0].text.strip() if __name__ == "__main__": # 设置采样参数 sampling_params = SamplingParams(temperature=0.45, top_p=0.9, max_tokens=8192) # 初始化LLM实例 llm = LLM(model=model_path, dtype="float16", swap_space=16) # 用户初始提问 messages = [ { "role": "user", "content": "广州天气情况如何?" } ] # 工具函数映射表 tool_functions = { "get_current_weather": get_current_weather } # 定义工具描述(必须符合OpenAI格式) tools = [ { "type": "function", "function": { "name": "get_current_weather", "description": "获取指定位置的当前天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "查询当前天气的城市,例如:深圳" } }, "required": ["city"] } } } ] # 第一次调用:模型决定是否需要调用工具 response = chat(llm, sampling_params, messages, tools) print("模型原始输出:") print(response) # 判断是否为工具调用请求(JSON格式) if response.startswith("{") and "name" in response and "arguments" in response: try: tool_call = json.loads(response) func_name = tool_call["name"] args = tool_call["arguments"] # 执行对应函数 if func_name in tool_functions: result = tool_functions[func_name](**args) print(f"\n工具执行结果:{result}") # 将助手的工具调用记录加入对话历史 messages.append({ "role": "assistant", "content": response }) # 添加工具返回结果 messages.append({ "role": "tool", "content": result, "tool_call_id": generate_random_id() }) # 第二次调用:让模型基于工具结果生成最终回答 final_response = chat(llm, sampling_params, messages, tools) print(f"\n最终回答:{final_response}") else: print("未知工具调用:", func_name) except Exception as e: print("解析工具调用失败:", e) else: # 如果模型直接回答,则无需调用工具 print("模型直接回答:", response)

4.3 代码关键点解析

(1)tools参数定义规范
{ "type": "function", "function": { "name": "get_current_weather", "description": "获取指定位置的当前天气", "parameters": { ... } } }
  • 必须遵循 OpenAI 兼容格式
  • parameters使用 JSON Schema 描述输入参数类型和必填项
  • vLLM 会据此引导模型生成合法 JSON 输出
(2)两阶段对话流程设计
阶段输入内容目的
第一阶段用户问题 + tools定义让模型判断是否调用工具
第二阶段原始对话 + 工具调用记录 + 工具返回结果让模型生成自然语言总结

这是实现 Tool Calling 的标准范式,不可省略中间步骤。

(3)tool_call_id的作用

虽然本例为本地模拟,但为了兼容未来对接真实 API 网关或 Agent 框架(如 LangChain),建议始终生成唯一的tool_call_id,以便追踪调用链路。


五、运行结果与输出分析

执行脚本后输出如下:

模型原始输出: {"name": "get_current_weather", "arguments": {"city": "广州"}} 工具执行结果:目前广州多云到晴,气温28~31℃,吹轻微的偏北风。 最终回答:目前广州的天气情况是多云到晴,气温在28到31℃之间,吹着轻微的偏北风。

可以看到: 1. 模型准确识别出需调用get_current_weather工具; 2. 成功提取参数"city": "广州"; 3. 主程序正确执行函数并回传结果; 4. 模型整合信息后生成流畅自然的回答。

整个流程完全自动化,体现了 LLM 作为“大脑”协调外部“感官”与“执行器”的能力。


六、常见问题与解决方案

6.1 错误:TypeError: LLM.chat() got an unexpected keyword argument 'tools'

❌ 错误原因:

vLLM 版本过低(< 0.4.0),不支持tools参数。

✅ 解决方案:

升级 vLLM 到最新版本:

pip install --upgrade vllm

验证版本:

pip show vllm

确保输出类似:

Name: vllm Version: 0.4.0 or higher

6.2 模型未返回 JSON,而是直接回答?

可能原因: - 输入问题不够明确,模型认为可用已有知识回答 -tools定义不清晰或缺少必要字段

改进建议:
  • 明确提问方式:“请调用工具查询广州天气”
  • 强化 system prompt(可在 messages 开头添加):
{ "role": "system", "content": "你是一个智能助手,能够调用外部工具获取实时信息。当涉及天气、时间、价格等动态数据时,请优先使用工具。" }

6.3 如何接入真实天气API?

只需替换get_current_weather函数即可:

import requests def get_current_weather(city: str) -> str: url = f"https://api.weather.com/v7/forecast/current?city={city}&apiKey=YOUR_KEY" try: resp = requests.get(url).json() temp = resp['temperature'] condition = resp['condition'] return f"{city}当前气温{temp}℃,天气{condition}。" except: return f"无法获取{city}的天气数据,请稍后再试。"

💡 提示:生产环境中建议增加缓存、限流、错误重试机制。


七、总结与展望

7.1 核心价值总结

本文完整实现了基于Qwen2.5-7B-Instruct + vLLM的工具调用系统,展示了如何让大模型“走出文本”,连接真实世界的数据与服务。其核心价值体现在:

  • 打破知识静态性局限:通过工具调用获取实时信息
  • 提升回答准确性:避免“幻觉”式编造答案
  • 构建可扩展AI代理:为后续接入数据库、搜索引擎、自动化脚本打下基础
  • 本地化部署保障安全:所有数据不出内网,适合企业私有化场景

7.2 最佳实践建议

建议说明
使用 Conda 管理环境避免依赖冲突
升级至最新版 vLLM获得完整功能支持
工具定义标准化遵循 OpenAI Schema 规范
增加 System Prompt 引导提高工具调用成功率
分阶段测试调试先验证模型能否输出 JSON,再联调执行逻辑

7.3 下一步学习路径

  • 接入更多工具:日历查询、股票行情、网页搜索
  • 构建 Web UI:使用 FastAPI + Gradio 提供可视化界面
  • 集成 LangChain / LlamaIndex:打造完整 Agent 应用
  • 模型微调:针对特定行业定制工具调用行为

🌐 未来属于能“动手做事”的AI,而不仅仅是“能说话”的模型。掌握工具调用技术,是迈向真正智能体(Agent)的第一步。


本文代码已在 CentOS 7 + Tesla V100 + vLLM 0.4.2 + Qwen2.5-7B-Instruct 环境下验证通过。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 21:32:45

基于Qwen2.5-7B实现高效Lora微调与离线推理

基于Qwen2.5-7B实现高效Lora微调与离线推理 一、引言&#xff1a;为何选择LoRA vLLM进行模型定制化推理&#xff1f; 在大语言模型&#xff08;LLM&#xff09;落地应用过程中&#xff0c;如何在不牺牲性能的前提下实现低成本、高效率的个性化适配&#xff0c;是工程实践中的…

作者头像 李华
网站建设 2026/4/18 8:28:34

MiDaS部署性能提升:多线程推理配置详细步骤

MiDaS部署性能提升&#xff1a;多线程推理配置详细步骤 1. 背景与挑战&#xff1a;单线程瓶颈下的服务响应延迟 1.1 单目深度估计的工程落地需求 AI 单目深度估计技术近年来在三维感知、AR/VR、机器人导航和智能安防等领域展现出巨大潜力。其中&#xff0c;Intel ISL 实验室…

作者头像 李华
网站建设 2026/4/18 6:33:24

Qwen2.5-7B指令模型体验|多语言长文本生成新选择

Qwen2.5-7B指令模型体验&#xff5c;多语言长文本生成新选择 1. 引言 随着大语言模型技术的持续演进&#xff0c;阿里通义千问团队于2024年9月正式发布Qwen2.5系列模型&#xff0c;标志着其在语言理解、推理能力与多模态支持上的又一次重大突破。其中&#xff0c;Qwen2.5-7B-…

作者头像 李华
网站建设 2026/4/8 11:19:42

分类模型+知识图谱:云端联合推理,准确率再创新高

分类模型知识图谱&#xff1a;云端联合推理&#xff0c;准确率再创新高 引言 在医疗AI领域&#xff0c;纯数据驱动的模型常常面临一个尴尬局面&#xff1a;虽然算法能识别出"肺部有阴影"&#xff0c;却无法判断这是肺炎、结核还是肿瘤。这就像一位记忆力超强但缺乏…

作者头像 李华
网站建设 2026/4/10 20:44:28

单目深度估计技术揭秘:MiDaS模型应用全解析

单目深度估计技术揭秘&#xff1a;MiDaS模型应用全解析 1. 引言&#xff1a;从2D图像到3D空间感知的AI革命 在计算机视觉领域&#xff0c;如何让机器“理解”三维世界一直是核心挑战之一。传统方法依赖双目立体视觉或多传感器融合&#xff08;如LiDAR&#xff09;&#xff0c…

作者头像 李华