RAG文档切分算法洞察

目录

1.Level 1:Text Splitters - CharacterTextSplitter

2.Level 2:Text Splitters - RecursiveCharacterTextSplitter

3.Level 3:Text Splitters - MarkdownTextSplitter

4.Level 4:Text Splitters - SemanticChunker

5.Text Splitters产生的问题

6.Level 5:Text Splitters - AI21SemanticTextSplitter

7.Level 6:Text Splitters - SegTextSplitter


        分享的是现在rag优化方面关于文档切分的算法的洞察。选择这方面的一个原因,就是在rag的优化模块中:

        文档预处理环节,包括识别、增强文档规律划分、数据增强等操作,以提升文档质量。其次,查询优化,包括查询重写和后续提示等优化功能等等,我个人觉得现在这些优化的一些东西,都是一些锦上添花的操作,现在可能真正出现一些问题的地方,在我们实际的运行过程中可能是在文档切分、文本分块的,现在效果不是特别好,目前网上的算法比较有限,导致整体功能实现和使用的效果并未达到理想状态。因此,需要对算法思路进行调整,以提升文本分割的效果和速度。

        从一个从最简单然后到复杂的一个思路,来去看一下我们现在这个切分算法:

        前五种参考了langchain和文档切分解析

        关于chunk_size和overlap可以参考上述链接,这里不过多赘述了。

1.Level 1:Text Splitters - CharacterTextSplitter

        参考:CharacterTextSplitter

        按字符拆分。

        字符分割是拆分文本的最基本形式。它是将文本简单地分成 N 个字符大小的块的过程,而不管其内容或形式如何。

        俗称的硬拆分。

2.Level 2:Text Splitters - RecursiveCharacterTextSplitter

        参考:

        按分隔符拆分

        “\n\n”   —— 双换行符,或最常见的段落换行符

        “\n”        —— 新行

        “./“。”  —— 结束符

        Recursive的概率,在使用“\n\n” 分割后若块大小任然大于给定的chunk_size,就使用“\n继续分割,若扔大于,继续使用标点符号分割。

3.Level 3:Text Splitters - MarkdownTextSplitter

        参考:MarkdownHeaderTextSplitter

        文档特定拆分

        比如在Markdown中

        \n#{1,6}                - 用新行分隔,后跟标题(H1 H6

        ```\n                       - 代码块

        \n\\*\\*\\*+\n    - 水平线

        \n---+\n                 - 水平线

        \n___+\n              - 水平线

        \n\n                       - 双换行

        \n                           - 新行

        “ ”                          - 空格

        Python/JS等等特定格式的数据文档

4.Level 4:Text Splitters - SemanticChunker

        参考:SemanticChunker

        比如对于一段文字:

想要创业吗?获得Y Combinator 的资助。 2006 10 月(本文源自麻省理工学院的一次演讲)。

直到最近,即将毕业的大四学生都面临两个选择:找工作或去读研究生。

我认为将会有越来越多的第三种选择:\n创办自己的创业公司。

在每个融资周期大约一个月后,我们会举办一场名为“原型日”的活动。

在活动上,每家初创公司都会向其他初创公司展示他们目前所取得的成就。

您可能认为他们不需要任何进一步的激励。

告诉人们不要这样做?原因与那位可能不为人知的小提琴家相同,

每当他被要求评判某人的演奏时,他总是说他们没有足够的天赋成为职业选手。

        分块机制应考虑实际内容和语义信息

        得到相邻语句之间的向量距离:

        

        把任何超过 over_distance 的距离视为断点,假如这里设置为95%

        最终的效果是:

想要创业吗?获得Y Combinator 的资助。 2006 10 月(本文源自麻省理工学院的一次演讲)。

直到最近,即将毕业的大四学生都面临两个选择:找工作或去读研究生。

我认为将会有越来越多的第三种选择:\n创办自己的创业公司。

在每个融资周期大约一个月后,我们会举办一场名为“原型日”的活动。

在活动上,每家初创公司都会向其他初创公司展示他们目前所取得的成就。

您可能认为他们不需要任何进一步的激励。

告诉人们不要这样做?原因与那位可能不为人知的小提琴家相同,

每当他被要求评判某人的演奏时,他总是说他们没有足够的天赋成为职业选手。

        最后获得的分块看上去已经初步达到我们想要的效果了。

5.Text Splitters产生的问题

        在许多文档中,很有可能会出现相似的语义片段,这些语义片段在embedding的时候造成了语义的冗余,并且的topk检索时很有可能由于冗余从而检索不到实际有用的语义信息:

        

        例如安装的语义片段,在一篇使用手册中可能会重复出现多次,如果作为不同的语义块存入数据库,在检索时会将这些相同的归为多个topk从而减少了检索的语义信息。

        所以切分中不只是切分相邻距离句子间的语义情况,还应该对整篇文章中纵向得来切分语义。

        这里提出一个横纵向切分的概念

        横向:基于句子之间的相邻距离做切分

        纵向:基于语义的相邻距离做切分

        切分并不只是横向的,还需要考虑的纵向,现在的splitter都没有考虑到纵向的切分

6.Level 5:Text Splitters - AI21SemanticTextSplitter

        参考:AI21SemanticTextSplitter | 🦜️🔗 LangChain

        首先Langchain的AI21SemanticTextSplitter并未开源,这里是结合发布的视频以及文档做的一些归纳。

        在SemanticChunker基础上,我们已经获得了段落的结构信息,现在要做的就是对这些段落进行聚类,使得在语义上得以延伸。

        Langchain怎么做的:

        将现存的所以的语义块全部递给大模型做一次归纳,获取每一个语义块的命题:

['月份是十月。',

 '年份是 2023 年。',

 '我小时候并不了解绩效回报的超线性程度。',

 '绩效回报是超线性的。',

 '了解绩效回报的超线性程度是最重要的事情之一。',

 '老师和教练含蓄地告诉我们回报是线性的。’]

        这里获取了6个命题

        然后遍历所有语义块,并将其动态地聚类:

添加:“月份是十月。”

没有区块,创建一个新的

创建新块:日期和时间

添加:“今年是 2023 年。”

找到块,添加到:日期和时间

添加:“我小时候并不了解绩效回报的超线性程度。”

未找到块

创建新块:努力 - 奖励关系

添加:“绩效回报是超线性的。”

找到块,添加到:努力 - 奖励关系

添加:“了解绩效回报的超线性程度是最重要的事情之一。”

找到块,添加到:绩效的超线性回报

添加:“教师和教练含蓄地告诉我们回报是线性的。”

未找到块

创建新块:教育与辅导回报

        最后可以得到两个区块:

0

摘要:此块包含与当前月份和年份相关的特定日期和时间的信息。

命题:

    -月份是十月。

    -年份是 2023 年。

1

摘要:此块讨论了不同行业的超线性回报概念及其对理解经济、社会和个人成长动态的影响。

命题:

    -我小时候并不了解绩效回报的超线性程度。

    -绩效回报是超线性的。

    -了解绩效回报的超线性程度是最重要的事情之一。

    -商业中的绩效回报是超线性的。

    -有些人认为商业中的超线性回报是资本主义的缺陷。

    -有些人认为改变规则会阻止商业中的超线性回报成为现实。

    -绩效的超线性回报是世界的一个特征。

    -绩效的超线性回报不是人类发明的规则的产物。

    -名望中也能看到同样的超线性回报模式。

    -权力中也能看到同样的超线性回报模式。 -

    军事胜利中也能看到同样的超线性回报

    模式。 -知识中也能看到同样的超线性回报模式。 -

    造福人类中也能看到同样的超线性回报模式。

    -在所有这些领域,富人越来越富。

    -如果不理解超线性回报的概念,就无法理解世界。

    -如果你有野心,你就应该理解超线性回报的概念。

    -理解超线性回报的概念将成为有野心人士冲浪的浪潮。

        这样的问题是,有的块太过臃肿,同时冗余信息太多,且这种方法速度慢,成本高。

7.Level 6:Text Splitters - SegTextSplitter

        提出一个全新的,理想中的聚类方式 - SegTextSplitter

        我的想法是:   基于空间向量做聚类,聚类为区块后的结果统一进入LLM做归纳

        每一个语义块embedding后作为一个点存在于向量空间中,在向量空间做基于欧式距离的聚类:

        如何聚类:kmeans\dbscan?

        Seg:自动寻找类别且由于生长限制不用担心臃肿

        LLM:大模型最后进行总结,减少了复杂度且不用担心信息的冗余

        这样上述语义冗余的块1:

1

摘要:此块讨论了不同行业的超线性回报概念及其对理解经济、社会和个人成长动态的影响。

命题:

    -我小时候并不了解绩效回报的超线性程度。

    -绩效回报是超线性的。

    -了解绩效回报的超线性程度是最重要的事情之一。

    -商业中的绩效回报是超线性的。

    -有些人认为商业中的超线性回报是资本主义的缺陷。

    -有些人认为改变规则会阻止商业中的超线性回报成为现实。

    -绩效的超线性回报是世界的一个特征。

    -绩效的超线性回报不是人类发明的规则的产物。

    -名望中也能看到同样的超线性回报模式。

    -权力中也能看到同样的超线性回报模式。 -

    军事胜利中也能看到同样的超线性回报

    模式。 -知识中也能看到同样的超线性回报模式。 -

    造福人类中也能看到同样的超线性回报模式。

    -在所有这些领域,富人越来越富。

    -如果不理解超线性回报的概念,就无法理解世界。

    -如果你有野心,你就应该理解超线性回报的概念。

    -理解超线性回报的概念将成为有野心人士冲浪的浪潮。

        就可以在大模型的归纳下简化为:

介绍了超线性回报的概念,指出在不同行业和领域中,某些形式的绩效或回报并非线性增长,而是呈现出超线性增长趋势。

个人经历与理解:

作者小时候并未了解绩效回报的超线性性质,暗示这是一个个人认知的变迁和成长过程。

绩效回报的超线性性质:

绩效回报在商业中和其他领域中被指出是超线性的,即成功或回报的增长速度随着初始投入的增加而加速。

超线性回报的社会影响和看法:

一些人将商业中的超线性回报视为资本主义的缺陷,主张改变规则以遏制其现实化。

超线性回报在不同领域中的存在:

超线性回报模式不仅存在于商业中,还在名望、权力、军事胜利、知识和造福人类等领域中观察得到。

对超线性回报理解的重要性:

认为理解超线性回报的概念是理解世界运作的关键之一,特别是对于有野心的人士。

预示理解超线性回报的概念将成为有野心人士的必备知识,因其能够揭示出不同领域中成功和回报的非线性特性。

        这样检索出来的信息不仅简洁且有效。

<think>好的,用户现在想了解RAG架构中的文档切分方法和工具。首先,我需要回忆一下RAG的基本流程,文档切分是预处理的重要步骤,直接影响后续检索的效果。用户之前可能已经了解过PDF解析,现在进入分块阶段。 根据之前的引用内容,用户提到的两种切分策略:按字符切分和按字符递归切分,还有不同文档类型的处理。需要结合这些信息,但也要扩展其他方法。比如,除了字符切分,可能还有语义切分、滑动窗口等。 接下来要整理常见的方法和工具。比如LangChain的RecursiveCharacterTextSplitter,还有spaCy、NLTK用于句子分割。另外,Markdown和代码的专门处理也很重要,用户可能需要具体的例子。 用户可能需要实际工具推荐,比如LangChain、Hugging Face的Transformer库,或者LlamaIndex。同时,注意事项部分需要提到块大小、重叠处理、保留元数据等,这些对实际应用很重要。 还要考虑用户可能的后续问题,比如参数调整、处理复杂文档的方法,或者评估分块效果的工具。这样可以在回答中预判并提供相关信息。 最后,确保引用之前的资料,但用户给的引用2内容比较模糊,可能无法具体引用,所以主要参考引用1提到的按字符切分和递归切分,并补充其他策略。需要保持回答结构清晰,分点说明方法和工具,然后给出示例,再注意事项和相关问题。确保使用正确的中文术语和LaTeX格式,但用户问题中没有数学公式,所以可能不需要太多LaTeX,但如果有示例代码或命令,需要用代码块包裹。</think>### RAG 架构中文档切分方法及工具 在 RAG(检索增强生成)架构中,文档切分是预处理阶段的核心步骤,直接影响后续检索和生成的质量。以下是文档切分的常见方法及工具: --- #### **一、文档切分方法** 1. **按字符切分** - 直接按固定字符长度分割文本(如每 500 字符一块),适合格式简单的文档。 - **优点**:实现简单;**缺点**:可能破坏语义连贯性[^1]。 2. **按语义单元递归切分** - 分层拆分文本:先按段落分割,若过长则按句子分割,再按词语分割。 - **示例**: ```python from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50) ``` 3. **按特定格式切分** - **Markdown**:按标题层级分割,保留章节结构。 - **代码**:按函数、类或代码块分割。 - **LaTeX**:按章节或公式块分割。 4. **滑动窗口切分** - 允许块间重叠(如 20% 重叠),避免边界信息丢失。 --- #### **二、常用工具** 1. **LangChain** - 提供多种文本分割器: - `CharacterTextSplitter`(基础字符分割) - `RecursiveCharacterTextSplitter`(递归分割) - `MarkdownTextSplitter`(支持 Markdown 结构) - **代码示例**: ```python from langchain.text_splitter import MarkdownTextSplitter markdown_splitter = MarkdownTextSplitter(chunk_size=200) ``` 2. **spaCy / NLTK** - 基于自然语言处理的句子分割,适合语义敏感场景。 - **示例**: ```python import spacy nlp = spacy.load("en_core_web_sm") doc = nlp(text) sentences = [sent.text for sent in doc.sents] ``` 3. **Hugging Face Transformers** - 使用预训练模型(如 BERT)识别语义边界。 4. **LlamaIndex** - 支持自定义分块策略,集成语义分析和元数据保留功能。 --- #### **三、注意事项** 1. **块大小选择**:一般 200-500 字符,需平衡信息密度与检索效率。 2. **保留上下文**:通过重叠或添加元数据(如章节标题)增强关联性。 3. **特殊文档处理**:公式、表格等需单独处理,避免解析错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值