原文:https://mp.weixin.qq.com/s/Yax05qsVj1tXi77za8Wm2g
欢迎关注公zh: AI-Frontiers
RAG往期文章推荐
收藏!RAG核心工具大全: 7大解析工具+向量模型+数据库+检索排序
GraphRAG开源生态全景:6大主流开源项目,微软/蚂蚁/港大项目同台PK
**检索增强生成(RAG)**将 LLM 与信息检索系统相结合,以生成更准确、更符合上下文的响应。通过从外部文档中获取相关信息,解决了LLM固有的一些问题:
-
幻觉问题 (Hallucination):当被问到知识盲区或不确定的内容时,大模型容易一本正经地编造看似合理但完全虚构的细节。比如,你问「蓝鳍X9的新型芯片性能如何?」,如果模型在训练时没学过,它可能会凭空捏造出这款芯片的参数、性能和评价。
-
知识固化与过时:无法知晓训练截止日期之后发生的事,比如,你问「2026年世界杯决赛结果如何?」,模型只能回答「我的知识截止到某年某月,无法提供最新信息」或者胡编一个结果。
-
缺乏领域深度与可溯源性 : 在回答高度专业或企业内部独有的问题时,往往不够深入,最关键的是,无法知道答案来自哪里。
RAG 的一个关键组成部分是「分块」: 将大型文档分割成更小、更易于管理的部分。然后对这些块进行索引,并在检索阶段使用这些块,为语言模型提供上下文相关的信息。
为什么分块很重要
在 RAG 中,分块有多种用途:
① 决定检索的命中精度与召回率
-
块太大:如一整章,细节问题易被噪音干扰,模型难以找关键信息,回答不精确或产生幻觉
-
块太小:如单个句子,丢失上下文,导致召回失败
-
理想情况:块应包含独立、完整的语义单元(如一个概念的解释、一个问答对),兼顾语义完整与检索精度
② 突破大模型的上下文窗口与注意力限制
-
上下文窗口限制:模型处理能力有限,超长文档无法一次输入。即使窗口够大,全文检索也面临速度慢、成本高、易被无关信息干扰等问题。分块是海量知识"索引化"的关键
-
注意力稀释效应:输入整本书时,模型注意力被分散。给出少量精准、高相关度的"知识卡片",能让注意力集中,提升回答质量
③ 直接影响生成答案的连贯性与完整性
- 合理分块能提供信息丰富、边界清晰的完整文本,便于模型提炼答案。分块破碎则输入碎片化,生成内容易前言不搭后语
分块策略概述
文本分块策略因其划分文本的方式和保留的上下文层次而异。主要包括:
-
固定长度分块
-
基于句子的分块
-
基于段落的分块
-
滑动窗口分块
-
语义分块
-
递归分块
-
上下文增强型分块
-
特定模态分块
-
代理分块
-
子文档分块
-
混合分块
每种方法都有其独特的优势、适用于特定的应用场景。本文将详细介绍每种分块方法,比较不同的分块策略,探讨 如何选择合适的分块策略 ,并了解在 RAG 中实施分块的****最佳实践。
固定长度分块
原理:将文本分割成预定义长度的块,通常基于标记或字符
适用场景:简单的文档、常见问题解答,或者处理速度是首要考虑因素的情况
优势:
-
简单易行:无需复杂算法即可轻松实现
-
统一性:生成一致的块大小,简化索引
挑战:
-
上下文丢失:可能导致句子或想法断裂,从而造成信息不完整
-
相关性问题:关键信息可能跨越多个数据块,从而降低检索效率
实施技巧:
-
选择合适的块大小,兼顾上下文和效率
-
考虑结合重叠窗口来减少上下文丢失
基于句子的分块
原理:在句子边界处分割文本,确保每个部分都是一个完整的思想
适用场景:简短、直接的回复,例如客户查询或对话式人工智能
优势:
-
上下文保留:保持单个句子的完整性
-
易于实施:利用自然语言处理(NLP)工具进行句子检测
挑战:
-
上下文有限:单个句子可能缺乏足够的上下文信息来回答复杂的问题
-
长度可变:句子长度可能不同,导致句子块大小不一致
实施技巧:
-
使用自然语言处理库进行精确的句子边界检测
-
如果多个句子较短,请将它们合并成一个更完整的句子
基于段落的分块
原理:将文档拆分成段落,每个段落通常包含一个完整的想法或主题
适用场景:结构化文档,如文章、报告或论文
优势:
-
更丰富的语境:提供比基于句子的片段更多信息
-
逻辑划分:与文本的自然结构一致
挑战:
-
大小不一致:段落长度可能差异很大
-
标记限制:较长的段落可能会超出模型的上下文长度限制
实施技巧:
-
监控数据块大小,确保其保持在可接受的 token 限制范围内
-
如有必要,可将较长的段落进一步拆分,同时尽量保持上下文连贯性
滑动窗口分块
原理:通过在文本上滑动窗口来创建重叠的文本块,确保相邻的文本块共享内容
适用场景:需要保持各部分之间上下文联系的文档,例如法律或医学文本
优势:
-
上下文连续性:重叠部分有助于保持信息的流畅性
-
改进检索:提高检索结果中包含相关信息的概率
挑战:
-
冗余:内容重叠会导致信息重复
-
计算成本:数据块越多,处理和存储需求就越高
实施技巧:
-
根据文档性质优化窗口大小和重叠部分
-
在检索过程中使用去重技术来处理冗余数据
语义分块
原理:利用 embedding 或机器学习模型,根据语义含义分割文本,确保每个部分在主题或思想上是连贯的
适用场景:需要深入理解的复杂查询,例如技术手册或学术论文
优势:
-
上下文相关性:数据块按有意义的方式分组,从而提高检索准确率
-
灵活性:能够适应文本固有的结构和内容
挑战:
-
复杂性:需要高级自然语言处理模型和计算资源
-
处理时间:语义分析可能很耗时
实施技巧:
-
利用预训练模型进行语义分割
-
计算成本与语义块粒度之间的平衡
递归分块
原理:使用字符、标题、副标题、段落和句子等层次分隔符,将文本逐步分解成更小的部分
适用场景:大型、层级结构化的文档,如书籍或篇幅较长的报告。
优势:
-
层级上下文:维护文档的结构关系
-
可扩展性:对超大型文本有效
挑战:
-
实现复杂:需要处理多层文本结构
-
潜在的上下文丢失:即使是最小的数据块,如果管理不当,也可能丢失上下文
实施技巧:
-
利用文档结构(如 HTML 标签)来识别层次结构
-
存储有关每个数据块在层次结构中的位置的元数据,以便在检索时提供上下文信息
上下文增强型分块
原理:通过添加来自周围块的摘要或元数据来丰富每个块,从而在序列之间保持上下文
适合场景:篇幅较长、需要保证多个部分之间连贯性的文档
优势:
-
增强上下文:提供额外信息,而不会显著增加数据块大小
-
提高一致性:帮助模型生成更准确、更符合语境的响应
挑战:
-
复杂性:需要额外的处理才能生成摘要或元数据
-
存储开销:增强型数据块会占用更多存储空间
实施技巧:
-
生成简洁的摘要,以最大限度地减少额外的令牌使用
-
考虑将关键术语或概念作为元数据包含在内,而不是提供完整的摘要
特定模态分块
原理:分别处理不同的内容类型(文本、表格、图像),并根据其性质对每种内容进行分块处理
适合场景:混合媒体文档,例如科学论文或用户手册
优势:
-
定制化方法:针对每种内容类型优化分块
-
提高准确率:专门的处理可以提高检索效率
挑战:
-
实现复杂度:每种模态都需要自定义逻辑
-
整合难度:在检索过程中整合来自不同模态的信息可能具有挑战性
实施技巧:
-
使用OCR识别包含文本的图像
-
将表格转换为结构化数据格式
-
保持不同模式下索引系统的一致性
代理分块
原理:采用大型语言模型 (LLM) 分析文本,并根据内容结构和语义建议块边界
适用场景:需要保留含义和上下文的复杂文档
优势:
-
智能分割:利用 LLM 的理解能力创建有意义的块
-
适应性强:能够有效处理多样化和非结构化的内容
挑战:
-
计算密集型:处理整个文档需要大量资源
-
成本:由于计算成本,可能不适用于大规模应用
实施技巧:
-
对关键文档有选择地使用主体分块
-
优化 LLM 提示,使其能够高效地识别逻辑块边界
子文档分块
原理:对整个文档或大段内容进行总结,并将这些总结作为元数据附加到各个部分
适用场景:提高大型文档集合的检索效率
优势:
-
分层检索:允许检索系统在多个上下文级别上运行
-
上下文深度:为模型提供额外的信息层
挑战:
-
额外处理:需要生成和管理摘要
-
元数据管理:增加了索引系统的复杂性
实施技巧:
-
利用自然语言处理技术实现摘要过程自动化
-
高效存储汇总信息,以最大限度地减少对存储空间的影响
混合分块
原理:结合多种分块策略,动态适应不同的查询类型或文档结构
适用场景:能够处理各种查询和文档类型的多功能系统
优势:
-
灵活性:可根据内容和需求切换策略
-
性能优化:在各种使用场景下平衡速度和准确性
挑战:
-
复杂逻辑:需要复杂的决策算法
-
维护:组件越多,出错的可能性就越大
实施技巧:
-
制定选择分块策略的标准(例如,文档类型、查询复杂度)
-
对混合方法进行广泛的测试和验证,以确保其可靠性
分块策略的比较分析
| 分块 策略 | 上下文 保留度 | 实现 复杂度 | 计算 成本 | 最适合场景 |
| 固定长度分块 | 低 | 低 | 低 | 简单文档,对速度要求高的应用场景 |
| 基于句子的分块 | 中 | 低 | 低 | 短查询,对话式人工智能 |
| 基于段落的分块 | 中高 | 低 | 中 | 结构化文档 |
| 滑动窗口分块 | 高 | 中 | 高 | 对上下文要求高的文本 |
| 语义分块 | 高 | 高 | 高 | 技术或学术文档 |
| 递归分块 | 高 | 中 | 中 | 大型、分层结构的文档 |
| 上下文增强分块 | 非常高 | 高 | 高 | 需要连贯性的长文档 |
| 特定模态分块 | 可变 | 高 | 可变 | 混合媒体文档 |
| 代理分块 | 非常高 | 非常高 | 非常高 | 需要深度理解的复杂文档 |
| 子文档分块 | 高 | 高 | 高 | 大型文档集合 |
| 混合分块 | 可变 | 非常高 | 可变 | 多功能系统 |
选择合适的分块策略
选择合适的分块策略取决于以下几个因素:
-
文档类型:结构化文档与非结构化文档、长度和模式
-
查询复杂度:简单常见问题 vs. 复杂技术咨询
-
资源可用性:计算能力和时间限制
-
预期结果:速度 vs. 准确性 vs. 上下文保留
指南:
-
为了提高速度:使用固定长度或基于句子的分段
-
对于上下文:选择滑动窗口、语义或上下文增强型分块
-
对于混合内容:采用特定模态或混合分块
-
对于大型系统:使用递归或子文档分块在效率和上下文之间取得平衡
RAG 中分块实施的最佳实践
-
监控代码块大小:确保代码块保持在语言模型的标记限制内
-
保持原意:避免随意拆分句子或逻辑单元
-
优化检索:使用适合分块策略的高效索引和检索机制
-
处理冗余:实施去重以管理重叠内容
-
广泛测试:使用特定数据和查询评估不同的策略,以找到最佳方法
-
利用元数据:使用元数据增强数据块,以提高检索相关性
分块是检索增强生成(RAG)过程中的一个关键步骤,它直接影响系统的效率和准确性。理解各种分块策略及其适用场景,有助于开发者根据自身需求定制RAG系统。通过权衡上下文保留、计算成本和实现复杂度之间的利弊,可以选择最合适的分块方法来有效地增强语言模型