大模型RAG(一)文本分块

本文探讨了文档分块策略,包括字符、语义、特定文档类型和基于模型的方法,以及如何通过NLP工具如BERT进行语义分割。文章还介绍了文本分类的多种策略,如句子、段落和文章级别,重点是关键信息抽取和利用NLP技术提取核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 文档分块策略

文档切分粒度不好把控,既担心噪声太多又担心语义信息丢失

文档索引构建常用思路:

  • 一级索引是关键信息,用于计算相似度
  • 二级索引是原始文本
  • 二者通过索引映射

2. RAG的5种文本分块策略

  1. 字符分割 - 简单的静态字符数据块
  2. 递归字符文本分割 - 基于分隔符列表的递归分块
  3. 特定文档分割 - 针对不同文档类型(PDF、Python、Markdown)的各种分块方法
  4. 语义分割 - 基于嵌入式遍历的分块
  5. LLM 分割 - 使用类似代理系统的实验性文本分割方法。如果您的GPT成本接近于0.00美元,这种方法很好。

3. 不同文本的分类策略(句子、段落、文章)

3.1 句子本身不长,不需要进行额外分割

3.2 语义段的切分及段落(句子)关键信息抽取:

  1. 利用NLP中的成分句法分析(constituency parsing)工具和命名实体识别(NER)工具提取,前者可以提取核心部分(名词短语、动词短语……),后者可以提取重要实体(货币名、人名、企业名……)。
  2. 可以用语义角色标注(Semantic Role Labeling)来分析句子的谓词论元结构,提取“谁对谁做了什么”的信息作为关键信息。
  3. 关键词提取工作(Keyphrase Extraction)。

3.3 文章的切分及关键信息抽取:

  1. nlp篇章分析,把所有包含主从关系的段落合并成一段。
  2. 训练一个bert模型实现语义分割

4. Langchain中的文本分块工具

langchain默认使用RecursiveCharacterTextSplitter

1. RecursiveCharacterTextSplitter():按不同的字符递归地分割文档,同时要兼顾被分割文本的长度和重叠字符,它的默认分割符是一个列表即[“\n\n”, “\n”, " ", “”],因此它会用分割符列表中从左至右的顺序的分割符依次去搜索目标文档中的分割符,然后再分割文档,比如先搜索目标文档中的双换行符\n\n,如果存在,则切割文档,然后依次搜索单分隔符\n,空格等
2. CharacterTextSplitter():按字符数来切割文档。
3. MarkdownHeaderTextSplitter():基于指定的标题来分割markdown 文件,将同一标题下的文本放在了同一个块(chunk)中,而文本对应的标题信息则被存储在块的元数据中。
4. TokenTextSplitter():按token来分割文本。
5. SentenceTransformersTokenTextSplitter() : 是专门用于句子转换模型的文本分割器。默认行为是将文本分割成合适的句子转换模型的标记窗口的块。
6. Language() - 用于 CPP、Python、Ruby、Markdown 等。
7. NLTKTextSplitter():使用 NLTK(自然语言工具包)按句子分割文本,而不仅仅是根据 “\n\n” 进行分割。
8. SpacyTextSplitter() - 使用 Spacy分词器按句子的切割文本。

相关内容解释

### RAG 架构中的文本分块技术 RAG(Retrieval-Augmented Generation)是种结合检索和生成模型的方法,用于增强自然语言处理任务的效果。在实际应用中,为了提高效率并减少计算资源消耗,通常会采用 **文本分块(text chunking)** 技术来分割文档内容。 #### 文本分块的目的 文本分块的主要目的是将长篇文档拆分为更小的单元以便于存储、索引以及后续的检索操作。通过这种方式可以显著降低内存占用率,并提升检索速度[^1]。 #### 常见的文本分块方法 以下是几种常见的文本分块策略: 1. **固定长度切片** 这种方式按照固定的字符数或者词数量对原文档进行切割。例如,如果设定每段的最大长度为500个单词,则当达到该限制时就会创建个新的片段。 2. **基于语义边界划分** 考虑到单纯依赖字数可能导致某些重要信息被截断的情况发生,因此也可以利用句法分析工具识别出合适的断点位置来进行更加合理的分区。比如,在完成段描述之后再做进步分离而不是随意打断句子结构[^2]。 3. **滑动窗口机制** 使用大小可调的滑动窗体沿输入序列移动,并从中提取子串作为候选答案区域之;这种方法能够捕捉上下文中可能存在的关联关系从而改善最终效果表现。 #### 实现细节示例 下面给出个简单的 Python 函数用来演示如何根据指定最大长度实现基本版本的定长切片功能: ```python def split_text(text, max_length=500): """Split a long string into chunks with maximum length.""" words = text.split(' ') current_chunk = [] result = [] for word in words: if len(' '.join(current_chunk)) + len(word) + 1 <= max_length: current_chunk.append(word) else: result.append(' '.join(current_chunk)) current_chunk = [word] if current_chunk: result.append(' '.join(current_chunk)) return result ``` 此函数接受两个参数:待处理字符串`text` 和希望设置成多大的单个chunk 的近似值 `max_length`. 它先按空格把整个文字分解成个个词语列表形式储存起来; 接着逐考察这些词汇是否能加入当前正在构建的小段落里而不超出预定界限——旦发现无法满足条件就立即停止累加并将已积累的部分保存下来形成新的独立项存入结果集中去.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自律也自由

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值