1. RAG召回质量优化全景图
当RAG系统召回结果不尽如人意时,我们需要从检索全链路进行系统性优化。根据实际项目经验,召回不准的问题通常出现在以下四个关键环节:
- 文本分块(Chunking)阶段:不合理的chunk策略导致语义完整性破坏
- 查询理解(Prompt)阶段:原始query未经过优化直接用于检索
- 排序(Rerank)阶段:仅依赖向量相似度而忽略语义相关性
- 结果筛选(Top_k)阶段:固定k值策略不适应多变的查询需求
1.1 问题定位方法论
在开始优化前,建议先通过以下诊断流程定位问题根源:
mermaid复制graph TD
A[召回结果评估] --> B{相关文档是否在库中?}
B -->|否| C[检查数据覆盖度]
B -->|是| D{文档分块是否合理?}
D -->|否| E[优化chunk策略]
D -->|是| F{query表达是否准确?}
F -->|否| G[改进prompt工程]
F -->|是| H{排序策略是否合适?}
H -->|否| I[引入rerank模型]
H -->|是| J[调整top_k策略]
实战经验:建议使用LlamaIndex的评估模块或自定义评估函数,对每个环节进行量化分析。我们团队常用的评估指标包括:
- Hit Rate@k
- MRR(Mean Reciprocal Rank)
- NDCG(Normalized Discounted Cumulative Gain)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Chunk策略深度优化
2.1 动态分块技术
传统固定大小的分块方式(如512 tokens)会破坏文本的语义完整性。我们采用基于语义的动态分块策略:
python复制from langchain.text_splitter import SemanticChunker
from langchain.embeddings import HuggingFaceEmbeddings
embedder = HuggingFaceEmbeddings(model_name="BAAI/bge-small-en")
text_splitter = SemanticChunker(
embedder,
breakpoint_threshold_type="percentile",
breakpoint_threshold=0.8
)
chunks = text_splitter.create_documents([long_text])
关键参数说明:
breakpoint_threshold_type:支持percentile/standard_deviation/absolutebreakpoint_threshold:建议0.7-0.9之间调整
2.2 分层分块架构
对于复杂文档(如技术手册),我们采用三级分块策略:
- 文档级:保留整体结构信息
- 章节级:按逻辑章节划分
- 段落级:细粒度语义单元
python复制class HierarchicalChunker:
def __init__(self, max_chunk_sizes=[2000, 800, 300]):
self.sizes = max_chunk_sizes
def chunk(self, document):
results = []
# 第一级分块
for section in document.sections:
if len(section) > self.sizes[0]:
# 第二级分块
for subsection in section.split('\n\n'):
if len(subsection) > self.sizes[1]:
# 第三级分块
for para in subsection.split('.'):
if para: results.append(para)
