2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

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

发布日期:2024-10-19 09:56:33 浏览次数: 5380
作者:活水智能

微信搜一搜,关注“活水智能”


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 importCharacterTextSplitter

text ="你的长文档文本在这里..."

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 importRecursiveCharacterTextSplitter

text ="你的长文档文本在这里..."

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 TokenTextSplitter

text = "你的长文档文本在这里..."

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 importMarkdownHeaderTextSplitter

markdown_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 importPythonCodeTextSplitter

python_code ="""
def function1():
    print("Hello,World!")

class MyClass:
    def __init__(self):
        self.value = 42

    def 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 importHTMLSectionSplitter

html_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 SpacyTextSplitter

text = "你的长文档文本在这里。它可以是多种语言的。SpaCy 将处理语言的细微差别。"

splitter = SpacyTextSplitter(
    chunk_size=100,
    chunk_overlap=20
)

chunks = splitter.split_text(text)
chunks

Latex 文本分割器

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

from langchain.text_splitter importLatexTextSplitter

latex_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 importRecursiveJsonSplitter

json_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,Language

PYTHON_CODE ="""
def add(a, b):
    return a + b

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, value):
        self.result += value
        return self.result

    def subtract(self, value):
        self.result -= value
        return 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


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅