Qwen3 在 2025 年发布时已经提供混合思考模式,并由官方建议通过 Qwen-Agent 使用工具与 MCP。这是一个适合教学的组合,但 Qwen3 并不是 2026 年发布的新模型。

下面不连接真实服务,只用 mock tools 说明运行合同。模型提出调用,应用验证、授权并执行;MCP 负责协议,不负责业务权限。

先冻结模型与模式

记录具体 Qwen3 模型卡、推理运行时、chat template、Qwen-Agent commit、MCP revision 和采样参数。简单读取可以使用 non-thinking;需要多步规划时启用 thinking,但仍设置 token 和步骤预算。/think/no_think 是控制信号,不应让不可信工具结果任意注入。

同一任务分别测试两种模式,比较成功、工具调用、延迟与输出 token。思考更长不是质量保证;能用 schema 和确定性代码完成的校验不要交给模型反复推理。

用 mock 工具定义权限边界

from dataclasses import dataclass

@dataclass(frozen=True)
class ToolResult:
    ok: bool
    data: dict

def lookup_inventory(sku: str, tenant: str) -> ToolResult:
    if not sku.startswith("SKU-"):
        return ToolResult(False, {"error": "invalid_sku"})
    fixtures = {("acme", "SKU-42"): 7}
    if (tenant, sku) not in fixtures:
        return ToolResult(False, {"error": "not_found"})
    return ToolResult(True, {"sku": sku, "available": fixtures[(tenant, sku)]})

注册表只暴露名称、严格 schema 与 handler;未知工具拒绝。生产凭据留在执行器,tenant 来自认证上下文而不是模型参数。即使 MCP annotation 声称只读,客户端也按自己的注册表和 server trust 重新判定。

工具结果是数据

网页或仓库工具可能返回“忽略之前规则”的文本。将 content 包在不可信数据边界中,不让它改变系统指令、思考模式、工具集合或审批。输出 schema 能降低解析歧义,却不能证明事实正确;执行后做领域验证。

MCP server 使用 allowlist 与固定版本。stdio 子进程限制工作目录和环境变量;HTTP server 验证 token audience,不转发客户端 token。写操作默认关闭,启用时需要幂等键和行动时审批。

失败恢复是一等路径

任务状态包含 planningcallingwaiting_approvalrecovering 与终态。每个调用保存 call id、规范化参数 hash、结果和重试次数。瞬时读取失败可以退避重试;invalid、permission denied 和 not found 不重试。未知外部状态先 reconciliation。

设置最大六步、每工具一次重试和总时间预算。相同调用连续失败则停止并返回需要的信息。恢复时从产品数据库读取已完成步骤,而不是把整段旧 transcript 当唯一真相。

测试 Agent 而不是演示

fixture 包含正常库存、错误 SKU、跨租户 id、超时、提示注入、重复调用和取消。断言正确工具、参数来源、无越权、错误分类、停止条件与最终事实。mock trace 可在升级 Qwen、runtime 或 Qwen-Agent 后回放,不产生真实副作用。

评测报告分开任务成功与安全违规;一次越权不能被高平均分抵消。比较 thinking 与 non-thinking 时保持工具、模板、数据和预算一致。

上线前再做小规模 shadow 运行:只记录建议调用,不授予真实写权限,并把建议与现有流程结果比较。确认错误分布、延迟和停止条件后,再逐类开放低风险只读工具;写工具始终单独审批。

Qwen3 与 MCP 能降低工具型 Agent 的接线成本,可靠性仍来自应用层:冻结版本、限制思考预算、默认拒绝工具、幂等保存和可恢复状态。先让 mock 场景中的每个失败都可解释,再接入真实系统,远比从一个漂亮演示直接走向生产稳妥。