
1. 从零跑通一个 Qwen3 智能体卡在哪一步AI Agent 智能体开发这件事真正上手之后你会发现难的不是写那几十行调用代码而是把「模型接入 → 工具调用 → 多轮对话 → 结果验证」这条链路完整跑通。Qwen3 大模型在中文理解、工具调用格式遵循、思考模式切换上表现不错很适合作为智能体开发的基座模型。但很多开发者第一次做的时候会卡在几个很具体的地方API Key 怎么配、工具调用的 JSON Schema 怎么写、MCP 服务怎么挂载、多轮对话的上下文怎么管理。这篇内容面向的是想系统学习智能体架构与落地的开发者尤其是刚接触 AI Agent、想用 Qwen3 大模型跑通第一个可运行项目的朋友。我会交付一套可复制的 Agent 项目骨架配置包含模型接入参数和工具调用参数然后用 5 个实战案例的运行验证步骤帮你从环境搭建一路走到多轮对话完整链路。整个过程不需要你提前懂 MCP 协议细节也不需要你有 GPU 服务器一台能跑 Python 的机器就够。我试过把 Qwen3 接入到智能体框架里实测下来最省事的路径是先用统一 API 网关把模型调用跑通再逐步叠加工具调用和 MCP 服务。这样每一步都有明确的验证点出问题也容易定位。下面按这个思路展开。2. TaoToken 前置把 Qwen3 模型接入这一步做扎实2.1 为什么智能体开发需要一个统一的模型接入层做 AI Agent 开发模型调用是地基。你可能会同时用到 Qwen3 的不同尺寸版本也可能在调试阶段频繁切换模型来对比工具调用效果。如果每个模型都单独去申请 Key、单独维护一套调用代码项目还没开始写业务逻辑光接入层就够乱了。TaoToken 在这里的角色是一个模型接入网关它把 Qwen3 等大模型的调用统一成 OpenAI 兼容的接口格式。这意味着你写智能体代码时只需要维护一套base_url和api_key切换模型只改一个模型名字符串。对于智能体开发来说这个统一层很关键因为 Agent 框架比如 LangGraph、AutoGen大多默认走 OpenAI 兼容协议统一接入层能省掉大量适配代码。官网地址https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 地址https://taotoken.net/api2.2 获取 API Key 与模型对话入口进入控制台创建 API Key这是后续所有代码调用的凭证。创建时建议按项目命名比如agent-dev-qwen3方便后面排查是哪个项目在调用。API Keys 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite如果你只是想先验证 Qwen3 的对话效果和工具调用格式不想马上写代码可以直接用模型对话页面测试。输入一段带工具描述的 prompt看模型返回的 function call 结构是否符合预期这一步能帮你提前确认模型对工具调用格式的遵循程度。模型对话入口https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite2.3 智能体开发场景下的接入文档接入文档里有完整的请求参数说明包括tools字段的 JSON Schema 写法、tool_choice的取值、多轮对话中tool角色消息的传递方式。做 Agent 开发时这几个参数是高频使用的建议先过一遍。接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite注意智能体开发中工具调用的返回结果需要以role: tool的消息回传给模型很多初学者会漏掉tool_call_id的对应关系导致模型无法正确关联工具结果。3. 可复制配置Qwen3 智能体项目骨架3.1 环境准备与依赖安装先建一个干净的 Python 环境避免和已有项目冲突。Python 版本建议 3.10 以上因为部分 Agent 框架对类型注解有要求。conda create -n qwen3-agent python3.10 -y conda activate qwen3-agent pip install openai httpx pydantic这里用openai官方 SDK 来调用因为 TaoToken 的接口是 OpenAI 兼容的直接用官方 SDK 最省事不需要额外写 HTTP 封装。3.2 模型接入配置把 API Key 和 base_url 写成配置文件不要硬编码在业务代码里。下面是一个config.py示例# config.py import os TAOTOKEN_API_KEY os.getenv(TAOTOKEN_API_KEY, sk-your-key-here) TAOTOKEN_BASE_URL https://taotoken.net/api # 智能体默认使用的模型 DEFAULT_MODEL qwen3-235b-a22b # 工具调用相关参数 TOOL_CHOICE auto TEMPERATURE 0.3 MAX_TOKENS 2048temperature设成 0.3 是因为智能体场景下需要模型稳定遵循工具调用格式温度太高容易产生格式漂移。tool_choice用auto让模型自己决定是否调用工具如果你在调试某个特定工具可以强制指定{type: function, function: {name: get_weather}}。3.3 工具调用参数定义智能体的核心能力是工具调用。下面定义一个查询天气的工具重点看 JSON Schema 的写法# tools.py weather_tool { type: function, function: { name: get_weather, description: 查询指定城市的实时天气, parameters: { type: object, properties: { city: { type: string, description: 城市名称例如杭州 }, unit: { type: string, enum: [celsius, fahrenheit], description: 温度单位 } }, required: [city] } } }description字段要写清楚模型是靠这个描述来判断什么时候该调用这个工具的。required里列出必填参数非必填的放在properties里但不进required。3.4 智能体主循环骨架下面是一个最小可运行的智能体循环包含模型调用、工具执行、结果回传三个环节# agent.py from openai import OpenAI from config import TAOTOKEN_API_KEY, TAOTOKEN_BASE_URL, DEFAULT_MODEL from tools import weather_tool client OpenAI(api_keyTAOTOKEN_API_KEY, base_urlTAOTOKEN_BASE_URL) def execute_tool(name, arguments): if name get_weather: city arguments.get(city) # 这里替换成真实工具实现 return f{city}今天晴气温 22 摄氏度 return 未知工具 def run_agent(user_input, historyNone): messages history or [] messages.append({role: user, content: user_input}) response client.chat.completions.create( modelDEFAULT_MODEL, messagesmessages, tools[weather_tool], tool_choiceauto, temperature0.3 ) msg response.choices[0].message if msg.tool_calls: messages.append(msg) for call in msg.tool_calls: import json args json.loads(call.function.arguments) result execute_tool(call.function.name, args) messages.append({ role: tool, tool_call_id: call.id, content: result }) # 工具结果回传后再次调用模型生成最终回答 final client.chat.completions.create( modelDEFAULT_MODEL, messagesmessages, temperature0.3 ) return final.choices[0].message.content, messages return msg.content, messages这个骨架的关键点在于工具调用发生后必须把模型的tool_calls消息和每个工具的返回结果都追加到messages里再发起第二次请求。很多初学者只追加了工具结果漏掉了模型的tool_calls消息导致模型报错说找不到对应的 tool_call_id。4. 验证请求5 个实战案例跑通4.1 案例一基础多轮对话验证先不挂工具验证 Qwen3 的多轮对话能力。运行下面代码from agent import run_agent history [] reply, history run_agent(你好介绍一下你自己, history) print(第一轮, reply) reply, history run_agent(你刚才说了什么, history) print(第二轮, reply)预期结果是第二轮模型能引用第一轮的内容说明上下文传递正常。如果第二轮模型说「不知道你指什么」检查history是否正确累积。4.2 案例二单工具调用验证reply, history run_agent(杭州今天天气怎么样) print(reply)预期输出类似「杭州今天晴气温 22 摄氏度」。如果模型没有触发工具调用而是直接编了一个天气检查tool_choice是否为auto以及工具description是否足够明确。4.3 案例三多工具串联验证再定义一个时间查询工具测试模型能否在一次对话中连续调用多个工具time_tool { type: function, function: { name: get_current_time, description: 获取当前系统时间, parameters: {type: object, properties: {}} } }把weather_tool和time_tool一起传入tools列表然后问「现在几点杭州天气如何」。模型应该会返回两个tool_calls你的循环代码需要能处理多个工具调用。4.4 案例四MCP 服务挂载验证MCP 是智能体工具调用的一种标准化协议。你可以把本地的一个 MCP 服务挂载到智能体上让模型通过 MCP 协议调用外部能力。验证步骤是先启动一个本地 MCP 服务然后在智能体配置里注册这个服务的连接信息最后发一条需要用到该服务的请求看模型是否能正确路由。# mcp_config.py MCP_SERVERS { local_tools: { command: python, args: [mcp_server.py], transport: stdio } }挂载后智能体启动时会自动拉取 MCP 服务暴露的工具列表合并到tools参数里。这一步的验证点是模型能否在不知道工具具体实现的情况下仅凭 MCP 服务返回的工具描述就正确调用。4.5 案例五带记忆的完整链路验证最后一个案例把多轮对话、工具调用、上下文记忆串起来history [] reply, history run_agent(帮我查一下杭州天气, history) print(reply) reply, history run_agent(那北京呢, history) print(reply) reply, history run_agent(两个城市温差多少, history) print(reply)第三轮模型需要从历史消息里提取两个城市的温度并计算差值。如果模型能正确回答说明你的智能体已经具备了完整的记忆和推理链路。5. 本篇常见错排查5.1 工具调用返回 400 错误最常见的原因是messages里tool角色消息的tool_call_id和模型返回的tool_calls[].id对不上。检查你的循环代码确保每个工具结果都用了正确的 id。另一个原因是tools参数的 JSON Schema 格式不合法比如required里写了不存在的属性名。5.2 模型不触发工具调用先确认tool_choice不是none。然后检查工具的description是否太模糊模型判断不出什么时候该用。可以把description写得更具体比如「当用户询问天气、气温、降水等气象信息时调用此工具」。5.3 多轮对话上下文丢失检查history是否在每次调用后正确更新。run_agent函数返回的messages列表应该包含所有轮次的消息下次调用时传入这个列表。如果你每次都传空列表模型自然没有记忆。5.4 MCP 服务连接失败先单独测试 MCP 服务能否启动再检查智能体配置里的command和args是否正确。stdio 传输模式下MCP 服务是通过子进程启动的路径问题最容易出错。建议用绝对路径。5.5 模型返回格式漂移如果模型偶尔返回非 JSON 格式的工具参数把temperature再调低比如 0.1。另外可以在 system prompt 里明确要求「工具调用参数必须是合法 JSON」。6. 长期编码与 Agent 项目的持续迭代跑通上面 5 个案例之后你已经有了一套可运行的智能体骨架。接下来要做的是把它变成一个能持续迭代的项目。这里有几个方向可以深入一是把工具调用从硬编码改成动态注册方便后续接入更多 MCP 服务二是引入 LangGraph 这类多智能体框架把单 Agent 升级成多 Agent 协作三是把模型调用层做成可切换的方便对比不同模型在工具调用上的表现。如果你打算长期做智能体开发建议用 Coding Plan 来管理模型调用额度避免调试过程中频繁遇到限流。Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewriteClaudeCodeAnthropic 接入方式https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite控制台入口https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite实际做项目时我习惯把每个工具单独写一个测试用例先确保工具本身能跑通再挂到智能体上验证模型调用。这样出问题时能快速定位是工具实现的问题还是模型调用的问题。另外智能体的 system prompt 值得反复打磨它直接决定了模型在什么场景下调用什么工具比调参的影响大得多。