LLM应用的分块策略

news2024/11/28 5:38:11

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。

欢迎关注公众号

原文标题:Chunking Strategies for LLM Applications

原文地址:https://www.pinecone.io/learn/chunking-strategies/


LLM应用的分块策略

在构建与LLM相关的应用程序的背景下,分块是将大段文本分解为较小段的过程。这是一种关键的技术,有助于在使用LLM嵌入内容后,优化从矢量数据库获取的内容的相关性。在本博客文章中,我们将探讨分块是否以及如何提高LLM相关应用程序的效率和准确性。

正如我们所知,我们在Pinecone中索引的任何内容都需要首先进行嵌入。分块的主要原因是确保我们嵌入的内容尽可能少地包含噪音,同时仍然在语义上相关。

例如,在语义搜索中,我们索引一系列文档,每个文档都包含特定主题的有价值信息。通过应用有效的分块策略,我们可以确保我们的搜索结果准确捕捉用户查询的本质。如果我们的文本块太小或太大,可能会导致不精确的搜索结果或错过展示相关内容的机会。通常来说,如果文本块在不考虑周围上下文的情况下对人类来说是有意义的,那么对语言模型来说也是有意义的。因此,找到语料库中文档的最佳分块大小对确保搜索结果准确和相关至关重要。

另一个例子是对话代理(我们之前使用Python和Javascript进行了介绍)。我们使用嵌入的块来构建基于知识库的对话代理的上下文,该知识库将代理置于可信的信息中。在这种情况下,选择正确的分块策略非常重要,原因有两个:首先,它将决定上下文是否真正与我们的提示相关。其次,它将决定我们是否能够将检索到的文本适应到上下文中,然后发送给外部模型提供商(例如,OpenAI),考虑到我们每次请求可以发送的令牌数量的限制。在某些情况下,比如在使用具有32k上下文窗口的GPT-4时,适应文本块可能不是问题。然而,我们需要注意,当我们使用非常大的文本块时,这可能会对我们从Pinecone得到的结果的相关性产生负面影响。

在这篇文章中,我们将探讨几种分块方法,并讨论在选择分块大小和方法时应考虑的权衡。最后,我们将给出一些关于确定最佳分块大小和方法的建议,这将适用于您的应用程序。

1.嵌入短内容和长内容

当我们嵌入我们的内容时,我们可以预见到根据内容的长度(如句子或段落,甚至整篇文章)的不同,会有不同的行为。

当一个句子被嵌入时,生成的向量专注于句子的特定含义。与其他句子嵌入比较时,比较通常会在这个层面上进行。这也意味着嵌入可能会错过在段落或文档中发现的更广泛的上下文信息。

当整个段落或文章被嵌入时,嵌入过程会同时考虑整体上下文和文本内部句子和短语之间的关系。这可能导致一个更全面的向量表示,捕捉文本的广泛含义和主题。另一方面,更大的输入文本大小可能会引入噪音或淡化单个句子或短语的重要性,使得在查询索引时找到精确匹配更困难。

查询的长度也会影响嵌入之间的关系。更短的查询,如单个句子或短语,会集中在特定的细节上,可能更适合与句子级别的嵌入进行匹配。超过一句话或一段落的更长查询可能会更符合段落或文档级别的嵌入,因为它可能在寻找更广泛的上下文或主题。

索引也可能是非均匀的,包含各种大小的块嵌入。这可能在查询结果的相关性方面带来挑战,但也可能带来一些积极的影响。一方面,由于长、短内容的语义表示之间的差异,查询结果的相关性可能会波动。另一方面,非均匀索引可能捕获更广泛的上下文和信息,因为不同大小的块代表了文本中不同级别的粒度。这可能更灵活地适应不同类型的查询。

2.分块的考虑因素

确定最佳分块策略的几个变量会根据使用场景的不同而变化。以下是一些需要考虑的关键因素:

(1)被索引的内容是什么性质?你是在处理长的文档,如文章或书籍,还是较短的内容,如推特或即时信息?答案将决定哪个模型更适合你的目标,因此,也会决定应用什么样的分块策略。

(2)你正在使用哪种嵌入模型,以及它对哪种大小的块有最佳的性能?例如,句子-转换器模型在处理单个句子时表现良好,但像text-embedding-ada-002这样的模型在处理包含256或512个标记的块时表现更好。

(3)你对用户查询的长度和复杂性有什么期望?他们会是短而具体,还是长且复杂?这可能会影响你选择如何分块内容,以便嵌入查询和嵌入块之间有更紧密的关联。

(4)在你的特定应用中如何使用检索到的结果?例如,他们会被用于语义搜索,问答,总结,还是其他目的?例如,如果你的结果需要被输入到另一个具有标记限制的LLM中,你就必须考虑这个因素,并根据你希望适应到LLM请求的块数量来限制块的大小。

回答这些问题将使你能够制定出一个平衡性能和精度的分块策略,这反过来也将确保查询结果的相关性更高。

3.分块方法

有多种不同的分块方法,每种方法可能适合不同的情况。通过分析每种方法的优点和缺点,我们的目标是确定适合应用它们的正确场景。

3.1固定大小分块

这是最常见和最直接的分块方法:我们只需决定我们的块中的token数,并选择性地决定它们之间是否应存在任何重叠。一般来说,我们会希望块之间保持一些重叠,以确保语义上下文不会在块之间丢失。固定大小的分块在大多数常见情况下将是最好的路径。与其他形式的分块相比,固定大小的分块在计算上便宜且使用简单,因为它不需要使用任何NLP库。

以下是使用LangChain执行固定大小分块的示例:

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])
3.2内容感知分块

这是一组方法,用于利用我们正在分块的内容的性质,并应用更复杂的分块方法。以下是一些例子:

(1)句子分割

如我们之前提到的,许多模型都是针对嵌入句子级内容进行优化的。自然地,我们会使用句子分块,有几种方法和工具可以执行此操作,包括:

  • 简单分割:最简单的方法是按句号(“。”)和换行符进行分割。虽然这可能很快且简单,但此方法不能考虑所有可能的边缘情况。以下是一个非常简单的例子:
text = "..." # your text
docs = text.split(".")
  • NLTK:自然语言工具包(NLTK)是用于处理人类语言数据的流行Python库。它提供了一个可以将文本分割成句子的句子标记器,有助于创建更有意义的文本块。例如,要将NLTK与LangChain一起使用,您可以执行以下操作:
text = "..." # your text
from langchain.text_splitter import NLTKTextSplitter
text_splitter = NLTKTextSplitter()
docs = text_splitter.split_text(text)
  • spaCy:spaCy是另一个用于NLP任务的强大Python库。它提供了复杂的句子分割功能,可以有效地将文本划分为独立的句子,使得后续块中更好地保留上下文。例如,要将spaCy与LangChain一起使用,您可以执行以下操作:
text = "..." # your text
from langchain.text_splitter import SpacyTextSplitter
text_splitter = SpaCyTextSplitter()
docs = text_splitter.split_text(text)

(2)递归分块

递归分块使用一组分隔符以分层和迭代的方式将输入文本划分为更小的块。如果首次尝试分割文本未能产生所需大小或结构的块,该方法会递归地在结果块上调用自身,并使用不同的分隔符或标准,直到达到所需的块大小或结构。这意味着,虽然块不会完全相同大小,但它们仍会“渴望”达到类似的大小。

以下是如何使用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
)

docs = text_splitter.create_documents([text])

(3)专用分块

Markdown和LaTeX是您可能会遇到的两个结构化和格式化内容的示例。在这些情况下,您可以使用专用的分块方法,在分块过程中保留内容的原始结构。

  • Markdown: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])
  • LaTeX: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])

4.为您的应用确定最佳的块大小

如果常见的分块方法(如固定分块)不能轻松适用于您的用例,以下是一些提示,帮助您找出最优的块大小。

  • 预处理你的数据 - 在确定应用程序的最佳块大小之前,你首先需要预处理你的数据以确保质量。例如,如果你的数据是从网页获取的,你可能需要删除HTML标签或特定只增加噪音的元素。

  • 选择一定范围的块大小 - 数据预处理完成后,下一步是选择一定范围的潜在块大小进行测试。如前所述,这个选择应考虑到内容的性质(例如,短消息或长篇文档)、你将使用的嵌入模型及其功能(例如,token限制)。目标是在保留上下文和维持准确性之间找到平衡。可以通过探索不同的块大小开始,包括较小的块(例如,128或256 token)用于捕获更细粒度的语义信息,和较大的块(例如,512或1024 token)用于保留更多的上下文。

  • 评估每个块大小的性能 - 为了测试各种块大小,你可以使用多个索引或单个索引与多个命名空间。有了代表性的数据集,创建你想要测试的块大小的嵌入,然后保存在你的索引中。然后你可以运行一系列可以评估质量的查询,并比较各种块大小的性能。这很可能是一个迭代的过程,在这个过程中你要测试各种块大小与不同的查询,直到你能确定最适合你的内容和预期查询的最佳性能的块大小。

5.结论

在大多数情况下,对您的内容进行分块是相当简单的 - 但当您开始走出常规思维时,它可能会带来一些挑战。分块没有一种适合所有情况的解决方案,所以对一个用例有效的方法可能对另一个用例无效。希望这篇文章可以帮助您更好地理解如何为您的应用程序进行分块的方法。

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

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

相关文章

数据结构:队列(链表和数组模拟实现)

目录 1.何为队列 2.链表模拟实现 2.1 节点和队列创建 2.2 初始化队列 2.3 入队操作 2.4 出队操作 2.5 遍历队列 2.6 获取队首和队尾元素 2.7 判断队列是否为空 2.8 完整实现 3. 数组模拟实现 3.1 创建队列 3.2 入队和出队操作 3.3 遍历队列 3.4 获取队首和队尾元…

计算机组成原理复习4

习题 练习题 下列不属于系统总线的为() a.数据总线 b.地址总线 c.控制总线 d.片内总线 D 系统总线中地址总线的功能是() a.选择主存单元地址 b.选择进行信息传输的设备 c.选择外存地址 d.指定主存和I/O设备接口电路的地址 D 解…

【电商项目实战】商品详情显示与Redis存储购物车信息

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《电商项目实战》。🎯🎯 &am…

第9章 继承和派生习题(详解)

一、选择题 1.下列表示引用的方法中, () 是正确的。已知:int m10: A.int &xm; B.int &y10; C.int &z; D.fl…

[CISCN 2019华东南]Web11

[CISCN 2019华东南]Web11 wp 信息搜集 页面内容如下: 右上角显示的是我的当前 IP 。 在最下角提示:Build With Smarty ! Smarty 是 PHP 的一个模板引擎,那么这道题应该是 Smarty 模板注入。 Smarty 模板注入 可以参考博客:Sm…

4年微博热搜数据,一次拿走

又是新的一年了,从2020年开始,就养成了定时备份各大平台热搜数据的习惯,微博,知乎都在备份,今天给大家看一下从2020年到2023年的微博热搜数据情况 这是2022年的备份数据,每天的热搜数据一个文件&#xff0c…

[蓝桥杯基础题型] 图论题目

遍历 添加路障 首先答案只能是0 1 2 ,原因:把出发点堵住只需要两个路障 路障为0:不能找到一条从出发点到终点的路 路障为1:能找到一条从出发点到终点的路,但是只有一条 路障为2:能找到一条从出发点到终…

Origin 2021软件安装包下载及安装教程

Origin 2021下载链接:https://docs.qq.com/doc/DUnJNb3p4VWJtUUhP 1.选中下载的压缩包,然后鼠标右键选择解压到"Origin 2021"文件夹 2.双击打开“Setup”文件夹 3.选中“Setup.exe”鼠标右键点击“以管理员身份运行” 4.点击“下一步" 5…

SELinux 安全模型——MLS

首发公号:Rand_cs BLP 模型:于1973年被提出,是一种模拟军事安全策略的计算机访问控制模型,它是最早也是最常用的一种多级访问控制模型,主要用于保证系统信息的机密性,是第一个严格形式化的安全模型 暂时无…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1)索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2)查询语句较烂 3)关联查询太多join&a…

Embedding模型在大语言模型中的重要性

引言 随着大型语言模型的发展,以ChatGPT为首,涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快,却少有关注支撑许多大型语言模型应用落地的必不可少的Embedding模型。本文将主要介绍为什么…

【SpringCloud Alibaba笔记】(2)Nacos服务注册与配置中心

Nacos Nacos简介与下载 是什么? 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos(Dynamic Naming and Configuration Service)就是注册中心+配置中心的组合 Nacos Eureka Config Bus 替代Eureka…

初识HTTP协议

Web服务器可以接收浏览器的请求,并将服务器中的web项目资源响应给浏览器,浏览器与服务器之间进行网络通信遵循HTTP协议。 一、什么是HTTP协议 超文本传输协议(HTTP,HyperText Transfer Protocol)(浏览器---->web服务…

27 UVM queue

uvm_queue类构建一个动态队列,该队列将按需分配并通过引用传递。 uvm_queue类声明: class uvm_queue #( type T int ) extends uvm_object 1 uvm_queue class hierarchy 2 uvm_queue class Methods 3 UVM Queue Example 在下面的示例中,…

基于深度卷积神经网络的垃圾分类识别系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细介绍了一基于深度卷积神经网络的垃圾分类识别系统。采用TensorFlow和Keras框架,通过卷积神经网络(CNN)进行模型训练和预测。引入迁移学习中的VGG16模型…

Linux:apache优化(7)—— 日志分割|日志合并

作用:随着网站访问量的增加,访问日志中的信息会越来越多, Apache 默认访问日志access_log单个文件会越来越大,日志文件体积越大,信息都在一个文件中,查看及分析信息会及不方便。 分割 实现方式&#xff1a…

『JavaScript』JavaScript事件类型详解:全面解析各类用户交互行为

📣读完这篇文章里你能收获到 理解事件驱动编程的基本概念和工作原理掌握JavaScript中常见的事件类型及其应用场合学习如何使用DOM API添加和移除事件监听器探讨事件冒泡、事件捕获和事件委托等高级事件处理技术 文章目录 一、事件处理程序1. HTML事件处理HTML事件处…

单片机键盘程序设计举例

1、键盘与的连接 图3键盘连接 图4单片机与键盘接口图 2、通过1/0口连接。将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键…

HttpClient入门

HttpClient入门 简介 HttpClient 是 Apache HttpComponents 项目中的一个开源的 Java HTTP 客户端库,用于发送 HTTP 请求和处理 HTTP 响应。它提供了一组强大而灵活的 API,使得在 Java 程序中执行 HTTP 请求变得相对简单 maven依赖 org.apache.httpco…

72内网安全-域横向CSMSF联动及应急响应知识

拿到才行,拿不到就是多余的 案例一MSF&CobaltStrike 联动 Shell 有一些功能可能cs或者msf强大一些,他们两个可以相互调用,在真实情况下也是可以cs和msf同时启动的, cs移交给msf .创建Foreign监听器 “Listeners”“Add”…