摘要:今天这篇文章继续RAG 专题,前面一篇讲到了 RAG 文件内容的摄入;将图、文、表 理解输入为文本的形态,得到文本的形态内容之后,接下来很重要的一个步骤就是要进行文本分块——分块(chunking)是将大块文本分解成小段的过程。
今天这篇文章继续RAG 专题,前面一篇讲到了 RAG 文件内容的摄入;将图、文、表 理解输入为文本的形态,得到文本的形态内容之后,接下来很重要的一个步骤就是要进行文本分块——分块(chunking)是将大块文本分解成小段的过程。
一、为什么需要文本分块?
1.提升向量数据库被召回的内容的准确性—简单来讲,保持被embedding 内容的单一性,减少 embedding 内容的噪音,这是最重要的因素.
2.embedding 模型输入长度限制,要求必须进行大文本切分为小文本块
3.在召回后的文本块,输入LLM 大模型,LLM 大模型对输入上下文长度有限制,过长会被截断,虽然目前动辄128k 的上下文长度,已经不成问题;但LLM 输入长度限制仍然是一个需要被考虑的问题.
二、文本分块考虑因素
1.文本分块块大小如何决定?大块和小块的优势和缺点是什么?
一般具体来讲,文本的embedding 可以是句子级别,也可以是段落级别;句子级别的embedding,粒度更细;能在句子这个级别做召回时候,捕捉到具体差异;但同时可能会错过在段落或文档中找到的更广泛的上下文信息。而段落的划分切块方式能考虑学习到整个段落语义的完整性,同理忽略了句子内部差别与联系;总体来讲,一般为了规避这两种切块带来的弊端;针对短文本(句子级别划分)在召回的时候,使用较大的TopK;二句子级别的召回设置较小的TopK 输入模型.
2.构建向量库被索引的内容
是处理较长的文档(如文章或书籍),还是处理较短的内容(如微博或即时消息)?文本性质将决定哪种模型更适合您的目标,从而决定应用哪种分块策略。大部头的文本书籍,采用的分块策略应该是段落级别较优,反而针对企业级应用,一些零碎行业知识最好建议句子级别切分.
3.Embedding 模型
具体采用的Embedding 模型会对文本切分之后,embedding 性能产生差异;sentence-transformer[1]模型在单个句子上工作得很好,但像 text- embedt-ada -002这样的模型在包含256或512个tokens的块上表现得更好.4.用户查询的长度和复杂性
用户输入的问题文本是简短而具体的还是冗长而复杂的?这也直接影响到我们选择分组内容的方式,以便在嵌入查询和嵌入文本块之间有更紧密的相关性。
5.对于召回结果做什么具体应用?
用于语义搜索、问答、摘要或其他目的,这是需要考虑的问题.
三、分块方法
1.句分割
Naive splitting: 最幼稚的方法是用句号(。)和“换行”来分割句子。虽然这可能是快速和简单的,但这种方法不会考虑到所有可能的边缘情况
NLTK: 自然语言工具包(NLTK)是一个流行的Python库,用于处理自然语言数据。它提供了一个句子标记器,可以将文本分成句子,帮助创建更有意义的分块。
spaCy: spaCy是另一个用于NLP任务的强大Python库。它提供了一个复杂的句子分割功能,可以有效地将文本分成单独的句子,从而在生成的块中更好地保存上下文.
递归分割:递归分块使用一组分隔符以分层和迭代的方式将输入文本分成更小的块。如果分割文本开始的时候没有产生所需大小或结构的块,那么这个方法会使用不同的分隔符或标准对生成的块递归调用,直到获得所需的块大小或结构。这意味着虽然这些块的大小并不完全相同,但它们仍然会逼近差不多的大小.
上述几种分割方式在对应的llama_index, langchain 框架中都有对应的封装实现
块重叠 (Chunk Overlap): 这种方式文本块相互融合,块 #1 的末尾和块 #2 的开头将会是相同的内容,依此类推
2.针对具体文件格式切分方式
Markdown:通过识别Markdown语法(例如,标题、列表和代码块),您可以根据其结构和层次结构智能地划分内容,从而生成语义更连贯的块
LaTex: LaTeX是一种文档准备系统和标记语言,通常用于学术论文和技术文档。通过解析LaTeX命令和环境,您可以创建尊重内容逻辑组织的块(例如,节、子节和方程),从而产生更准确和上下文相关的结果
Code 通过代码检测的方式,识别出代码;将代码code 进行单独分割。
3.语义模型自动分割模型
一类是bert 类的 Cross-segment BERT、BERT+Bi-LSTM、Hierarchical BERT等
另一个用的比较多的是阿里开源的语义分割模型SeqModel;
4.LLM 大模型
借助提示词,描述你的分块要求,以固定字符分割输出,然后基于固定字符分割解析文本块即可.
对于研发人员来讲,具体采用哪种分块,可能要依据你的分块文本性质,应用场景进行多轮综合测试评估;貌似没有那种方法能解决所有问题;魔鬼往往藏匿在细节之处。
今天关于RAG 分块就讲到这里,大模型普及的今天,搬运工认为对于NLP应用,依然不是一件简单的事情;就以RAG 来讲,每个流程都非常重要,在构建RAG 中每个流程做到90%,几个流程得分乘下来,可能综合体验70%; 实际单个流程90% 已经是一个非常高的标准。
来源:AIGC-LANDING