一、RAG文本分割

        RAG(Retrieval-Augmented Generation,检索增强生成)模型是一种结合了检索 和生成能力的自然语言处理模型。 它通过检索相关的文档片段,并将这些信息作为生成过程的上下文,以提高生成质量 和准确性。

        在RAG模型中,文本分割是一个非常关键的步骤。合理地分割文档文本, 不仅能够提高检索的效率,还能更有效地将检索到的信息提供给生成模型,使生成内 容更加连贯和准确。

文本分割优点: 

        提升检索效率: 文本分割的首要原因是为了提高检索的效率。对于较长的文档,直接检索整篇文 档可能会导致信息冗余或者重要信息丢失。因此,合理的文本分割将长文档分成 多个段落或片段,这样每个片段可以单独进行检索,从而提高检索的精度和速 度。

        更好的信息匹配: 当文档被合理地分割后,检索算法可以更加精确地匹配用户查询和文档片段。这 样不仅能够减少噪声,还可以确保检索到的内容更加相关,生成模型在使用这些 片段进行回答时能够生成更加相关和有意义的内容。

        增强生成质量: 检索增强生成模型依赖检索到的内容作为生成输入的一部分。如果检索到的文档 片段不准确或上下文不完整,生成的结果可能会偏离用户的期望。文本分割可以 确保每个文档片段足够独立,且能够提供完整的上下文信息,从而提高生成的准 确性和上下文连贯性。

        降低计算复杂度: 长文本的直接处理会大大增加模型的计算量和时间开销,甚至有些大模型并不支 持超长文本的输入。通过将文本分割成多个较小的片段,可以只针对特定的片段 进行处理,从而减少计算量,提高响应速度。这不仅优化了模型的性能,还减少 了生成结果时的延迟。 

二、文本分割方法 

2.1、字符分割

        字符分割是最基础的文本分割方式,按照指定的分隔符进行分割。chunk_size 指的 是每个分割片段(chunk)的长度。chunk_overlap 指的是每个分割片段之间的重叠 部分。

注意: split_text 和 split_documents 不同:

        split_text:处理单纯的字符串。

        split_documents:处理包含元数据的文档对象。 

# 导入LangChain的字符文本分割器
from langchain.text_splitter import CharacterTextSplitter# 定义要分割的中文文本
text = "在西天取经的几百年前黑风山上有一只黑熊精占山为王,自称黑风大王。"# 创建字符文本分割器实例
# 参数说明:
# chunk_size=15: 每个文本块的最大字符数
# chunk_overlap=2: 相邻文本块之间的重叠字符数
# separator="": 分割符设为空字符串(按字符分割)
splitter = CharacterTextSplitter(chunk_size=15,chunk_overlap=2,separator=""
)# 执行文本分割
chunks = splitter.split_text(text)# 打印分割结果
print(chunks)
['在西天取经的几百年前黑风山上有', '上有一只黑熊精占山为王,自称黑', '称黑风大王。']

2.2、递归字符文本分割

        递归字符文本分割是字符分割的升级版,它以字符分割为基础,但在分割时引入了递 归的机制。 在初步分割之后,再对一些不完整或冗长的片段进行进一步细分,从而获得更加细粒 度的分割。

        这个方法比简单的字符分割更加灵活,可以通过递归深度来控制分割的粒度。 RecursiveCharacterTextSplitter不设置separators时,默认的separators参数为 ["\n\n", "\n", " ", ""]:将按不同的字符递归地分割(按照这个优先级["\n\n", "\n", " ", ""]),文本分割器首先在"\n\n"处尝试分割,如果分出的块过大(大于 chunk_size),则找到"\n"处尝试分割以此类推,若都不满足则按照字符划分。

# 导入LangChain的递归字符文本分割器
from langchain.text_splitter import RecursiveCharacterTextSplitter# 定义要分割的中文文本
text = "在西天取经的几百年前黑风山上有一只黑熊精占山为王,这里只是为了占位没什么用,自称黑风大王。"# 创建递归字符文本分割器实例
# 参数说明:
# chunk_size=15: 每个文本块的最大字符数
# chunk_overlap=3: 相邻文本块之间的重叠字符数
# separators=[...]: 分割符优先级列表(按顺序尝试分割)
splitter = RecursiveCharacterTextSplitter(chunk_size=15,  # 每个分块最大15个字符chunk_overlap=3,  # 分块间重叠3个字符separators=["\n\n",  # 双换行(最高优先级)"\n",    # 单换行" ",      # 空格".",      # 英文句号",",      # 英文逗号",",     # 中文逗号"。",     # 中文句号""        # 最后按字符分割(最低优先级)]
)# 执行文本分割
chunks = splitter.split_text(text)# 打印分割结果
print(chunks)
['在西天取经的几百年前黑风山上有', '山上有一只黑熊精占山为王', ',这里只是为了占位没什么用', ',自称黑风大王。']

递归分割机制:

        会按照separators列表中的顺序,优先尝试用高级别的分隔符

        如果高级别分隔符无法满足chunk_size要求,会降级使用更低级别的分隔符

参数特点:

        chunk_overlap=3确保分块之间有3个字符的重叠,保持上下文连贯

        中文标点","和"。"被明确列为分隔符,确保在标点处自然分割

分割策略:

        优先在段落(\n\n)、句子(。)级别分割

        其次在短语(,)和词语(空格)级别分割

        最后才会按单个字符分割

中文适配:

        专门添加了中文标点作为分隔符

        确保中文文本能在语义合理的边界处分割

2.3、特定文档分割(以markdown为例):

        特定文档分割是基于文档结构对文本进行分割的一种方式。不同的文档类型通常有各 自的结构化信息,例如书籍中的章节和段落、网页中的HTML标签等。 利用这些预定义的结构化信息,可以更加自然地分割文本,保证片段的上下文连贯 性。

# 导入Markdown标题文本分割器
from langchain.text_splitter import MarkdownHeaderTextSplitter# 定义包含Markdown标题的文本内容
text = """
# 第一章
在西天取经的几百年前,黑风山上。\n\n在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。
# 第二章
测试。
"""# 定义需要分割的标题级别和对应的元数据名称
# 格式: [(标题标记, 元数据字段名), ...]
headers_to_split_on = [("#", "Header 1"),   # 一级标题,保存到Header 1元数据字段("##", "Header 2"),  # 二级标题,保存到Header 2元数据字段
]# 创建Markdown标题分割器实例
splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on  # 传入标题配置
)# 执行文本分割
chunks = splitter.split_text(text)# 打印分割结果
print(chunks)
# 预期输出结构:
# [
#     {
#         'content': '在西天取经的几百年前...',  # 正文内容
#         'metadata': {'Header 1': '第一章'}  # 标题元数据
#     },
#     {
#         'content': '测试。',
#         'metadata': {'Header 1': '第二章'}
#     }
# ]
[Document(metadata={'Header 1': '第一章'}, page_content='在西天取经的几百年前,黑风山上。  \n在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。在西天取经的几百年前,黑风山上。'), Document(metadata={'Header 1': '第二章'}, page_content='测试。')]

2.4、实例

# 导入必要的库
from langchain_community.document_loaders import TextLoader  # 文本加载器
from langchain.text_splitter import RecursiveCharacterTextSplitter  # 递归字符分割器# 1. 加载TXT文档
# 创建TextLoader实例,指定文件路径和编码格式
text_loader = TextLoader("黑悟空.txt", encoding="UTF-8")
# 加载文档内容,返回Document对象列表
documents = text_loader.load()# 2. 定义递归字符分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200,  # 每个分块的最大字符数chunk_overlap=20,  # 相邻分块间的重叠字符数separators=["\n\n", "\n", " ", ".", ",", ",", "。", ""]  # 分割符优先级列表# 分割符优先级说明:# 1. 首先尝试用双换行符(\n\n)分割# 2. 然后尝试单换行符(\n)# 3. 接着是空格、英文标点# 4. 最后是中文标点# 5. 如果以上都不适用,则按单个字符分割
)# 3. 执行文档分割
# 对加载的文档进行分割,返回分割后的Document对象列表
splits_docs = text_splitter.split_documents(documents)# 4. 打印分割结果
# 遍历所有分块,打印序号和内容
for i, chunk in enumerate(splits_docs):print(f"分块 {i+1}: \n{chunk}\n")  # 打印分块编号和内容# 每个chunk是一个Document对象,包含page_content和metadata属性# 补充说明:
# 1. 适合处理包含中文标点的文本
# 2. 会尽量在段落、句子边界处进行分割
# 3. 重叠部分(chunk_overlap)确保上下文连贯性
# 4. 输出结果保留了原始文档的结构信息

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

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

相关文章

vue笔记3 VueRouter VueX详细讲解

vueRouter & vueX 看到这里的朋友如果没有看过前几期,可以通过文章的链接跳转到第一期,从第一期的 vue2 语法开始学习,如果是复习的朋友,也可以看本期只学习 vueRouter & VueX 项目初始化 经过上期,我们学习…

从当下需求聊聊Apifox 与 Apipost 的差异

作为一名长期投身于复杂项目开发的工程师,我深切体会到一款适配的接口管理工具对提升开发效率的关键意义。当团队在进行工具选型时,我对 Apifox 和 Apipost 展开了全面且系统的对比分析,其中的诸多发现,值得与大家深入探讨。 一、…

蓝牙协议栈高危漏洞曝光,攻击可入侵奔驰、大众和斯柯达车载娱乐系统

OpenSynergy BlueSDK关键漏洞,可远程执行代码入侵数百万车辆系统PCA网络安全公司的研究人员在OpenSynergy BlueSDK蓝牙协议栈中发现了一组被统称为"完美蓝"(PerfektBlue)的关键漏洞。利用这些漏洞可能对数百万辆汽车实施远程代码执…

Android 性能优化:启动优化全解析

前言 Android应用的启动性能是用户体验的重要组成部分。一个启动缓慢的应用不仅会让用户感到烦躁,还可能导致用户放弃使用。 本文将深入探讨Android应用启动优化的各个方面,包括启动流程分析、优化方法、高级技巧和具体实现。 一、Android应用启动流程深…

前沿重器[69] | 源码拆解:deepSearcher动态子查询+循环搜索优化RAG流程

前沿重器栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…

Vue+axios

1. axios简介axios 是一个基于 Promise 的 HTTP 客户端,主要用于浏览器和 Node.js 环境中发送 HTTP 请求。它是目前前端开发中最流行的网络请求库之一,被广泛应用于各种 JavaScript 项目(如 React、Vue、Angular 等框架或原生 JS 项目&#x…

通过Tcl脚本命令:set_param labtools.auto_update_hardware 0

1.通过Tcl脚本命令:set_param labtools.auto_update_hardware 0 禁用JTAG上电检测,因为2016.1 及更高版本 Vivado 硬件管理器中,当 FPGA正连接编程电缆时 重新上电,可能会出现FPGA无法自动加载程序的故障。 2.还可以通过 hw_serv…

Spring Boot 安全登录系统:前后端分离实现

关键词:Spring Boot、安全登录、JWT、Shiro / Spring Security、前后端分离、Vue、MySQL 详细代码请参考这篇文章:完整 Spring Boot Vue 登录 ✅ 摘要 在现代 Web 应用中,用户登录与权限控制是系统安全性的基础环节。本文将手把手带你实现…

Docker高级管理--Dockerfile 镜像制作

目录 一:Docker 镜像管理 1:Docker 镜像结构 (1) 镜像分层核心概念 (2)镜像层特性 (3)关键操作命令 (4)优化建议 2:Dockerfile介绍 (1&…

Leetcode力扣解题记录--第42题 接雨水(动规和分治法)

题目链接:42. 接雨水 - 力扣(LeetCode) 这里我们可以用两种方法去解决巧妙地解决这个题。首先来看一下题目 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。…

宝塔配置pgsql可以远程访问

本地navicat premium 17.0 可以远程访问pgsql v16.1宝塔的软件商店里,找到pgsql管理器;在pgsql管理器里找到客户端认证:第二步:配置修改,CtrlF 查找listen_addresses关键字;第三步:在navicat里配…

小架构step系列12:单元测试

1 概述 测试的种类很多:单元测试、集成测试、系统测试等,程序员写代码进行测试的可以称为白盒测试,单元测试和集成测试都可以进行白盒测试,可以理解为单元测试是对某个类的某个方法进行测试,集成测试则是测试一连串的…

SpringBoot3-Flowable7初体验

目录简介准备JDKMySQLflowable-ui创建流程图要注意的地方编码依赖和配置控制器实体Flowable任务处理类验证启动程序调用接口本文源码参考简介 Flowable是一个轻量的Java业务流程引擎,用于实现业务流程的管理和自动化。相较于老牌的Activiti做了一些改进和扩展&…

phpMyAdmin:一款经典的MySQL在线管理工具又回来了

phpMyAdmin 是一个免费开源、基于 Web 的 MySQL/MariaDB 数据库管理和开发工具。它提供了一个直观的图形用户界面,使得我们无需精通复杂的 SQL 命令也能执行大多数数据库管理任务。 phpMyAdmin 项目曾经暂停将近两年,不过 2025 年又开始发布新版本了。 …

存储服务一NFS文件存储概述

前言: 网络文件系统(Network File System,NFS)诞生于1984年,由Sun Microsystems首创,旨在解决异构系统间的文件共享需求。作为一种基于客户端-服务器架构的分布式文件协议,NFS允许远程主机通过T…

libimagequant 在 mac 平台编译双架构

在 macOS 上编译 libimagequant 的双架构(aarch64 x86_64)通用二进制库,以下是完整步骤:​​1. 准备 Rust 工具链​​ # 安装两个目标平台 rustup target add aarch64-apple-darwin x86_64-apple-darwin# 确认安装成功 rustup ta…

暑期自学嵌入式——Day01(C语言阶段)

点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!! 主页: 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1011.2682.3001.5343感悟: 今天我认为最重…

Flutter基础(前端教程⑧-数据模型)

这个示例展示了如何创建数据模型、解析 JSON 数据,以及在 UI 中使用这些数据:import package:flutter/material.dart; import dart:convert;void main() {// 示例:手动创建User对象final user User(id: 1,name: 张三,age: 25,email: zhangsa…

SSRF10 各种限制绕过之30x跳转绕过协议限制

ssrf漏洞在厂商的处理下可能进行一些特殊处理导致我们无法直接利用漏洞 有以下四种: 1.ip地址限制绕过 2.域名限制绕过 3.30x跳转绕过域名限制 4.DNS rebinding绕过内网ip限制 本章我们讲30x跳转绕过域名限制 30x跳转绕过域名限制 之前我们使用ssrf漏洞时可以…

DNS解析过程和nmap端口扫描

目录 DNS解析流程: nmap端口扫描 指定扫描方式 TCP全连接扫描 -sT SYN半连接扫描 -sS -sT和 -sS的区别 Linux提权 利用好谷歌语法查找敏感信息 如果自己搭建了网站文件要放在phpstudy_pro\WWW下。 如果想要使用域名访问网站,需要在phpstudy_pro…