第 19 期:检索精进 — Hybrid Search、Re-Ranking 与多角度检索
基础 RAG 的三大痛点
graph TB
subgraph "基础 RAG 的局限"
P1["😤 痛点 1: 语义漂移
用户说'退换货',知识库用'退款'
→ 向量搜索匹配不到"]
P2["😤 痛点 2: 噪声过多
Top-K 返回的块相关度参差不齐
→ LLM 被无关信息干扰"]
P3["😤 痛点 3: 角度单一
用户的问题可能涉及多个知识面
→ 单次搜索只覆盖一个角度"]
end
P1 --> S1["✅ 解法: Hybrid Search"]
P2 --> S2["✅ 解法: Re-Ranking"]
P3 --> S3["✅ 解法: Multi-Query"]
style S1 fill:#22c55e,stroke:#16a34a,color:#fff
style S2 fill:#22c55e,stroke:#16a34a,color:#fff
style S3 fill:#22c55e,stroke:#16a34a,color:#fff1. Hybrid Search(混合搜索)
将向量语义搜索与传统关键词搜索 (BM25) 结合,取两者的并集。
graph TB
Query["❓ 用户: '如何退换货?'"]
Query --> Semantic["🧮 向量搜索
语义: '退换货' ≈ '退款流程'
找到: 退款政策文档 ✅"]
Query --> Keyword["🔤 关键词搜索 (BM25)
精确匹配: '退换货' 这三个字
找到: 退换货条款 ✅"]
Semantic --> Merge["🔗 合并 + 去重"]
Keyword --> Merge
Merge --> Result["📑 更全面的检索结果
既有语义匹配,又有精确匹配"]
style Merge fill:#f59e0b,stroke:#d97706,color:#fff// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// n8n 中实现 Hybrid Search
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 方案 1: Qdrant 原生支持
// Qdrant 集合配置中启用 "Full-Text Index":
// → 同一个集合同时支持向量搜索 + BM25 全文搜索
// → 在 n8n 的 Qdrant 节点中设置 Search Mode: "Hybrid"
// 方案 2: 手动双路合并 (更通用)
// 路径 A: Vector Store Tool → 语义搜索结果
// 路径 B: Code 节点 → 调用 Qdrant Scroll API (关键词过滤)
// Merge 节点 → 合并两路结果 → 去重
// Qdrant Hybrid 搜索的权重配置:
// - vector_weight: 0.7 // 语义匹配权重 70%
// - keyword_weight: 0.3 // 关键词匹配权重 30%
// 根据数据特性调整:
// 技术文档 → 关键词权重更高 (精确术语重要)
// 通用客服 → 语义权重更高 (用户表达方式多变)
2. Re-Ranking(重排序)
检索出 Top-20 粗排结果后,用一个专门的排序模型对相关性做精细排序,只保留 Top-5 最优。
graph TB
Query["❓ 用户问题"] --> Search["🔍 粗排: 向量搜索
Top-20"]
Search --> Rerank["🏆 精排: Re-Ranking 模型
对 20 个结果重新打分"]
Rerank --> Top5["📑 Top-5 最相关结果"]
Top5 --> LLM["🤖 LLM 生成回答"]
subgraph "Re-Ranking 打分示例"
R1["块 #7: '退款需在 30 天内申请' → 0.95 ⭐"]
R2["块 #3: '退款流程: 第一步...' → 0.91"]
R3["块 #12: '发票退款说明' → 0.87"]
R4["块 #1: '关于退款的常见问题' → 0.82"]
R5["块 #15: '退款到账时间' → 0.78"]
end
style Rerank fill:#8b5cf6,stroke:#7c3aed,color:#fff// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// n8n 中实现 Re-Ranking
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 方案 1: 使用 Cohere Re-Rank API
// 在 Code 节点中调用:
const chunks = $input.all().map(item => item.json.text);
const query = $('Chat Trigger').first().json.chatInput;
const response = await fetch('https://api.cohere.ai/v1/rerank', {
method: 'POST',
headers: {
'Authorization': `Bearer ${$env.COHERE_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'rerank-v3.5',
query: query,
documents: chunks,
top_n: 5 // 只保留排名前 5 的
})
});
const result = await response.json();
// result.results = [
// { index: 6, relevance_score: 0.95 },
// { index: 2, relevance_score: 0.91 },
// ...
// ]
// 方案 2: 用 LLM 作为 Reranker (更简单但更贵)
// Prompt: "以下是 10 段文档。请根据与问题的相关性排序,只返回前 5 个编号。"
3. Multi-Query(多角度检索)
让 LLM 先将用户的原始问题改写为 3-5 个不同角度的子查询,分别搜索后合并结果。
graph TB
Original["❓ 原始问题:
'n8n 部署到阿里云后 Webhook 收不到消息'"]
Original --> LLM["🧠 LLM 改写为 3 个子查询"]
LLM --> Q1["🔍 查询1: 'n8n Webhook 配置教程'"]
LLM --> Q2["🔍 查询2: '阿里云安全组 端口 5678 放行'"]
LLM --> Q3["🔍 查询3: 'WEBHOOK_URL 环境变量设置'"]
Q1 --> VDB["💾 Qdrant"]
Q2 --> VDB
Q3 --> VDB
VDB --> Merge["🔗 合并去重
取并集"]
Merge --> Final["📑 覆盖面更广的检索结果"]
style LLM fill:#8b5cf6,stroke:#7c3aed,color:#fff
style Merge fill:#f59e0b,stroke:#d97706,color:#fff// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Multi-Query 实现 (n8n Code 节点)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Step 1: 用 LLM 生成子查询
const originalQuery = $input.first().json.chatInput;
// 在 Basic LLM Chain 中使用以下 Prompt:
// """
// 你是一个搜索查询优化器。
// 将以下用户问题改写为 3 个不同角度的搜索查询,用于检索知识库。
// 每个查询应该覆盖问题的不同方面。
// 用 JSON 数组格式输出: ["查询1", "查询2", "查询3"]
// 原始问题: {originalQuery}
// """
// Step 2: 对每个子查询执行向量搜索 (Loop Over Items)
// Step 3: 合并去重 (Merge 节点 + Remove Duplicates)
优化策略对比
| 策略 | 复杂度 | 效果提升 | 额外成本 | 推荐场景 |
|---|---|---|---|---|
| Hybrid Search | ⭐⭐ | 召回率 +30% | 极低 | 技术文档/精确术语 |
| Re-Ranking | ⭐⭐⭐ | 精度 +40% | Cohere API 费用 | 结果质量要求高 |
| Multi-Query | ⭐⭐ | 覆盖面 +50% | 额外 LLM 调用 | 复杂/模糊问题 |
| Hybrid + Rerank | ⭐⭐⭐⭐ | 综合 +60% | 中等 | 生产级 RAG |
下一步
Ep 20 将构建一个完整的 企业级 RAG 知识管理系统——包含自动增量更新、过期文档清理与检索质量监控。