RAG 为什么需要文本分割(Chunking)

Picone上的一个博客,翻译过来学习一下,其中加入了一些个人的理解和调整,有兴趣更深入研究的可以看一下文章的原文。

为什么需要文本分割(Chunking)

在构建与LLM相关的应用程序时,Chunking是将大量文本分解为较小段的过程。这是很重要的一环,有助于优化从向量数据库中获得的LLM上下文嵌入内容的相关性。在这篇文章中,我们将探讨它是否以及如何有助于提高与LLM相关的应用程序中的效率和准确性。

如我们所知,我们在Pinecone中索引的任何内容都需要先进行嵌入(Embedded)。Chunking的主要目的是对上下文中的一个片段进行嵌入的过程中尽可能少的噪声,而还要保证内容仍然与语义相关。

例如,在语义搜索场景中,我们为一个文档集建立索引,每个文档都包含有关特定主题的宝贵信息。通过采用有效的分块(chunk)策略,可以确保搜索结果准确匹配用户查询的本意。如果我们的块太小会导致错过真正的相关内容,太大则可能导致搜索结果不准确。一般来说,如果一段文字脱离语境的上下文,对于人类来说仍然可以理解其含义,那么这段文字对于语言模型来说也是可以理解。因此,确定语料库中文档的最佳块大小对提高搜索结果准确性和相关性是非常重要的。

再举一个会话智能体(conversational agents)的例子(之前用Python和Javascript解释过)。使用知识库中嵌入的文本段构建一个让会话智能体使用的知识上下文。这种情况下,必须要对这些文本段作出正确的选择。有两个原因:

  • 首先,这决定嵌入的知识是否与我们的Prompt相关(Prompt中会嵌入真正的的用户问题)。
  • 其次,检索到文本的大小决定了我们是否能够将嵌入到要发送的上下文中传递给外部模型提供商(例如OpenAI),因为每个模型支持的发送Token的数量是有限的。 例如使用有32k上下文窗口的GPT-4,文本切分的问题可能不大。然而,在使用非常大的文本块时,仍需要谨慎处理,因为这可能对从Pinecone得到的结果的相关性产生负面影响。

这篇文章中,我们将探讨几种文本切分方法,并讨论在选择切分尺度和方式时应该考虑的权衡因素。最后,将给出一些建议,帮助确定最适合应用的文本切分尺度和方法。

Embedding大文本和小文本

当嵌入内容时,可以根据内容是简短(例如句子)还是长(例如文本段或整个文档)来设计不同的Embedding行为。

当一个句子被嵌入时,得到的向量会聚焦于该句子的特定含义。当用其他句子的嵌入进行搜索时,通常在这一层面上进行。这也意味着该嵌入可能会遗漏在文本段或文件中会找到的更宽泛的上下文信息。

当一个完整的段落或文档被嵌入时,嵌入过程要关注整体的上下文以及文本内部句子和短语之间的关系。这可能会产生一个更全面的向量表示,向量会表示出文本更广泛的含义和主题。另一方面,较大的输入文本尺寸可能会引入噪声、淡化单个句子或短语的重要性,使得在查询索引时找到精确匹配更困难。

查询的长度也影响着嵌入向量之间的关系。像一个单独的句子或短语这类较短的查询,会专注于具体内容,可能更适合与句子级别的嵌入进行匹配。一个跨越多个句子或一个段落的较长查询可能与段落或文档级别的嵌入更匹配,因为它可能在寻找更广泛的上下文或主题。

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

分块的思路

确定最佳分块策略的有几个变量,这些变量因使用场景而异。以下是一些需要注意的问题:

  1. 索引内容的特性是什么? 是在处理长篇文档,如文章或书籍,还是较短的内容,如推文或即时消息?这个答案将决定哪种模型更适合目标,并因此决定应用哪种分块策略。
  2. 正在使用哪种嵌入模型,它在哪种块大小上表现最佳? 例如,句子转换模型在单个句子上表现良好,但像text-embedding-ada-002这样的模型在包含256或512个标记的块上表现更优。
  3. 对用户查询的长度和复杂度有什么期望? 用户的问题会简短并具体,还是长且复杂?这也可能影响你选择如何分块你的内容,以便嵌入的查询和嵌入的块之间有更紧密的关系。
  4. 应用中如何利用检索到的结果? 比如,检索的文本段将用于语义搜索、问题回答、摘要,还是其他目的?再比如,结果需要输入另一个有Token限制的LLM,那么必须根据LLM的限制确定召回的块的数量来限制整体输入的大小。 反思这些问题会促使我们制定在性能和准确性之间相对平衡分块策略,这将确保查询结果更加相关。

分块的方法

列出几个不同的Chuking方法,每种方法都有不同的适用场景。了解每种方法的优势和劣势,目标是正确的场景下使用正确的Chunking方法。

定长Chunking(Fixed-size chunking)

这是最常见,也是最直接的分块方法:简单地决定我们的块中的标记数量,并选择性地决定它们之间是否应该有任何重叠。一般来说,块之间应该保持一些重叠,以确保语义上下文不会在块之间丢失。在大多数常见情况下,固定大小的分块将是最佳路径。与其他形式的分块相比,固定大小的分块的计算代价较低且使用成本不高,因为它不需要使用任何NLP库。 LangChain中的一个Demo

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])

内容感知分片(“Content-aware” Chunking)

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

句子分割

之前提到过,许多模型都被优化过,用于嵌入句子级内容。当然,我们会使用句子分块,并且有几种方法和工具可以达成目的,包括:

  • Naive splitting: 最简单方法是按(“.”)和换行符出现的频率分割句子。尽管这种方法直接快速,但这种方法不会考虑所有可能的产生的边界情况。一个很简单的实现例子:
text = "..." # your text
docs = text.split(".")
    • [NLTK]: Natural Language Toolkit(NLTK)是一个流行的用于处理自然语言数据的Python库。它提供了一个句子分词器,可以将文本分为句子,可以更有意义的Chunking。例如,要将NLTK与Langchain一起使用,可以按照下面的例子实现:
text = "..." # your text
from langchain.text_splitter import NLTKTextSplitter
text_splitter = NLTKTextSplitter()
docs = text_splitter.split_text(text)
text = "..." # your text
from langchain.text_splitter import SpacyTextSplitter
text_splitter = SpaCyTextSplitter()
docs = text_splitter.split_text(text)

递归Chunking(Recursive Chunking)

Recursive Chunking使用分层、迭代的概念形成一组分割器,用分割器将文本分割为较小的块。如果当前文本拆分出的段大小不满足需求大小,那么会递归地在带有不同的分离器或标准的结果块上继续调用,直到达到所需的块大小或结构为止。这意味着,尽管块的尺寸并不完全相同,但它们仍然与“预期”的尺寸相似。 下面是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])

固定格式的分割

Markdown和Latex是经常遇到的两个结构化、格式化内容的示例。在这中情况下,可以使用专门的Chunking方法来获取、分割内容。

  • [Markdown]: Markdown is a lightweight markup language commonly used for formatting text. By recognizing the Markdown syntax (e.g., headings, lists, and code blocks), you can intelligently divide the content based on its structure and hierarchy, resulting in more semantically coherent chunks. For example:
from langchain.text_splitter import MarkdownTextSplitter
markdown_text = "..."markdown_splitter = MarkdownTextSplitter(chunk_size=100, chunk_overlap=0)
docs = markdown_splitter.create_documents([markdown_text])
from langchain.text_splitter import LatexTextSplitter
latex_text = "..."
latex_splitter = LatexTextSplitter(chunk_size=100, chunk_overlap=0)
docs = latex_splitter.create_documents([latex_text])

确定应用中最佳的块大小

有一些经验可以帮助我们明确最佳的块尺寸,如果固定的块(例如固定的块)不容易应用您的用例,请使用最佳的块。

  • 预处理数据:在确定最佳的块大小之前,先预处理数据,保证数据质量。举个例子,如果数据是从网络上获取的,你可能需要删除HTML标签或其他特定元素标签,去掉所有噪音。
  • 决定一个块的尺寸范围: 预处理数据后,下一步就是选择一些尺寸进行测试。如前所述,尺寸的选择需要考虑内容的性质(例如,短消息或冗长的文档)、LLM的限制(例如令牌限制)。目的是在保留环境和保持准确性之间找到平衡。首先探索各种尺寸,包括较小的块(例如128或256Token),以捕获更多的粒状语义信息和较大的块(例如512或1024代币),以保留更多上下文。

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

Python酷库之旅-第三方库Pandas(004)

目录 一、用法精讲 5、pandas.DataFrame.to_csv函数 5-1、语法 5-2、参数 5-3、功能 5-4、返回值 5-5、说明 5-6、用法 5-6-1、代码示例 5-6-2、结果输出 6、pandas.read_fwf函数 6-1、语法 6-2、参数 6-3、功能 6-4、返回值 6-5、说明 6-6、用法 6-6-1、代码…

微信小程序渲染层与逻辑层交互原理

1. 网页开发与小程序开发有何不同? 2. 小程序运行环境 3. 页面渲染技术选型 1. 纯客户端技术; 2. 纯Web技术; 3. 用客户端原生技术与Web技术结合的混合技术(Hybrid),小程序就是使用的这种技术&#xff1…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权,当最后⼀个指涉到该对象的shared_ptr不再指向他时,shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个?《引⽤计数》 shared_ptr构造函数,使引⽤计数析构函数&…

【YOLOv5/v7改进系列】改进池化层为ASPP

一、导言 Atrous Spatial Pyramid Pooling (ASPP)模块是一种用于多尺度特征提取的创新技术,旨在提升深度学习模型在语义图像分割任务中的表现。ASPP模块通过在不同的采样率下应用空洞卷积,可以捕获不同大小的对象以及图像的上下文信息,从而增…

Astro新前端框架首次体验

Astro新前端框架首次体验 1、什么是Astro Astro是一个静态网站生成器的前端框架,它提供了一种新的开发方式和更好的性能体验,帮助开发者更快速地构建现代化的网站和应用程序。 简单来说就是:Astro这个是一个网站生成器,可以直接…

Hyper-V克隆虚拟机教程分享!

方法1. 使用导出导入功能克隆Hyper-V虚拟机 导出和导入是Hyper-V服务器备份和克隆的一种比较有效的方法。使用此功能,您可以创建Hyper-V虚拟机模板,其中包括软件、VM CPU、RAM和其他设备的配置,这有助于在Hyper-V中快速部署多个虚拟机。 在…

前端引用vue/element/echarts资源等引用方法Blob下载HTML

前端引用下载vue/element/echarts资源等引用方法 功能需求 需求是在HTML页面中集成Vue.js、Element Plus(Element UI的Vue 3版本)、ECharts等前端资源,使用Blob下载HTML。 解决方案概述 直接访问线上CDN地址:简单直接&#xff0c…

计算机网络(2

计算机网络续 一. 网络编程 网络编程, 指网络上的主机, 通过不同的进程, 以编程的方式实现网络通信(或网络数据传输). 即便是同一个主机, 只要不同进程, 基于网络来传输数据, 也属于网络编程. 二. 网络编程套接字(socket) socket: 操作系统提供的网络编程的 API 称作 “soc…

【数据结构与算法】堆排序算法原理与实现:基于堆实现的高效排序算法

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​ 目录 一、引言 堆排序的简介 堆排序的特点 二、堆的概念 三、堆排序算法的原理 四、堆…

软件测试面试1000问(含答案)

1、自动化代码中,用到了哪些设计模式? 单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化…

数据结构预科

在堆区申请两个长度为32的空间,实现两个字符串的比较【非库函数实现】 要求: 1> 定义函数,在对区申请空间,两个申请,主函数需要调用2次 2> 定义函数,实现字符串的输入,void input(char …

Jenkins容器的部署

本文主要是记录如何在Centos7上安装docker,以及在docker里面配置tomcat、mysql、jenkins等环境。 一、安装docker 1.1 准备工作 centos7、VMware17Pro 1.2 通过yum在线安装dokcer yum -y install docker1.3 启动docker服务 systemctl start docker.service1.4 查看docke…

Java传引用问题

本文将介绍 Java 中的引用传递,包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况: 通过引用修改当前引用的指向 通过引用修改原来指…

《数据仓库与数据挖掘》 总复习

试卷组成 第一章图 第二章图 第三章图 第四章图 第五章图 第六章图 第九章图 第一章 DW与DM概述 (特点、特性) DB到DW 主要特征 (1)数据太多,信息贫乏(Data Rich, Information Poor)。 &a…

H2 Database Console未授权访问漏洞封堵

背景 H2 Database Console未授权访问,默认情况下自动创建不存在的数据库,从而导致未授权访问。各种未授权访问的教程,但是它怎么封堵呢? -ifExists 很简单,启动参数添加 -ifExists ,它的含义&#xff1a…

【机器学习】机器学习的重要方法——线性回归算法深度探索与未来展望

欢迎来到 破晓的历程博客 引言 在数据科学日益重要的今天,线性回归算法以其简单、直观和强大的预测能力,成为了众多领域中的基础工具。本文将详细介绍线性回归的基本概念、核心算法,并通过五个具体的使用示例来展示其应用,同时探…

CASS7.0按方向和距离绘制图形

1、绘制工具 2、按方向和距离绘制 (1)切换方向 (2)距离输入

Python函数缺省参数的 “ 坑 ” (与C++对比学习)

我们都知道Python函数的缺省参数可以降低我们调用函数的成本,但是一般我们的缺省参数都是不可变对象,如果是可变对象,我们对其多次调用会发生什么呢? def func(arr[]):arr.append(Hello)print(arr)func() func() func() 这貌似…

MongoDB-社区版-本地安装

系统:win10 1. 下载server:Download MongoDB Community Server | MongoDB 我选的zip包 2. 下载shell:MongoDB Shell Download | MongoDB 我选的zip包 3. 启动server 4. 启动shell, 完成

MYSQL函数进阶详解:案例解析(第19天)

系列文章目录 一、MySQL的函数(重点) 二、MySQL的窗口函数(重点) 三、MySQL的视图(熟悉) 四、MySQL的事务(熟悉) 文章目录 系列文章目录前言一、MySQL的函数1. 聚合函数2. group_c…