工业级Agent意图识别分层漏斗

0 阅读8分钟

请添加图片描述

摘要:意图识别是工业级 Agent 路由的总闸门,误判将导致全链路工具调用偏差。全量大模型方案存在延迟、成本、稳定性三重硬伤。本文提出分层漏斗架构:规则层拦截约 60% 高频意图(<1ms),上下文层处理约 35% 多轮指代(~100ms),大模型层兜底约 5% 长尾请求。三层按复杂度递进分配算力,兼顾准确率、低延迟与可控 GPU 成本,并给出技术选型、阈值设计、MVP 代码与监控指标。

关键词:意图识别;分层漏斗;规则路由;上下文状态;LLM 兜底;Agent 路由;成本优化

一、问题背景:全量大模型的三个硬伤

工业级 Agent 系统中,意图识别模块是整条链路的总闸门——它决定后续所有路由走向,一旦误判,下游工具调用、任务拆解全部偏离。

最直觉的方案是将所有请求无差别送入大模型。该方案在低流量验证阶段表现正常,但一上并发便暴露三个硬伤:

硬伤表现根因
延迟失控单次推理 2000ms 起步,P99 随并发线性恶化大模型推理耗时与并发队列堆叠放大等待
成本爆炸简单指令也消耗 token,高峰期 GPU 开销超预算未区分请求复杂度,贵算力被浪费在简单任务上
稳定性风险大模型存在幻觉,意图分类偶尔跑偏单一依赖 LLM,无确定性兜底

这三个问题构成"不可能三角":准确率、低延迟、低成本难以同时成立。分层漏斗的核心思想是按请求复杂度分配算力,使三者同时可达。

二、分层漏斗架构

mermaid diagram

漏斗三层逐级过滤,每层只处理上一层无法确认的请求。关键设计原则:

  • 规则层不无限堆砌:只维护高频、稳定不变的意图,规则过多会导致冲突与维护成本爆炸。
  • 上下文层不做重型推理:使用轻量小模型完成语义分类与槽位填充,不消耗大模型算力。
  • 大模型层绝不扛主流量:仅作为最后兜底防线,处理前两层置信度不足的长尾请求。

2.1 层间协同与冲突解决

三层并非完全独立,需明确协同规则:

  1. 信息传递:规则层未命中时,将原始请求与规则匹配中间结果(如部分匹配的规则 ID)传递至上下文层,辅助轻量模型判断。
  2. 冲突解决:若规则层与上下文层同时命中但意图不一致,以规则层结果为准(确定性优先),同时将冲突案例记录至审计日志供后续分析。
  3. 降级策略:上下文层服务不可用时,规则层命中直接路由,未命中请求全部降级至大模型层,保证服务可用性。

三、第一层:规则拦截层

定位:高频固定意图,毫秒级响应,完全不消耗大模型算力。

技术手段:关键词匹配、正则表达式、有限状态机(FSM)。

适用场景:表达固定、无歧义的指令。例如:

  • "转人工" → 人工客服路由
  • "查询余额" → 账户查询工具
  • "退出会话" → 会话终止

设计要点:

  1. 规则按优先级排序,命中即返回,不做多余计算。
  2. 每条规则附带置信度分数(精确匹配 1.0,正则匹配 0.9),供下游审计。
  3. 规则变更走灰度发布,避免全量切换引入冲突。

四、第二层:上下文状态层

定位:承接规则漏下的约 35% 流量,处理多轮对话中的省略指代场景。

核心挑战:单独一句话无法判断意图,必须结合会话历史、当前激活任务与槽位信息。

典型场景:

用户前一轮:"我要申请退款" 用户当前轮:"那算了,不办了"

单独看"那算了,不办了"无法识别意图,需读取上下文才能判定为取消退款申请。

技术选型:

  • 轻量小模型(如 1B-7B 参数)做语义分类与槽位填充
  • 会话历史存储于 Redis,读取延迟 <5ms
  • 槽位信息由上游任务状态机维护,支持多轮累积

置信度机制:该层输出置信度分数,低于阈值(建议 0.8)时升级至第三层。

五、第三层:大模型兜底层

定位:仅处理前两层置信度不足的约 5% 长尾复杂请求。

适用场景特征:

  • 表达模糊、歧义强
  • 跨多任务、多步骤组合
  • 需要任务拆解与工具选择

能力范围:不仅做意图分类,还完成任务拆解、工具选择、参数提取,通过函数调用(Function Calling)或 MCP 协议直接对接后端工具。

成本控制:该层延迟最高(500-2000ms)、成本最贵,定位是最后兜底防线,绝对不能扛主流量。

六、工业实践要点

6.1 置信度阈值调优

阈值效果适用场景
0.9更多请求升级至 LLM,准确率最高,成本最高对准确率敏感的业务
0.8平衡点,多数生产系统推荐通用场景
0.7更多请求在中间层消化,成本最低对延迟敏感的业务

阈值应通过离线标注集 + 线上 A/B 测试确定,并随业务迭代定期复核。

6.2 规则治理

  • 规则数量上限建议 200 条,超出后合并同类项或迁移至语义层。
  • 每周审计规则命中率,清理零命中规则。
  • 规则冲突检测:新规则上线前与现有规则集做交集测试。

6.3 监控指标

指标目标值说明
规则层命中率≥55%设计目标约 60%,低于 55% 触发告警
上下文层命中率≥30%低于此值说明轻量模型能力不足
LLM 兜底率≤8%高于此值说明前两层过滤不够
端到端 P99 延迟<200ms不含 LLM 兜底请求
意图识别准确率≥95%离线标注集 + 人工抽检

七、MVP 示例代码

以下为一个最小可行实现,展示三层漏斗的核心调度逻辑:

import re
from dataclasses import dataclass
from enum import Enum
from typing import Optional

class RouteSource(Enum):
    RULE = "rule"
    CONTEXT = "context"
    LLM = "llm"

@dataclass
class RouteResult:
    intent: str
    confidence: float
    source: RouteSource
    latency_ms: float

# ========== 第一层:规则拦截 ==========
RULES = [
    (re.compile(r"转人工|人工客服", re.IGNORECASE), "human_agent", 1.0),
    (re.compile(r"查.*余额|余额.*查", re.IGNORECASE), "query_balance", 0.95),
    (re.compile(r"退出|结束会话", re.IGNORECASE), "exit_session", 1.0),
]

def rule_layer(text: str) -> Optional[RouteResult]:
    for pattern, intent, conf in RULES:
        if pattern.search(text):
            return RouteResult(intent, conf, RouteSource.RULE, 0.5)
    return None

# ========== 第二层:上下文状态层 ==========
def context_layer(text: str, session_history: list[str]) -> Optional[RouteResult]:
    # 简化示例:检测省略指代
    # 生产环境应替换为轻量模型推理
    if any(kw in text for kw in ["那算了", "不办了", "取消"]):
        if any("退款" in h for h in session_history):
            return RouteResult("cancel_refund", 0.85, RouteSource.CONTEXT, 80.0)
    return None

# ========== 第三层:大模型兜底 ==========
def llm_layer(text: str) -> RouteResult:
    # 生产环境应调用 LLM API 做意图分类
    # 此处为占位实现
    return RouteResult("complex_task", 0.7, RouteSource.LLM, 1500.0)

# ========== 漏斗调度器 ==========
def route(text: str, session_history: Optional[list[str]] = None) -> RouteResult:
    history = session_history if session_history is not None else []
    
    # 第一层:规则拦截
    result = rule_layer(text)
    if result:
        return result
    
    # 第二层:上下文状态
    result = context_layer(text, history)
    if result and result.confidence >= 0.8:
        return result
    
    # 第三层:大模型兜底
    return llm_layer(text)

# ========== 测试 ==========
if __name__ == "__main__":
    print(route("转人工"))                      # 规则层
    print(route("那算了不办了", ["我要申请退款"]))  # 上下文层
    print(route("帮我分析这个季度销售数据并生成报告"))  # LLM 层

八、效果与成本对比

以下为典型生产环境估算数据:

方案平均延迟日均 GPU 成本准确率
全量大模型2000ms100%约 92%
分层漏斗50ms15-25%约 95%

分层漏斗将约 95% 的请求在毫秒级闭环,仅约 5% 长尾消耗大模型算力,综合成本降低约 75-85%。同时因规则层与上下文层的确定性更高,整体准确率反而优于全量 LLM 方案。

九、总结

分层漏斗通过按请求复杂度分配算力,使准确率、低延迟与低成本三者同时成立。该架构已在多个生产环境中验证,是工业级 Agent 意图识别的实用方案。

参考文献

[1] Chen, Z. et al. "FrugalGPT: How to Use Large Language Models While Reducing Cost and Improving Performance." arXiv, 2023.

[2] Ong, Y. et al. "RouteLLM: Learning to Route LLMs with Preference Data." arXiv, 2024.

[3] STAR. "Steelmaking Task-Aware Routing for Multi-Agent LLM Expert Systems." Applied Sciences, 2026.

[4] Nova OS. "The 3-Tier Routing Cascade: Rule-Based → Semantic → LLM." Meganova Blog, 2026.

[5] MLflow. "LLM Routing in Production: Four Stages." MLflow Blog, 2026.

[6] CalibreOS. "LLM Router and Model Cascade: Cost-Aware Query Routing at Production Scale." CalibreOS, 2026.