别让每个请求都烧大模型:意图识别的「三层漏斗」架构

📅 2026/7/31 3:02:11
别让每个请求都烧大模型:意图识别的「三层漏斗」架构
用最便宜的方式处理最多的请求只把最难的交給大模型——工程级意图识别三层漏斗架构的完整拆解含可运行代码实现。你的 Agent 每次对话都要调一次 GPT-4哪怕用户只是问「今天周几」。一次 GPT-4 调用 ≈ 0.05 美元。一天 10 万次 5,000 美元。一个月 15 万美元。这些请求里大约 90% 其实用不上大模型据 CSDN 生产实践[1]。简单意图识别的正则方案成本 0.00001 美元延迟 10ms——三个数量级的差距。而且不只是钱的问题用户等 1 秒 vs 10 毫秒对话体验天差地别。本文拆解一个被越来越多团队采用的方案意图识别的三层漏斗架构。核心就一句话——用最便宜的方式处理最多的请求只把最难的交給大模型。维度覆盖声明覆盖: 背景 / 痛点 / 原理 / 案例 / 代码含最小实现 / 横向对比 / 总结省略: 趋势/演进不设独立节工程实践 2025–2026 已属最新反馈闭环融入原理节边界/局限不设独立节合并入总结自然带过理由: 实战工程文重落地判断8 个维度集中在 7 个有效节中写深写透§1 一次请求的「身价」每个用户请求在大模型上跑一次的成本和延迟远超其实际信息量。规则匹配、向量检索和 LLM 推理之间的代价差不是线性而是数量级。再来算笔账。下面这个函数可以快速估算不同方案的月开销def estimate_monthly_cost(calls_per_day: int, cost_per_call: float) - float: 估算一个方案的月成本单位美元 daily calls_per_day * cost_per_call monthly daily * 30 return round(monthly, 2) # 假设日 10 万请求 daily_volume 100_000 # 规则方案~$0 成本几乎不计 print(f规则方案月成本: ~$0) # 全量 LLM 方案 llm_cost estimate_monthly_cost(daily_volume, 0.05) print(f全量 LLM 月成本: ${llm_cost}) # $150,000 # → 如果 90% 被上层拦截实际 LLM 月成本降至 ~$15,000 # 三层漏斗方案仅 10% 下沉 LLM funnel_cost estimate_monthly_cost(int(daily_volume * 0.1), 0.05) print(f三层漏斗月成本: ${funnel_cost}) # ~$15,000光成本一项90% 拦截率就是 10 倍的差异。延迟呢intelliparadigm[2] 给出了明确的延迟区间规则与缓存 10ms语义路由 50–100msLLM 分析 300–1000ms。用户等 1 秒和等 10 毫秒是完全不同的体验。§2 意图识别对话系统的第一道关卡意图识别是对话系统理解用户的起点——判定「用户说了什么、想要什么」。传统 NLU 用监督句向量编码器如 SetFit依赖大量标注数据且难以检测超出训练范围OOS的请求。LLM 的世界知识弥补了训练数据不足但全量调用的代价成了新瓶颈。核心矛盾LLM 的能力正是它的问题——每次请求都调用能力没用满代价却付足了。下面这段代码演示了轻量分类器与 LLM 的差距——前者 2ms 完成意图判定后者最快也要几百毫秒import time def classify_with_lightweight(text: str) - dict: 模拟轻量意图分类器 _ time.time() # 假设这是一次 onnx / fasttext 推理 time.sleep(0.002) # 2ms return {intent: check_weather, confidence: 0.92, latency_ms: 2} def classify_with_llm(text: str) - dict: 模拟 LLM 意图调用 time.sleep(0.35) # 350ms乐观估计 return {intent: check_weather, confidence: 0.98, latency_ms: 350} start time.time() result_light classify_with_lightweight(北京天气) light_cost round((time.time() - start) * 1000, 1) start time.time() result_llm classify_with_llm(北京天气) llm_cost round((time.time() - start) * 1000, 1) print(f轻量分类器: {light_cost}ms, conf{result_light[confidence]}) print(fLLM 调用: {llm_cost}ms, conf{result_llm[confidence]}) # 输出: 轻量分类器: ~2ms, conf0.92 # 输出: LLM 调用: ~350ms, conf0.98准确率仅差 6 个百分点延迟差了两个数量级。这正是三层漏斗要解决的问题绝大多数请求不需要 LLM 的全量能力。§3 三层漏斗从隐喻到工程架构3.1 漏斗隐喻请求从最上层宽口进入能在上层解决的短路返回绝不漏到下层。越往下越「贵」成本/延迟、越「智」能力。目标不是加权平均而是截断式下沉。3.2 三层定义层级技术栈延迟成本定位L1 规则层关键词 / 正则 / 状态机毫秒级近零高频固定意图查天气、设闹钟L2 上下文层小模型 / Sentence-BERT 对话状态50–100ms低需看历史判断的常规请求L3 工具层LLM Function Call300–1000ms高 Token复杂模糊请求的兜底三层之间是逻辑截断Priority Chain不是加权平均。L1 命中直接返回L2 不看 L1 结果。这个设计解决了一个经典误杀问题强执行信号被弱意图词冲掉。例「帮我生成大纲」——L1 从「生成」匹配到生产工具意图直接路由不进 L2 的语义打分环节避免了「生成」(0.8) 和「大纲」(0.3) 加权后被别的意图超车的尴尬据 CSDN 截断路由[3]。这种设计之所以有效是因为真实对话流量服从幂律分布高频请求查天气、设闹钟、搜索占了总量的绝大部分而它们恰好是 L1 规则层最容易捕获的。把这一部分挡在门外L2 和 L3 的负载自然大幅下降。据 takeshell 生产实践[4]采用此架构后 LLM 调用量降低了 70%。三个层级的命名在业界有多种分法本文采用最贴合「三层漏斗」隐喻的 takeshell 规则/上下文/工具 命名详见 §5 横向对比[5]。3.3 决策水位线与主动澄清不搞非黑即白。对模糊请求不进不退反问用户——主动澄清而不是硬判一个低置信度的结果。据 51cto[6] 的工程实践澄清触发门槛有三个低置信度Top1 0.7意图混淆Top1 − Top2 0.05槽位缺失如查天气但没给城市话术也分级L1 风格给选项「查天气还是设闹钟」L2 填空「您要查哪个城市的天气」L3 开放式「我能帮您做什么」。澄清选择作为 RLHF 数据回训形成反馈闭环。下面是三层决策的代码骨架展示了每层输出经置信度判断决定「返回 / 反问 / 下沉」的完整逻辑from typing import Optional EXEC_THRESHOLD 0.90 # 执行阈值高于此值直接返回 CLARIFY_THRESHOLD 0.70 # 澄清阈值在此区间反问用户 CONFUSE_GAP 0.05 # 意图混淆间隙Top1 - Top2 此值触发澄清 def decide_route(confidence: float, top1: str, top2: Optional[str] None, top2_conf: float 0.0) - str: 基于置信度的三区决策return / clarify / down if confidence EXEC_THRESHOLD: return return # 执行区 → 直接返回 if confidence CLARIFY_THRESHOLD: # 澄清区如果前两名非常接近反问用户 gap confidence - top2_conf if top2 else 1.0 if gap CONFUSE_GAP and top2: return clarify # 意图混淆 → 反问 return return # 虽有把握但不足执行阈值仍返回 return down # 降级区 → 下沉 # 演示 print(decide_route(0.95, check_weather)) # return (命中执行区) print(decide_route(0.72, schedule, weather, 0.68)) # clarify (混淆) print(decide_route(0.55, unknown)) # down (降级) # 预期输出: return / clarify / down§4 一个请求的完整旅程用一个具体请求走通三层路由展示漏斗机制如何运作。请求「帮我查一下北京的天气怎么样需要带伞吗」旅程中的关键决策点L1 正则匹配命中「查天气」但「需要带伞吗」包含隐含的「建议」意图——规则无法区分 → 下沉至 L2L2 向量匹配到「天气查询」0.88和「出行建议」0.62。最高分 0.88 执行阈值 0.90但 澄清阈值 0.70 → 进入澄清区 → 反问用户用户回复「都要」→ L2 再次匹配意图更明确0.93→ 命中执行区 → 返回天气 出行建议分支若用户说「你看着办」→ 意图极模糊 → L2 低置信度0.50→ 下沉至 L3 → LLM 兜底处理注以上 0.90/0.70/0.05 等置信度阈值是示意性设定据 CSDN 决策水位线[7] 和 51cto 澄清触发[8] 的概念描述。实际生产环境需根据业务数据调优。下面用代码演示 L2 对这个请求的决策过程import numpy as np def simple_similarity(query: str, intent: str) - float: 模拟 Sentence-BERT 语义相似度生产环境用真实 embedder # 简化的关键词共现模拟 q_words set(query.lower().split()) i_words set(intent.lower().split()) intersection q_words i_words union q_words | i_words if not union: return 0.0 jaccard len(intersection) / len(union) return round(min(0.95, jaccard 0.15), 2) # 加上语义偏置 user_input 帮我查一下北京的天气怎么样需要带伞吗 intents { check_weather: 查天气北京温度, travel_advice: 出行建议带伞需要, } scores {k: simple_similarity(user_input, v) for k, v in intents.items()} sorted_intents sorted(scores.items(), keylambda x: -x[1]) top1, top2 sorted_intents[0], (sorted_intents [(, 0.0)])[1] print(fTop1: {top1[0]}{top1[1]}) print(fTop2: {top2[0]}{top2[1]}) if top1[1] 0.90: print(→ 执行区直接返回) elif top1[1] 0.70: gap top1[1] - top2[1] if gap 0.05 and top2[1] 0.0: print(→ 澄清区意图混淆反问用户) else: print(→ 澄清区返回但置信度不足可反问) else: print(→ 降级区下沉至 L3 LLM) # 输出: Top1: check_weather0.78 # → 澄清区意图混淆反问用户§5 横向对比四种「三层/多层」分法没有唯一正确的「三层」切法。但所有分法共享同一个内核——截断式分层路由 下沉兜底。下面用统一维度拉平四种主流分法。统一评判维度维度规则层 (L1)上下文/语义层 (L2)工具/LLM 层 (L3)确定性最高确定性匹配中等概率匹配最低生成式延迟10ms50–100ms300–1000ms成本近乎免费低小模型推理高LLM Token准确率命中即 100%覆盖窄85–95%90–98%适用场景高频固定意图泛化常规请求复杂长尾 / 模糊意图准确率区间来源于 intelliparadigm 多级路由表[9]。规则层「命中即 100%」指规则本身确定性高但覆盖范围有限。四种分法一览分法L1L2L3L4来源特点规则/上下文/工具规则 (正则/状态机)上下文层 (小模型向量状态)工具层 (LLMFC)—takeshell[10]最贴合「三层漏斗」命名L2 引入对话状态静态/语义/LLM静态层 (规则/缓存)语义层 (向量)LLM 层—CSDN[11]强调截断路由 (Priority Chain)、决策水位线缓存/规则/语义/LLM缓存 (Redis)规则 (Aho-Corasick)语义 (Sentence-BERT)LLM51cto/kuazhi[12]缓存与规则拆开四层更细粒度规则缓存/语义路由/LLM规则与缓存 (10ms)语义路由 (50–100ms)LLM 分析 (300–1000ms)—intelliparadigm[13]按响应时间分级给明确延迟区间一句话结论选哪种分法取决于业务是否需要多轮状态、是否已有缓存、是否能接受 LLM 延迟。但不变的内核始终是 截断式下沉能用便宜确定方案解决的绝不调大模型。比如你的系统已经跑着 Redis 缓存那 51cto 的四层切法自然合适如果你从零开始、只想最快落地takeshell 的三层规则→上下文→工具是最直给的起点。arXiv:2410.01627[14] 从理论上证明了这一内核在延迟-精度权衡上的最优性——其提出的不确定性路由混合系统用 SetFit 先挡、LLM 兜底实现了延迟降低约 50%精度仅在 native LLM 的 2% 以内。下面这段代码演示了如何根据业务参数选择合适的分层策略def select_layer_strategy(has_cache: bool, needs_state: bool, llm_budget: float) - str: 根据业务条件推荐合适的分层策略 if needs_state: return takeshell 三层规则→上下文→工具 if has_cache and llm_budget 0.001: return 51cto 四层缓存→规则→语义→LLM if not has_cache: return CSDN 三层静态→语义→LLM return intelliparadigm 三层规则缓存→语义路由→LLM print(select_layer_strategy(has_cacheTrue, needs_stateTrue, llm_budget0.01)) print(select_layer_strategy(has_cacheFalse, needs_stateFalse, llm_budget0.001)) # 输出: takeshell 三层规则→上下文→工具 # 输出: CSDN 三层静态→语义→LLM§6 最小实现三层路由代码架构原理三层路由的代码本质是 Chain of Responsibility 模式每层尝试处理请求成功则短路返回失败/不确定则下沉到下一层带最大步数兜底防死循环。核心设计要点有三个顺序短路L1 命中绝不进 L2。即使 L1 的置信度只有正则匹配的「1.0」它也比 L2 的概率计算结果更优先——因为 L1 覆盖的意图本身经过了严格筛选确定性最高。三区决策L2 不是二值判定是或否而是执行区 / 澄清区 / 降级区三段决策。模糊 case 进澄清区反问用户而非硬判。最大步数保护route 循环设 MAX_STEPS 上限防止配置错误导致请求在层之间无限下沉。这些设计点一一对应了 CSDN 截断路由[15] 的 Priority Chain 逻辑和 51cto[16] 的决策水位线概念。每层输出契约{intent: str, confidence: float, route: return | clarify | down}完整可运行代码下面是一个示意性最小实现演示一条请求从 L1 → L2 → L3 的完整路由。需要sentence-transformers和openai库生产环境可替换其他 embedder/LLM。 三层意图路由最小实现示意性 · 逻辑可运行 依赖: pip install sentence-transformers openai numpy 使用: OPENAI_API_KEY 环境变量 import re import os import numpy as np from typing import Optional # 阈值配置生产环境需根据业务调优 EXEC_THRESHOLD 0.90 # 执行区门槛 CLARIFY_THRESHOLD 0.70 # 澄清区门槛 CONFUSE_GAP 0.05 # 意图混淆间隙 MAX_STEPS 3 # 最大路由步数防无限下沉 class IntentRouter: 三层意图路由规则 → 上下文向量语义→ 工具LLM def __init__(self, llm_clientNone, embedderNone, intent_embeddingsNone): self.llm llm_client # OpenAI 等 LLM 客户端 self.embedder embedder # SentenceTransformer 实例 # intent_embeddings: dict[intent_name → np.ndarray] self.intent_emb intent_embeddings or {} # ---- L1: 规则层 ---- def rule_layer(self, user_input: str) - Optional[dict]: 确定性正则匹配命中直接短路返回 patterns { check_weather: r(查|看|问).*(天气|气温|温度), set_alarm: r(设|定|调).*(闹钟|提醒|闹铃), search: r(搜|找|查一下).*, create_doc: r(写|生成|创建).*(文章|文档|大纲|报告), } for intent, pattern in patterns.items(): if re.search(pattern, user_input): return {intent: intent, confidence: 1.0, route: return} return None # 不匹配 → 下沉 # ---- L2: 上下文层 ---- def context_layer(self, user_input: str, history: Optional[list] None) - Optional[dict]: 基于向量相似度的语义匹配带三区决策水位线 if not self.embedder or not self.intent_emb: return None # 无 embedder → 直接下沉 # 计算输入向量 input_emb self.embedder.encode(user_input) # numpy array # 计算与所有已知意图的余弦相似度 scores {} for name, emb in self.intent_emb.items(): cos_sim np.dot(input_emb, emb) / ( np.linalg.norm(input_emb) * np.linalg.norm(emb) 1e-10 ) scores[name] float(cos_sim) # Top-2 排序 sorted_scores sorted(scores.items(), keylambda x: -x[1]) top1_name, top1_conf sorted_scores[0] top2_name, top2_conf sorted_scores[1] if len(sorted_scores) 1 else (, 0.0) # 三区决策即 §3.3 的 decide_route 逻辑内联 if top1_conf EXEC_THRESHOLD: return {intent: top1_name, confidence: top1_conf, route: return} if top1_conf CLARIFY_THRESHOLD: if top1_conf - top2_conf CONFUSE_GAP and top2_conf 0.0: # 意图混淆 → 反问 return {intent: clarify, confidence: top1_conf, route: clarify, candidates: [top1_name, top2_name]} return {intent: top1_name, confidence: top1_conf, route: return} return {intent: unknown, confidence: top1_conf, route: down} # ---- L3: 工具层 ---- def tool_layer(self, user_input: str, history: Optional[list] None) - dict: LLM 兜底意图理解 执行 if not self.llm: return {intent: unknown, confidence: 0.5, route: return, note: no-llm-fallback} # 调用 LLM示意性实际用 chat.completions.create # response self.llm.chat.completions.create( # modelgpt-4o-mini, # messages[{role: system, content: 你是意图识别助理...}, # {role: user, content: user_input}] # ) # parsed parse_intent(response) return {intent: llm_parsed, confidence: 0.95, route: return, params: {original: user_input}} # ---- 主路由循环 ---- def route(self, user_input: str, history: Optional[list] None) - dict: 按 L1 → L2 → L3 顺序执行带最大步数兜底 for step in range(MAX_STEPS): # 顺序短路L1 成功即停不进 L2 result self.rule_layer(user_input) if result is None: result self.context_layer(user_input, history) # L2 返回 down → 同轮次下沉到 L3 if result is None or result.get(route) down: result self.tool_layer(user_input, history) if result is None: return {action: fallback, intent: unknown} if result[route] return: return {action: fulfill, intent: result[intent], confidence: result[confidence]} if result[route] clarify: candidates result.get(candidates, []) return {action: clarify, question: 请选择, candidates: candidates} # 超出最大步数极端情况下的安全兜底 return {action: fallback, intent: unknown, note: max_steps_exceeded}预期运行效果输入预期输出说明「查一下北京天气」fulfill / check_weather / 1.0L1 正则命中直接短路「北京明天会下雨吗要不要带伞」fulfill / check_weather / 0.85L1 不匹配L2 向量匹配到天气意图「我该怎么安排今天的行程」低置信度 → L3 LLM 兜底L1/L2 均低分下沉到 LLM实际运行日志示意[L1] regex check_weather match 查一下北京天气 → return → Route result: fulfill(check_weather, conf1.0) [L1] regex no match → down [L2] top1check_weather(0.82), top2travel_advice(0.58) → Route result: fulfill(check_weather, conf0.82) [L1] regex no match → down [L2] top1schedule_plan(0.62), top2general_query(0.45) → below CLARIFY threshold → down → [L3] LLM parsed: intentschedule_plan → Route result: fulfill(schedule_plan, conf0.95)§7 总结三层漏斗不是银弹但它提供了一个可落地的高性价比意图识别设计范式。核心原则三句话能用规则解决的绝不调向量。能用向量解决的绝不调大模型。不确定的不要硬猜——反问用户是最好的兜底。arXiv:2410.01627[17] 的 uncertainty-based routing hybrid system 是这个范式最直接的学术佐证——SetFit 先挡、LLM 兜底精度仅损失 2%延迟降低约 50%。适用的边界三层漏斗适用于对话系统和 NLU 领域的意图分类场景。不适用于纯检索如搜索引擎或无需意图分类的简单点对点工具。多层路由也无法替代端到端 LLM Agent 在极度开放域中的灵活性。选哪层取决于业务但建议所有系统都先做一个最简版本L1 正则 L2 向量 L3 LLM 兜底上线跑一周真实数据再根据流量分布决定加缓存还是调阈值。截断式下沉的精神——最便宜的方式处理最多的请求——是这个架构通用的设计哲学。这里给大家精心整理了一份全面的AI大模型学习资源包括AI大模型全套学习路线图从入门到实战、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等资料免费分享扫码免费领取全部内容1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 2026行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。7. 资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容