# 5.5 混合检索与高级检索增强生成

## 5.5.1 混合检索

**混合检索**（Hybrid Search）结合多种检索方法的优势，是当前 [RAG](/context_engineering_guide/di-er-bu-fen-he-xin-ji-shu-yu-ce-le/05_select/5.1_rag_principles.md) 实践的标准配置。

### 语义检索与关键词检索对比

| 特性   | 语义检索       | 关键词检索   |
| ---- | ---------- | ------- |
| 优势   | 理解语义、处理同义词 | 精确匹配、高速 |
| 劣势   | 可能忽略关键词    | 无法处理语义  |
| 典型场景 | 开放式问题      | 专有名词、代码 |

### 混合检索实现

{% @mermaid/diagram content="graph TB
A\["查询"] --> B\["语义检索"]
A --> C\["关键词检索"]
B --> D\["结果融合"]
C --> D
D --> E\["重排序"]
E --> F\["最终结果"]" %}

图 5-7：混合检索流程

**分数融合策略**：

**简单加权**

```
融合分数 = α × 语义分数 + (1-α) × 关键词分数
```

**倒数排名融合（RRF）**

```
RRF(d) = Σ 1/(k + rank_i(d))
```

RRF 不依赖原始分数，只使用排名，更加鲁棒。

## 5.5.2 高级检索增强生成技术

### 查询转换

在检索前对查询进行增强：

**查询扩展**

扩大查询覆盖范围：

* 同义词扩展
* 相关术语添加
* 多语言翻译

**查询分解**

将复杂查询拆分：

```
原始查询：比较 A 产品和 B 产品在性能和价格方面的差异
分解为：
- A 产品的性能
- B 产品的性能
- A 产品的价格
- B 产品的价格
```

**假设文档生成（HyDE）**

生成假设的答案，用其嵌入进行检索：

1. 让 LLM 生成假设答案
2. 将假设答案转换为嵌入
3. 用假设答案的嵌入检索

### 多跳检索

对于需要多步推理的问题，迭代检索：

{% @mermaid/diagram content="graph LR
A\["初始查询"] --> B\["第一跳检索"]
B --> C\["提取关键信息"]
C --> D\["生成新查询"]
D --> E\["第二跳检索"]
E --> F\["综合结果"]" %}

图 5-8：多跳检索流程

应用场景：

* 需要背景知识支持的问题
* 涉及多个实体关系的问题

### 自适应检索

根据查询特点动态调整策略：

**路由机制**

根据查询类型选择不同检索路径：

* 事实查询 → 精确检索
* 概念查询 → 语义检索
* 对比查询 → 多路检索

**无需检索的识别**

并非所有查询都需要检索：

* 常识问题：模型本身知识足够
* 创意任务：不需要外部事实

### 上下文增强

丰富检索结果的上下文：

**父子块策略**

* 使用小块检索：precision
* 返回大块内容：context

```
小块（检索用）: 约 200 Token
大块（返回用）: 约 1000 Token
```

**滑动窗口扩展**

检索到某块后，自动包含相邻块。

**元数据增强**

将来源、章节等元数据附加到结果中。

## 5.5.3 检索增强生成评估框架

### 组件级评估

分别评估 RAG 各组件：

| 组件  | 评估指标            |
| --- | --------------- |
| 检索  | Recall、MRR、NDCG |
| 生成  | 准确性、完整性、一致性     |
| 端到端 | 用户满意度、任务成功率     |

### 常用评估工具

* **RAGAS**：自动化 RAG 评估框架
* **TruLens**：RAG 质量监控
* **人工评估**：复杂场景仍需人工判断

## 5.5.4 检索增强生成调优策略

**问题诊断**

常见问题及对策：

* 检索不到相关内容 → 优化分块/嵌入
* 检索质量低 → 添加重排序
* 生成答案错误 → 优化提示词，加入约束

**迭代优化**

1. 收集失败案例
2. 分析失败原因
3. 针对性优化
4. 验证效果
5. 持续监控


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/context_engineering_guide/di-er-bu-fen-he-xin-ji-shu-yu-ce-le/05_select/5.5_hybrid_search.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
