RAG 查询路由:什么时候该走检索
挂载了 RAG ≠ 每个请求都走向量数据库。好的系统会先判断"这个问题是否需要外部知识",再决定走不走检索。
核心结论:不是所有问题都需要 RAG
| 场景 | 是否走 RAG | 原因 |
|---|---|---|
| 闲聊问候("你好") | ❌ | LLM 自己就能应对 |
| 通用知识("Python 是什么") | ❌ | LLM 训练数据已包含 |
| 公司私有知识("年假制度") | ✅ | LLM 不知道内部文档 |
| 最新信息("今天的新闻") | ✅ | LLM 有知识截止日期 |
| 精确数据查询("订单状态") | ❌ 不走向量库 | 走 SQL/API 更合适 |
| 创意写作("写一首诗") | ❌ | 检索反而限制创造力 |
怎么判断是不是私有知识?三种策略
策略一:先检索,用分数说话(⭐ 生产首选)
核心思路:不猜,每次都检索,根据相关性分数决定是否使用结果。
python
def smart_rag(query, retriever, llm):
# 每次都检索
results = retriever.similarity_search_with_score(query, k=5)
top_score = results[0][1] if results else 0
if top_score > 0.75:
# 高相关 → 知识库命中 → 用 RAG
context = "\n".join([doc.page_content for doc, _ in results])
return rag_answer(query, context, llm)
else:
# 低相关 → 知识库没有 → LLM 直接答
return direct_answer(query, llm)为什么推荐:向量检索只需 10-20ms,成本远低于判断错误的代价。
策略二:LLM 意图分类
关键在于告诉 LLM 知识库里有什么类目:
python
ROUTER_PROMPT = """根据用户问题,判断是否需要检索知识库。
我们的知识库包含:
- 公司规章制度(考勤、年假、报销等)
- 产品文档(功能说明、API 文档)
- 技术方案(架构设计、部署文档)
涉及以上内容 → 返回 "rag"
通用知识/闲聊 → 返回 "direct"
用户问题:{query}"""策略三:双重验证(高要求场景)
策略一 + 策略二组合:先 LLM 分类,再检索验证分数。适用于金融、法律等对准确性要求极高的场景。
方案选型
| 方案 | 准确度 | 延迟开销 | 推荐场景 |
|---|---|---|---|
| 每次检索 + 分数阈值 | ⭐⭐⭐⭐ | +15ms | 大多数场景(首选) |
| LLM 意图分类 | ⭐⭐⭐ | +300ms | 知识库边界清晰 |
| 双重验证 | ⭐⭐⭐⭐⭐ | +315ms | 金融、法律等高要求场景 |
💡 一句话总结:不要试图"猜"用户是不是在问私有知识——每次都检索,用分数说话。只有当检索本身成本很高时,才值得加一层路由判断。