当前位置: 首页 > news >正文

文档太大LLM处理不过来?这10种LangChain分割技术帮你搞定!

前言

RAG(检索增强生成)是一种创建基于大语言模型(LLM)应用的高效方式。它有助于生成对用户查询的准确回答。为了创建一个基于 RAG 的应用程序,我们需要执行一些操作,例如文档加载、将大文档拆分为多个小块、嵌入、嵌入索引,并将它们存储在向量数据库中。然后根据用户查询,系统从向量数据库中提取相关上下文并传递给提示词以及用户查询。然后 LLM 将用户查询和内容结合起来,生成适当的响应。这是 RAG 系统的整体流程。

文本分割器 在 LangChain 中有助于将大文档分解为较小的块。在大文档或文本中,很难根据用户查询找到相关的上下文。此外,我们无法将整个大文档传递给 LLM 模型。每个 LLM 模型能处理的 Token 是有限的,因此必须将大文本拆分为较小部分。这样我们就可以轻松地从这些小块中找到相关的上下文,并将其作为输入传递给 LLM,确保输入量低于模型的最大输入大小。因此,文本分割器的 关键使用场景 如下:

  • • 处理超过 LLM 模型 Token 限制的大文档,文本分割技术有助于将文档划分为较小的部分,以便模型处理。

  • • 在问答任务中,较小的文本块在查询、索引和检索方面更有效,而大文档则效率较低。

  • • 它通过在适当的点拆分段落或句子数量,帮助将上下文保留在较小的部分中。这样每个块都包含适当的知识。

  • • LLM 在上下文窗口大小上有 Token 数量限制。即使上下文大小是无限的,更多的输入 Token 也会导致更高的成本,而金钱不是 无限的

LangChain 中的文本分割技术

LangChain 提供了许多文本分割技术来适应不同类型的数据。今天我们将探索不同的文本分割技术,例如字符文本分割器、递归字符文本分割器、Token 文本分割器、Markdown 标题文本分割器、Python 代码文本分割器、HTML 文本分割器、Spacy 文本分割器、Latex 文本分割器、递归 JSON 文本分割器。如果你有兴趣探索更多的分割技术,请访问这个 LangChain 页面。建议你在自己的系统上运行代码,深入理解这些概念。

首先,安装执行分割技术所需的库。打开命令提示符或终端并运行以下命令。

pip install langchain spacy langchain_text_splitter langchain_core

字符文本分割器

这是最基本的文本分割技术,它根据特定的字符数来划分文本。它适用于简单且统一的文本分割任务。参数 separator 表示文本将只在换行符处拆分,因为使用了 “\n” 作为分隔符。它避免在段落中间拆分。我们可以使用其他分隔符,如空格。块大小表示每个块中的最大字符数,而块重叠表示从前一个块中取多少字符到下一个块中。我们要注意,每个块应该包含有用的知识。

from langchain.text_splitter importCharacterTextSplittertext ="你的长文档文本在这里..."splitter =CharacterTextSplitter(separator="\n\n",chunk_size=10,chunk_overlap=2
)chunks = splitter.split_text(text)
print(chunks)

递归字符文本分割器

它使用字符分隔符将大文档分解为较小的块。它递归地尝试使用分隔符层次结构(如段落 \n\n、句子 \n 和字符 .,)来拆分文本。它优先进行较高级别的拆分(如段落),如果需要则向下移动层次结构。当你需要灵活且分层的方法时,可以尝试这种技术。

from langchain.text_splitter importRecursiveCharacterTextSplittertext ="你的长文档文本在这里..."splitter =RecursiveCharacterTextSplitter(separators=["\n\n","\n"," ",""],chunk_size=1000,chunk_overlap=200,length_function=len
)chunks = splitter.split_text(text)
print(chunks)

Token 文本分割器

它根据 Token 而不是字符或单词来拆分文本。对于有 Token 限制的语言模型来说,这是必要的。它使用模型的 Token 化方法将大文档分割成块。这里我们使用了 OpenAI 的编码来对文档进行 Token 化。

from langchain.text_splitter import TokenTextSplittertext = "你的长文档文本在这里..."splitter = TokenTextSplitter(encoding_name="cl100k_base",  chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(text)
print(chunks)

Markdown 标题文本分割器

这种方法用于根据标题级别(如 #、##、### 等)拆分 Markdown 文档。它使用分层方法,例如将特定标题及其子标题下的文本分开。当你想组织 Markdown 文件中的内容(如技术文档)时,可以尝试这种分割方法。

from langchain.text_splitter importMarkdownHeaderTextSplittermarkdown_text ="""
# 标题
## 部分 1
部分 1 的内容
## 部分 2
部分 2 的内容
### 子部分 2.1
子部分 2.1 的内容
"""headers_to_split_on =[
("#","Header 1"),
("##","Header 2"),
("###","Header 3"),
]splitter =MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
chunks = splitter.split_text(markdown_text)
print(chunks)

Python 代码文本分割器

当你想将 Python 代码分解为较小的逻辑块时,这种技术非常有用。它基于 Python 特定的分隔符(如函数、类等)来拆分代码。

from langchain.text_splitter importPythonCodeTextSplitterpython_code ="""
def function1():print("Hello,World!")class MyClass:def __init__(self):self.value = 42def method1(self):return self.value
"""splitter =PythonCodeTextSplitter(chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(python_code)
print(chunks)

HTML 文本分割器

当你处理网页时,想要基于 HTML 层次结构进行分割而不破坏文档结构。你可以使用这种技术,它根据文档的结构来拆分 HTML 内容。它识别常见的 HTML 标签,如 <p>、<div>、<h1>等,并根据文档结构拆分文本。

from langchain_text_splitters importHTMLSectionSplitterhtml_text ="""
<html>
<body>
<h1>主标题</h1>
<p>这是一个段落。</p>
<div><h2>子部分</h2><p>另一个段落。</p>
</div>
</body>
</html>
"""headers_to_split_on =[("h1","Header 1"),("h2","Header 2")]
splitter =HTMLSectionSplitter(headers_to_split_on=headers_to_split_on,chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(html_text)
chunks

Spacy 文本分割器

它使用 Spacy NLP 管道来分割文本,利用 Spacy 的 Token 化和句子分割能力,基于语言规则来拆分文本。当语言细微差别(如句子边界)很重要时,可以尝试这种方法。

from langchain.text_splitter import SpacyTextSplittertext = "你的长文档文本在这里。它可以是多种语言的。SpaCy 将处理语言的细微差别。"splitter = SpacyTextSplitter(chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(text)
chunks

Latex 文本分割器

当你处理科学论文、数学文档或任何 LaTex 格式的文本时,可以使用这种技术,它在保留其结构的同时拆分文本。它使用 latex 特定的分隔符,如 \\documentclass{}\\begin{}等,将文本拆分为块。

from langchain.text_splitter importLatexTextSplitterlatex_text = r"""
\documentclass{article}
\begin{document}
\section{引言}
这是引言部分。
\section{方法}
这是方法部分。
\end{document}
"""splitter =LatexTextSplitter(chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(latex_text)
chunks

递归 JSON 文本分割器

你可以使用它将大型或嵌套的 JSON 对象分割为较小的可管理部分。它递归地拆分 JSON,并通过遍历键和值保持层次结构的顺序。

from langchain_text_splitters importRecursiveJsonSplitterjson_data ={
"company":{
"name":"TechCorp",
"location":{
"city":"Metropolis",
"state":"NY"
},
"departments":[
{
"name":"Research",
"employees":[
{"name":"Alice","age":30,"role":"Scientist"},
{"name":"Bob","age":25,"role":"Technician"}
]
},
{
"name":"Development",
"employees":[
{"name":"Charlie","age":35,"role":"Engineer"},
{"name":"David","age":28,"role":"Developer"}
]
}
]
},
"financials":{
"year":2023,
"revenue":1000000,
"expenses":750000
}
}splitter =RecursiveJsonSplitter(max_chunk_size=200, min_chunk_size=20)chunks = splitter.split_text(json_data, convert_lists=True)for chunk in chunks:
print(len(chunk))
print(chunk)

选择合适的文本分割器

我们之前讨论过递归字符文本分割技术。你也可以使用这种技术递归地分割编程语言。编程语言的结构不同于纯文本,我们可以根据特定语言的语法来拆分代码。

from langchain_text_splitters importRecursiveCharacterTextSplitter,LanguagePYTHON_CODE ="""
def add(a, b):return a + bclass Calculator:def __init__(self):self.result = 0def add(self, value):self.result += valuereturn self.resultdef subtract(self, value):self.result -= valuereturn self.result# 调用函数
def main():calc = Calculator()print(calc.add(5))print(calc.subtract(2))if __name__ == "__main__":main()
"""python_splitter =RecursiveCharacterTextSplitter.from_language(language=Language.PYTHON, chunk_size=100, chunk_overlap=0)python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs

如果你不确定哪种分割技术最适合你的 RAG 应用程序,可以选择递归字符文本分割器技术。它作为通用的默认选项,也可以执行专门的分割器,如 MarkdownHeaderTextSplitter、PythonCodeTextSplitter 等,它们为特定的文档格式提供解决方案。


最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

在这里插入图片描述

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

在这里插入图片描述

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

相关文章:

文档太大LLM处理不过来?这10种LangChain分割技术帮你搞定!

前言 RAG&#xff08;检索增强生成&#xff09;是一种创建基于大语言模型&#xff08;LLM&#xff09;应用的高效方式。它有助于生成对用户查询的准确回答。为了创建一个基于 RAG 的应用程序&#xff0c;我们需要执行一些操作&#xff0c;例如文档加载、将大文档拆分为多个小块…...

TikTok广告账号被封?常见原因及解决方法分享

TikTok广告投放往往会给我们的账号带来高效曝光和精准流量&#xff0c;但同时许多用户也面临着一个困扰——广告账号被封禁的问题。将在此文一起商讨TikTok广告账号被封禁的原因&#xff0c;分析平台的具体规定&#xff0c;提供解决问题的应对策略&#xff0c;帮助大家有效规避…...

maven聚合ssm

如果没有写过ssm项目请移步SSM后端框架搭建&#xff08;有图有真相&#xff09;-CSDN博客 数据库准备 create table user (id int (11),uid varchar (60),name varchar (60),age int (11),sex varchar (12) ); insert into user (id, uid, name, age, sex) values(10,202409…...

网络通信与并发编程(二)基于tcp的套接字、基于udp的套接字、粘包现象

基于tcp的套接字 文章目录 基于tcp的套接字一、套接字的工作流程二、基于tcp的套接字通信三、基于udp的套接字通信四、粘包现象 一、套接字的工作流程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是一个…...

400行程序写一个实时操作系统(十):用面向对象思想构建抢占式内核

前言 通过前几章的学习&#xff0c;我们学会了如何为RTOS设计一个合理的内存管理算法。现在&#xff0c;是时候学习设计RTOS内核了。 关于RTOS内核的文章也有很多&#xff0c;但都有一点先射箭再化靶子的意味。要么是代码连篇解释却寥寥无几&#xff0c;要么是要先怎么样再怎么…...

C#学习笔记(九)

C#学习笔记&#xff08;九&#xff09; 第六章 面向对象编程&#xff08;一&#xff09;类与对象、字段与属性一、类与对象正确的理解1. 什么是类&#xff1f;2.什么是对象&#xff1f;3. 类与对象的区别 二、类的基本规范和对象使用1. 类的规范 三、类的访问修饰符&#xff08…...

意外发现!AI写作这样用,热点文章轻松超越同行90%!

做自媒体&#xff0c;写热点文章很重要。 热点自带流量&#xff0c;能很快吸引不少读者。 可很多自媒体新手很犯愁。 干货文还能勉强写出来&#xff0c;碰到热点文就不知咋办了。 为啥写热点文章这么难呢&#xff1f; 关键是得找个新颖角度切入。 要是只在网上反复复制粘贴那些…...

WPF常见容器全方位介绍

Windows Presentation Foundation (WPF) 是微软的一种用于构建Windows桌面应用程序的UI框架。WPF的布局系统基于容器&#xff0c;帮助开发者以灵活、响应的方式组织用户界面 (UI) 元素。本篇文章将详细介绍WPF中几种常见的容器&#xff0c;包括Grid、StackPanel、WrapPanel、Do…...

重置时把el-tree树节点选中状态取消

要重置 Element UI 的 el-tree 组件并取消所有节点的选中状态&#xff0c;可以通过以下几种方法&#xff1a; 使用 setCheckedKeys 方法&#xff1a; 如果你的树配置了 node-key 属性&#xff0c;可以使用 setCheckedKeys 方法来清空所有选中的节点。 this.$refs.tree.setCheck…...

服务器系统克隆技术

工作任务&#xff1a;克隆对象是Windows server2019 和2022的datacenter版本 条件&#xff1a;在已经完成安装的虚拟机上做克隆 图1-1 用两个服务器的母盘准备进行克隆 第一步&#xff1a;新建一个文件目录用于安放克隆好的服务器 图1-2 创建两个目录用于安放即将克隆好的服务…...

【Java】多线程 Start() 与 run() (简洁实操)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述start() 方法run() 方法 四、解决方案&#xff1a;4.1 重复调用 .run()4.2 重复调用 start()4.3 正常调用…...

基于微信小程序的购物系统【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...

AI绘画:24最新Stable Diffusion 终极炼丹宝典:从入门到精通!

前言 我是咪咪酱&#xff0c;以浅显易懂的方式&#xff0c;与大家分享那些实实在在可行之宝藏。 历经耗时数十个小时&#xff0c;总算将这份Stable Diffusion的使用教程整理妥当。 从最初的安装与配置&#xff0c;细至界面功能的详解&#xff0c;再至实战案例的制作&#xf…...

线性可分支持向量机的原理推导【补充知识部分】拉格朗日函数 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。在主文章中&#xff0c;有一个部分是关于补充拉格朗日对偶性的相关知识&#xff0c;此公式即为这部分内容。 公式 9-9 是关于拉格朗日函数 L ( x , α , β…...

csdn(最新交流群)

SEOI Chathttps://seoi.net/room/10122?kwe7cp45v此网站开放性较强&#xff0c;小心诈骗...

新手maven入门学习教程

MAVEN基础入门 提示&#xff1a;java新人的学习之路记录 学习内容&#xff1a; 提示&#xff1a;了解并会初步使用maven构建管理java项目 Maven 是一个非常流行的 Java 项目管理和构建工具。它通过提供一套标准的构建生命周期和一组预定义的目标来简化 Java 应用程序的构建过…...

React 中级阶段学习计划

React 中级阶段学习计划 目标 掌握状态管理和路由。能够调用API并处理异步数据。学会使用CSS-in-JS和CSS Modules进行样式处理。 学习内容 状态管理 React Context API Context API&#xff1a;用于在组件树中传递数据&#xff0c;避免多层props传递。示例&#xff1a;im…...

[产品管理-47]:产品市场调研 - 一级市场、二级市场、次级市场?

目录 一、产品销售环节的一级二级市场 1、一级市场 2、二级市场 3、一级市场与二级市场的互动关系 二、金融中的一级二级市场 1、一级市场&#xff08;Primary Market&#xff09;- 新股发行、定向发行 2、二级市场&#xff08;Secondary Market&#xff09;- 普通投资者…...

Linux零基础教程学习(黑马)

1.初识Linux 1.2远程连接Linux系统 图形化、命令行 对于操作系统的使用&#xff0c;有2种使用形式&#xff1a; 图形化页面使用操作系统 以命令的形式使用操作系统 不论是Windows还是Linux亦或是MacOS系统&#xff0c;都是支持这两种使用形式。 图形化&#xff1a;使用操作…...

一款零依赖、跨平台的流媒体协议处理工具,支持 RTSP、WebRTC、RTMP 等视频流协议的处理

大家好&#xff0c;今天给大家分享一款功能强大的流媒体协议处理工具go2rtc&#xff0c;支持多种协议和操作系统&#xff0c;具有零依赖、零配置、低延迟等特点。 项目介绍 go2rtc可以从各种来源获取流&#xff0c;包括 RTSP、WebRTC、HomeKit、FFmpeg、RTMP 等&#xff0c;并…...

PHP 正则验证A-Z且排除某字母

都已经找到这里来了&#xff0c;相信已经尝试很多办法了&#xff0c;那么我们直接上答案 关键正则&#xff1a;(?!.*[IO]) //验证5到6个大写字母且排除I和O if (preg_match(/^(?!.*[IO])[A-Z\d]{5,6}$/u, AAAAM)) {echo "匹配成功"; } else {echo "匹配失败…...

如何安全运行别人上传的Python代码?

写后端的同学&#xff0c;有时候需要在网站上实现一个功能&#xff0c;让用户上传或者编写自己的Python代码。后端再运行这些代码。 涉及到用户自己上传代码&#xff0c;我们第一个想到的问题&#xff0c;就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两行&…...

matlab相位图

% 清空工作空间和命令窗口 clear; clc; % 模拟生成时间t&#xff0c;位移y(t)和角位移theta(t) t linspace(0, 100, 1000); % 时间从0到100&#xff0c;包含1000个点 y 1e-5 * sin(2 * pi * 0.1 * t) .* exp(-0.01 * t); % 位移y(t) 振荡衰减 theta 1e-6 * cos(2 * pi * …...

C语言笔记(指针的进阶)

目录 1.字符指针 2.指针数组 3.数组指针 3.1.创建数组指针 3.2.&数组名和数组名 1.字符指针 int main() { char ch w;char* pc &ch;const char *p "abcdef";//常量字符串 产生的值就是首元素的地址//常量字符串不能被修改 因此需要加上一个…...

NodeJS连接MySQL 8.4报错:code: ‘ER_TABLEACCESS_DENIED_ERROR‘

NodeJS连接MySQL 8.4报错&#xff1a;code: ER_TABLEACCESS_DENIED_ERROR { code: ER_TABLEACCESS_DENIED_ERROR, errno: 1142, sqlMessage: "SELECT command denied to user 用户名localhost for table 表名", sqlState: 42000, index: 0, sql: SELECT …...

力扣66~70题

题66&#xff08;简单&#xff09;&#xff1a; python代码&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67&#xff08;简…...

Axure重要元件三——中继器添加数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;中继器添加数据 课程内容&#xff1a;添加数据项、自动添加序号、自动添加数据汇总 应用场景&#xff1a;表单数据的添加 案例展示&#xff1a; 步骤…...

矩阵系统哪家好~矩阵短视频运营~怎么矩阵OEM

一、引言 在当今的数字化时代&#xff0c;矩阵系统在众多领域中发挥着至关重要的作用&#xff0c;如视频监控、信号切换、自动化控制等。然而&#xff0c;如何判断一个矩阵系统是否好用成为了许多用户面临的问题。本文将从多个方面探讨矩阵系统好用与否的判断标准&#xff0c;希…...

Axure树形菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure树形菜单展开与折叠 主要内容&#xff1a;树形菜单制作——层级关系——隐藏与显示——值的变化——多层交互 应用场景&#xff1a;关系树、菜…...

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…...