RAG文本分块

不论是向量化模型还是大语言模型,都存在输入长度的限制。对于超过限制的文本,模型会进行截断,造成语义缺失。分块可以确保每个文本片段都在模型的处理范围内,避免重要信息的丢失。

文本分块的核心原则

高质量分块的核心原则是:一个分块应当表示一个完整且语义相关的上下文信息

这意味着:

  • 分块过小:会导致语义信息被割裂,检索时可能错过真正相关的内容
  • 分块过大:一个块内可能包含多个不相关的上下文信息,增加检索噪声

实际应用中,合理的分块大小通常在几百到一千多个token之间,但具体应根据文档特性和应用场景灵活调整。

主流分块策略详解

1. 递归文本分块

递归文本分块是最常用的分块策略,其核心思想是根据特定的分隔符(段落、句子、单词等)对文档进行递归分割。

工作原理

  1. 指定目标块大小(如200个token,不要超过embedding尺寸)
  2. 定义由粗到细的分隔符列表(段落 > 句子 > 单词 > 字符)
  3. 先使用最粗的分隔符(如段落标记)拆分文本
  4. 检查拆分结果,如果某块大小超过目标值,则使用下一级更细的分隔符继续拆分
  5. 重复此过程,直到所有块都不超过目标大小
from langchain.text_splitter import RecursiveCharacterTextSplitter# 创建递归文本分块器
text_splitter = RecursiveCharacterTextSplitter(# 设置块大小chunk_size=500,# 设置块间重叠部分chunk_overlap=50,# 按优先级定义分隔符separators=["\n\n", "\n", "。", ",", " ", ""]
)# 进行分块
chunks = text_splitter.split_text(long_text)

chunk_overlap 重叠设置
分块时通常会设置一定的重叠区域(overlap),可以保持上下文连贯性,避免关键信息在块边界处断裂

在这里插入图片描述

separators 分隔符设置
不同类型的文档可能需要特定的分隔符设置:

  • 中文文档:应增加中文标点符号(如"。“、”,")作为分隔符
  • Markdown文档:可使用标题标记(#、##)、代码块标记(```)等作为分隔符

2. 基于语义的分块策略

递归文本分块基于预定义规则工作,虽然简单高效,但可能无法准确捕捉语义变化。
基于语义的分块策略则直接分析文本内容,根据语义相似度判断分块位置。

基于Embedding的语义分块

这种方法利用向量表示捕捉语义变化,可分为四个步骤:

  1. 将文档拆分为句子级别的基本单位
  2. 设定滑动窗口(如包含3个句子)
  3. 计算相邻窗口文本的embedding相似度
  4. 当相似度低于设定阈值时,在该位置进行分块
from langchain.text_splitter import SentenceTransformersTokenTextSplitter# 创建基于语义的分块器
semantic_splitter = SentenceTransformersTokenTextSplitter(model_name="all-MiniLM-L6-v2",  # 指定embedding模型# 选择阈值策略threshold_strategy="percentile",  # 百分位策略threshold=0.95,  # 95%分位数作为阈值window_size=3  # 滑动窗口大小
)# 分块
semantic_chunks = semantic_splitter.split_text(long_text)

阈值选择策略包括:

  • 百分位策略:对所有相似度值排序,选择特定百分位的值作为阈值
  • 标准差策略:基于相似度的统计分布确定阈值
  • 四分位策略:使用四分位数统计确定阈值
基于模型的端到端语义分块

更先进的方法是使用专门训练的神经网络模型,直接判断每个句子是否应作为分块点。这种方法无需手动设置阈值,而是由模型端到端地完成分块决策。

以阿里达摩院开发的语义分块模型为例,其工作流程为:

  1. 将文本窗口中的N个句子输入模型
  2. 模型为每个句子生成表示向量
  3. 通过二分类层直接判断每个句子是否为分块点
    在这里插入图片描述
from modelscope.pipelines import pipeline# 加载语义分块模型
semantic_segmentation = pipeline('text-semantic-segmentation',model='damo/nlp_bert_semantic-segmentation_chinese-base'
)# 进行分块
result = semantic_segmentation(long_text)
segments = result['text']

这种方法的优势在于模型已经学习了语义变化的复杂模式,无需手动调整参数。但需注意模型的泛化能力,应在特定领域文档上进行验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题

2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题 (二)A 模块基础设施设置/安全加固(200 分)A-1 任务一登录安全加固(Windows,Linux)A-2 任务二 Nginx 安全策略&…

量子隧穿:PROFINET到Ethernet ip的无损耗协议转换方案转

在本季度的生产工作中,我们成功实现了仓储物流自动化分拣系统中的关键技术突破。我们面临的主要挑战是将采用EtherNet/IP协议的输送带控制器与PROFINET协议的上位系统进行有效通信。通过引入ethernet IP转PROFINET网关倍讯科技BX-606-EIP,我们实现了输送…

OpenCV CUDA模块中矩阵操作------降维操作

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::reduce 函数用于对 GPU 上的矩阵沿某个维度进行降维操作,例如求和、取最大值等。此函数支持多种降维操作,并允…

一分钟用 MCP 上线一个 贪吃蛇 小游戏(CodeBuddy版)

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 你好,我是悟空。 背景 上篇我们用 MCP 上线了一个 2048 小游戏,这次我们继续做一个 …

简单神经网络(ANN)实现:从零开始构建第一个模型

本文将手把手带你用 Python Numpy 实现一个最基础的人工神经网络(Artificial Neural Network, ANN)。不依赖任何深度学习框架,适合入门理解神经网络的本质。 一、项目目标 构建一个三层神经网络(输入层、隐藏层、输出层&#xf…

使用python进行人员轨迹跟踪

一、系统概述 该系统基于计算机视觉技术,实现对视频或摄像头画面中的人员进行检测、跟踪,并生成轨迹数据。支持透视变换校准(鸟瞰图显示)、多目标跟踪、轨迹存储及视频录制功能,适用于安防监控、行为分析等场景。 二…

[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程

本人为强化学习小白,为了在后续科研的过程中能够较好的结合强化学习来做相关研究,特意买了西湖大学赵世钰老师撰写的《强化学习数学原理》中文版这本书,并结合赵老师的讲解视频来学习和更深刻的理解强化学习相关概念,知识和算法技…

Docker入门指南:镜像、容器与仓库的核心概念解析

目录 前言:为什么需要Docker? 一、Docker能做什么? 二、核心概念解析 1. 镜像(Image):应用的标准化打包 2. 容器(Container):镜像的运行实例 3. 镜像仓库&#xff0…

大模型微调实战:基于GpuGeek平台的低成本高效训练方案

文章目录 引言一、GpuGeek平台使用入门1. 注册与账号设置2. 控制台功能概览3. 快速创建GPU实例3. 预置镜像与自定义环境 二、GpuGeek平台核心优势解析1. 显卡资源充足:多卡并行加速训练2. 镜像超多:开箱即用的开发环境3. 计费灵活:按需付费降…

Linux:计算机的层状结构

1.冯诺依曼体系结构 我们常见的计算机,如笔记本、台式机。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系结构。 CPU:运算器和控制器组成。运算器主要工作是做算术运算和逻辑运算。控制器主要工作是协调设备之间信息流动的…

LangGraph(四)——加入人机交互控制

目录 1. 引言2. 添加Human Assistance工具3. 编译状态图4. 提示聊天机器人5. 恢复执行参考 1. 引言 智能体可能不可靠,甚至需要人工输入才能完成任务。同样,对于某些操作,你可能需要在运行前获得人工批准,以保证一切按预期运行。 …

数据结构【AVL树】

AVL树 1.AVL树1.AVL的概念2.平衡因子 2.AVl树的实现2.1AVL树的结构2.2AVL树的插入2.3 旋转2.3.1 旋转的原则 1.AVL树 1.AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通…

JavaScript【5】DOM模型

1.概述: DOM (Document Object Model):当页面被加载时,浏览器会创建页面的文档对象模型,即dom对象;dom对象会被结构化为对象树,如一个HTML文档会被分为head,body等部分,而每个部分又…

STM32烧录程序正常,但是运行异常

一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动(BOOT01,BOOT10),程序在掉电后无法保存,导致复位后无法正常运行。应确保BOOT00(从Flash启动)15。…

汽车二自由度系统模型以及电动助力转向系统模型

汽车二自由度系统模型与电动助力转向系统(EPS)的详细建模方案,包含理论推导、MATLAB/Simulink实现代码及参数说明: 一、二自由度汽车模型 1. 模型描述 包含以下两个自由度: 横向运动(侧向加速度&#xf…

git提交库常用词

新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点 JavaScript 可以轻松实现时间格式(HH:mm:ss 或 HH:mm)与十进制小时(如 17.5)的相互转换。两个函数分别处理时间字符串到十进制小时,以及十进制小时到时间字符串的转换,支持灵活的输入和输出格式。这…

LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作

LLM智能体(LLM agents)是能够自主行动以实现特定目标的AI系统。在实际应用中,智能体能够将用户请求拆解为多个步骤,利用知识库或API获取数据,最终整合出答案。这让智能体相比于传统独立聊天机器人拥有更强大的能力——…

[PMIC]PMIC重要知识点总结

PMIC重要知识点总结 摘要:PMIC (Power Management Integrated Circuit) 是现代电子设备中至关重要的组件,负责电源管理,包括电压调节、电源转换、电池管理和功耗优化等。PMIC 中的数字部分主要涉及控制逻辑、状态机、寄存器配置、通信接口&am…

PYTHON训练营DAY28

类 (一)题目1:定义圆(Circle)类 要求: 包含属性:半径 radius。包含方法: calculate_area():计算圆的面积(公式:πr)。calculate_circ…