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 评估结果,找到最适合你需求的方案。学习的过程就是不断尝试和调整的过程!

相关推荐
子午1 小时前
基于Python深度学习【眼疾识别】系统设计与实现+人工智能+机器学习+TensorFlow算法
人工智能·python·深度学习
云天徽上2 小时前
【数据可视化-11】全国大学数据可视化分析
人工智能·机器学习·信息可视化·数据挖掘·数据分析
小馋喵知识杂货铺2 小时前
pytest 截图功能
开发语言·python
李洋-蛟龙腾飞公司2 小时前
HarmonyOS NEXT 应用开发练习:AI智能语音播报
人工智能·harmonyos
JAMES费4 小时前
《Hands on Large Language Models》(深入浅出大型语言模型)实战书探秘
人工智能·语言模型·自然语言处理
XianxinMao4 小时前
MemGPT:赋能大型语言模型的自我记忆管理
人工智能·语言模型
酒酿小圆子~5 小时前
NLP中常见的分词算法(BPE、WordPiece、Unigram、SentencePiece)
人工智能·算法·自然语言处理
find_starshine5 小时前
xml-dota-yolo数据集格式转换
xml·python·yolo
blues_C6 小时前
Pytest-Bdd-Playwright 系列教程(完结篇):本框架的功能参数说明
自动化测试·python·pytest·测试框架·bdd