不仅看语义,更看可执行性:Wix确定性门控拦截59%无效技能,上下文缩减90%

Don't Offer What Can't Be Done: Deterministic Executability Gating for LLM Skill Selection at Scale

论文原文 ↗ 论文发布 解读发布 解读:AI前沿分享

在大模型驱动的智能客服与任务型 Agent 系统中,技能选择(Skill Selection / Tool Routing)一直遵循着某种约定俗成的设计范式:先通过向量召回或语义分类器,根据用户的输入匹配出一批语义相关的候选技能,再把这些技能的名称、描述与参数模式塞进 Prompt,交由大语言模型做最后的函数调用(Function Calling)决策。随着系统能力库的不断扩充,这种单纯依赖语义相关性的方案正面临严峻的工程瓶颈。

ArXiv URL:https://arxiv.org/abs/2608.01050

语义匹配只能回答“用户的话题和这个功能像不像”,却无法回答“在这个用户的账户状态下,该功能到底能不能跑”。

以知名建站平台 Wix 的智能客服助手 Helpmate 为例,当三位不同的用户同时向机器人发送“我想绑定一个域名”时,从语义角度看,他们都强相关于 connect_domain 这个技能。然而在真实的业务上下文中,第一位用户可能早就绑定了域名,第二位用户使用的是免费版套餐、根本没有购买独立域名的增值权限,而第三位用户可能只是网站的协作者而非所有者。如果系统仅仅因为语义命中就把该技能推给大模型,模型一旦决定调用,下游业务接口就会因为前置检查未通过而直接中断退出。这种非必要暴露不仅让大模型浪费了大量推理上下文,还会把用户引向死胡同,甚至引发混淆代理人(Confused Deputy)等越权风险。

Wix 团队在其线上生产环境提出并部署了一套三阶段技能选择流水线,引入了确定性可执行性门控(Deterministic Executability Gating)机制。在一项涵盖 75.6 万条线上真实用户消息、26.7 万场对话的离线与在线分析中,该系统在语义召回之后,通过确定性门控再次剔除了 59.4% 的无效候选技能,节省了 59.1% 的技能描述 Token;相较于将领域技能无差别暴露给所有消息的基线,整体上下文开销缩减了 90.5%。更关键的反事实回放显示,一旦撤下这道门控,大模型在 7.8% 的风险场景下会直接选中根本无法执行的“死路”技能。

三阶段技能选择流水线架构

为什么大模型不该为业务先决条件买单?

让大语言模型自己去理解并遵守业务状态约束,在理论上看似可行,在工业级落地中却极为脆弱。常见朴素做法是在系统 Prompt 中写明各种限制:“如果用户不是站点管理员,请勿调用此工具”或者“如果用户未升级套餐,请提示升级”。

这种设计将严格确定的业务硬性约束,降级为了概率性模型的注意力博弈。业务先决条件被迫在同一个上下文窗口内,与用户多轮对话历史、口语化意图、模型自身的先验偏好共同竞争注意力。当提示词变得冗长或者用户表达具有诱导性时,大模型极易忽略这些前置规则。特别是在多租户或多权限的企业级 SaaS 系统中,低权限协作者如果通过提示注入或模糊诱导触发了高权限工具的调用流程,单纯依靠模型的软性约束,极易引发严重的状态篡改风险。

退一步讲,即便大模型在被调用后因下游 API 报错而被迫触发降级、向用户回复错误信息,这种“先调用、再撞墙、后报错”的链路也极大地损害了交互体验。一个合理的交互逻辑应当是:如果某项能力在当前状态下无论如何都不可能成功执行,系统一开始就不应该把它作为可选项摆在模型面前,更不应该在对话中给用户造成能够直接代办的虚假预期。

经典的符号规划系统早有共识:动作的可用性永远取决于先决条件(Preconditions)。Wix 团队的核心设计思想正在于此——将业务状态的可执行性检查从概率性的大模型决策中剥离,提升为基础设施层的确定性阶段

三阶段技能选择流水线的工程拆解

Helpmate 将原本混合在单次决策中的流程,清晰划分为召回、门控与推理三个阶段。

第一阶段是面向高召回的语义匹配器(Semantic Matcher)。这一层完全不感知账户状态,仅针对用户发出的自然语言文本进行分析。若识别到用户意图涉及特定业务领域家族(在论文评估的 Wix 域名家族中包含 10 个具体技能),该阶段就会把这一家族对应的全部候选技能集合打包传递给下一阶段。如果未命中任何领域意图,候选集直接置空,请求将流向通用知识问答流程。

第二阶段是整套系统的核心:确定性可执行性门控(Deterministic Executability Gate)。对于语义阶段输出的每一个候选技能,门控会直接对接权威业务后端(Authoritative State),拉取当前站点、账户和用户的实时状态数据,并评估一组精确对应的硬性退出条件(Exit Conditions)。所谓退出条件,直接取自该技能在后端微服务中已经编写好的防御性分支代码——例如资源已存在、缺乏 License 配额、角色鉴权不通过等。若该技能的退出谓词在当前状态下为真,门控便毫不犹豫地将其从候选名单中永久剔除。

第三阶段才轮到大语言模型进行最终决策。此时,送入大模型 Prompt 上下文中的,仅仅是那些通过了物理检查、确认在当前账户状态下真正具备执行可能的候选技能描述。大模型不再需要费尽心思去核算用户的会员等级或权限配置,它的注意力被收敛至它最擅长的领域:理解用户上下文对话、权衡沟通时机,并在真正可用的技能、基于知识库直接解答、或是发起多轮追问澄清之间做出判断。

这种架构构建了一种非对称的正确性保证:只要门控与下游技能执行链路所依赖的状态检查逻辑保持严格对齐(Predicate Parity),并且两者读取的状态足够新鲜,那么被门控拦截的技能就绝对不可能在当前状态下执行成功。系统不需要为门控单独训练任何机器学习分类器,其阻断决策完全建立在确定性代码之上,因而不存在统计意义上的“误拦截”。

技能描述 Token 开销漏斗

75 万条生产消息验证:Token 与无效调用的双重压缩

为了评估该架构在实际生产环境中的表现,Wix 团队对 Helpmate 线上运行期间的 756,641 条用户消息进行了全量追踪分析,这些消息分布在 267,612 场客服会话中。

在第一阶段的语义匹配中,系统共筛出 174,927 条涉及域名操作的消息,占全量消息的 23.1%。按照传统的技能暴露方案,每个命中消息都需要挂载该家族全部 10 个技能的详细 Prompt 描述,这累计产生了 1,749,270 个“技能-消息”候选对,对应 3.87 亿个技能描述 Token。

随后介入的确定性门控展现出了极其显著的剪枝能力:在上述 174.9 万个候选对中,门控准确识别并移除了 1,039,462 个无效候选,阶段剔除率高达 59.4%。在 Token 消耗层面,门控直接削减了约 2.288 亿个技能描述 Token(占比 59.1%),最终仅向大语言模型透出了约 1.58 亿 Token 的有效候选描述。平均到每条匹配的消息上,门控机制能剔除 5.94 个不可能执行的技能,为单次请求省下 1,308 个描述 Token。

若以“将所有技能暴露给全量消息”的朴素全暴露基线为参照,语义粗筛阻断了 76.9% 的无关上下文,而确定性门控在此基础上进一步将上下文压缩到了原基线的 9.5%,实现了高达 90.5% 的端到端技能描述 Token 削减。

更具洞察力的是各项技能之间的异质性分布。数据表明,不同技能的线上拦截率从最低的 28.1% 到最高的 94.1% 不等,中位数达到 48.2%。这种巨大的离散度揭示了一个关键事实:业务技能在真实世界的不可用性并非均匀分布。某些特定功能在语义上非常容易被用户提及,但其执行门槛极高;如果没有前置门控,这些技能就会频繁沦为模型调用的高危陷阱。

各技能拦截率、描述长度及节省 Token 分布

撤除门控会怎样?1000 场高危会话的反事实回放

单纯节省 Prompt 长度并不足以证明门控改变了模型的决策质量;如果大语言模型本身就足够聪明、能天然避开那些即使看到了也无法执行的技能,那么门控的价值就会大打折扣。

为了验证这一点,研究人员抽取了一个由 1,000 场高风险会话组成的反事实回放队列(Counterfactual Replay Cohort)。在这个测试集里的每一个会话节点上,都至少存在一个技能满足三项条件:用户语义命中、底层状态不满足前置条件(线上已被门控成功阻断)、且在线上并未被激活。研究团队在完全相同的生产运行环境中,对这 1,000 场会话重新进行了离线推理回放,唯一的变量是:撤除确定性门控,将该家族的全部 10 个技能描述完整暴露给模型。

回放结果给出了确凿的答案:在没有任何门控保护的情况下,大模型在 78 场会话(7.8%)中直接选择了激活那些线上判定为根本不可能执行成功的技能

这 7.8% 的模型选择偏差直观地证明:即使是当前顶尖的语言模型,在面对语义高度吻合但隐含业务状态冲突的任务时,依然存在明显的盲目调用倾向。确定性门控绝不仅仅是一个用来压缩上下文、节省 API 账单的缓存工具,而是一道实实在在防御模型产生无效操作、保护业务状态一致性的架构防线。

工业级落地中的三类陷阱与运维经验

将业务条件逆向转化为门控谓词,看似原理简单,但在长期迭代的企业级代码库中维持其可靠性却充满工程挑战。Wix 团队总结了保障该机制长期运行的核心设计原则与常见故障模式。

从工程生命周期来看,确定性门控面临的三大主要风险可以归纳如下:

  1. 谓词漂移(Predicate Drift):当技能本身的后端代码修改了报错拦截逻辑(例如新增了一个业务限制状态),但门控端的检查代码未同步更新,两者的退出判定失去等价性,可能导致门控放行无效技能或误伤可用技能。

  2. 状态陈旧(State Staleness):门控在评估谓词时读取的账户或站点缓存数据如果缺乏即时性,与技能真正执行时读取的底层数据库出现视图不一致,就会产生误判。

  3. 底层契约漂移(Backend-contract Drift):底层微服务接口对业务字段的定义、枚举值或 Schema 发生静默变更,导致上游门控代码基于旧理解解析状态出错。

为了对抗这些退化,系统设计必须确立职责分离的底线。门控只负责基于权威数据核算“硬性退出条件”,绝对不应当演变成另一个去猜测用户可能想要什么的“软性推荐器”。只要门控严格限定于底层退出条件的逆向逻辑,它的验证逻辑就只需要紧盯代码级的回归测试与状态新鲜度,而无需耗费大量人力去标注主观的执行数据集。

此外,门控机制虽然大幅降低了大模型接触高风险接口的概率,但它永远不能替代后端真正的鉴权与交易校验机制。将未授权技能从 Prompt 中抹除可以改善体验并收敛攻击面,但最后的执行防线依然必须由业务后端的最细粒度权限控制(Least Privilege Access Control)死死守住。

从单纯依赖提示词到确定性架构共治

Wix 这项研究给处于落地深水区的 Agent 开发者们带来了一个极为清醒的启示:在大模型时代,并非所有问题都适合交给大模型端到端解决。

让大模型在开放域中进行自然对话、常识推理与柔性意图识别,同时把严谨的、具有决定性后果的、依赖复杂业务状态机的条件检查,果断交还给传统的确定性代码和分布式基础设施。这种“确定性基础设施过滤物理可行域、概率性大模型决策意图执行点”的分工,不仅显著降低了推理成本,更构筑了工业级 Agent 系统最迫切需要的稳定性基石。