4种最常用的LLM应用文本分块策略

news2024/11/20 13:30:39

在构建 LLM 应用程序时,分块(Chunking)是将大块文本分解成更小的片段的过程。 这是一项重要的技术,一旦我们使用LLM嵌入内容,它有助于优化我们从矢量数据库返回的内容的相关性。 在这篇博文中,我们将探讨它是否以及如何帮助提高LLM相关请求的效率和准确性。

众所周知,我们在 Pinecone 中索引的任何内容都需要首先嵌入。 分块的主要原因是确保我们嵌入的内容尽可能少,但在语义上仍然相关。

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

另一个例子是会话代理(Conversational Agent)。 我们使用嵌入的文本块根据知识库为会话代理构建上下文,该知识库使代理基于可信信息。 在这种情况下,对我们的分块策略做出正确的选择很重要,原因有两个:首先,它将确定上下文是否确实与我们的提示相关。 其次,考虑到我们可以为每个请求发送的令牌数量的限制,它将确定我们是否能够在将检索到的文本发送到外部模型提供商(例如 OpenAI)之前将其放入上下文中。 在某些情况下,例如在 32k 上下文窗口中使用 GPT-4 时,拟合块可能不是问题。 尽管如此,我们需要注意何时使用非常大的块,因为这可能会对我们从 Pinecone 返回的结果的相关性产生不利影响。

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

在这里插入图片描述

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

1、嵌入短内容和长内容

当我们嵌入内容时,我们可以根据内容是短(如句子)还是长(如段落或整个文档)来预测不同的行为。

当嵌入一个句子时,所得向量集中于该句子的特定含义。 与其他句子嵌入相比,比较自然会在该级别上进行。 这也意味着嵌入可能会错过段落或文档中更广泛的上下文信息。

当嵌入完整的段落或文档时,嵌入过程会考虑整体上下文以及文本中句子和短语之间的关系。 这可以产生更全面的矢量表示,捕获文本的更广泛的含义和主题。 另一方面,较大的输入文本可能会引入噪音或削弱单个句子或短语的重要性,从而使在查询索引时找到精确匹配变得更加困难。

查询的长度也会影响嵌入之间的相互关系。 较短的查询(例如单个句子或短语)将专注于细节,并且可能更适合与句子级嵌入进行匹配。 跨越多个句子或段落的较长查询可能更适合段落或文档级别的嵌入,因为它可能正在寻找更广泛的上下文或主题。

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

2、分块注意事项

有几个变量在确定最佳分块策略方面发挥着作用,这些变量根据用例而变化。 以下是需要牢记的一些关键方面:

  • 被索引的内容的性质是什么? 你是否正在处理长文档(例如文章或书籍)或较短的内容(例如推文或即时消息)? 答案将决定哪种模型更适合你的目标,以及应用哪种分块策略。
  • 你使用哪种嵌入模型,它在什么块大小上表现最佳? 例如, sentence-transformer模型在单个句子上效果很好,但像 text-embedding-ada-002 这样的模型在包含 256 或 512 个token的块上表现更好。
  • 你对用户查询的长度和复杂性有何期望? 它们会简短而具体,还是长而复杂? 这也可能会告诉您选择对内容进行分块的方式,以便嵌入式查询和嵌入式块之间有更紧密的相关性。
  • 检索到的结果将如何在你的特定应用程序中使用? 例如,它们会用于语义搜索、问答、摘要或其他目的吗? 例如,如果你的结果需要输入到具有令牌限制的另一个 LLM 中,那么必须考虑到这一点,并根据想要适应LLM请求的块数量来限制块的大小。

回答这些问题将使你能够开发一种平衡性能和准确性的分块策略,这反过来又将确保查询结果更相关。

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

3、4种分块策略

针对不同情况,我们介绍4种在LLM应用开发中常见的文本分块策略:按固定大小分块、按语句分块、递归分块和结构化文档分块。

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 按语句分块

正如我们之前提到的,许多模型都针对嵌入句子级内容进行了优化。 当然,我们会使用句子分块,并且有多种方法和工具可用于执行此操作。

最朴素的方法是按句点(“.”)和换行符分割句子。 虽然这可能快速且简单,但这种方法不会考虑所有可能的边缘情况。 这是一个非常简单的例子:

text = "..." # your text
docs = text.split(".")

自然语言工具包 (NLTK) 是一个流行的 Python 库,用于处理人类语言数据。 它提供了一个句子标记器,可以将文本分割成句子,帮助创建更有意义的块。 例如,要将 NLTK 与 LangChain 结合使用,可以执行以下操作:

text = "..." # your text
from langchain.text_splitter import NLTKTextSplitter
text_splitter = NLTKTextSplitter()
docs = text_splitter.split_text(text)

spaCy 是另一个用于 NLP 任务的强大 Python 库。 它提供了复杂的句子分割功能,可以有效地将文本分割成单独的句子,从而在生成的块中更好地保留上下文。 例如,要将 spaCy 与 LangChain 结合使用,可以执行以下操作:

text = "..." # your text
from langchain.text_splitter import SpacyTextSplitter
text_splitter = SpaCyTextSplitter()
docs = text_splitter.split_text(text)

3.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
)

docs = text_splitter.create_documents([text])

3.4 结构化文档分块

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

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 命令和环境,你可以创建尊重内容逻辑组织的块(例如,部分、小节和方程),从而获得更准确且与上下文相关的结果。 例如:

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 标签或只会增加噪音的特定元素。
  • 选择块大小范围 - 数据经过预处理后,下一步是选择要测试的潜在块大小范围。 如前所述,选择应考虑内容的性质(例如,短消息或冗长的文档)、你将使用的嵌入模型及其功能(例如,令牌限制)。 目标是在保留上下文和保持准确性之间找到平衡。 首先探索各种块大小,包括用于捕获更细粒度语义信息的较小块(例如,128 或 256 个标记)和用于保留更多上下文的较大块(例如,512 或 1024 个标记)。
  • 评估每个块大小的性能 - 为了测试各种块大小,你可以使用多个索引或具有多个命名空间的单个索引。 使用代表性数据集,为要测试的块大小创建嵌入并将它们保存在索引中。 然后,可以运行一系列查询,可以评估其质量,并比较不同块大小的性能。 这很可能是一个迭代过程,你可以针对不同的查询测试不同的块大小,直到可以确定内容和预期查询的最佳性能块大小。

5、结束语

在大多数情况下,对内容进行分块非常简单 - 但当你开始偏离常规时,它可能会带来一些挑战。 没有一种万能的分块解决方案,因此适用于一种用例的方法可能不适用于另一种用例, 希望这篇文章能够帮助你更好地了解如何为LLM应用程序进行分块。


原文链接:LLM应用的分块策略 — BimAnt

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

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

相关文章

什么是网络中的服务质量 (QoS)?

什么是服务质量(QoS) 服务质量(QoS)是网络中用于管理质量并确定数据流量传输优先级的机制。它确保不同类型的数据流量,如语音、视频和数据,获得适当的服务水平。其主要目标是使网络和组织能够对流量进行优…

亚马逊是如何风控虚假交易操控评论的?稳定的测评系统的重要性。

稳定的亚马逊测评系统重不重要? 亚马逊平台对测评行为的打击力度十分严格,堪称所有电商平台中最严格的一个。许多人可能会好奇,采用的是真人测评,由真实的客户群体购买产品后进行评价,这种模式难道也会存在风险吗&…

数电发票接口服务商怎么选择?

自2023年11月1日起,除了港澳台、西藏外,全国范围内都开展了数电票开票试点,对于那些已经习惯使用传统税控开票接口的企业,如今在数电发票的试点下,原本的税控开票接口如同老去的侠客,曾经的荣光已经不再。在…

JavaFX增删改查其他控件01界面展示

界面展示 小技巧 增删改查思路--查 底层select * from 表 where sname like %% --1.拿文本框的关键字 --2.调模糊查询的方法 myShow("")--删 底层 delete from tb_stu where sid? --1.想方设法拿学号 --1.先拿到用户所选中的学生对象 Student --2.调用方法传对象.g…

【1】Gradele概述

目录 Gradle为什么选择Gradle?支持的语言和框架兼容的集成开发环境许可证 兼容性JavaKotlinGroovyAndroid Gradle 与 Maven 比较灵活性性能用户体验依赖管理 个人主页: 【⭐️个人主页】 需要您的【💖 点赞关注】支持 💯 Gradle 【官网指南】…

【链表】数据查找和合并

获取链表中间位置的数据 #include <stdio.h> #include <stdlib.h>/* 定义链表的结构体 */ struct Node {int data;struct Node *next; };/* 获取链表中处于中间位置的元素并打印出来*/ void printMiddle(struct Node *head) {struct Node *slow_ptr head;struct …

【Linux】--进程信号

信号 1.信号入门 程序员设计进程的时候&#xff0c;早就已经设计了对信号的识别能力&#xff01;&#xff01;&#xff01;&#xff01;进程在没有收到信号的时候&#xff0c;其实它早就已经知道一个信号该怎么处理了&#xff01;因为信号可能随时会产生&#xff0c;所有在信…

鲲鹏920的架构分析

*本文信息主要来源于书籍《鲲鹏处理器架构与编程》以及论文《Kunpeng 920: The First 7-nm Chiplet-Based 64-Core ARM SoC for Cloud Services》 * 笔者已然写了一篇上述论文的分析博客&#xff0c;但尚觉论文内容对chiplet架构描述不够清晰&#xff0c;因此查阅《鲲鹏处理器…

Flutter笔记 - 关于 fit 属性以及相关知识的总结

Flutter笔记 关于 fit 属性以及相关知识的总结 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/13434451…

lenovo联想小新 Air-14 2019 AMD平台API版(81NJ)原装出厂Windows10系统

下载链接&#xff1a;https://pan.baidu.com/s/1HCC66EH4UOcgofRx5_v1oA?pwdlgqw 提取码&#xff1a;lgqw 原厂系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xf…

关于Google Play应用商店的优化技巧1

作为Google Play商店ASO策略的一部分&#xff0c;我们需要查明并优化有助于应用排名的各种因素。在这里将介绍几个可以增强我们列表并增加在搜索中被发现的机会的技巧。 1、优化标题和描述字段。 在创建有效的Google Play商店列表时&#xff0c;我们应该考虑的第一个元素是应用…

易货:一种绿色、高效的商业模式

随着社会经济的发展和人民生活水平的提高&#xff0c;人们手中闲置的物品越来越多&#xff0c;如何将这些物品盘活&#xff0c;成为了一个亟待解决的问题。易货商业模式应运而生&#xff0c;它不仅可以将闲置物品变成财富&#xff0c;还可以为企业和个人带来更多的商机和资源。…

【题解】2023-11-11 B层模拟赛T1

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 CF461B 题目描述 一棵树有 n n n 个节点&#xff0c; n − 1 n − 1 n−1 条边。树上的节点有两种&#xff1a;黑&#xff0c;白节点。 Tyk 想断掉一些边把树分成很多部分。 他想要保证每个部…

【优选算法系列】【专题二滑动窗口】第二节.1004. 最大连续1的个数 III和1658. 将 x 减到 0 的最小操作数

文章目录 前言一、最大连续1的个数 III 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、将 x 减到 0 的最小操作数 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 一、最大连…

迈巴赫S480升级流星雨大灯 最高配的数字大灯

“流星雨”数字大灯&#xff0c;极具辨识度&#xff0c;通过260万像素的数字微镜技术&#xff0c;实现“流星雨”仪式感与高度精确的光束分布&#xff1b;在远光灯模式下&#xff0c;光束精准度更达之前84颗LED照明的100倍&#xff0c;更新增坡道照明功能&#xff0c;可根据导航…

进程线程

从Android3.0开始&#xff0c;系统要求网络访问必须在子线程中进行&#xff0c;否则会抛出异常&#xff0c;这么做是为了避免主线程被阻塞而导致ANR&#xff0c;那么网络访问的操作就必须要放到线程中去执行。 进程 进程是操作系统结构的基础&#xff0c;是程序在一个数据集合…

极兔面试:微服务爆炸,如何解决?Uber 是怎么解决2200个微服务爆炸的?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

基于HF transformers的AI建模和训练实战

我们经常使用 scikit-learn 对监督学习和无监督学习任务的数据进行建模。 我们熟悉面向对象的设计&#xff0c;例如启动类并从类中调用子函数。 然而&#xff0c;当我个人使用 PyTorch 时&#xff0c;我发现与 scikit-learn 类似但又不一样的设计模式。 在线工具推荐&#xff…

11个最受欢迎的3D打印AI软件【2023】

如今&#xff0c;人工智能&#xff08;AI&#xff09;似乎已经成为每个人都在谈论的话题。 尽管围绕该技术的伦理问题存在着重要的讨论&#xff0c;但不可否认的是&#xff0c;人工智能可能成为包括 3D 打印在内的许多不同行业的重要工具。 事实上&#xff0c;人工智能在 3D 打…

【Java王大师王天师】关注有礼博客模板

【点我-这里送书】 本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》 公众号&#xff1a;JAVA开发王大师&#xff0c;专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生&#xff0c;期待你的…