LLM大语言模型中RAG切片阶段改进策略

切片方法的特点和示例:

Token 切片

适合对 Token 数量有严格要求的场景,比如使用上下文长度较小的模型时。

示例文本: "LlamaIndex是一个强大的RAG框架。它提供了多种文档处理方式。用可以根据需选择合适的方法。"

使用Token切片(chunk_size=10)后可能的结果:

切片1: "LlamaIndex是一个强大的RAG"

切片2: "框架。它提供了多种文"

切片3: "档处理方式。用户可以"

python 复制代码
token_splitter = TokenTextSplitter(
    chunk_size=1024,
    chunk_overlap=20
)
evaluate_splitter(token_splitter, documents, question, ground_truth, "Token")

句子切片

这是默认的切片策略,会保持句子的完整性。

同样的文本使用句子切片后:

切片1: "LlamaIndex是一个强大的RAG框架。"

切片2: "它提供了多种文档处理方式。"

切片3: "用户可以根据需求选择合适的方法。"

python 复制代码
sentence_splitter = SentenceSplitter(
    chunk_size=512,
    chunk_overlap=50
)
evaluate_splitter(sentence_splitter, documents, question, ground_truth, "Sentence")

句子窗口切片

每个切片都包含周围的句子作为上下文窗口。

示例文本使用句子窗口切片(window_size=1)后:

切片1: "LlamaIndex是一个强大的RAG框架。" 上下文: "它提供了多种文档处理方式。"

切片2: "它提供了多种文档处理方式。" 上下文: "LlamaIndex是一个强大的RAG框架。用户可以根据需求选择合适的方法。"

切片3: "用户可以根据需求选择合适的方法。" 上下文: "它提供了多种文档处理方式。"

python 复制代码
sentence_window_splitter = SentenceWindowNodeParser.from_defaults(
    window_size=3,
    window_metadata_key="window",
    original_text_metadata_key="original_text"
)
# 注意:句子窗口切片需要特殊的后处理器
query_engine = index.as_query_engine(
    similarity_top_k=5,
    streaming=True,
    node_postprocessors=[MetadataReplacementPostProcessor(target_metadata_key="window")]
)
evaluate_splitter(sentence_window_splitter, documents, question, ground_truth, "Sentence Window")

语义切片

根据语义相关性自适应地选择切片点。

示例文本: "LlamaIndex是一个强大的RAG框架。它提供了多种文档处理方式。用户可以根据需求选择合适的方法。此外,它还支持向量检索。这种检索方式非常高效。"

语义切片可能的结果:

切片1: "LlamaIndex是一个强大的RAG框架。它提供了多种文档处理方式。用户可以根据需求选择合适的方法。"

切片2: "此外,它还支持向量检索。这种检索方式非常高效。" (注意这里是按语义相关性分组的)

python 复制代码
semantic_splitter = SemanticSplitterNodeParser(
    buffer_size=1,
    breakpoint_percentile_threshold=95,
    embed_model=Settings.embed_model
)
evaluate_splitter(semantic_splitter, documents, question, ground_truth, "Semantic")

Markdown 切片

专门针对 Markdown 文档优化的切片方法。

示例 Markdown 文本:

markup 复制代码
# RAG框架
LlamaIndex是一个强大的RAG框架。

## 特点
- 提供多种文档处理方式
- 支持向量检索
- 使用简单方便

### 详细说明
用户可以根据需求选择合适的方法。

Markdown切片会根据标题层级进行智能分割:

切片1: "# RAG框架\nLlamaIndex是一个强大的RAG框架。"

切片2: "## 特点\n- 提供多种文档处理方式\n- 支持向量检索\n- 使用简单方便"

切片3: "### 详细说明\n用户可以根据需求选择合适的方法。"

python 复制代码
markdown_splitter = MarkdownNodeParser()
evaluate_splitter(markdown_splitter, documents, question, ground_truth, "Markdown")

在实际应用中,选择切片方法时不必过于纠结,你可以这样思考:

如果你刚开始接触 RAG,建议先使用默认的句子切片方法,它在大多数场景下都能提供不错的效果

当你发现检索结果不够理想时,可以尝试:

处理长文档且需要保持上下文?试试句子窗口切片

文档逻辑性强、内容专业?语义切片可能会有帮助

模型总是报 Token 超限?Token 切片可以帮你精确控制

处理 Markdown 文档?别忘了有专门的 Markdown 切片

切片改进策略

在文档解析与切片阶段,从参考信息完整度的角度,我们可以把可能出现的问题分为两大类:参考信息缺失、干扰信息过多。

参考信息缺失

1.没有相关文档

没有相关文档时,新增相关文档。

2.有相关知识文档,但和用户问题的表述方式不接近

比如说文档里面叫AA,但用户习惯性叫bb,召回阶段召回不出,但AA和bb是同一类东西,这时需要优化知识文档,比如在AA旁边加个括号注解,AA(bb)

3.文档类型不统一,部分格式的文档不支持

例如PDF文件里面或网页里面有图片信息,需要对文件解析器优化,加入图片解析器,例如加入OCR技术提取文件内容。

4.已支持解析的文档格式里,存在一些特殊内容

优化解析器,对特殊内容进行转换。

5.文档切片长度过短,有效信息被截断

增加切片长度,根据业务需求选择根据合适的切片攻略。

干扰信息过多

1.文档中有很多主题接近的内容

比如工作手册文档中,需求分析,开发,发布等每个阶段都有注意事项,操作指引。我们可以扩写文档标题和子标题,例如【注意事项】=>【需求分析>注意事项】

或者,建立文档元数据(打标)

2.文档切片过大,引入过多干扰项

减少切片长度,根据业务需求选择根据合适的切片攻略。

深入优化chunk切分模式

每个chunk都包含了一些有用的信息,RAG 根据用户的问题寻找某个知识时,可以迅速定位到与答案相关信息的chunk,而不是在整个数据库中盲目搜索。

因此,通过精心设计的chunk切分策略,系统能够更高效地检索信息,就像图书馆里按照类别和标签整理书籍一样,使得查找特定内容变得容易。

优化chunk切分模式,就能加速信息检索、提升回答质量和生成效率。具体方法有很多:

利用领域知识

针对特定领域的文档,利用领域专有知识进行更精准的切分。例如,在法律文档中识别段落编号、条款作为切分依据。

基于固定大小切分

比如默认采用128个词或512个词切分为一个chunk,可以快速实现文本分块。缺点是忽略了语义和上下文完整性。

上下文感知

在切分时考虑前后文关系,避免信息断裂。可以通过保持特定句对或短语相邻,或使用更复杂的算法识别并保留语义完整性。最简单的做法是切分时保留前一句和后一句话。

你也可以使用自然语言处理技术识别语义单元,如通过句子相似度计算、主题模型(如LDA)或BERT嵌入聚类来切分文本,确保每个chunk内部语义连贯,减少跨chunk信息依赖。

句子滑动窗口检索

这个策略是通过设置window_size(窗口大小)来调整提取句子的数量,当用户的问题匹配到一个chunk语料块时,通过窗函数提取目标语料块的上下文,而不仅仅是语料块本身,这样来获得更完整的语料上下文信息,提升RAG生成质量。

自动合并检索

这个策略是将文档分块,建成一棵语料块的树,比如1024切分、512切分、128切分,并构造出一棵文档结构树。当应用作搜索时,如果同一个父节点的多个叶子节点被选中,则返回整个父节点对应的语料块。

从而确保与问题相关的语料信息被完整保留下来,从而大幅提升RAG的生成质量。(比句子滑动窗口检索效果好)

总结

没有最好的切片方法,只有最适合你场景的方法。你可以尝试不同的切片方法,观察 Ragas 评估结果,找到最适合你需求的方案。学习的过程就是不断尝试和调整的过程!

相关推荐
数据智能老司机11 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机11 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机11 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i11 小时前
drf初步梳理
python·django
每日AI新事件11 小时前
python的异步函数
python
这里有鱼汤12 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
aneasystone本尊13 小时前
学习 Chat2Graph 的知识库服务
人工智能
IT_陈寒13 小时前
Redis 性能翻倍的 7 个冷门技巧,第 5 个大多数人都不知道!
前端·人工智能·后端
databook1 天前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室1 天前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python