01.引言
在数字化时代,处理和分析大型文档的任务变得日益复杂。本文将深入探讨一种新技术,它通过智能分块优化了检索增强型生成(RAG)系统的性能。
02.理解RAG系统
RAG系统是一种先进的机器学习模型,它结合了检索和生成技术,以提高输出内容的质量和相关性。系统的工作流程分为两个阶段:检索阶段和生成阶段。
以下是RAG系统工作原理的分解:
-
检索阶段:系统首先根据输入查询检索相关文档或信息。这个阶段依赖于搜索算法和索引方法,从大量数据中快速识别最相关的数据。
-
生成阶段:一旦检索到相关文档,通常使用基于变换器的语言模型(如GPT-4)作为生成模型,以创建连贯且上下文合适的响应。该模型使用检索到的信息确保生成内容的准确性和信息性。RAG系统的混合特性使它们特别适用于复杂或知识密集型任务,在这些任务中,检索和生成的结合显著提高了整体性能。
03.分块技术的重要性
有效的文档分块对于优化RAG系统的检索和嵌入步骤至关重要。不同的分块方法,如递归字符文本分割器、标记分割器、句子分割器等,各有其优势和适用场景。
-
递归字符文本分割器:这种方法通过基于字符递归划分文本。每个区块保持在指定长度以下,这对于具有自然段落或句子断点的文档特别有用。这种方法确保了区块易于管理和处理,同时不会丢失文档的固有结构。
-
标记分割器:这种技术使用标记(可以是单词或子词)来划分文档。当使用有标记限制的语言模型工作时,它特别有益,因为它确保每个区块都适合模型的约束。基于标记的分割通常用于NLP任务,以保持文本的完整性,同时遵守模型限制。
-
句子分割器:通过在句子边界处分割文档,这种方法保持了文本的上下文完整性。句子通常代表完整的想法,使这种方法理想用于需要连贯理解内容的任务。
-
正则表达式分割器:这种方法使用正则表达式定义自定义分割点。它提供了最高的灵活性,允许用户根据其用例的特定模式分割文档。例如,可以在每个特定的关键词或标点符号处分割文档。
-
Markdown分割器:专为Markdown文档量身定制,这种方法根据Markdown特有的元素(如标题、列表和代码块)分割文本。它保留了Markdown文档的结构和格式,适用于技术文档和内容管理。
04.探索高级分块方法
除了标准分块技术,还有更高级的方法,如按字符分块、按标记分块、按段落分块、递归分块、语义分块和主体分块,它们根据不同的需求提供定制化的解决方案。
-
按字符分块:这种方法将文本分解为单个字符。它对于需要深入和细粒度文本分析的任务非常有用,例如字符级语言模型或某些类型的文本预处理。
-
按字符+SimplerLLM分块:这种技术在SimplerLLM库中可用,它在保留句子结构的同时按字符分块文本。它通过保持基于字符的区块内句子的完整性,提供更好且更有意义的区段。
-
按标记分块:将文本分割成标记(如单词或子词)是自然语言处理的标准方法。基于标记的分块对于依赖标记输入的文本分类、语言建模和其他NLP应用至关重要。
-
按段落分块:按段落分块文本有助于保持文档的整体结构和流程。这种方法非常适合需要较大上下文的任务,如文档摘要或内容提取。
-
递归分块:这涉及重复将数据分解为更小的区块,通常用于层次数据结构。递归分块对于需要多层次分析的任务(如主题建模或层次聚类)非常有益。
-
语义分块:基于意义而非结构元素对文本进行分组对于需要理解数据上下文的任务至关重要。语义分块利用句子嵌入等技术确保每个区块代表一个连贯的主题或想法。
-
主体分块:这种方法侧重于识别和分组基于涉及的主体(如个人或组织)的文本。它在信息提取和实体识别任务中非常有用,这些任务需要理解不同实体之间的作用和关系。
05.新分块技术
主题意识句子嵌入
本文重点介绍一种利用句子嵌入来识别文档内主题变化的新技术。这种技术通过确保每个区块包含单一主题,提高了RAG系统生成连贯且上下文合适的响应的能力。
-
句子嵌入:句子嵌入将句子转换为高维向量,捕捉它们的语义含义。通过分析这些向量,我们可以识别主题变化点。
-
主题检测:使用专为主题建模设计的算法,该技术检测主题变化并确定分割文档的最佳点。这确保了每个区块在主题上的连贯性。
-
增强检索和嵌入:通过确保每个区块代表单一主题,RAG系统中的检索和嵌入步骤变得更加高效。每个区块的嵌入更有意义,从而带来更好的检索性能和更准确的响应。
这种技术已在主题建模的背景下得到演示,但它同样适用于RAG系统。通过采用这种方法,RAG系统能够在生成内容上实现更高的准确性和相关性,使它们在复杂和知识密集型任务中更加有效。
使用LangChain实现高级文档分割
LangChain框架提供了实现这些高级分块技术的具体示例,包括递归字符文本分割器、标记分割器、句子分割器、正则表达式分割器和Markdown分割器等。
以下是LangChain中一些文档分割方法的示例,以及详细的解释和代码片段,以展示它们的用法:
-
递归字符文本分割器 递归字符文本分割器方法根据字符计数将文本划分为区块,确保每个区块都低于指定长度。这种方法适用于在文档中保持自然段落或句子断点。标记分割器 标记分割器方法根据标记(如单词或子词)来划分文本。这种方法在与有标记限制的语言模型工作时特别有益。
-
句子分割器 句子分割器方法在句子边界处分割文本,保持文本的上下文完整性。这种方法非常适合需要连贯和完整思想的任务。
-
正则表达式分割器 正则表达式分割器方法使用正则表达式定义自定义分割点,为各种用例提供高度灵活性。
-
Markdown分割器 Markdown分割器方法专为Markdown文档量身定制,根据Markdown特有的元素(如标题、列表和代码块)来分割文本。
# Importing the RecursiveCharacterTextSplitter class from langchain from langchain.text_splitter import RecursiveCharacterTextSplitter # Example long document text text = "Your long document text goes here..." # Initializing the RecursiveCharacterTextSplitter with a chunk size of 1000 characters and an overlap of 50 characters splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50) # Splitting the text into chunks chunks = splitter.split_text(text) # Printing each chunk for chunk in chunks: print(chunk)
# Importing the TokenSplitter class from langchain from langchain.text_splitter import TokenSplitter # Example long document text text = "Your long document text goes here..." # Initializing the TokenSplitter with a maximum token limit of 512 splitter = TokenSplitter(max_tokens=512) # Splitting the text into chunks chunks = splitter.split_text(text) # Printing each chunk for chunk in chunks: print(chunk)
核心挑战与新方法的优势
大型文档通常包含多个主题,传统的分割技术难以准确识别主题转换点。新方法使用Sentence-BERT(SBERT)生成句子嵌入,通过计算相似性和间隙得分来检测主题边界,提供了更精确的分割。
- 核心挑战
大型文档(如学术论文、长篇报告和详细文章)通常包含多个主题。从简单的基于规则的方法到先进的机器学习算法,传统的分割技术难以识别主题转换的精确点。这些方法经常错过微妙的转变或错误地识别它们,导致片段破碎或重叠。
- 利用句子嵌入
我们的方法使用Sentence-BERT(SBERT)为每个句子生成嵌入。这些嵌入是密集的向量表示,包含句子的语义内容。
-
生成嵌入 使用SBERT为文档中的每个句子生成嵌入。这些嵌入捕获句子的语义含义,允许我们测量它们的相似性。
-
计算相似性 使用余弦相似度或其他距离度量(如曼哈顿或欧几里得距离)来测量句子之间的相似性。这有助于识别连续句子之间的连贯性。
-
间隙得分和平滑 为了检测主题转换,我们定义了一个参数n,指定要比较的句子数量。算法基于余弦相似度计算间隙得分。为了解决间隙得分中的噪声问题,应用了平滑算法。窗口大小k决定了平滑的程度。
-
边界检测 分析平滑后的间隙得分以识别局部最小值,这表明潜在的主题转换。阈值c用于确定显著的边界。
-
聚类区段 对于较长的文档,相似的主题可能会重新出现。为了处理这一点,算法对具有类似内容的区段进行聚类,减少冗余并确保每个主题被独特地表示。
from sklearn.cluster import KMeans # Convert segments into embeddings segment_embeddings = [np.mean(embeddings[start:end], axis=0) for start, end in zip(significant_boundaries[:-1], significant_boundaries[1:])] # Apply clustering kmeans = KMeans(n_clusters=5) clusters = kmeans.fit_predict(segment_embeddings)
06.未来研究方向
未来的研究可以探索自动参数优化、大规模数据集试验、实时分割、模型改进、多语言分割、层次分割、用户界面开发和与NLP任务集成等领域。
-
自动参数优化:利用机器学习技术动态调整参数。
-
大规模数据集试验:在多样化的大型数据集上测试该方法,以验证其有效性。
-
实时分割:探索动态文档的实时应用。
-
模型改进:集成更新的变换器模型以提高性能。
-
多语言分割:使用多语言SBERT将该方法应用于不同语言。
-
层次分割:研究多层次分割以进行详细的文档分析。
-
用户界面开发:创建交互式工具,以便更容易地调整分割结果。
-
与NLP任务集成:将算法与其他自然语言处理任务结合起来。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。