RAG文本加载和分块调研

文本加载和分块
一、文本加载
文本加载是RAG文本增强检索重要环节。文件有不同类型(excel、word、ppt、pdf、png、html、eps、gif、mp4、zip等),衍生出了很多第三方库。使用python处理文件是各种python开发岗位都需要的操作。主要涉及到的标准库包括io、os、sys、csv等,涉涉及常用的第三方库包括numpy、pandas、openpyxl、xlwt、xlrd、xlsxwriter、reportlab等。RAG文本加载库主要包括open、numpy、Pandas、langchain等,使用案例如下:
1、Python自带库open库
file 对象使用 open 函数来创建
f = open(路径名, ‘r’)
print (f)
d = csv.reader(f)
for line in d:
print (line)
f.close()
2、numpy库
import numpy as np
p = np.loadtxt(路径名, delimiter=‘,’, skiprows=1)
print §
3、Pandas库
import pandas as pd
data = pd.read_csv(路径名) # TV、Radio、Newspaper、Sales
x = data[[‘TV’, ‘Radio’, ‘Newspaper’]]
y = data[‘Sales’]
print (x)
print (y)
4、langchain相关包
langchain提供了很多文档加载的类,以便进行不同的文件加载,这些类都通 过 langchain.document_loaders 引入。例如:UnstructuredFileLoader(txt文件 读取)、UnstructuredFileLoader(word文件读取)、MarkdownTextSplitter(m arkdown文件读取)、UnstructuredPDFLoader(PDF文件读取)。
#加载txt文件
def load_txt_file(txt_file):
loader = UnstructuredFileLoader(os.path.join(work_dir, txt_file))
docs = loader.load()
print(docs[0].page_content[:100])
return docs
#加载pdf文件
def load_pdf_file(pdf_file):
loader = UnstructuredPDFLoader(os.path.join(work_dir, pdf_file))
docs = loader.load()
print(‘pdf:\n’,docs[0].page_content[:100])
return docs
二、文本分块
1、什么是分块
在构建RAG这类基于LLM的应用程序中,分块(chunking)是将大块文本分解成小段的过程。当我们使用LLM embedding内容时,这是一项必要的技术,可以帮助我们优化从向量数据库被召回的内容的准确性。
对于大语言模型,往往单次传入的token长度是有限的。因此在加载完成后,还需要对文件进行分割,这样才能更准确的被模型所理解。分割默认有两个关键参数:chunk_size:每个分割段的最大长度;chunk_overlap:相邻两个分割段之间的重叠token数量。这两个参数可以 根据实际需要来配置。
2、分块算法
2.1、固定大小的分块
这是最常见、最直接的分块方法:我们只需决定一个文本块中的分词数量,以及选择性地决定文本块之间可否进行交叠(overlap)。一般来说,我们希望在文本块块之间保留一些交叠,这样可以防止上下文的语义不会丢失。大多数常见情况下,定长分块是最佳路径。与其他形式的分块相比,定长分块计算成本低且易于使用,因为不需要使用任何NLP库。使用CharacterTextSplitter,一般的设置参数为:chunk_size、 chunk_overlap、separator和strip_whitespace。
text = “…” # your text
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
separator = “\n\n”,
chunk_size = 256,
chunk_overlap = 20
)
docs = text_splitter.create_documents([text])
2.2“内容感知”分块
朴素切分:最简单的方法是按句点(“.”)和换行符切分句子。虽然这可能既快速又简单,但这种方法不会考虑所有可能的边缘情况。下面是一个非常简单的示例:
text = “…” # your text
docs = text.split(“.”)
NLTKopen in new window:自然语言工具包(NLTK)是一个流行的Python库,用于处理人类语言数据。它提供了一个句子分词器,可以将文本切分为句子,帮助创建更有意义的块。例如,要将NLTK与LangChain一起使用,您可以执行以下操作:
text = “…” # your text
from langchain.text_splitter import NLTKTextSplitter
text_splitter = NLTKTextSplitter()
docs = text_splitter.split_text(text)
spaCyopen in new window:spaCy是另一个强大的Python库,用于NLP任务。它提供了复杂的分句功能,可以有效地将文本划分为单独的句子,从而在生成的块中更好地保留上下文。例如,要将spaCy与LangChain一起使用,您可以执行以下操作:
text = “…” # your text
from langchain.text_splitter import SpacyTextSplitter
text_splitter = SpaCyTextSplitter()
docs = text_splitter.split_text(text)
2.3、递归分块
递归分块使用一组分隔符以分层和迭代方式将输入文本划分为较小的块。如果拆分文本的初始尝试未生成所需大小或结构的块,则该方法会使用不同的分隔符或条件递归调用生成的块,直到达到所需的块大小或结构。这意味着,虽然块的大小不会完全相同,但它们仍然追求具有相似的大小。下面是如何在 LangChain 中使用递归分块的示例:
text = “…” # your text
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter

Set a really small chunk size, just to show.

chunk_size = 256,
chunk_overlap = 20
2.4、专用分块
Markdown和LaTeX是您可能会遇到的结构化和格式化内容的两个例子。在这些情况下,您可以使用专门的分块方法在分块过程中保留内容的原始结构。
Markdownopen in new window:Markdown 是一种轻量级标记语言,通常用于格式化文本。通过识别 Markdown 语法(例如,标题、列表和代码块),您可以根据内容的结构和层次结构智能地划分内容,从而产生语义上更一致的块。例如:
from langchain.text_splitter import MarkdownTextSplitter
markdown_text = “…”
markdown_splitter = MarkdownTextSplitter(chunk_size=100, chunk_overlap=0)
docs = markdown_splitter.create_documents([markdown_text])
LaTexopen in new window:LaTeX是一种文档准备系统和标记语言,通常用于学术论文和技术文档。通过解析 LaTeX 命令和环境,您可以创建尊重内容逻辑组织(例如,部分、子部分和公式)的块,从而获得更准确和上下文相关的结果。例如:
from langchain.text_splitter import LatexTextSplitter
latex_text = “…”
latex_splitter = LatexTextSplitter(chunk_size=100, chunk_overlap=0)
docs = latex_splitter.create_documents([latex_text])
2.5、语义分块
我们是否觉得为块大小设置一个全局常量很奇怪?我们的普通分块机制是否更奇怪,因为它们没有考虑实际内容?嵌入表示了字符串的语义含义。它们本身并没有太多作用,但是当与其他文本的嵌入进行比较时,您可以开始推断块之间的关系。利用这个特性,探索使用嵌入来找到语义上相似的文本聚类。假设是语义上相似的块应该放在一起。
2.6、LLM 分块
我们是否可以命令LLM执行此任务?人类是如何进行分块的呢?我们会如何将文档分块成具有语义相似性的离散部分?我会准备一张草稿纸或记事本。我会从文章的顶部开始,假设第一部分将是一个块(因为我们还没有任何块)。然后,我会继续阅读文章,评估新的句子或文章片段是否应该成为第一个块的一部分,如果不是,就创建一个新的块。
3、分块策略选择
3.1、考虑分块大小
在语义搜索中,我们索引一个文档语料库,每个文档包含一个特定主题的有价值的信息。通过使用有效的分块策略,我们可以确保搜索结果准确地捕获用户查询的需求本质。如果我们的块太小或太大,可能会导致不精确的搜索结果或错过展示相关内容的机会。根据经验,如果文本块尽量是语义独立的,也就是没有对上下文很强的依赖,这样子对语言模型来说是最易于理解的。因此,为语料库中的文档找到最佳块大小对于确保搜索结果的准确性和相关性至关重要。另一个例子是会话Agent。我们使用embedding的块为基于知识库的会话agent构建上下文,该知识库将代理置于可信信息中。在这种情况下,对分块策略做出正确的选择很重要,原因有两个:

  • 首先,它将决定上下文是否与我们的prompt相关。
  • 其次,考虑到我们可以为每个请求发送的tokens数量的限制,它将决定我们是否能够在将检索到的文本合并到prompt中发送到大模型(如OpenAI)。
    参考:https://zhuanlan.zhihu.com/p/676979306
    找出最适合应用程序的块大小:
    预处理数据 - 在确定应用程序的最佳块大小之前,你需要首先预处理数据以确保质量。 例如,如果你的数据是从网络检索的,可能需要删除 HTML 标签或只会增加噪音的特定元素。
    选择块大小范围 - 数据经过预处理后,下一步是选择要测试的潜在块大小范围。 如前所述,选择应考虑内容的性质(例如,短消息或冗长的文档)、你将使用的嵌入模型及其功能(例如,令牌限制)。 目标是在保留上下文和保持准确性之间找到平衡。 首先探索各种块大小,包括用于捕获更细粒度语义信息的较小块(例如,128 或 256 个标记)和用于保留更多上下文的较大块(例如,512 或 1024 个标记)。
    评估每个块大小的性能 - 为了测试各种块大小,你可以使用多个索引或具有多个命名空间的单个索引。 使用代表性数据集,为要测试的块大小创建嵌入并将它们保存在索引中。 然后,可以运行一系列查询,可以评估其质量,并比较不同块大小的性能。 这很可能是一个迭代过程,你可以针对不同的查询测试不同的块大小,直到可以确定内容和预期查询的最佳性能块大小。
    3.2分块方法选择
    比较适合的方法如下:
    方法1:固定大小块分割 - 简单的静态字符数据块
    方法2:递归字符文本分割 - 基于分隔符列表的递归分块
    方法3:特定文档分割 - 针对不同文档类型(PDF、Python、Markdown)的各种分块方法
    方法4:语义分割 - 基于嵌入式遍历的分块
    方法5:LLM 分割 - 使用类似代理系统的实验性文本分割方法。

方法相关试例:
方法1:固定大小块分割
字符分割是将文本分割的最基本形式。它是简单地将文本分割成N个字符大小的块,而不考虑其内容或形式。
优点:简单易行
缺点:非常刻板,不考虑文本的结构

方法2:递归字符文本分割
方法1的问题在于完全不考虑文档的结构。只是按照固定数量的字符进行分割。递归字符文本分割器可以解决这个问题。通过它,我们将指定一系列分隔符来分割文档。例如 LangChain的默认分隔符:“\n\n” - 换行、“\n” - 换行、" " - 空格、“” - 空字符等,这是快速搭建应用程序时的首选。如果您不知道从哪个分割器开始,这是一个不错的首选。

方法3:特定文档分割
除了普通文本文件之外的其他文档类型。比如图片、PDF、代码片段等等。前两个方法对于这些情况并不适用,所以需要找到不同的策略。Markdown、Python和JS的分割器基本上与递归字符分割器类似,只是使用不同的分隔符。例如 Markdown 分隔符:\n#{1,6} - 标题、```\n -代码块等。

方法4:语义分块
我们是否觉得为块大小设置一个全局常量很奇怪?我们的普通分块机制是否更奇怪,因为它们没有考虑实际内容?嵌入表示了字符串的语义含义。它们本身并没有太多作用,但是当与其他文本的嵌入进行比较时,您可以开始推断块之间的关系。利用这个特性,探索使用嵌入来找到语义上相似的文本聚类。假设是语义上相似的块应该放在一起。

方法5:LLM 分块
我们是否可以命令LLM执行此任务?人类是如何进行分块的呢?我们会如何将文档分块成具有语义相似性的离散部分?我会准备一张草稿纸或记事本。我会从文章的顶部开始,假设第一部分将是一个块(因为我们还没有任何块)。然后,我会继续阅读文章,评估新的句子或文章片段是否应该成为第一个块的一部分,如果不是,就创建一个新的块。然后一直这样做,直到读完整篇文章。
4、分块实现代码
4.1、langchain相关实现
链接:文本分割器# – LangChain中文网
在这里插入图片描述
在这里插入图片描述

4.2上面五种方法的实现
链接1:https://github.com/FullStackRetrieval-com/RetrievalTutorials/blob/main/5_Levels_Of_Text_Splitting.ipynb
链接2:https://python.langchain.com/docs/modules/data_connection/document_transformers/semantic-chunker
在这里插入图片描述
在这里插入图片描述

5、评估
langchain评估链接:https://chunkviz.up.railway.app/
可以使用创建的Chunkviz 实用程序Greg Kamradt来评估文本拆分器。Chunkviz是一个很好的工具,可以直观地显示文本拆分器的工作情况。它将向您显示文本是如何分割的,并帮助调整分割参数。
ragas评估链接:github.com/explodinggradients/ragas
Ragas是一个帮助您评估检索增强生成(RAG)pipelines。Ragas提供基于最新研究的工具,用于评估LLM生成的文本,以帮助您了解RAG pipelines的情况。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL入门到实战-第四弹

PostgreSQL入门到实战 PostgreSQL查询语句(一)官网地址PostgreSQL概述查询语句概述查询语句实操更新计划 PostgreSQL查询语句(一) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.postgresql.org/PostgreSQL概述…

reids-AOF(Append Only File)持久化使用方法

一,什么是AOF(Append Only File) 将我们所有的命令都记录下来,history,恢复的时候就把这个文件全部再执行一遍 以日志的形式来记录每个写的操作,将Redis执行过的所有指令记录下来(读操作不记录&…

利用Java代码调用Lua脚本改造分布式锁

4.8 利用Java代码调用Lua脚本改造分布式锁 lua脚本本身并不需要大家花费太多时间去研究,只需要知道如何调用,大致是什么意思即可,所以在笔记中并不会详细的去解释这些lua表达式的含义。 我们的RedisTemplate中,可以利用execute方…

V神演讲展望Web3发展并认为可引入人工智能

前言 2024 香港 Web3 嘉年华期间,以太坊联合创始人 Vitalik Buterin 发表主旨演讲《Reaching the Limits of Protocol Design》。以下是演讲内容: 区块链与ZK-SNARKS 我们用来构建协议的技术类型在过去 10 年里发生了很大变化。那么,当 2…

[react优化] 避免组件或数据多次渲染/计算

代码如下 点击视图x➕1,导致视图更新, 视图更细导致a也重新大量计算!!这很浪费时间 function App() {const [x, setX] useState(3)const y x 2console.log(重新渲染, x, y);console.time(timer)let a 0for (let index 0; index < 1000000000; index) {a}console.timeE…

CodeMirror使用: 编写一个在线编辑HTML、JS、CSS文件,网页的模板页面-初实现

前言&#xff1a;前几天编写一个UI模板控制的功能&#xff0c;根据上传的前端模板更换跳转入口主题页面&#xff1b;在编写的时候&#xff0c;突发奇想能不能在列表页面进行在线编辑刚刚上传的模板zip压缩包里的页面...于是经过学习研究有了这篇文章&#xff1b;当日记本一样记…

主机有被植入挖矿病毒篡改系统库文件

查看主机有被植入挖矿病毒篡改系统库文件的行为 排查方法 挖矿病毒被植入主机后&#xff0c;利用主机的运算力进行挖矿&#xff0c;主要体现在CPU使用率高达90%以上&#xff0c;有大量对外进行网络连接的日志记录。 Linux主机中挖矿病毒后的现象如下图所示&#xff1a; &…

在Linux中使用dpkg -i离线安装下载的deb软件包

“dpkg -i” 是 Debian 系统中用于安装 .deb 格式软件包的命令。它是 Debian Package Management System&#xff08;DPMS&#xff09;的一部分&#xff0c;允许用户通过命令行界面来管理软件包。 使用该命令时&#xff0c;需要提供要安装的软件包的路径作为参数。例如&#…

Walmart.com DSV XML对接需求

此前的文章Walmart.com DSV EDI对接需求中&#xff0c;为大家介绍了如果选择传输EDI文件需要做的准备与需求。本文将为大家介绍Walmart.com 与DSV&#xff08;Drop Ship Vender&#xff09;之间传输XML文件的需求。与EDI相比&#xff0c;XML文件的处理难度相对低一些。无论企业…

2007-2022年上市公司企业绿色创新效率数据

2007-2022年上市公司企业绿色创新效率数据&#xff08;仅结果&#xff09; 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;stkcd、year、绿色科技研发效率、绿色成果转化效率 3、来源&#xff1a;上市公司年报、上市公司社会责任报告、上市公司网站信息 4、计算方法&…

自动化测试大总结

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

[NKCTF2024]-PWN:leak解析(中国剩余定理泄露libc地址,汇编覆盖返回地址)

查看保护 查看ida 先放exp 完整exp&#xff1a; from pwn import* from sympy.ntheory.modular import crt context(log_leveldebug,archamd64)while True:pprocess(./leak)ps[101,103,107,109,113,127]p.sendafter(bsecret\n,bytes(ps))cs[0]*6for i in range(6):cs[i]u32(p…

想要品牌传播有效,先清楚这三个本质问题

在互联网时代&#xff0c;企业想要提高市场竞争力就需要做好品牌传播。然而有许多企业在做品牌传播时都会踩坑&#xff0c;原因是因为忽视了这三点&#xff0c;接下来就让媒介盒子和大家分享&#xff1a; 一、 文案本质是“购买理由” 在文案技巧中经常会出现一些词&#xff…

【SVN】clean up报错:Cleanup failed to process the following paths 解决方法

报错来源&#xff1a;代码更新有一个文件既不能接受自己的也不能接受别人的&#xff0c;只能取消&#xff0c;再提交提醒clean up&#xff0c;随后报标题错误。 解决方法&#xff1a;参考https://www.cnblogs.com/pinpin/p/11395438.html 1.下载sqlite3 网址&#xff1a;SQL…

请求转发和请求重定向的区别

请求转发(Forward)和请求重定向(Redirect)虽然都是 HTTP 服务器&#xff0c;处理客户端请求时进行(页面)跳转的实现方式&#xff0c;但是二者有以下 5 点不同: 1. 定义不同。 2. 跳转方不同。 3. 数据共享不同。 4.最终 URL 地址不同。 5.代码实现不同。 具体内容如下&…

实践笔记-linux内核版本升级(centos7)

linux内核版本升级 1.查看当前内核版本信息2.采用yum方式进行版本升级2.1导入仓库源2.2选择 ML 或 LT 版本安装2.3设置内核启动 3.删除旧版本内核 1.查看当前内核版本信息 #查看操作系统版本 cat /etc/redhat-release #查看系统内核 uname -r2.采用yum方式进行版本升级 2.1导…

微信公众号视频下载

这几天想在微信公众号中下载几个视频&#xff0c;但没有视频中没有下载图标&#xff0c;试了据说可以下载视频的网站也不行。折腾了我几天&#xff0c;一直不得其法&#xff0c;没想到最后想要放弃时&#xff0c;被我找到了下载方法&#xff0c;很简单&#xff0c;在这里分享给…

基于SpringBoot+Vue的在线学习平台(源码+文档+部署+讲解)

一.系统概述 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具有学习信息管理功能的选择。学…

华为USG6000v

1、安全区域 一个及或多个接口的集合 默认的安全区域 Trust --- 优先级85&#xff0c;一般连接内网 Untrust --- 优先级5&#xff0c; 一般连接外网 Dmz --- 优先级50&#xff0c;一般连接服务器、 Local --- 优先级100&#xff0c;防火墙接口所在区的区域 2…

在短视频的挤压下,长视频何去何从?长视频行业能否借助AI重拾信心?

回顾2019年中国网络视听大会&#xff0c;长视频行业的领袖们曾在演讲中对短视频进行了猛烈抨击&#xff0c;这一场面至今仍然令人印象深刻。当时&#xff0c;长视频平台似乎还有一些自信&#xff0c;但如今&#xff0c;他们已经被来自各方的竞争对手挤得喘不过气来。今年以来&a…