2026/10/1 23:43:35

客服Agent实战:Tool、RAG、MCP与Eval的系统级咬合

客服Agent实战:Tool、RAG、MCP与Eval的系统级咬合 1. 项目概述一场真实发生的客服 Agent 成长实录“客服 Agent 渡劫 48 关”这标题不是玄幻小说而是我带团队落地一个企业级智能客服系统时的真实日志编号。从第一版只能硬编码调用三个 API 的“工具调用雏形”到最终支撑日均 12 万次会话、平均响应延迟 850ms、意图识别准确率 93.7%、知识召回 hit rate 稳定在 86.2% 的生产级 Agent我们确实完整走过了 48 个关键迭代节点——每“一关”对应一个必须攻克的技术瓶颈、一次线上事故复盘、或一次业务方提出的不可妥协需求。它不叫“48 小时速成”而叫“48 次认知刷新”。核心关键词Agent、Tool、RAG、MCP、Eval不是并列的五个技术名词而是一条清晰的演进链条Agent 是目标形态Tool 是能力基座RAG 是知识补给线MCP 是协同神经中枢Eval 是闭环校准器。网上很多教程把它们拆开讲仿佛能各自独立存在但真实项目里你改一行 RAG 的 chunk size可能让 Tool 调用失败率上升 17%你升级 MCP 协议版本没同步更新 Eval 的 trace 分析逻辑整个质量看板就变成“数据正确但结论失真”的废纸。这正是本文要撕开的表层——不讲概念定义只讲它们在客服场景下如何咬合、如何打架、又如何被我们亲手焊死。适合谁读如果你正面临这些具体问题已用 LangChain/LlamaIndex 搭出基础 RAG但客户问“上个月张三的退货单号是多少”系统要么答非所问要么直接拒答试过多个 Agent 框架AutoGen、CrewAI、LangGraph但一接入真实 CRM/ERP 接口就频繁超时或参数错乱听说 MCP 协议能解多 Agent 协作但连wss://api.xiaozhi.me/mcp/这类真实 endpoint 都不敢贸然连怕触发风控每次上线新模型都靠人工抽样 50 条对话判分结果运营说“感觉更卡了”技术说“指标没跌”双方僵持那么这篇就是为你写的。它不教你怎么跑通一个 demo而是告诉你当客服坐席每天处理 300 个“为什么我的优惠券没生效”你的 Agent 如何在第 48 次迭代后真的听懂这句话背后指向的是“营销活动配置漏配”而非“用户账户异常”。2. 整体设计思路为什么是“渡劫”而不是“升级”2.1 客服场景的特殊性高确定性 低容错率 强时效性先破一个常见误区很多人把客服 Agent 当作通用对话 Agent 的子集这是致命错误。通用 Agent 可以说“我不太确定建议您咨询人工”客服 Agent 说这句话的代价是客户挂机、投诉率飙升、KPI 扣罚。我们统计过真实工单72.3% 的会话必须给出唯一确定答案且 95% 的会话要求首句响应时间 ≤ 1.2 秒。这意味着不能依赖 LLM 自由生成哪怕 GPT-4 Turbo 生成质量再高其 token 生成的不确定性如突然插入无关解释在客服场景就是事故。我们必须把 LLM 降级为“精准计算器”而非“自由作家”。Tool 不是可选项而是主干道客服本质是查系统、改状态、传凭证。所有“理解用户意图→调用工具→解析返回→组织回复”必须原子化。我们曾测试纯 RAG 方案处理“查物流”在 37 个快递公司接口中仅 12 家返回结构化 JSON其余全是 HTML 表格或图片。这时 RAG 的“检索”环节根本无从下手——你连文本都没法提取。RAG 的瓶颈不在向量库而在 schema 对齐网上教程总强调“用 BGE-M3 做 embedding”但真实痛点是CRM 里“客户等级”字段叫vip_level知识库文档写的是“VIP 级别”而客服话术模板里说的是“尊享权益”。这三个词语义一致但向量距离可能比“VIP”和“普通会员”还远。这不是模型问题是业务 schema 没对齐。提示我们最终放弃“统一 embedding 模型”转而为每个业务系统定制轻量级 synonym mapping layer。例如在物流查询模块预置规则[物流单号, 运单号, 快递单号, tracking number] → tracking_id。实测比单纯提升 embedding 维度效果高 3.8 倍。2.2 “48 关”的演进逻辑从单点突破到系统耦合所谓“渡劫”是指每个阶段都存在一个必须解决的“单点故障”否则整个链路崩塌。我们按真实时间线梳理出五阶段跃迁阶段核心目标关键“劫数”失败后果1-12 关Tool 可靠调用第 7 关CRM 接口 Token 过期自动续签失败30% 会话因鉴权失败直接报错13-24 关RAG 精准召回第 19 关促销政策文档更新后旧 chunk 未失效导致答案过期客户按错误优惠下单公司损失 27 万元25-36 关MCP 协同调度第 31 关订单 Agent 与物流 Agent 并发调用时共享 session 上下文错乱同一客户两次提问返回不同物流单号37-45 关Eval 闭环校准第 42 关人工标注样本未覆盖“方言否定句式”如“莫得优惠”导致拒答率虚高运营误判模型能力砍掉 40% 知识库预算46-48 关全链路韧性第 48 关LLM 服务临时抖动时自动降级至规则引擎兜底首次实现“零客诉”下的服务降级注意这个顺序不可逆。没有第 12 关的 Tool 稳定性第 19 关的 RAG 优化就是空中楼阁——因为 RAG 返回的答案最终要喂给 Tool 去执行若 Tool 本身不可信再准的答案也无意义。2.3 为什么 MCP 是分水岭从“单兵作战”到“作战室”MCPModel Control Protocol常被误解为“另一个 RPC 协议”但它在客服场景的核心价值是状态主权移交。传统方案中Agent 自己维护 session、管理上下文、决定何时调用哪个 ToolMCP 则把这套逻辑抽离成独立 control planeAgent 只需声明“我需要订单信息”control plane 自动路由给订单 Agent并注入当前会话 ID、用户画像、历史动作等上下文。我们踩过的最大坑是早期用 LangGraph 实现多 Agent 协作每个 Agent 都自己存一份session_state。当客户问“刚查的物流能顺便退这个单吗”物流 Agent 和订单 Agent 各自解析“这个单”因上下文隔离一个认为指最新订单一个认为指物流单号对应的订单结果退错单。引入 MCP 后control plane 统一注入context: {order_id: ORD20240521XXXX}所有 Agent 基于同一事实决策。注意MCP 不是银弹。我们实测发现当并发 800 QPS 时control plane 的 WebSocket 连接池成为瓶颈。解决方案不是加机器而是将高频固定路径如“查订单→查物流→查售后”编译为预置 workflow绕过 MCP 动态调度直连下游 Agent。这恰是“协议”与“实践”的典型张力——理论最优 vs 现实妥协。3. 核心模块深度拆解Tool、RAG、MCP、Eval 如何咬合3.1 Tool 模块不是“调用 API”而是“接管业务系统”客服 Tool 的本质是业务系统的语义代理层。它必须解决三个原始问题认证、参数映射、错误归因。认证层我们弃用通用 OAuth2采用“双因子令牌”机制。每个 Tool 注册时除标准 client_id/client_secret 外必须提供business_scope如crm:read_order, erp:update_inventory。当 Agent 请求调用“查订单”时control plane 不仅验证 Token 有效性还校验该 Token 是否包含crm:read_order权限。这避免了某次 CRM 接口升级后因权限粒度变粗导致 Agent 误删客户数据。参数映射层这是最耗时的模块。以“修改收货地址”为例用户输入“把收货地址改成北京市朝阳区建国路 1 号”LLM 输出结构化参数{province: 北京, city: 朝阳区, detail: 建国路 1 号}但 ERP 接口实际要求{area_code: 110105, address: 北京市朝阳区建国路 1 号}我们开发了ParamMapper中间件它接收 LLM 输出的 semi-structured JSON通过以下步骤转换地理编码补全调用高德地图 API将朝阳区→110105朝阳区行政区划码字段重命名根据 ERP 接口 Schema 映射表将provincecity→area_code格式标准化强制address字段拼接为“省市区详细地址”避免 ERP 因字段缺失拒绝请求。实操心得不要试图让 LLM 直接输出 ERP 要求的格式。LLM 的强项是理解语义弱项是记忆 200 个字段的命名规范。把“语义理解”和“格式适配”解耦前者交给 LLM后者交给确定性代码稳定性提升 5 倍。错误归因层当 Tool 调用失败传统做法是返回{error: 调用失败}。我们要求每个 Tool 必须返回结构化错误码{ code: ERP_404_ORDER_NOT_FOUND, message: 订单不存在请确认单号是否正确, suggestion: 请引导用户提供完整订单号或切换至人工服务 }这个suggestion字段由业务方预先配置Agent 收到后直接透传给用户而非让 LLM 二次解释。实测将“用户因错误提示不清而重复提问”的比例从 31% 降至 4.2%。3.2 RAG 模块知识不是“扔进向量库”而是“编织成网”客服 RAG 的最大陷阱是把知识库当成“搜索引擎替代品”。真实场景中用户问题往往跨多个知识域。例如“我用花呗付的订单能开发票吗”——这涉及支付渠道花呗、订单状态是否已付款、财务规则花呗支付是否支持开票三个知识源。我们构建了RAG Graph结构节点每个知识源是一个节点如payment_rules、invoice_policies、order_status_flow边节点间的关系是业务规则如payment_rules.funding_source huabei→invoice_policies.allow_invoice true检索不只检索单个文档而是启动图遍历。当用户问“花呗能开发票吗”RAG Engine 先定位payment_rules节点再沿边找到关联的invoice_policies节点合并两个节点的 chunk 进行重排。关键技术点动态 Chunking不按固定长度切分。对政策类文档按条款切分如h2发票开具规则/h2为一个 chunk对操作手册按步骤切分如“第一步登录后台”为一个 chunk。我们用 Llama-3-8B 微调了一个ChunkBoundaryDetectorF1 达 0.92。Hybrid Retrieval70% 流量用向量检索BGE-M330% 高频问题如“怎么退货”走关键词匹配Elasticsearch规避向量漂移。关键词库由运营每周更新确保“七天无理由”等新政策即时生效。Post-Retrieval Filtering检索出的 top-5 chunk必须通过PolicyValidator模块校验时效性。例如若 chunk 中含valid_until: 2024-03-31而当前日期已超期则自动过滤。注意RAG 的 hit rate 不是“检索到相关文档的比例”而是“检索到的文档中能直接回答用户问题的比例”。我们曾将 hit rate 从 78% 优化到 86%关键不是换 embedding 模型而是增加PolicyValidator后无效 chunk 减少 42%。3.3 MCP 模块协议落地的三道生死线MCP 协议本身很薄WebSocket JSON-RPC但落地时有三道必须跨过的坎第一道Session 上下文一致性MCP 要求所有 Agent 共享同一session_id但现实是CRM 系统有自己的 sessionERP 有自己的 session甚至前端 H5 页面也有自己的 session。我们的解法是Session Fusion在用户首次接入时control plane 生成全局global_session_id如GSID_20240521_XXXX向各业务系统发起bind_session请求传入global_session_id和系统专属auth_token各系统返回system_session_id如CRM_SID_XXXX,ERP_SID_XXXXcontrol plane 建立映射表后续所有 Tool 调用control plane 自动注入对应system_session_id。这避免了 Agent 自己管理多套 session也杜绝了因某系统 session 过期导致的连锁失败。第二道Action 可观测性MCP 要求每个 Action如getOrderDetails必须返回trace_id。但我们发现很多业务系统日志不打 trace_id导致问题无法定位。解决方案是Log Injection Middleware在 control plane 发起 HTTP 请求前自动注入X-Trace-ID: {trace_id}Header同时要求所有业务系统在日志中打印该 Header。当getOrderDetails超时我们能直接在 CRM 日志中搜索X-Trace-ID秒级定位是网络延迟还是数据库慢 SQL。第三道降级熔断策略MCP 的优雅在于可插拔但灾难在于单点故障。我们为每个 MCP endpoint 配置三级熔断L1毫秒级单次调用 800ms自动取消并返回缓存结果如“订单状态处理中”L2分钟级5 分钟内失败率 30%暂停该 endpoint流量切至备用 Agent如用规则引擎查订单L3小时级连续 1 小时不可用触发告警并自动生成 RCA 报告Root Cause Analysis包括最近一次变更、依赖服务状态、错误日志摘要。这套机制让我们在去年双十一大促期间成功扛住 ERP 接口 37 分钟不可用客户无感知。3.4 Eval 模块不是“测准确率”而是“建信任契约”客服 Eval 的核心矛盾是技术指标如 F1与业务体验如客户满意度长期脱钩。我们曾用 95% F1 的模型上线NPS 却下降 12 点。复盘发现模型在“查订单”任务上 F1 极高但在“解释为什么不能退货”这类开放问答上因过度自信生成错误政策解读导致客户投诉。因此我们构建了四维 Eval 体系维度评估方式数据来源业务意义Correctness正确性人工标注 500 条样本判断答案是否符合政策运营团队每周抽样防止法律风险Helpfulness帮助性计算用户后续动作是否追问、是否转人工、是否结束会话会话日志分析衡量真实体验Efficiency效率首轮响应时间、总轮次、Tool 调用次数系统埋点控制成本Robustness鲁棒性注入噪声测试方言、错别字、多轮指代如“它”、“这个”自动生成对抗样本保障长尾场景关键创新是Eval-as-a-Service所有 Agent 输出必须经 Eval Service 校验后才返回给用户。例如当 Agent 输出“可以退货”Eval Service 会检查是否调用了checkReturnEligibilityTool校验 Tool 返回的can_return: true若未调用或返回 false则拦截并触发 fallback如“我帮您转接人工坐席”。这使“模型幻觉”导致的错误回答归零。实操心得Eval 不是上线后的质检而是上线前的准入门槛。我们规定任何新知识库、新 Tool、新 Prompt必须通过四维 Eval 的 baselineCorrectness ≥ 92%, Helpfulness ≥ 85%, Efficiency ≤ 1.1s, Robustness ≥ 78%才能发布。这倒逼团队在开发初期就考虑可测性。4. 实操全流程从零搭建一个可上线的客服 Agent4.1 环境准备与工具链选型我们放弃“All-in-One 框架”选择乐高式组合原因很简单每个模块的迭代节奏不同。RAG 每周更新知识Tool 每月对接新系统MCP 协议每年升级强行绑定会导致牵一发而动全身。核心组件清单Agent RuntimeLangGraph非 LangChain因其原生支持 stateful graph便于 MCP 集成LLM 接口层自研LLMRouter支持 OpenAI/Gemini/Ollama 多后端按 cost/perf 动态路由RAG 引擎Qdrant向量库 Elasticsearch关键词库 自研 GraphRAG OrchestratorMCP Control Plane基于 FastAPI WebSocket 实现协议兼容 mcp-server-python Eval ServicePytest 自定义插件支持批量跑 eval case 并生成可视化报告。注意不要迷信“最新框架”。我们测试过 CrewAI其内置的Task状态管理与 MCP 的session冲突调试三天无解。LangGraph 虽学习曲线陡但其StateGraph的add_edge方法能精准控制 MCP 的action触发时机这才是刚需。4.2 第一关Tool 开发实录以“查订单”为例Step 1定义 Tool Schema不写代码先写 OpenAPI SpecYAMLopenapi: 3.0.0 info: title: OrderQueryTool version: 1.0.0 paths: /v1/orders/{order_id}: get: parameters: - name: order_id in: path required: true schema: type: string pattern: ^ORD\\d{12}$ # 强制订单号格式 responses: 200: content: application/json: schema: type: object properties: order_id: type: string status: type: string enum: [created, paid, shipped, delivered, cancelled] payment_method: type: string enum: [alipay, wechat, huabei, bank_transfer]Step 2生成 SDK 并注入 MCP用openapi-generator生成 Python SDK再封装为 MCP Toolfrom mcp.server.stdio import stdio_server from mcp.types import ToolResult, TextContent class OrderQueryTool: def __init__(self, crm_client): self.crm_client crm_client async def query_order(self, order_id: str) - ToolResult: # Step 1: 校验订单号格式来自 OpenAPI Spec if not re.match(r^ORD\d{12}$, order_id): return ToolResult(content[TextContent(text订单号格式错误请输入12位数字的订单号)]) # Step 2: 调用 CRM自动注入 session_id try: resp await self.crm_client.get_order(order_idorder_id) return ToolResult(content[TextContent(textf订单 {order_id} 状态{resp.status}支付方式{resp.payment_method})]) except CRMError as e: return ToolResult(content[TextContent(textf查询失败{e.message})])Step 3注册到 MCP Server# mcp_server.py from mcp.server.models import ToolRequest, ToolResult from order_tool import OrderQueryTool tool OrderQueryTool(crm_client) std_server.tool(query_order) async def query_order(tool_request: ToolRequest) - ToolResult: order_id tool_request.arguments[order_id] return await tool.query_order(order_id)关键细节pattern校验在 Tool 层完成避免无效请求打到 CRM错误消息e.message直接透传不经过 LLM 二次加工所有ToolResult必须是TextContent禁止返回 raw JSON确保 Agent 解析稳定。4.3 第十九关RAG 知识库构建以“促销政策”为例Step 1知识源清洗促销政策文档常含大量 HTML 表格、PDF 图片。我们不用通用 PDF 解析器而是针对业务定制对 HTML用 BeautifulSoup 提取table转为 Markdown 表格对 PDF用pdfplumber提取文本再用正则匹配“满[0-9]减[0-9]”等模式生成结构化 JSON{ activity_id: PROMO_2024_Q2, name: 夏季大促, rules: [ {condition: 满300减50, scope: [手机, 电脑], period: 2024-05-01~2024-06-30}, {condition: 满500减100, scope: [全部商品], period: 2024-05-01~2024-06-30} ] }Step 2Graph 构建用 Neo4j 存储知识关系// 创建节点 CREATE (p:Promotion {id: PROMO_2024_Q2, name: 夏季大促}) CREATE (i:ItemCategory {name: 手机}) CREATE (r:Rule {condition: 满300减50}) // 创建关系 CREATE (p)-[:HAS_RULE]-(r) CREATE (r)-[:APPLIES_TO]-(i)Step 3检索增强用户问“买手机有啥优惠”RAG Engine 执行语义检索在 Promotion 节点中找name包含“手机”的图遍历从匹配的 Promotion 节点沿HAS_RULE→APPLIES_TO找到所有适用规则重排按period新旧排序优先返回有效期内的规则。提示不要把所有知识塞进一个向量库。促销政策、退货规则、物流说明应分库存储、分图构建。混合会导致检索噪音我们实测分库后 recall 提升 22%。4.4 第三十一关MCP 协同调度订单 物流 Agent架构图文字描述User → [Control Plane] ├─→ OrderAgent (处理 /orders/{id}) └─→ LogisticsAgent (处理 /logistics/{tracking_id}) OrderAgent 与 LogisticsAgent 之间无直接通信所有数据经 Control Plane 中转。关键代码Control Plane# 当收到 查订单 请求 async def handle_order_query(session_id: str, order_id: str): # Step 1: 获取订单详情 order_resp await call_mcp_tool(order_query, {order_id: order_id}) # Step 2: 若订单状态为 shipped/delivered自动触发物流查询 if order_resp.status in [shipped, delivered]: tracking_id extract_tracking_id(order_resp) # 从订单详情中提取单号 logistics_resp await call_mcp_tool(logistics_query, {tracking_id: tracking_id}) # Step 3: 合并结果注入统一 context return { session_id: session_id, order: order_resp, logistics: logistics_resp, context: {user_intent: track_order, order_id: order_id} }避坑指南绝不共享内存OrderAgent 和 LogisticsAgent 是独立进程context 通过 JSON 序列化传递超时必须分级Order 查询设 1.2s 超时Logistics 查询设 2.5s因第三方接口更慢避免一个慢拖垮全部错误隔离若 Logistics 查询失败不影响 Order 信息返回只标记logistics_status: unavailable。4.5 第四十二关Eval 校验流水线Step 1构建 Eval Dataset从真实会话日志中抽取 5000 条样本按四维标签correctness_label: 0/1运营标注helpfulness_score: 1-5 分用户点击“有用/无用”按钮efficiency_ms: 系统埋点robustness_flag: 是否含方言/错别字用规则匹配Step 2自动化 Eval Pipeline# 每日凌晨执行 python eval_runner.py \ --model-version latest \ --dataset-path data/eval_v2.jsonl \ --output-report reports/eval_20240521.html \ --thresholds correctness0.92,helpfulness0.85,efficiency1100,robustness0.78Step 3阻断式发布CI/CD 流程中加入 Eval Gate# .gitlab-ci.yml eval_gate: stage: test script: - python eval_runner.py --model-version $CI_COMMIT_TAG --fail-on-threshold-breach allow_failure: false若任一维度不达标发布流程终止。实操心得Eval 报告不是给技术看的是给业务方看的。我们把报告首页做成“业务语言”“Correctness 92.3% → 每 100 个回答约 8 个可能出错主要集中在‘跨境订单关税’场景”“Helpfulness 86.1% → 用户 86% 的会话在 2 轮内结束优于人工坐席的 79%”。这让业务方真正理解指标含义而非纠结数字。5. 常见问题与实战排查技巧5.1 Tool 类问题为什么调用总是超时现象query_orderTool 在 30% 的请求中返回TimeoutError但手动 curl 同一接口秒回。排查路径检查连接池确认crm_client使用aiohttp连接池且limit≥ 100默认 100 太小检查 DNS 缓存CRM 域名解析慢加resolveraiohttp.AsyncResolver()并设ttl_dns_cache300检查 TLS 握手CRM 服务器 TLS 版本老旧强制ssl_contextssl.create_default_context(purposessl.Purpose.SERVER_AUTH)终极手段在 Tool 内部加time.time()打点发现 90% 超时发生在await response.json()而非await session.get()—— 原因是 CRM 返回了 2MB 的冗余日志字段。解决方案在response.json()前用response.content.read(1024*1024)截断。提示超时问题 80% 出在客户端配置而非网络。永远先查aiohttp/httpx的连接池和 SSL 设置。5.2 RAG 类问题为什么检索不到明明存在的知识现象知识库中有“花呗支付不支持开具增值税专用发票”但用户问“花呗能开专票吗”RAG 返回空。排查路径检查 embedding 模型BGE-M3 对中文金融术语表现一般换用bge-zh-v1.5专为中文优化检查 chunk 粒度原 chunk 是整段政策改为按“问题-答案”切分如{question: 花呗支付能否开具增值税专用发票, answer: 不支持}检查 query rewrite用户问“花呗能开专票吗”LLM 重写为花呗 支付 专票丢失“增值税”关键词。加规则金融类问题强制追加增值税、普通发票、专用发票等术语。独家技巧我们开发了RAG Debugger工具输入用户问题实时显示Query rewrite 后的文本检索到的 top-3 chunk 及相似度最终重排后的答案。这比看日志快 10 倍。5.3 MCP 类问题为什么两个 Agent 返回冲突结果现象用户问“订单 123 的物流”OrderAgent 返回status: shippedLogisticsAgent 返回status: pending。根因分析OrderAgent 调用的是 CRM物流状态更新有 5 分钟延迟LogisticsAgent 调用的是快递公司 API实时但偶有缓存。解决方案数据源可信度分级CRM 状态权重 0.7快递 API 权重 0.3引入时间戳仲裁比较两个状态的时间戳取更新的那个业务兜底规则若冲突返回“CRM 系统显示已发货物流系统正在更新中预计 2 小时内同步”。注意MCP 不解决数据一致性它只暴露不一致性。真正的解法是业务规则而非协议。5.4 Eval 类问题为什么人工标注和自动评估结果差异大现象Eval Service 判定“答案正确”但运营标注为“错误”。案例还原用户问“上个月的订单能开发票吗”Agent 返回“可以登录订单中心申请即可。”Eval Service 检查调用了getInvoiceEligibilityTool返回can_issue: true→ 判定正确。运营标注错误因政策规定“仅支持开票近 90 天内订单”上个月已超期。根因Tool 返回的can_issue: true是基于订单创建时间但未校验“是否在 90 天内”。修复在getInvoiceEligibilityTool 内部增加时间校验逻辑在 Eval Service 中增加policy_compliance_check步骤调用 Policy Engine 校验答案是否符合最新政策。实操心得Eval 的最大价值是暴露“你以为的正确”和“业务真实的正确”之间的鸿沟。每次差异都是业务规则沉淀的机会。6. 最后一关第 48 关的启示——当 LLM 抖动时系统如何呼吸第 48 关不是技术难题而是哲学考验一个高度依赖 LLM 的系统如何在 LLM 失效时依然保持基本服务能力我们的答案是三级降级体系Level 1LLM 降级毫秒级当 LLM API 返回503 Service Unavailable或响应 2s自动切换至LLM-Fallback一个轻量级 T5 模型仅做意图分类和槽位填充不生成自然语言。例如用户说“我要退货”直接输出 {intent: return_order, slots: {order_id: ORD2024