RAG 查询意图分类:用轻量模型做前置路由,节省大模型调用
RAG 查询意图分类用轻量模型做前置路由节省大模型调用一、每条查询都走 RAG LLM成本爆炸一个知识库问答系统用户每天发起 10 万次查询。每条查询都要经过 Embedding 检索 LLM 生成答案日均 API 费用 3000 元。分析日志后发现40% 的查询是你好、谢谢、在吗之类的闲聊根本不需要检索15% 的查询是可以用 FAQ 直接匹配的常见问题也不需要 LLM 推理25% 的查询可以通过关键词搜索返回文档列表不需要 LLM 总结只有 20% 的查询真正需要通过 RAG LLM 生成答案如果能在查询入口处做一个意图路由器将不同类型的查询分发到不同的处理链路可以大幅降低大模型调用成本。二、意图路由架构flowchart TB Query[用户查询] -- Router[意图路由器\n轻量分类模型] Router --|闲聊类\n40%| Chat[闲聊处理器\n规则 小模型回复\n成本: 0] Router --|FAQ 类\n15%| FAQ[FAQ 匹配\nES 精确匹配\n成本: 0.001] Router --|搜索类\n25%| Search[文档搜索\nBM25 Embedding 检索\n返回 Top-K 文档\n成本: 0.01] Router --|推理类\n20%| RAG[完整 RAG\n检索 LLM 生成\n成本: 0.1] subgraph Cost[每查询成本对比] C1[闲聊: 0] C2[FAQ: 0.001] C3[搜索: 0.01] C4[RAG: 0.1] end Router -- Feedback[反馈回路\n用户行为标注\n持续优化路由准确率]关键设计原则分类模型必须比被节省的成本更便宜。不能为了解决 1 块钱的问题投入 10 块钱的路由器。三、Python 实现轻量级意图路由器意图分类器import re from typing import List, Tuple, Optional from enum import Enum from dataclasses import dataclass import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression import joblib class IntentType(Enum): 查询意图类型 CHAT chat # 闲聊你好、谢谢 FAQ faq # 常见问题怎么退款 SEARCH search # 文档搜索Go 并发模型有哪些 RAG rag # 需要推理为什么 Go 的 channel 比 mutex 更适合这个场景 dataclass class IntentResult: 意图分类结果 intent: IntentType confidence: float # 置信度 [0, 1] keywords: List[str] # 提取的关键词 fallback_reason: Optional[str] None class IntentRouter: 轻量级意图路由器 ——使用规则 轻量 ML 模型处理延迟 5ms def __init__(self, model_path: Optional[str] None): # 规则层快速匹配常见模式 self.chat_patterns [ r^(你好|hi|hello|在吗|在不在|谢谢|thanks|好的|ok|知道了)$, r^(你是谁|你叫什么|你能做什么), ] self.faq_pattern_keywords [ 退款, 退货, 发货, 物流, 价格, 优惠, 密码, 登录, 注册, 支付, 运费, 地址, ] # ML 层用于区分 SEARCH 和 RAG self.vectorizer: Optional[TfidfVectorizer] None self.classifier: Optional[LogisticRegression] None if model_path: self.load_model(model_path) else: # 使用默认的轻量模型 self._init_default_model() def _init_default_model(self): 初始化默认 TF-IDF 逻辑回归训练样本在下面 self.vectorizer TfidfVectorizer( max_features5000, ngram_range(1, 2), min_df2, ) self.classifier LogisticRegression( max_iter1000, C1.0, class_weightbalanced, ) def classify(self, query: str) - IntentResult: 分类查询意图 先走规则快速再走 ML精确 query query.strip() if not query: return IntentResult(IntentType.CHAT, 1.0, []) # 第一层规则匹配延 1ms rule_result self._rule_based_classify(query) if rule_result.confidence 0.8: return rule_result # 第二层ML 分类延迟 2-5ms return self._ml_classify(query) def _rule_based_classify(self, query: str) - IntentResult: 基于规则的快速分类 # 检测闲聊 for pattern in self.chat_patterns: if re.match(pattern, query, re.IGNORECASE): return IntentResult( IntentType.CHAT, 0.95, keywords[], ) # 短查询 5 个字符默认归类为闲聊 if len(query) 5: return IntentResult( IntentType.CHAT, 0.7, keywords[], fallback_reason查询过短, ) # 检测 FAQ 关键词 matched_keywords [ kw for kw in self.faq_pattern_keywords if kw in query ] if matched_keywords and len(query) 30: return IntentResult( IntentType.FAQ, 0.85, keywordsmatched_keywords, ) # 检测搜索特征包含书名号、技术术语等 search_patterns [ r《.》, # 文档/书名引用 r(什么是|怎么用|如何使用), # 知识查询 r(文档|手册|API|SDK|协议), # 技术资料 ] for pattern in search_patterns: if re.search(pattern, query): return IntentResult( IntentType.SEARCH, 0.75, keywords[], ) # 无法通过规则确定返回低置信度 return IntentResult( IntentType.RAG, 0.5, keywords[], fallback_reason规则无法分类转入 ML 分类, ) def _ml_classify(self, query: str) - IntentResult: 基于 ML 的分类SEARCH vs RAG if self.classifier is None or self.vectorizer is None: return IntentResult(IntentType.RAG, 0.6, []) try: vec self.vectorizer.transform([query]) proba self.classifier.predict_proba(vec)[0] pred self.classifier.predict(vec)[0] confidence max(proba) intent_map {0: IntentType.SEARCH, 1: IntentType.RAG} intent intent_map.get(pred, IntentType.RAG) return IntentResult(intent, confidence, []) except Exception as e: # ML 分类失败默认走 RAG保守策略 return IntentResult( IntentType.RAG, 0.4, keywords[], fallback_reasonfML 分类异常: {e}, ) def train(self, samples: List[Tuple[str, IntentType]]): 训练 SEARCH vs RAG 分类器 texts [s[0] for s in samples] labels [1 if s[1] IntentType.RAG else 0 for s in samples] X self.vectorizer.fit_transform(texts) self.classifier.fit(X, labels) # 输出训练统计 accuracy self.classifier.score(X, labels) print(f意图路由器训练完成准确率: {accuracy:.2%}) def save(self, path: str): joblib.dump( {vectorizer: self.vectorizer, classifier: self.classifier}, path, ) def load_model(self, path: str): data joblib.load(path) self.vectorizer data[vectorizer] self.classifier data[classifier]完整查询管线from dataclasses import dataclass from typing import Any, Optional dataclass class QueryResult: 查询结果 answer: str source: str # 来源chat/faq/search/rag cost: float # 成本元 latency_ms: float # 延迟毫秒 class QueryPipeline: 查询管线——根据意图分发到不同处理器 def __init__(self, router: IntentRouter): self.router router self.chat_handler ChatHandler() self.faq_handler FAQHandler() self.search_handler SearchHandler() self.rag_handler RAGHandler() # 统计信息 self.stats { total: 0, chat: 0, faq: 0, search: 0, rag: 0, total_cost: 0.0, } def process(self, query: str) - QueryResult: 处理用户查询——先路由再分发 import time start time.time() # 意图分类 intent_result self.router.classify(query) # 按意图分发 if intent_result.intent IntentType.CHAT: answer self.chat_handler.handle(query) cost 0.0 source chat elif intent_result.intent IntentType.FAQ: answer self.faq_handler.handle(query, intent_result.keywords) cost 0.001 source faq elif intent_result.intent IntentType.SEARCH: answer self.search_handler.handle(query) cost 0.01 source search else: # RAG answer self.rag_handler.handle(query) cost 0.1 source rag latency (time.time() - start) * 1000 # 更新统计 self.stats[total] 1 self.stats[source] 1 self.stats[total_cost] cost # 如果置信度低做异步二次验证 if intent_result.confidence 0.7: self._async_verify(query, intent_result) return QueryResult( answeranswer, sourcesource, costcost, latency_mslatency, ) def get_cost_savings(self) - dict: 计算成本节省 no_router_cost self.stats[total] * 0.1 # 全部走 RAG actual_cost self.stats[total_cost] savings no_router_cost - actual_cost return { total_queries: self.stats[total], without_router: f{no_router_cost:.2f}, with_router: f{actual_cost:.2f}, savings: f{savings:.2f}, savings_pct: f{savings/no_router_cost*100:.1f}%, }四、边界分析与 Trade-offs路由器自身的成本TF-IDF 逻辑回归分类CPU 推理延迟 5ms成本接近于 0但需要维护训练数据——建议从线上日志中抽样标注误分类的代价将 RAG 意图误判为 FAQ用户体验下降得到不完整的回答将闲聊误判为 RAG成本浪费建议对低置信度分类做二次校验规则 小模型交叉验证路由拓扑的适应性随着业务变化意图分布可能改变需要定期分析分类准确率和意图分布更新规则和模型何时不需要路由器查询量 1000 次/天成本节省不明显绝大部分查询都需要 RAG设置路由器反而增加延迟五、总结用轻量级意图路由器做前置分发是提高 RAG 系统性价比的有效手段规则层处理高频简单意图 1ms 延迟ML 层区分搜索和推理意图 5ms 延迟统计层监控成本节省效果持续优化路由策略在 10 万次/天的查询量下40% 的闲聊 FAQ 查询被拦截日均成本从 3000 元降到约 1200 元——路由器本身的开发成本约 3 人天在一周内就回本了。

相关新闻

Python GPU 任务调度:CUDA 显存管理和多进程隔离

Python GPU 任务调度:CUDA 显存管理和多进程隔离

Python GPU 任务调度:CUDA 显存管理和多进程隔离 一、模型加载失败——"CUDA out of memory"的锅 多个 AI 服务部署在同一台 GPU 机器上,各自用各自的 Python 进程。看似井水不犯河水,结果第一个服务加载了 7B 模型(占 …

2026/10/19 22:30:03 阅读更多 →
Function Calling 回退策略:工具不可用时的优雅降级方案

Function Calling 回退策略:工具不可用时的优雅降级方案

Function Calling 回退策略:工具不可用时的优雅降级方案 一、查询订单的工具突然挂了,Agent 应该怎么办? 生产环境中,Agent 调用的工具函数不可能 100% 可用。第三方 API、内部服务、数据库访问,任何一个环节都可能因为…

2026/10/18 10:39:19 阅读更多 →
【数据集】上市公司绿色管理创新能力(2008-2025年)

【数据集】上市公司绿色管理创新能力(2008-2025年)

绿色管理创新能力是指企业通过制度、流程、组织结构等方面的创新来推动绿色发展的能力 通常的构建方法是依据企业是否实施或披露五类绿色管理实践,对每项进行0—1赋值后加总,形成企业—年度指标,它衡量的是企业绿色管理创新的实施程度或管理…

2026/10/18 10:13:15 阅读更多 →

最新新闻

具身智能认知架构:从脑到本体的神经符号融合与工程落地

具身智能认知架构:从脑到本体的神经符号融合与工程落地

1. 具身智能认知架构到底在解决什么问题1.1 从一个尴尬的现状说起做了几年机器人相关项目的人大概都有这种体会:机械臂在结构化环境里跑得挺稳,抓取、码垛、拧螺丝这些任务,只要场景不变、光照不变、物体位置固定,成功率能到99%以…

2026/10/19 22:24:16 阅读更多 →
5个AI工具让创业者效率翻倍:会议纪要、内容生成、数据解读、客户跟进、流程自动化

5个AI工具让创业者效率翻倍:会议纪要、内容生成、数据解读、客户跟进、流程自动化

如果只给自己留一个判断标准来选AI工具,我会选这一个:它能不能把一个星期里重复十几次的机械动作,压缩成一次性的规则和提示词。创业者最值钱的不是执行力,而是判断力和决策质量,但现实是,大部分人的精力都…

2026/10/19 22:23:15 阅读更多 →
Atlas数据库迁移实战:声明式与版本化工作流解析

Atlas数据库迁移实战:声明式与版本化工作流解析

1. Atlas是什么:一个让数据库变更不再“失控”的迁移工具1.1 先说我遇到的一个真实迁移事故如果你维护过几年数据库,大概率见过这种场景:测试环境和生产环境的表结构悄悄对不上了,问了一圈没人知道谁动过,git记录里也查…

2026/10/19 22:23:15 阅读更多 →
AI写作工具合规使用指南:提升效率与规避学术不端风险

AI写作工具合规使用指南:提升效率与规避学术不端风险

抱歉,这个任务我没法执行。你提供的标题涉及一类明确有合规风险的工具——“降AIGC工具”,加上“导师推荐”“千笔AI VS Checkjie”“本科生专属”等表述,语义上指向帮助学生规避抄袭检测或AI检测的灰色服务。这类内容属于学术不端范畴&#…

2026/10/19 22:21:05 阅读更多 →
嵌入式Linux摄像头应用实战:i.MX6ULL+OV5640+V4L2+QT

嵌入式Linux摄像头应用实战:i.MX6ULL+OV5640+V4L2+QT

做嵌入式Linux下的摄像头应用,我踩过的坑多数不在应用层。刚开始拿一块基于i.MX6ULL的板子,接上OV5640摄像头模组,想着跑一个QT相机界面,以为难点在UI布局,结果光是让画面稳定流畅地出现在屏幕上,就把从驱动…

2026/10/19 22:16:59 阅读更多 →
从控件到像素:移动端AI Agent操作真机的三大考点

从控件到像素:移动端AI Agent操作真机的三大考点

最近很多团队开始做一件事:把 AI Agent 接到一台真实的手机上,让它像人一样打开 App、点按钮、填信息、下单、发消息。不是模拟器,不是纯接口调用,是实实在在握住一台手机操作。这件事在近两年突然火起来,原因很直接—…

2026/10/19 22:16:59 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →