news 2026/5/16 17:25:39

Qwen3-1.7B高级插件技巧:多步骤调用实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qwen3-1.7B高级插件技巧:多步骤调用实战

Qwen3-1.7B高级插件技巧:多步骤调用实战

1. 引言

随着大语言模型在实际业务场景中的深入应用,单一的文本生成能力已无法满足复杂任务的需求。Qwen3-1.7B作为通义千问系列中轻量级但功能强大的模型版本,在保持高效推理的同时,支持完整的工具调用(Tool Calling)机制,使得模型能够通过插件扩展其能力边界。

本文聚焦于多步骤工具调用这一高级特性,结合LangChain集成方式与底层Hugging Face实现原理,系统性地讲解如何构建具备链式逻辑处理能力的智能代理(Agent),并以真实可运行代码演示从环境配置到插件注册、再到多阶段任务执行的完整流程。

不同于简单的单次函数调用,多步骤调用允许模型根据前一步骤的结果动态决定下一步操作,从而完成搜索→分析→决策等复杂工作流。这种能力是构建自动化助手、智能客服和行业专用AI代理的核心基础。


2. 环境准备与基础调用

2.1 启动镜像并访问Jupyter

首先确保您已在CSDN AI开发平台成功启动Qwen3-1.7B镜像,并进入内置的 Jupyter Notebook 环境。该镜像已预装 Transformers、LangChain、Torch 等必要依赖库,可直接进行开发调试。

2.2 使用LangChain调用Qwen3-1.7B

通过 LangChain 接口可以快速接入 Qwen3-1.7B 模型服务,以下是标准调用示例:

from langchain_openai import ChatOpenAI import os chat_model = ChatOpenAI( model="Qwen3-1.7B", temperature=0.5, base_url="https://gpu-pod69523bb78b8ef44ff14daa57-8000.web.gpu.csdn.net/v1", # 替换为当前Jupyter实际地址 api_key="EMPTY", extra_body={ "enable_thinking": True, "return_reasoning": True, }, streaming=True, ) response = chat_model.invoke("你是谁?") print(response.content)

说明: -base_url必须替换为您当前实例的实际访问地址。 -api_key="EMPTY"表示无需认证,适用于本地或内网部署的服务端点。 -extra_body中启用enable_thinkingreturn_reasoning可让模型返回中间推理过程,便于观察多步决策路径。

此接口封装了底层通信细节,适合快速原型开发。但对于需要精细控制工具调用行为的高级场景,建议结合 Hugging Face 原生 API 实现更灵活的插件管理机制。


3. 多步骤调用机制解析

3.1 工具调用协议与特殊Token

Qwen3系列模型采用基于XML标签的结构化工具调用协议,通过特定Token标识函数调用的开始与结束:

Token ID内容作用
151657<tool_call>工具调用开始标记
151658</tool_call>工具调用结束标记
151665<tool_call>工具响应开始标记
151666<tool_call>工具响应结束标记

当用户输入触发某个工具时,模型输出如下格式内容:

<tool_call>{"name": "search_information", "arguments": {"query": "北京天气"}}</tool_call> <tool_call>{"result": "今天北京晴,气温25°C"}</tool_call> <tool_call>{"name": "summarize_result", "arguments": {"text": "今天北京晴,气温25°C"}}</tool_call>

这表明模型先发起一次搜索请求,收到结果后再次调用摘要函数——即实现了多步骤逻辑流转

3.2 多步调用的工作流程

多步骤调用的本质是一个“感知-行动”循环:

  1. Prompt输入→ 模型判断是否需调用工具
  2. 生成Tool Call→ 输出<tool_call>{...}</tool_call>
  3. 外部执行→ 客户端解析并执行对应函数
  4. 返回结果→ 将结果嵌入对话历史,带上<tool_response>标签
  5. 继续生成→ 模型基于新上下文决定下一步动作(继续调用或直接回复)

只有正确维护对话状态(message history),才能支持连续多次工具交互。


4. 构建支持多步骤调用的插件系统

4.1 插件基类设计

定义通用插件架构,便于后续扩展多种功能模块:

from typing import Dict, Any, List from dataclasses import dataclass @dataclass class ToolFunction: name: str description: str parameters: Dict[str, Any] class QwenPluginBase: """插件基类""" def __init__(self, model_name: str = "Qwen/Qwen3-1.7B"): self.model_name = model_name self.tools: List[ToolFunction] = [] def register_tool(self, tool: ToolFunction): self.tools.append(tool) def get_tools_schema(self) -> List[Dict]: return [ { "type": "function", "function": { "name": tool.name, "description": tool.description, "parameters": { "type": "object", "properties": tool.parameters, "required": list(tool.parameters.keys()) } } } for tool in self.tools ]

4.2 实现多步骤插件:信息检索与分析

以下插件包含两个函数:search_informationanalyze_results,构成典型的“查+析”链路:

class MultiStepPlugin(QwenPluginBase): def __init__(self): super().__init__() self.register_tool(ToolFunction( name="search_information", description="根据用户问题搜索相关信息", parameters={"query": {"type": "string", "description": "搜索关键词"}} )) self.register_tool(ToolFunction( name="analyze_results", description="对搜索结果进行归纳总结与情感分析", parameters={"data": {"type": "string", "description": "待分析的原始文本"}} )) def search_information(self, query: str) -> Dict[str, Any]: print(f"[执行] 搜索中: {query}") # 模拟搜索引擎返回 mock_results = { "人工智能发展": "近年来AI技术飞速进步,尤其在自然语言处理领域。", "Python教程": "Python是一种易学易用的编程语言,广泛应用于数据分析和AI开发。", "北京天气": "今日北京晴朗,最高温26℃,空气质量良好。" } result = mock_results.get(query, "未找到相关信息") return {"query": query, "result": result} def analyze_results(self, data: str) -> Dict[str, Any]: print(f"[执行] 分析中: {data[:50]}...") # 简单模拟分析逻辑 sentiment = "正面" if any(word in data for word in ["良好", "进步", "优秀"]) else "中性" summary = f"内容概要:{data[:60]}... 情感倾向:{sentiment}" return {"summary": summary, "sentiment": sentiment}

5. 集成插件管理器实现多轮调用

5.1 插件管理器核心逻辑

from transformers import AutoModelForCausalLM, AutoTokenizer import json class QwenPluginManager: def __init__(self, model_name: str = "Qwen/Qwen3-1.7B"): self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype="auto", device_map="auto" ) self.plugins = {} self.conversation_history = [] def register_plugin(self, name: str, plugin): self.plugins[name] = plugin def _get_all_tools(self): all_tools = [] for plugin in self.plugins.values(): all_tools.extend(plugin.get_tools_schema()) return all_tools if all_tools else None def run(self, user_input: str, max_turns: int = 3): """运行多轮插件调用""" self.conversation_history = [{"role": "user", "content": user_input}] for turn in range(max_turns): # 应用聊天模板,包含工具定义 text = self.tokenizer.apply_chat_template( self.conversation_history, tokenize=False, add_generation_prompt=True, tools=self._get_all_tools() ) inputs = self.tokenizer([text], return_tensors="pt").to(self.model.device) outputs = self.model.generate( **inputs, max_new_tokens=1024, eos_token_id=self.tokenizer.eos_token_id ) response_ids = outputs[0][len(inputs.input_ids[0]):] response_text = self.tokenizer.decode(response_ids, skip_special_tokens=False) # 添加模型响应到历史 self.conversation_history.append({"role": "assistant", "content": response_text}) print(f"第{turn+1}轮模型输出:\n{response_text}\n") # 解析工具调用 if "<tool_call>" in response_text and "<tool_call>" in response_text: try: call_content = response_text.split("<tool_call>")[1].split("<tool_call>")[0].strip() tool_call = json.loads(call_content) tool_name = tool_call["name"] args = tool_call.get("arguments", {}) # 查找并执行对应方法 found = False for plugin in self.plugins.values(): if hasattr(plugin, tool_name): method = getattr(plugin, tool_name) result = method(**args) # 返回工具响应 tool_response = {"name": tool_name, "content": json.dumps(result, ensure_ascii=False)} self.conversation_history.append({"role": "tool", "content": json.dumps(tool_response)}) print(f"✅ 执行工具: {tool_name}, 结果: {result}\n") found = True break if not found: error_msg = {"error": f"未注册的工具: {tool_name}"} self.conversation_history.append({ "role": "tool", "content": json.dumps({"name": tool_name, "content": json.dumps(error_msg)}) }) print(f"❌ 错误: 未找到工具 {tool_name}") except Exception as e: print(f"🛠️ 工具调用异常: {e}") break else: # 无工具调用,结束 print("🔚 对话结束,模型直接回复。") break

6. 完整使用示例

# main.py from multi_step_plugin import MultiStepPlugin from qwen_plugin_manager import QwenPluginManager def main(): manager = QwenPluginManager("Qwen/Qwen3-1.7B") # 注册多步骤插件 multi_plugin = MultiStepPlugin() manager.register_plugin("multi", multi_plugin) # 测试多步调用 test_queries = [ "请查找关于人工智能发展的资料,并做简要分析。", "搜索北京天气,然后给出出行建议。", "找一篇Python入门教程并总结要点。" ] for query in test_queries: print("=" * 60) print(f"📌 用户提问: {query}") print("-" * 60) manager.run(query) print("\n") if __name__ == "__main__": main()

预期输出示例

============================================================ 📌 用户提问: 请查找关于人工智能发展的资料,并做简要分析。 ------------------------------------------------------------ 第1轮模型输出: <tool_call>{"name": "search_information", "arguments": {"query": "人工智能发展"}}</tool_call> ✅ 执行工具: search_information, 结果: {'query': '人工智能发展', 'result': '近年来AI技术飞速进步,尤其在自然语言处理领域。'} 第2轮模型输出: <tool_call>{"name": "analyze_results", "arguments": {"data": "近年来AI技术飞速进步,尤其在自然语言处理领域。"}}</tool_call> ✅ 执行工具: analyze_results, 结果: {'summary': '内容概要:近年来AI技术飞速进步,尤其在自然语言处理领域。... 情感倾向:正面', 'sentiment': '正面'} 第3轮模型输出: 根据搜索和分析结果,人工智能正处于快速发展阶段,尤其在自然语言处理方面取得了显著进展,整体趋势积极向上。 🔚 对话结束,模型直接回复。

7. 总结

本文详细介绍了如何利用 Qwen3-1.7B 的工具调用能力实现多步骤插件调用,涵盖从环境搭建、插件定义、消息历史维护到完整执行流程的设计与编码实践。

关键要点总结如下:

  1. 理解工具调用协议:掌握<tool_call><tool_response>的Token机制是实现插件交互的基础。
  2. 维护对话状态:必须将每次工具调用及其返回结果写入conversation_history,否则模型无法继续推理。
  3. 合理设计工具链:将复杂任务拆解为多个原子化函数,如“搜索+分析+生成”,提升可控性和复用性。
  4. 错误处理与健壮性:添加参数校验、异常捕获和重试机制,避免因单步失败导致整个流程中断。
  5. 性能优化方向:未来可结合 FP8 量化版本进一步降低显存占用,提升推理速度。

通过上述方法,开发者可以基于 Qwen3-1.7B 构建出真正具备自主决策能力的智能代理系统,广泛应用于知识问答、自动化办公、客户服务等领域。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

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

雀魂智能助手Akagi:从零开始打造专业麻将分析系统

雀魂智能助手Akagi&#xff1a;从零开始打造专业麻将分析系统 【免费下载链接】Akagi A helper client for Majsoul 项目地址: https://gitcode.com/gh_mirrors/ak/Akagi 在激烈的麻将对局中&#xff0c;每一个决策都可能影响最终的战局走向。Akagi作为一款专为雀魂游戏…

作者头像 李华
网站建设 2026/5/8 12:40:34

BiliTools跨平台B站资源下载工具功能解析与使用指南

BiliTools跨平台B站资源下载工具功能解析与使用指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools Bi…

作者头像 李华
网站建设 2026/5/13 4:56:13

MinerU功能全测评:学术论文解析真实表现

MinerU功能全测评&#xff1a;学术论文解析真实表现 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0c;支持一键部署。 1. 引言&am…

作者头像 李华
网站建设 2026/5/11 16:37:22

Win11Debloat高效清理工具:一键解决Windows系统臃肿问题

Win11Debloat高效清理工具&#xff1a;一键解决Windows系统臃肿问题 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简化和…

作者头像 李华
网站建设 2026/5/11 5:49:05

PC手游键盘操控配置:告别手残党的终极解决方案

PC手游键盘操控配置&#xff1a;告别手残党的终极解决方案 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy 还…

作者头像 李华
网站建设 2026/5/9 18:21:31

如何利用Uncle小说PC版打造个人专属数字图书馆

如何利用Uncle小说PC版打造个人专属数字图书馆 【免费下载链接】uncle-novel &#x1f4d6; Uncle小说&#xff0c;PC版&#xff0c;一个全网小说下载器及阅读器&#xff0c;目录解析与书源结合&#xff0c;支持有声小说与文本小说&#xff0c;可下载mobi、epub、txt格式文本小…

作者头像 李华