
最近不少朋友在折腾大模型应用问得最多的问题就是模型能聊天了但怎么让它自己调工具、查资料、算数据真正替人干活市面上Agent框架不少LangChain、MetaGPT这些名头都很大但对于刚入门的朋友来说学习曲线确实陡配置又多光是把概念理清楚就得花不少时间。如果你本身用的是通义千问系列模型那Qwen-Agent是个非常好的切入点——它轻量、直接、和Qwen模型配合最默契而且官方自带大量可直接运行的示例代码。这篇文章不搞花架子就从实战出发带你从安装环境到写一个能跑的多Agent应用全程附代码。这篇文章适合这几类人已经跑通过Qwen API调用、但对Agent还没什么概念的同学看LangChain源码看到一头雾水想换个简单框架的开发者还有那些手上有真实业务需求、想快速验证Agent方案的工程师。读之前不需要你懂复杂的Prompt Engineering或者强化学习有基础的Python知识就够。1. 先聊清楚Qwen-Agent到底是什么1.1 它解决的是哪一类痛点直接调大模型API本质上就是一个“单轮问答机器”。你问它一句它答你一句整个过程模型只是根据上下文生成文字并不能真正去执行操作。比如你想让它分析一份Excel数据光靠裸API它只能给你“建议怎么做”的代码不能直接帮你跑出来。而Agent框架就是解决这个问题的它让大模型作为“调度中枢”模型自己决定需要调用哪些工具、按什么顺序调用、拿到结果后再怎么整合回复。这中间涉及工具注册、函数调用Function Calling、结果解析、多轮上下文维护等一堆工程细节。Qwen-Agent把这些都封装好了你能用几行代码就搭出自己的智能体。我试过用LangChain跑类似流程需要理解Chain、AgentExecutor、Tool、OutputParser等一系列抽象概念代码很灵活但心智负担重。Qwen-Agent的思路更像“给你一辆教练车上车就能开”它默认配好了一套完整的最佳实践你只需要往里填自己的业务逻辑。1.2 和直接用裸模型有什么区别直接调Qwen模型时你的调用链路是用户输入 - 模型生成 - 返回文本。模型不具备读取本地文件的能力不具备调用外部API的能力也不具备“记住我之前让它做了几步操作”的能力。使用Qwen-Agent后链路变成用户输入 - Agent解析意图 - 模型生成工具调用指令 - 框架执行工具 - 结果回填给模型 - 模型继续推理或生成最终回复。这个转变非常关键。模型从“会说话”变成“会做事”靠的就是这个执行循环。Qwen-Agent和裸模型的关系就像外卖平台的App和餐厅后厨——App是展示和交互层后厨才是真正产出内容的地方但你作为用户主要面对的是App。Qwen-Agent本身不是一个模型它是一套基于Qwen模型的开发框架。你在代码里还是会调用千问的API或本地模型但不再需要自己管理工具调用和上下文拼接这些脏活累活。2. 环境准备用最少依赖搭起可跑环境2.1 安装与依赖确认先看一张我整理的环境清单依赖项版本建议说明Python3.9及以上我实测3.8也能跑但官方推荐3.9qwen-agent最新版主框架包dashscope最新版阿里云灵积模型服务SDK用于调用千问APIopenai1.x部分工具和兼容接口需要opencv-python最新版官方示例中框架会用到如果不需要视觉识别可以不装安装命令很简单一条搞定pip install qwen-agent dashscope装完可以验证一下版本python -c import qwen_agent; print(qwen_agent.__version__)正常会输出版本号。如果提示找不到模块检查一下你的Python环境是不是对了——我曾经因为conda环境没激活折腾了十分钟才发现装错了地方。2.2 初始化LLM实例的两种方式Qwen-Agent官方支持两种模型接入方式一种是通过DashScope的API远程调用另一种是接入本地部署的模型比如用vLLM起服务。对于入门来说强烈推荐先用API方式跑通全流程等理解了Agent机制再考虑本地化部署。直接用API的配置方式如下# 配置 DashScope API Key import os os.environ[DASHSCOPE_API_KEY] sk-xxxxxxxx # 创建Qwen模型实例 llm LLM( modelqwen-plus, # 经济实惠的选择 model_serverdashscope, )这里我要多说一句模型的选择。qwen-plus就够用了qwen-max效果更好但费用更高。入门阶段跑通逻辑才是重点用qwen-plus能帮你省下一杯奶茶钱。如果你想用本地模型Qwen-Agent也支持走OpenAI兼容接口用vLLM把本地模型起成服务llm LLM( modelQwen/Qwen2.5-7B-Instruct, model_serverhttp://localhost:8000/v1, # vLLM默认地址 api_keyEMPTY, )这种方式适合对数据隐私有要求、想要离线使用的场景。但本地模型对显存有要求7B模型至少需要16G显存且量化后才能跑得舒服入门阶段不建议一上来就搞。3. Agent的底层机制别只会调库要懂它的运行逻辑3.1 核心大模型的工具调用能力很多朋友一开始不理解“工具调用”到底是怎么实现的。其实原理不复杂当你给模型提供工具清单后模型不是真的“动手”去调用工具而是在回复中输出一段结构化的JSON指令告诉框架它想调用哪个工具、参数是什么。举个例子如果你给模型提供了一个“乘法计算器”工具当你问“123乘以456等于多少”时模型可能会输出这样的指令{ thought: 用户询问乘法计算我可以使用乘法工具。, action: multiply_calculator, action_args: { num1: 123, num2: 456 } }框架接住这段JSON帮你执行真正的计算再把结果“123乘以45656088”作为一条消息追加回上下文然后模型基于这个结果生成给用户的最终回复。这个机制就是Function Calling。Qwen-Agent的整个Agent能力就是建立在这个机制之上的。理解这个你再去看框架源码就不会懵了。3.2 Agent循环逻辑一个完整的Agent执行流程分为几步系统提示词System Prompt先告诉模型它是什么角色、有哪些工具可用、使用工具时要注意什么。用户消息进入模型基于“系统提示词用户消息历史上下文工具描述”生成回复。框架检查模型的回复中是否包含工具调用指令。如果没有说明模型可以直接回答用户Agent循环结束把回复返回给用户。如果有工具调用指令框架解析出工具名和参数在本地执行对应函数。执行结果作为“工具调用结果”Tool Result追加到上下文再次提交给模型。模型继续判断是继续调用工具还是生成最终回复循环往复直到模型不再输出工具调用指令为止。这个循环就是Agent所有能力的底层架构。Qwen-Agent用一套简洁的接口帮你跑通了上面所有环节——你只需要实现每个工具“具体做什么”调度逻辑框架帮你管。3.3 记忆管理机制Agent应用场景中多轮对话是常态。用户可能连续问三步操作第一步的结果会影响第二步的指令。Qwen-Agent中通过消息列表机制管理历史记忆常用的是messages列表里面存着system、user、assistant、function四条消息类型。框架在这个基础上做了优化它会自动裁剪过长历史把工具调用结果和模型回复压成更紧凑的格式控制token消耗。你可以用max_history_len参数控制保留多少轮对话历史。这在真实场景中非常实用不然聊几十轮后token会飞速上涨费用扛不住。4. 实战代码从单工具到多Agent4.1 最简单示例不接任何工具在配置好环境、理解了机制之后我们看看Qwen-Agent最少需要多少行代码、能实现一个什么样的智能体。先从一个最基础的例子开始——不接任何工具就是一个普通问答Agent。import os from qwen_agent import Agent # 设置API Key os.environ[DASHSCOPE_API_KEY] sk-xxxxxxxx # 这个Agent没有任何工具,就是一个纯对话模型 agent Agent( name小千, description一个简单的对话助手, modelqwen-plus, system_prompt你是一个友好的助手用简洁准确的中文回答问题。, ) # 单轮对话 messages [ {role: user, content: 介绍一下你自己}, ] responses agent.run(messages) for response in responses: for msg in response: print(msg[content])这段代码堪称“入门第一课”。Agent对象只需要指定名字、描述、模型和系统提示词即可运行。run方法接收一个消息列表返回的是输出消息流的可迭代对象——Qwen-Agent的Agent响应都是这种生成器形式因为要支持流式输出。运行这段代码你就能收到模型回复。别小看这个示例它验证了整个环境、API认证、基础调用链路是否畅通。我每次换新项目第一步都会跑这个最小示例确认没问题再往上面叠功能这是很好的排错习惯。4.2 实战一接入计算器与代码解释器纯对话没意思现在给Agent加点真本事。我们先接两个工具计算器和代码解释器。计算器能处理精确计算代码解释器能跑Python代码处理更复杂的任务。import os from qwen_agent import Agent os.environ[DASHSCOPE_API_KEY] sk-xxxxxxxx # Qwen-Agent内置了几个常用工具,直接通过函数名使用 agent Agent( name计算分析助手, description一个可以算术和写代码的助手, modelqwen-plus, system_prompt你是一个能干的助手当遇到需要计算的任务时优先使用计算工具当需要处理数据、转换格式等任务时使用代码解释器。, function_list[math, code_interpreter], ) # 提问 messages [ {role: user, content: 帮我计算(82*35127)/3保留三位小数}, ] responses agent.run(messages) for response in responses: for msg in response: print(msg[content])这短短几行代码里面的逻辑可不简单。function_list[math, code_interpreter]让Agent记住了自己可用的工具清单。当你提问时模型会“思考”要不要用工具用哪个工具然后输出对应的调用指令。特别提一下这个“code_interpreter”工具它实际上是框架内置的Python代码执行环境——别看只是调用一个Python函数这个工具的背后是独立的执行会话能够保持变量状态执行完一段代码后后续代码还能接着使用之前的变量。我实测下来qwen-plus在工具选型上很聪明。你让它算连加乘除混合运算它会自动选数学计算工具你让它批量读取列表并筛选数据它就会走代码解释器。如果你告诉它“不要使用代码解释器”它也能乖乖听话只凭自己的计算能力硬算——当然准确率就不保证那么高了。这就是Agent框架的灵活之处工具是给模型的“选项”最终用不用、怎么用模型自己判断。4.3 实战二自定义一个情感分析工具内置工具够用但真实业务场景肯定需要自定义工具。比如注册一个专门做情感分析的函数。这个工具可以是你自己训练的模型接口也可以是调用某个第三方服务Qwen-Agent不在乎你内部实现是什么只要把这个函数的名称、参数和功能描述告诉它即可。先定义一个普通函数from qwen_agent.tools import BaseTool class SentimentAnalyzer(BaseTool): # 工具描述这是Agent判断何时调用此工具的依据非常关键 description 对输入文本进行情感分析返回情感标签positive正面、neutral中性或negative负面。 # 定义工具接收的参数JSON Schema格式告诉模型应该传什么参数 parameters { type: object, properties: { text: { type: string, description: 需要分析情感的文本内容 } }, required: [text] } # 核心逻辑实现call方法 def call(self, params: str) - str: params self._parse_params(params) text params.get(text, ) # 这里简单演示规则逻辑实际项目中可以替换为模型或接口调用 positive_words [好, 赞, 喜欢, 优秀, 满意] negative_words [差, 坏, 讨厌, 垃圾, 失望] pos_count sum(1 for w in positive_words if w in text) neg_count sum(1 for w in negative_words if w in text) if pos_count neg_count: return positive elif neg_count pos_count: return negative else: return neutral然后注册这个工具并创建Agentimport os from qwen_agent import Agent os.environ[DASHSCOPE_API_KEY] sk-xxxxxxxx # 注册自定义工具工具名就是类名 tools [SentimentAnalyzer()] agent Agent( name情感分析助手, description一个可以判断文本情感的助手, modelqwen-plus, system_prompt你是一个情感分析助手当用户输入需要分析情感的文本时调用情感分析工具并解释分析结果。, function_listtools, ) messages [ {role: user, content: 我今天买的手机到了手感很好屏幕显示效果太棒了我很喜欢}, ] responses agent.run(messages) for response in responses: for msg in response: print(msg[content])这一步是整个实战中最值得细品的地方。自定义工具本质就是继承BaseTool类、实现call方法然后框架就自动帮你完成解析、调度、结果回填。你只需要定义“做什么”不用管“怎么被调用”。这种设计模式对开发非常友好每个工具都是一个独立的类职责单一测试和维护都不费劲。需要注意类的description字段和parameters字段都是写给模型看的“说明书”。description要写清楚“这个工具是干嘛的、什么时候用它”parameters要明确“调用时需要传哪些参数、每个参数什么格式”。描述越清楚模型就越不会误调用。4.4 进阶多Agent协作工作流真实的业务场景很少只有一个Agent单独完成任务。更多时候需要多个角色分工配合一个负责当“规划者”拆解任务一个负责“执行者”调用工具执行一个负责“审核者”检查结果。Qwen-Agent支持构建这种多Agent协作流程代码写起来依然很清爽。我用一个“文章分析助手”的例子演示两个Agent协作一个负责总结文章要点一个负责检查总结的质量并给出优化建议。这里不引入额外的插件框架只利用Qwen-Agent自带的Agent类组合实现。import os from qwen_agent import Agent os.environ[DASHSCOPE_API_KEY] sk-xxxxxxxx # 第一个Agent负责内容总结 agent_summarizer Agent( name内容总结器, description负责对用户输入的文本进行结构化总结, modelqwen-plus, system_prompt你是一位资深的文章分析师。请将用户提供的文本提炼成3-5个核心要点每个要点不超过20字。输出格式为列表每个要点一行。, ) # 第二个Agent负责质量检查 agent_checker Agent( name质量检查员, description负责检查总结是否准确完整, modelqwen-plus, system_prompt你是一位严格的编辑。你会收到一篇总结内容请检查它是否覆盖了原文的核心信息。如果发现遗漏或偏差请指出遗漏了什么并提供改进建议。, ) # 多Agent组合以列表形式传入 agent Agent( name文章分析协作团, description多Agent协作的文章分析工具, modelqwen-plus, system_prompt你是一个多Agent协作流程的管理者。当收到用户文本时先让内容总结器进行总结然后让质量检查员对总结结果进行检查。最后把两个结果一起呈现给用户。, agent_list[agent_summarizer, agent_checker], ) # 测试 article 大语言模型在过去一年中取得了显著进展。从最初的文本生成到现在的多模态理解模型能力发生了质的变化。 特别是在Agent应用方面大模型不再局限于被动回答问题而是能够主动调用工具、规划任务步骤、完成复杂操作。 这种能力让AI从“聊天机器人”变成了“数字员工”可以辅助完成数据分析、报告撰写、信息检索等实际工作。 当然大模型Agent也面临挑战比如如何保证工具调用的正确性、如何管理长期记忆、如何防止恶意指令注入等。 messages [ {role: user, content: f请分析以下文章{article}}, ] responses agent.run(messages) for response in responses: for msg in response: print(msg[content])这个例子展示了一个很有意思的地方主Agent的agent_list参数可以挂载子Agent框架会自动处理任务在它们之间的流转。主Agent收到用户消息后会调用子Agent处理然后把子Agent的输出作为中间结果再决定下一步操作。这种组合方式非常灵活——你可以把任意多个Agent拼成自己的工作流就像搭积木一样。多Agent架构在真实项目中有个很大的优势可维护性。每个Agent只负责一个职责修改其中一个不会影响其他模块。比如你想把“质量检查员”换成更严格的版本只需要改这个Agent的system prompt其他的不用动。5. 常见问题与排查技巧实录5.1 高频问题速查表我在实际使用Qwen-Agent过程中踩过一些坑整理了遇到的高频问题供参考问题现象原因与解决方式API Key报错调用时报401认证失败检查环境变量名是否拼错必须是DASHSCOPE_API_KEY。另外确认Key是否过期以及账户是否有余额工具不被触发模型明明回答不了问题但就是不调用工具工具描述写得太模糊让模型识别不出何时该用。检查工具名是否在function_list中确认自定义工具确实继承了BaseTool并实现了call方法Agent无限循环模型反复调用工具不回最终结果通常是没有设置迭代上限或某个工具频繁返回空结果。可以在创建Agent时设置max_rounds参数比如为5同时检查工具返回结果是否有效上下文太长报错多轮对话后请求超时或报长度超限减少system prompt冗余信息利用Agent的history参数控制保留的轮数拆分成较短的会话代码解释器执行失败工具调用后返回错误信息检查代码运行时依赖的库是否在可执行环境中安装打印出工具执行的原始输出根据报错信息定位原因多Agent不按预期协作主Agent不把任务分发给子Agent确认system prompt中是否用了agent_list里的Agent名称描述模型是按名称识别协作对象的表格之外最让人头大的往往是“模型就是不调用工具”。我的经验是先从最简单工具开始测逐步加复杂度把工具描述写具体比如“当用户需要精确计算、且计算问题相对复杂时使用此工具”在system prompt中明确说明“遇到XX类型问题必须先使用XX工具”。这些方法都试过了还不行再考虑是不是模型版本太旧换更新的模型版本试试。5.2 调试技巧把Agent的思考过程暴露出来Qwen-Agent默认只返回最终结果但调试阶段你可能想看到模型“想了什么”。这时候可以开启精调模式。方法很简单不仅能看完整工具调用日志还能对中间过程做细粒度检查。我的经验是在调试时打印每一步的消息流框架返回的响应是一个生成器每次迭代会产生一条或多条新的消息。遍历响应就能看到工具调用的完整轨迹。如果使用的是较新版本的Qwen-Agent可以开启verboseTrue参数让框架输出更多运行时信息。调试时还有一个非常好用的小技巧用简单且可控的测试输出来验证工具逻辑。比如自定义工具计算加法你不用让它跟复杂任务交互直接在代码里调用这个工具的call方法传个“1和2”进去看看是否能返回“3”。工具本身是纯函数可以直接单测不用每次都在Agent链路里排错。最后再分享两个小细节。一个是用seed参数固定随机种子尤其在复现问题时很有帮助另一个是多利用max_rounds控制Agent的“思考深度”——如果问题很简单限制它最多调用两轮工具就够了既能减少延迟也能省钱还能防止它绕圈子。我在几十个项目里反复用Qwen-Agent之后最大的体会是框架本身真的不难难的是把业务逻辑清晰地拆解成工具再给模型写清楚“说明书”。这个框架帮你省掉的工程量数以万计但你要做的功课一点不少——需要对模型的行为有足够的耐心去调试和引导。上手之后你会发现自己搭建一个能用上真实场景的Agent应用其实也就是一个下午的时间。