大模型RAG中的分块策略(一)什么是分块?分块技术及其策略

分块策略在检索增强生成(RAG)方法中起着至关重要的作用,它使文档能够被划分为可管理的部分,同时保持上下文。每种方法都有其特定的优势,适用于特定的用例。

将大型数据文件拆分为更易于管理的段是提高LLM应用效率的最关键步骤之一。目标是向LLM提供完成特定任务所需的确切信息,不多也不少。

“我的解决方案中应该采用何种合适的分块策略”是LLM实践者在构建高级 RAG 解决方案时必须做出的初始和基本决策之一。

一、关于LangChat

LangChat 是Java生态下企业级AIGC项目解决方案,集成RBAC和AIGC大模型能力,帮助企业快速定制AI知识库、企业AI机器人。

支持的AI大模型: Gitee AI / 阿里通义 / 百度千帆 / DeepSeek / 抖音豆包 / 智谱清言 / 零一万物 / 讯飞星火 / OpenAI / Gemini / Ollama / Azure / Claude 等大模型。

  • 官网地址:http://langchat.cn/

开源地址:

  • Gitee:https://gitee.com/langchat/langchat
  • Github:https://github.com/tycoding/langchat

iShot_2025-02-12_12.18.53

iShot_2025-02-12_12.18.53

img

二、什么是分块?

分块涉及将文本划分为可管理的单元或“块”,以实现高效处理。这种分割对于语义搜索、信息检索和生成式 AI 应用等任务至关重要。每个块都保留上下文和语义完整性,以确保结果连贯。

三、分块技术及其策略

各种分块技术根据文本结构和应用需求满足特定需求:

  • 固定长度分块:根据标记、单词或字符将文本分割成统一的大小。这种方法计算效率高,但可能在边界处切断有意义的上下文。

  • 基于句子的分块:按句子分割文本,保留语法和上下文完整性。非常适合对话模型,但可能对较长的文本效率不高。

  • 基于段落的分块:按段落分组文本,保持主题上下文。适用于结构化文档,但可能对精细调整的任务失去粒度。

  • 语义分块:专注于按意义分组文本,而不是结构。这确保了语义连贯性,但增加了计算开销,因为它需要深入的语言理解。

  • 滑动窗口分块:使用重叠窗口对文本进行分段,减少块边界处的信息损失。它确保更好的上下文保留,但会增加内存和处理成本。

  • 文档分块:将整个文档视为一个单一块。这种方法对于保持整体上下文有效,但由于内存限制,可能不适用于大型文本。

四、分块优化关键策略

为了最大化分块的优势,采用以下策略:

  • 重叠块:包括块之间的某些重叠可以确保在段落之间不会丢失关键信息。这对于需要无缝过渡的任务尤其重要,如对话生成或摘要。

  • 动态块大小:根据模型的容量或文本的复杂性调整块大小可以提升性能。较小的块适合 BERT 等模型,而较大的块适用于需要更广泛上下文的生成任务。

  • :递归或多级分块允许处理复杂的文本结构,例如将文档拆分为章节、节和段落。

  • 向量化的对齐:分块技术的选择对检索系统中的向量表示有显著影响。句子转换器和 BERT 或 GPT 等嵌入通常用于与分块粒度对齐的最佳向量化

五、优点与局限性

好处:

  • 增强上下文理解。
  • 支持 RAG 系统中高效的索引和检索。
  • 保持生成模型中更好的准确性,语义连贯性。

限制:

  • 计算上对语义和重叠分块较为昂贵。
  • 需要调整以平衡上下文保留和处理效率。

六、应用场景

分词在以下方面被广泛使用:

  • 检索系统:在搜索引擎或聊天机器人中检索回答查询的相关片段。
  • 生成模型:保持文本生成的上下文连贯。
  • 学术和法律研究:确保对结构化和复杂文档进行详细、有意义的分段。

通过采用适当的分块策略,从业者可以提升检索和生成系统的性能,在计算资源和上下文准确性之间取得平衡。

1. 固定长度分块

固定长度分块将文本分割成指定字符数或词数的块。这种方法简单直接,但往往存在将有意义的内容分割开的风险,导致上下文丢失。

如何工作:如何工作

  • 该方法根据预定义的长度(例如,单词数、标记或字符数)将文本划分为均匀的块。

  • 例如,一个包含 100 个单词的段落可能被分成十个 10 个单词的片段。

优势:

  • 简洁性与计算效率。

  • 适用于结构化文本或当上下文边界不是关键时。

缺点:

  • 可能会在块之间分割句子或想法,导致语义连贯性丧失。

示例:示例

  • 文本分块通过将文本分解成部分来提高检索。

  • 固定长度分块(每块 10 个字符):

  • 块 1:“Chunking i”

  • 块 2:“提高 re”

  • 块 3:“通过”检索

Input: "The quick brown fox jumps over the lazy dog. It is a bright sunny day."  
Chunk Size: 10 characters  
Chunks:  
  1. "The quick "  
  2. "brown fox "  
  3. "jumps over"  
  4. " the lazy"  
  5. " dog. It"  
  6. " is a bri"  
  7. "ght sunny"  
  8. " day."  
  • 影响:分割句子或思想会导致语义连贯性丧失。

代码示例

def fixed_length_chunk(text, size):  
    return [text[i:i+size] for i in range(0, len(text), size)]  

2. 语义块切分

文本根据语义连贯性分成块,确保每个块都是一个有意义的单元。这通常需要使用嵌入来找到逻辑边界。

img

如何工作:如何工作

  • 文本根据语义连贯性而非固定大小进行划分。
  • 使用自然语言理解(NLP)来识别逻辑断点,如句子或主题边界。

优势:

  • 保留每个片段的意义和上下文。
  • 提升检索增强生成(RAG)任务的准确性。

缺点:

  • 计算成本高,因为它需要语义解析。

示例:示例

  • AI 研究涵盖各种主题。机器学习专注于模式。

  • 语义块:

  • 块 1:“人工智能研究涵盖各种主题。”

  • 机器学习专注于模式。

Input: "The quick brown fox jumps over the lazy dog. It is a bright sunny day."  
Chunks:  
  1. "The quick brown fox jumps over the lazy dog."  
  2. "It is a bright sunny day."  
  • 影响:通过保留信息的逻辑流程来提高检索准确性。

  • 代码示例

from sentence_transformers import SentenceTransformer  
  
def semantic_chunk(text, max_tokens, model):  
    sentences = text.split('. ')  
    chunks, current_chunk = [], ""  
    for sentence in sentences:  
        if len(current_chunk) + len(sentence) <= max_tokens:  
            current_chunk += sentence + ". "  
        else:  
            chunks.append(current_chunk.strip())  
            current_chunk = sentence + ". "  
    if current_chunk:  
        chunks.append(current_chunk.strip())  
    return chunks  

3. 递归字符分块

初始块基于字符限制创建。如果它们太大,则递归地分成更小的、具有语义意义的单元(例如,句子)。

如何工作:如何工作

  • 最初,根据字符限制(例如,500 个字符)创建大块内容。
  • 如果一个块超过了限制,它将被递归地分割成更小的有意义的单位,例如句子。

优势:

  • 保留语义完整性,同时遵守尺寸限制。
  • 非常适合存在 API 限制的情况(例如,OpenAI 的令牌限制)。

缺点:

  • 递归处理会增加计算时间。

示例:示例

  • 文本分块将文本分解成更小的部分。此方法增强了检索。

  • 递归字符限制(20 个字符):

  • 文本块 1:“分块处理文本”

  • 块 2:“分成更小的部分。”

  • 块 3:“此方法增强”

  • 块 4:“检索。”

示例:示例

Input: "The quick brown fox jumps over the lazy dog. It is a bright sunny day."  
Step 1: Chunk by character size (50).  
Step 2: Further divide large chunks into sentences.  
Chunks:  
  1. "The quick brown fox jumps over the lazy dog."  
  2. "It is a bright sunny day."  

影响:平衡块大小和连贯性。

代码示例

def recursive_chunk(text, char_limit):  
    if len(text) <= char_limit:  
        return [text]  
    midpoint = len(text) // 2  
    for i in range(midpoint, len(text)):  
        if text[i] in '.!?':  
            return [text[:i+1].strip()] + recursive_chunk(text[i+1:].strip(), char_limit)  

4. 自适应分块

动态调整块大小,根据内容的复杂度或重要性,利用自然语言处理技术识别逻辑终点。

如何工作:如何工作

  • 动态调整块大小,基于内容复杂度。
  • 使用先进的自然语言处理技术来查找逻辑端点。

优势:

  • 平衡计算效率和语义连贯性。
  • 有效处理复杂和可变长度的内容。

缺点:

  • 实施复杂性。

示例:示例

  • “简单想法适合小块。复杂概念需要更大的块。”
  • 自适应块
  • 块 1:“简单想法适合小块。”
  • 块 2:“复杂概念需要更大的块。”

示例:示例

Input: "The quick brown fox jumps over the lazy dog. It is a bright sunny day."  
Output:  
  1. "The quick brown fox jumps over the lazy dog."  
  2. "It is a bright sunny day."  

影响:适应不同类型的文档,提高混合内容情况下的性能。

代码示例

def adaptive_chunk(text, nlp_model):  
    doc = nlp_model(text)  
    chunks = []  
    for sent in doc.sents:  
        chunks.append(sent.text.strip())  
    return chunks  

5. 混合分块

  • 解释:结合固定长度和语义分块,允许在块大小上保持灵活性,同时保持语义连贯性。

如何工作:如何工作

  • 结合固定大小和语义分块策略。
  • 允许在保持上下文的同时调整块大小。

优势:

  • 可定制以适应特定应用。
  • 平衡精度与效率。

缺点:

  • 需要仔细调整以避免冗余或失真。

示例:示例

  • “分块提高检索效率。灵活性对于精确度至关重要。”

  • 混合块:

  • 块 1:“分块提高检索。”

  • 块 2:“灵活性对精度至关重要。”

示例:示例

Input: "The quick brown fox jumps over the lazy dog. It is a bright sunny day."  
Chunk Size: 10 words  
Chunks:  
  1. "The quick brown fox jumps over the lazy dog."  
  2. "It is a bright sunny day."  
  • 影响:针对既需要上下文又需要计算效率的系统进行了优化。

代码示例

def hybrid_chunk(text, word_limit, semantic=True):  
    words = text.split()  
    chunks = []  
    for i in range(0, len(words), word_limit):  
        chunk = " ".join(words[i:i+word_limit])  
        if semantic and chunk[-1] not in '.!?':  
            chunk += '.'  
        chunks.append(chunk.strip())  
    return chunks  

6. 重叠分块

块重叠一定间距,确保边界处不丢失上下文。

如何工作:如何工作

  • 创建重叠块以保留边界之间的上下文。
  • 确保一个块中的关键思想不会在块之间丢失。

优势:

  • 保留更多上下文。
  • 提升检索准确性。

缺点:

  • 冗余增加内存使用。

示例:示例

  • 文本分块通过将文本分解成部分来提高检索。

  • 重叠块(5 词重叠):

  • 块 1:“分块通过分割提高检索”

  • 块 2:“通过将文本拆分来检索”

  • 块 3:“将文本拆分成部分。”

示例:示例

Input: "The quick brown fox jumps over the lazy dog. It is a bright sunny day."  
Overlap: 5 words  
Chunks:  
  1. "The quick brown fox jumps over the lazy"  
  2. "fox jumps over the lazy dog. It is a"  
  3. "dog. It is a bright sunny day."  
  • 影响:跨边界保持上下文,提高检索质量。
  • 代码示例
def overlapping_chunk(text, size, overlap):  
    words = text.split()  
    chunks = []  
    for i in range(0, len(words), size - overlap):  
        chunks.append(" ".join(words[i:i+size]))  
    return chunks  

7. 字符文本分割

如何工作:如何工作

  • 根据特定的字符限制分割文本。

优势:

  • 快速且直接。
  • 适用于具有令牌或字符限制的系统。

缺点:

  • 风险在于字符在单词或句子中间掉落时破坏意义。

8. 使用 LangChain 进行自动文本分割

如何工作:如何工作

  • 使用 LangChain 内置的TextSplitter类来自动化分块。
  • 根据文本类型和内容结构进行适配。

优势:

  • 简化处理流程。
  • 支持各种分块配置。

9. 递归字符文本分割

如何工作:如何工作

  • 递归方法类似于递归字符分块,但专为分词文本设计。

10. 文档特定拆分

如何工作:如何工作

  • 利用特定领域的拆分器(例如,MarkdownSplitterPythonCodeTextSplitter)来处理专业文档。

优势:

  • 自定义各种格式的处理。
  • 增强特定领域检索。

11. 基于嵌入的语义分块

如何工作:如何工作

  • 使用语义嵌入将文本划分为连贯的片段。
  • 将块与向量表示对齐以增强搜索。

12. 代理分块

代理分块关注逻辑命题或连贯的组群,将每个分块分解成有意义的行或组。

基于命题的词块化

  • 解释:每个块代表一个逻辑命题,独立存在,具有完整的意义。

  • 示例:示例

Input: "The quick brown fox jumps. The lazy dog sleeps."  
Chunks:  
  1. "The quick brown fox jumps."  
  2. "The lazy dog sleeps."  

影响:适用于结构化和基于规则的文本。

基于分组的分块

  • 解释:根据代理驱动的启发式方法将相关块组合成连贯的单元。
  • 代码示例
def agentic_chunk(text):  
    lines = text.split('. ')  
    chunks = [line.strip() + '.' for line in lines if line]  
    return chunks  

13. 如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

<think>好的,我现在要回答用户关于大模型RAG开发技术的问题。首先,我需要明确什么是RAGRAG的全称是Retrieval-Augmented Generation,也就是检索增强生成。之前听说过这个术语,但具体细节可能还需要查证。 我记得RAG结合了信息检索和生成模型,比如在回答问题的时候,先从个大型数据库中检索相关信息,然后用这些信息来辅助生成回答。这样可以提高生成内容的准确性和相关性,特别是在需要实时或特定领域知识的情况下。 接下来,我需要分解RAG的组成部分。首先是检索部分,可能涉及到向量数据库或者传统的搜索引擎技术,用来快速找到相关的文档或段落。然后是增强生成部分,利用像GPT这样的大模型,根据检索到的信息生成回答。这步可能需要将检索到的内容作为上下文输入到生成模型中。 用户可能想知道RAG的应用场景。比如,在客服系统中,RAG可以从产品文档中检索信息,生成更准确的回答;或者在医疗领域,结合最新的研究论文来提供建议。这样,RAG既利用了大模型的生成能力,又通过检索补充了最新的或特定的知识,避免了大模型本身可能的知识过时或不足的问题。 还需要考虑RAG的优势和挑战。优势包括提升回答的准确性、可解释性(因为可以引用检索到的文档)、以及动态更新知识库的能力。挑战可能包括检索的效率和准确性,如何将检索到的信息有效地整合到生成过程中,以及处理大规模数据时的计算资源问题。 可能用户还会想知道RAG与传统Fine-tuning的区别。传统的微调需要重新训练模型来适应特定领域,而RAG不需要改变模型本身,而是通过外部检索来增强,这使得它更灵活,特别是在需要频繁更新知识的场景中。 另外,实现RAG技术细节可能包括使用嵌入模型将文档转换为向量,使用近似最近邻(ANN)算法进行快速检索,然后将检索结果与用户问题起输入生成模型。需要确保检索到的信息是相关的,并且生成模型能够有效地利用这些信息。 可能还需要提到些框架或工具,比如LangChain、LlamaIndex,这些工具可以帮助开发者更方便地构建RAG系统,处理数据加载、索引、检索和生成的流程。 最后,要确保解释清晰,避免使用过多技术术语,让不同背景的读者都能理解。同时,举些实际应用的例子,帮助用户更好地理解RAG的价值。</think>大模型RAG(Retrieval-Augmented Generation,检索增强生成)是种结合信息检索与生成模型的开发技术,旨在提升大语言模型(如GPT、LLaMA等)的准确性、实时性和领域适应性。其核心思想是:**先通过检索外部知识库获取相关信息,再将这些信息作为上下文输入生成模型,辅助生成更可靠的回答**。 --- ### **RAG 的核心流程** 1. **检索(Retrieval)** - 当用户输入问题时,系统会从外部知识库(如文档、数据库、网页)中检索与问题相关的信息片段。 - 通常使用**向量检索技术**(如基于BERT的嵌入模型),将问题与知识库内容转换为向量,通过相似度匹配快速找到相关内容。 2. **增强(Augmentation)** - 将检索到的信息与用户问题结合,形成“增强后的输入”。例如,将检索到的文本作为上下文附加到原始问题后,再输入生成模型。 3. **生成(Generation)** - 大语言模型基于增强后的输入生成最终回答,确保结果既具备模型本身的通用知识,又结合了外部检索的实时或领域特定信息。 --- ### **RAG 的优势** 1. **解决“知识固化”问题** - 传统大模型的训练数据是静态的,无法更新。RAG通过检索实时知识库,能动态补充最新信息(如新闻、研究论文)或专有数据(如企业文档)。 2. **提升可信度与可解释性** - 生成结果基于检索到的文档,可追溯来源,减少模型“幻觉”(编造虚假信息)的风险。 3. **降低微调成本** - 无需重新训练大模型,仅需优化检索和集成方式,即可适配不同领域(如医疗、法律)。 --- ### **典型应用场景** - **智能客服**:检索产品手册或工单记录,生成精准回复。 - **学术研究**:从论文库中检索相关研究,辅助文献综述。 - **医疗咨询**:结合最新医学指南或病例数据,提供诊断建议。 - **企业知识库**:快速查询内部文档,生成摘要或分析报告。 --- ### **关键技术挑战** 1. **检索质量** - 如何从海量数据中精准找到最相关的片段?需优化向量模型和检索算法(如Faiss、Annoy等近似最近邻搜索工具)。 2. **上下文整合** - 生成模型需有效利用检索内容。过长或不相关的上下文可能导致生成效果下降,需设计合理的输入格式和长度控制。 3. **效率与延迟** - 实时检索可能增加响应时间,需平衡检索速度与准确性(如预建索引、分块策略)。 --- ### **RAG vs. 微调(Fine-tuning)** - **RAG**:通过外部检索扩展知识,灵活适应新领域,无需修改模型参数。 - **微调**:直接调整模型参数以适应特定任务,依赖标注数据,可能过拟合。 - **结合使用**:部分场景会同时使用微调和RAG,例如先用RAG增强输入,再用微调后的模型生成答案。 --- ### **开发工具与框架** - **LangChain**:提供RAG流程的模块化组件(检索器、生成器、记忆管理等)。 - **LlamaIndex**:专注于数据索引与检索优化,支持多种向量数据库(如Pinecone、Milvus)。 - **Hugging Face Transformers**:集成检索模型(如DPR)与生成模型(如T5、GPT-2)。 --- ### **总结** RAG技术通过“检索+生成”的协作模式,弥补了大模型在实时性、专业性和可解释性上的不足,成为当前落地应用的热门方向。随着向量数据库和高效检索算法的进步,RAG正在推动大模型从“通用对话”向“专业助手”演进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值