第 19 期:检索精进 — Hybrid Search、Re-Ranking 与多角度检索

⏱ 预计阅读 10 分钟 更新于 2026/4/9

基础 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:#fff

1. 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 知识管理系统——包含自动增量更新、过期文档清理与检索质量监控。