RAG技术完全指南(四):RAG文档处理四步优化法

一、文档解析:多格式支持与增强方案

一般情况下,文档解析分为以下几个步骤:

  1. 文档加载:将文档加载到内存中。
  2. 格式转换:将文档转换为统一的格式,如 HTML 或 Markdown。
  3. 元数据提取:从文档中提取元数据,如标题、作者、日期等。
  4. 结构化处理:将文档转换为结构化的数据,如段落、标题、列表等。

LlamaIndex 原生支持解析 PDF、Word、Markdown、JSON、CSV、HTML 等多种文件格式,并提供了丰富的配置选项,以满足不同场景下的需求。但是存在一些复杂的文本格式(扫描件、复杂表格等),此时,便需要引入 其他解析技术(使用 OCR 技术处理扫描件等),对文档进行预处理,提升文档解析效果。

二、文档切分:语义分块优化策略

2.1 分块三要素

要素 说明 推荐值
块大小 每段文字的长度 200-500 字
块重叠 相邻块重复内容 10%-20%
切分依据 按句子/段落/语义划分 语义分割最优

2.2 分块策略对比表

策略类型 优点 缺点 适用场景
固定大小 实现简单 可能切断完整语义 技术文档
按段落分割 保持逻辑完整性 段落长度差异大 文学小说
语义分割 确保内容完整性 计算资源消耗较大 专业领域文档

2.3 分块常见问题

  1. 如何确定最佳块大小?
    测试不同尺寸查看检索效果

    1
    2
    3
    4
    5
    #测试块大小对召回率的影响
    sizes = [128, 256, 512]
    for size in sizes:
    test_recall = evaluate_chunk_size(size)
    print(f"块大小{size} → 召回率{test_recall:.2f}%")
  2. 分块重叠是否越多越好?
    适当重叠(10-20%)可防止信息断裂,但过多会导致冗余

三、提升召回率:多粒度检索技术

3.1 什么是召回率

低召回率:检索结果中包含的文档数量较少,可能无法满足用户需求
高召回率:检索结果中包含的文档数量较多,能够满足用户需求

3.2 提升召回率的三大策略

  1. 查询扩展:将用户查询扩展为多个相关查询,提高检索结果的多样性
    例如:用户查询“Python 编程”,可以扩展为“Python 编程入门”、“Python 编程进阶”、“Python 编程实战”等

  2. 混合检索:结合两种搜索方式
    例如:关键词搜索 + 语义搜索

  3. 向量优化:进行微调
    例如:微调前:”Transformer” → 理解为”变形金刚”
    微调后:”Transformer” → 识别为”深度学习模型”

效果验证方法:

  1. 准备测试问题集(至少 50 个典型问题)
  2. 记录基础方案召回率
  3. 应用优化策略后再次测试
  4. 对比提升幅度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 案例1:向量检索
from llama_index.core import VectorStoreIndex
vector_index = VectorStoreIndex(nodes)
vector_retriever = vector_index.as_retriever(similarity_top_k=3)
print("向量检索结果:", [node.text[:30] for node in
vector_retriever.retrieve(query)])
# 案例2:混合检索
from llama_index.core import KeywordTableIndex
keyword_retriever = KeywordTableIndex(nodes).as_retriever(retriever_mode="bm25",
similarity_top_k=3)
from llama_index.core.retrievers import QueryFusionRetriever
fusion_retriever = QueryFusionRetriever([vector_retriever, keyword_retriever])
print("混合检索结果:", [node.text[:30] for node in
fusion_retriever.retrieve(query)])

四、重排序:精准结果排序优化

4.1 什么要重排序?

  • 基于关键词的检索结果可能存在不相关的情况
  • 基于向量的检索结果可能存在相关度不高的现象

4.2 常见排序模型对比

模型名称 速度 精度 硬件要求 适用场景
BM25 关键词匹配
Cross-Encoder 小规模精准排序
ColBERT 平衡速度与精度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 初始检索结果(按相似度排序):
results = [
"模型正则化方法简述",# 相关度0.7
"硬件加速技术进展",# 相关度0.65
"过拟合解决方案详解",# 相关度0.92 ← 正确答案
"数据集清洗方法"
]
# 应用重排序
from llama_index.postprocessor.cohere_rerank import CohereRerank
reranker = CohereRerank(api_key="YOUR_KEY", top_n=2)
reranked_results = reranker.postprocess_nodes(results, query_str=query)
print("重排序后结果:", [res.text for res in reranked_results])

# 原始排序:
# 1. 模型正则化方法简述(相关度0.7)
# 2. 硬件加速技术进展(相关度0.65)
# 3. 过拟合解决方案详解(相关度0.92)← 正确答案
# 4. 数据集清洗方法
# 重排序后:
# 1. 过拟合解决方案详解(评分0.95)← 正确答案
# 2. 模型正则化方法简述(评分0.88)

RAG技术完全指南(四):RAG文档处理四步优化法
https://blog.echo-silence.top/posts/a3e130c6.html
作者
极客奶爸
发布于
2025年5月21日
许可协议