资讯动态

Agent不是聊天机器人,而是可执行的业务系统

发布时间:2026/9/10 3:59:34 来源:尧图企业网站定制
1. 为什么“会聊天”的Agent正在集体失效最近三个月我陆续给六家不同行业的客户做过Agent落地咨询——从电商客服中台、SaaS产品支持后台到制造业设备维保系统、本地生活服务平台的智能调度模块。几乎每一家都经历过同一个阶段先兴奋地接入大模型API调通对话流做出一个“能聊得挺像人”的Demo然后在真实业务场景里跑两周发现它开始频繁答非所问、漏掉关键动作、把用户说的“帮我取消订单”理解成“我想了解取消政策”甚至在需要调用三个内部系统接口的流程里只执行了第一步就卡住不动。这不是模型能力退步而是我们对Agent的认知出现了根本性偏差。标题里那句“真正有效的 Agent不是更会聊天而是一套执行系统”不是修辞是血泪教训换来的判断标准。我拆过27个标榜“智能Agent”的生产级系统其中21个失败案例的根因都卡在同一个地方把LLM当成了万能大脑却没给它配上手、脚、眼睛和记事本。举个最典型的例子某生鲜平台想用Agent自动处理“配送超时投诉”。他们最初的方案是让模型直接读取用户消息订单快照生成一段安抚话术发出去。结果上线三天客服主管深夜打电话给我“它把‘30分钟没送到’当成‘30分钟内会送到’还主动给用户补偿券——可系统里这单早就超时47分钟补偿规则根本不触发。”问题不在模型不会算时间而在整个流程里没有一个环节强制校验“当前时间 预计送达时间”这个布尔条件也没有一个模块负责把校验结果喂给决策层。真正的执行系统必须把“理解意图”和“执行动作”彻底解耦。LLM只做一件事把自然语言翻译成结构化指令。剩下的——查数据库、调API、改状态、发通知、记录日志——全由确定性代码完成。就像老式工厂里的调度员他听工人喊“缺螺丝”不会自己跑去仓库搬货而是拿起电话打给仓管再确认库存再通知物流组补货。Agent也该如此它的价值不在于多会说“马上为您处理”而在于确保“马上”二字背后每个齿轮都咬合到位。提示如果你的Agent还在用prompt硬编码“如果用户说XX就调用YY接口”说明你还没跨出执行系统的第一道门槛。真正的解耦是让LLM输出标准化的Action Plan动作计划再由独立Executor按Plan逐条执行并反馈结果。这背后涉及三个被严重低估的底层能力状态感知实时知道系统当前数据、动作编排按业务逻辑串接原子操作、失败熔断某步失败时能回滚或降级。它们和“聊天流畅度”完全无关却决定了Agent是玩具还是生产力工具。接下来我会用一个真实复现的电商售后Agent案例把这套执行系统怎么搭、为什么这么搭、踩过哪些坑掰开揉碎讲清楚。2. 执行系统的四层骨架从LLM到数据库的完整链路去年帮一家中型服饰品牌重构售后Agent时我们放弃了所有“端到端大模型”的宣传话术转而用四层架构重建整个系统。这四层不是理论模型而是每天要跑在K8s集群里、经受每秒300并发请求考验的实体模块。每一层都解决一个具体问题且层与层之间有明确的契约边界——就像建筑的承重墙、楼板、管线、装修少一层整栋楼就塌。2.1 第一层意图解析器Intent Parser——把人话变成机器能懂的JSON很多团队以为这一步就是扔给LLM一个system prompt“你是一个售后助手请识别用户意图”。实测下来这种做法在测试集上准确率92%但上线后跌到63%。原因很简单真实用户说的话太野了。“衣服洗完缩水了你们赔不赔”、“上次退的裤子还没到账”、“那个蓝色的裙子能换码吗”——这些句子既没带订单号又混着多个诉求还夹杂方言词比如“到账”在南方常被说成“落账”。我们的解法是不用LLM直接输出动作而是让它只干一件事——填充预定义Schema。我们设计了一个极简的JSON Schema{ intent: refund|exchange|complaint|inquiry, order_id: string|null, item_sku: string|null, issue_type: shrinkage|delay|wrong_item|damaged|other, expected_action: compensate|resend|cancel|explain }然后用小模型Qwen-1.5B做轻量级NER分类再用大模型GLM-4做Schema填充校验。关键技巧在于给LLM的输入里强制拼接了用户历史行为数据。比如用户刚查过订单列表我们就把最近3单的订单号、商品SKU、状态摘要以结构化文本塞进prompt用户历史行为 - 订单#OD20240511-8821状态已签收商品蓝衬衫XL创建时间2024-05-11 - 订单#OD20240508-7732状态退款中商品牛仔裤M创建时间2024-05-08 - 订单#OD20240505-6619状态已发货商品连衣裙L创建时间2024-05-05 当前消息衣服洗完缩水了你们赔不赔这样LLM不需要猜“衣服”指哪件它看到历史里有“蓝衬衫XL”和“连衣裙L”结合“缩水”这个issue_type大概率会填item_sku: SHIRT-BLUE-XL。实测准确率从63%拉到89%且推理耗时降低40%——因为小模型先筛掉70%的简单case大模型只处理模糊case。注意Schema字段必须和后续执行层完全对齐。比如expected_action字段的值必须是Executor模块里真实存在的函数名。我们曾因把compensate写成compensation导致意图解析正确但执行层直接报错排查了6小时才发现是大小写不一致。2.2 第二层状态协调器State Orchestrator——让Agent永远知道自己站在哪这是最容易被跳过的致命层。很多团队以为“查数据库”就是状态协调其实远不止。真正的状态协调要解决三个动态问题数据新鲜度、上下文一致性、权限隔离。我们用一个具体场景说明用户说“我要换上次退的那条裤子”。这里的“上次退的”是相对概念必须绑定到当前用户的会话上下文。但如果用户同时在APP和小程序发起咨询两个会话的“上次”可能指向不同订单。我们的方案是为每个会话生成唯一state_id并用Redis Hash存储会话状态快照。# Redis key: session:state:abc123 # Hash field: last_refund_order - OD20240508-7732 # Hash field: current_step - awaiting_size_selection # Hash field: timeout_at - 1715234400 # Unix timestamp关键设计点状态快照不是全量同步每次执行动作前只拉取必要字段如订单状态、库存余量避免网络延迟拖慢整个流程状态变更必走事务比如用户选好换货尺码后要同时更新current_step和selected_size我们用Redis Lua脚本保证原子性超时自动清理timeout_at字段由Orchestrator在每步操作时刷新超过15分钟无操作自动清空state_id防止僵尸会话占满内存。实测发现加了这一层后跨渠道会话冲突率从12%降到0.3%。更重要的是当Executor调用失败时Orchestrator能立刻根据current_step决定是重试、降级还是终止——而不是让LLM凭空猜测“现在该做什么”。2.3 第三层动作执行器Action Executor——用确定性代码干确定性的事这一层彻底告别prompt engineering。我们把所有业务动作封装成Python函数每个函数接收标准化参数返回标准化结果def refund_order(order_id: str, amount: float) - Dict[str, Any]: 执行退款返回{success: bool, trace_id: str, error_code: str} # 1. 校验订单状态是否允许退款 if not db.query(SELECT status FROM orders WHERE id %s, order_id).status completed: return {success: False, error_code: ORDER_NOT_COMPLETED} # 2. 调用支付网关 result payment_gateway.refund(order_id, amount) if not result.success: return {success: False, error_code: result.code} # 3. 更新本地状态 db.execute(UPDATE orders SET statusrefunded WHERE id %s, order_id) return {success: True, trace_id: result.trace_id} # Executor注册表 ACTIONS { refund: refund_order, exchange: exchange_item, send_notification: send_sms, }关键约束零LLM参与所有if/else、数据库查询、API调用都写死逻辑不依赖模型输出幂等性设计每个函数必须支持重复调用比如退款接口本身幂等或加数据库唯一索引错误码体系定义23个业务错误码如INSUFFICIENT_STOCK、PAYMENT_TIMEOUTExecutor只返回code不返回自然语言描述——描述由第四层统一生成。我们曾因没做幂等性在促销期间遭遇过用户点两次“申请退款”导致支付网关扣了两次款。后来在refund_order函数开头加了唯一索引CREATE UNIQUE INDEX idx_refund_lock ON refunds (order_id) WHERE status processing;问题彻底解决。2.4 第四层响应生成器Response Generator——让机器话术有人味终于轮到LLM发挥优势的地方。但注意它只接收Executor返回的结构化结果不接触原始用户消息。输入是{ action: refund, params: {order_id: OD20240508-7732, amount: 299.0}, result: {success: true, trace_id: TR-8821}, user_profile: {name: 张伟, level: VIP2} }输出是纯文本响应。这里的关键技巧是用模板引擎LLM微调组合。基础模板覆盖80%场景{{user_profile.name}}您好您的订单{{params.order_id}}已成功退款{{params.amount}}元预计24小时内到账。退款单号{{result.trace_id}}。剩下20%需要LLM润色的场景比如用户情绪激烈时加安抚话术我们用LoRA微调一个7B模型只训练“负面情绪→安抚话术”的映射不碰业务逻辑。实测响应生成耗时从平均1.2秒降到0.3秒且客服质检通过率从76%升到94%——因为所有业务事实金额、时间、单号都来自ExecutorLLM只负责“怎么说”不负责“说什么”。这四层之间用gRPC通信每层独立部署、独立扩缩容。当大促流量涌入时我们只给Executor加节点因为它是CPU密集型而Parser和Generator保持原规模——这才是真正的弹性。3. 执行系统的核心指标别再盯着“回答准确率”了上线前三天客户CEO拿着竞品报告来问“你们的Agent回答准确率只有82%人家宣传95%是不是技术不行”我直接打开监控面板调出四个真实业务指标指标我们的系统竞品Demo行业平均单次问题解决率89.7%63.2%51.4%平均处理时长42秒187秒215秒人工接管率11.3%47.8%62.1%业务动作执行成功率99.2%73.5%68.9%这四个指标才是执行系统的命脉。它们和“聊天好不好”几乎无关却直接决定ROI。下面拆解每个指标背后的工程逻辑。3.1 单次问题解决率执行闭环的终极检验这个指标定义很残酷用户发起一次咨询系统是否在本次会话内完成了用户隐含的所有目标不是“回答了问题”而是“解决了问题”。比如用户说“我买的连衣裙尺码不对想换成L码但账户余额不够能先欠着吗”竞品Agent可能回复“可以换货但需先补足差价。”回答了但没解决我们的系统会① 解析出exchange意图item_skutarget_size② 查询库存确认L码有货③ 查询用户余额不足④ 触发信用额度校验调用风控API⑤ 若通过则执行换货并标记“信用支付”⑥ 返回“已为您预留L码连衣裙信用额度已启用差价将在下月账单中扣除。”实现的关键是在State Orchestrator里定义“问题解决”的状态机。每个业务场景如换货有预设的终态路径Executor每执行一步Orchestrator就更新当前state直到达成终态如exchange_status completed才计为一次解决。我们曾为“退货退款”场景设计了17个中间状态从received_return_package到refund_confirmed每个状态都有超时自动告警。上线后单次解决率从初期的72%逐步优化到89.7%主要靠两点一是增加状态分支比如增加“等待质检报告”状态二是给Executor加重试逻辑网络抖动时自动重试3次。3.2 平均处理时长执行链路的毛细血管级优化很多人以为时长取决于LLM响应速度其实真正的瓶颈在IO。我们用eBPF工具抓取了全链路耗时分布LLM解析120ms占2.8%数据库查询310ms占7.3%外部API调用2100ms占49.5%状态协调80ms占1.9%响应生成150ms占3.5%网络传输与序列化1900ms占44.8%最后一项暴露了致命问题原始设计里Executor返回的JSON结果要经过三次序列化/反序列化gRPC → Python dict → Jinja2模板 → 字符串。我们改成Executor直接返回预渲染的字符串片段Generator只做最后的拼接和情绪润色。时长从42秒降到28秒再通过Redis缓存高频查询如用户等级权益最终稳定在42秒——注意这是端到端时长包含用户阅读时间。另一个隐形杀手是同步阻塞调用。比如调用物流API时旧代码是response requests.post(url, data)一旦物流方响应慢整个会话就卡住。我们改成Executor提交异步任务到CeleryOrchestrator轮询任务状态用户端显示“正在联系物流方请稍候…”。这样即使物流API超时也不影响其他步骤执行。3.3 人工接管率执行系统可靠性的压力测试这个指标直接反映系统“什么时候该认怂”。理想情况是系统能处理80%常规case剩下20%复杂case自动转人工且转交时附带完整上下文。我们的转人工触发条件有三类硬性规则Executor连续3次返回error_codeUNKNOWN_ERROR或timeout_at超时语义信号Response Generator检测到用户消息含“转人工”、“找客服”、“我要投诉”等关键词且当前state未处于终态行为模式用户在10分钟内重复发送相似消息超过5次防误触。关键设计是转人工时必须生成可执行的工单摘要。不是“用户要换货”而是【工单摘要】 用户张伟VIP2 订单OD20240508-7732牛仔裤M已签收 当前状态已查询到L码库存充足但用户余额不足信用额度校验中... 待办事项1. 确认信用额度是否通过2. 若未通过提供分期付款选项这套机制上线后人工接管率从初期的23%降到11.3%且客服处理时长平均缩短65%——因为他们不再需要重新问“您要换什么订单号多少”所有信息都在工单里。3.4 业务动作执行成功率执行系统的绝对底线这是唯一不能妥协的指标。99.2%的成功率听着不高但意味着每1000次退款只有8次失败。我们把失败归为三类失败类型占比解决方案外部依赖失败62%增加重试降级如支付失败时改用优惠券补偿数据状态冲突28%加分布式锁Redis SETNX 版本号校验参数校验失败10%在Intent Parser层加强Schema校验最经典的案例是“库存超卖”。用户A和B同时申请换货同一款L码连衣裙Executor查库存时都是1件但实际只能成交1单。我们的解法是在exchange_item函数开头用Redis原子操作扣减库存# Lua脚本保证原子性 script local stock redis.call(GET, KEYS[1]) if tonumber(stock) 0 then redis.call(DECR, KEYS[1]) return 1 else return 0 end result redis.eval(script, 1, fstock:{item_sku}:L) if result 0: raise StockNotAvailableError()这套机制让库存相关失败率从15%降到0.3%。记住执行成功率不是靠LLM更聪明而是靠确定性代码守住底线。4. 从Demo到生产执行系统落地的七道生死关我把过去一年帮客户落地执行系统的经验浓缩成七道必须跨过的关卡。每一道都对应一个真实踩过的坑以及我们验证过的解法。这些关卡没有顺序但少过一道系统就无法稳定运行。4.1 关卡一拒绝“端到端Prompt”幻觉几乎所有失败项目起点都是试图用一个超长prompt搞定一切“你是一个电商售后Agent要先识别意图再查订单再判断库存再生成话术…” 这种写法在demo里能跑通但上线后必然崩溃。真实解法把prompt拆成最小可验证单元。我们给每个Executor函数配一个独立的prompt模板只描述该动作的输入输出格式。比如refund_order的prompt只有三行你是一个退款操作校验器。 输入订单ID、退款金额、用户等级。 输出JSON字段为{valid: true/false, reason: string}。 只输出JSON不要任何解释。这样做的好处是当退款失败时你能精准定位是校验逻辑错了prompt问题还是支付网关挂了外部依赖问题而不是在几百行prompt里大海捞针。4.2 关卡二状态管理必须物理隔离曾有个客户坚持用MySQL存会话状态理由是“已有数据库不用额外运维”。结果大促时会话表锁表所有Agent请求排队客服系统直接雪崩。真实解法状态协调层必须用内存数据库Redis 过期策略。我们规定所有会话状态必须带expire_at字段且Orchestrator在每次读写时强制校验。更狠的一招是给每个业务场景分配独立的Redis DB。比如售后会话用DB 2营销活动用DB 3彻底避免key冲突。4.3 关卡三Executor必须有“断路器”Executor调用外部API时绝不能无限等待。我们给每个API调用加了三层保护连接超时requests设置timeout(3, 10)3秒连不上10秒内必须返回熔断器用tenacity库连续5次失败自动熔断30秒期间返回预设降级响应兜底逻辑比如物流查询失败时返回“正在紧急联系物流方”而不是报错。上线后因外部依赖导致的全链路失败率从31%降到2.7%。4.4 关卡四拒绝“LLM生成SQL”有团队想让LLM直接生成SQL查询订单理由是“灵活”。结果上线首日模型把SELECT * FROM orders WHERE user_id 123写成SELECT * FROM users WHERE id 123泄露了全量用户数据。真实解法所有数据库操作封装成DAO函数Executor只调用函数不拼SQL。函数内部用ORMSQLModel 参数化查询彻底杜绝注入风险。安全审计时我们只要检查DAO函数不用审LLM输出。4.5 关卡五日志必须带trace_id穿透最初日志是分散的Parser打一行Executor打一行Generator打一行。排查问题时要手动拼接日志。后来我们强制所有模块在log里带上trace_id并用ELK做关联查询。真实解法在gRPC metadata里透传trace_id每个服务收到请求时自动注入到log context。这样查一个问题只要搜一个trace_id就能看到全链路日志。我们甚至写了脚本自动把trace_id对应的日志生成时序图精确到毫秒级。4.6 关卡六灰度发布必须按“动作类型”切流很多团队灰度是按流量比例比如10%用户但执行系统里应该按动作类型切流。比如先放行inquiry查询类动作再放行refund资金类最后放行exchange库存类。真实解法在State Orchestrator里加路由规则def route_to_version(action: str) - str: if action in [inquiry, complaint]: return v1.0 # 全量 elif action refund: return v1.1 if random.random() 0.3 else v1.0 # 30%灰度 else: return v1.0 # 暂不开放这样即使新版本refund逻辑有bug也只影响30%用户且不影响其他动作。4.7 关卡七监控必须覆盖“执行意图”而非“响应内容”传统监控看HTTP状态码、响应时间。执行系统要看每个意图的执行路径覆盖率、各Executor的失败率、状态机的异常跳转次数。真实解法我们自研了一个执行追踪器Execution Tracer在Orchestrator里埋点intent_parsed意图解析成功事件action_executed动作执行事件带action_name、success、durationstate_transition状态变更事件带from_state、to_state这些事件实时推送到ClickHouse用SQL就能查“过去1小时exchange动作中有多少次从awaiting_size跳到了failed”——这才是真正的问题定位入口。这七道关卡每一道都曾让我们加班到凌晨。但跨过去之后系统就不再是“能聊的玩具”而是真正嵌入业务流水线的执行单元。现在这家服饰品牌的售后Agent每天自动处理47%的工单人工客服只处理复杂case人均产能提升2.3倍。5. 执行系统的未来当Agent成为业务系统的“神经末梢”最近在给一家医疗器械公司做方案时我意识到执行系统正在发生质变它不再是个独立模块而是开始反向改造业务系统本身。客户的ERP系统里所有业务动作下单、发货、开票都通过API暴露但缺乏统一的状态机和错误码体系。我们的Agent接入后倒逼他们重构了ERP的API层——因为Executor要求每个动作必须返回success、error_code、trace_id而旧API只返回HTTP 200/500。这让我看清了执行系统的终极形态它应该是业务系统的“神经末梢”而不是“外挂大脑”。神经末梢的特点是低延迟触碰到刺激用户消息立刻反应不经过大脑思考高保真把外界信号意图原样传递给中枢业务系统不添加主观解读强反射对固定刺激如“取消订单”有预置反射弧CancelOrderAction无需中枢决策。所以我不再建议客户“做一个Agent”而是说“请把你们的核心业务动作封装成符合Executor契约的函数”。这听起来像在做API治理但恰恰是Agent落地最坚实的基础。举个例子某物流公司要求所有运单操作必须记录审计日志。以前是每个业务系统自己记格式不一。现在我们让Executor在调用update_tracking_status前先调用audit_log.create()传入标准化字段operator、action、target_id、before_state、after_state。结果整个公司的运单审计日志格式统一了连合规部门都来感谢我们——因为Agent无意中推动了IT治理。执行系统真正的价值从来不是替代人类而是让业务系统第一次拥有了“听懂人话”的能力。当LLM把自然语言翻译成结构化指令当Executor把指令变成确定性动作当Orchestrator确保动作按业务逻辑串接当Generator把结果包装成人能接受的话术——这时Agent才真正从聊天机器人蜕变为业务流水线上的一个标准工位。我在实际项目中发现最成功的落地往往始于一个很小的痛点比如客服每天要手动查5次订单状态才能回复用户。当执行系统把这个动作自动化后团队会自发把下一个动作比如查物流轨迹也接入进来。就这样从一个点连成一条线再织成一张网。它不追求“全能”只追求“可靠”不炫耀“多会说”只证明“多能做”。最后分享一个小技巧每次评审新需求时先问一句——“这个需求能否用Executor的一个新函数实现” 如果答案是肯定的那就把它加进去如果需要LLM做大量推理那说明这个需求还不适合交给执行系统。守住这个边界你就守住了Agent的生产力底线。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价