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

简洁大方 网站网站设计公司长沙

简洁大方 网站,网站设计公司长沙,网站模板 源码,中山织树网站建设🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…

🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码)

一、前言

在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个非常关键的预处理步骤。LangChain 提供了多种灵活的文本切分器(TextSplitter),可以帮助开发者根据实际需求对文本进行合理划分。

本文将围绕你在实际项目中使用的 TextSplitter 类型展开讲解,并结合具体代码示例,帮助你更好地理解如何选择和配置不同的文本切分策略。


二、什么是 TextSplitter?

TextSplitter 是 LangChain 中用于将长文本分割成小块(chunks)的一个工具类。它的核心作用是:

  • 将一段较长的文本按照指定规则切分为多个较小的段落;
  • 支持设置每个段落的最大长度(chunk_size);
  • 支持相邻段落之间的重叠部分(chunk_overlap),以保留上下文信息;
  • 支持基于字符、语言模型 tokenizer 等方式切分。

三、常见的 TextSplitter 类型

LangChain 提供了多种类型的 TextSplitter,每种适用于不同的场景:

类名说明
RecursiveCharacterTextSplitter按照指定字符递归切分,默认按 [“\n\n”, “\n”, " ", “”] 切分
SpacyTextSplitter基于 SpaCy 的语言模型进行句子级切分
MarkdownHeaderTextSplitter专门用于 Markdown 格式文档,根据标题层级切分
TokenTextSplitter基于 Token 数量进行切分,常用于 GPT 系列模型

四、实战代码解析

1. 定义 SPLITTER_CLASS_MAP 映射

为了方便切换不同的切分器,我们可以先定义一个映射字典:

SPLITTER_CLASS_MAP = {"RecursiveCharacterTextSplitter": RecursiveCharacterTextSplitter,"SpacyTextSplitter": SpacyTextSplitter,"MarkdownHeaderTextSplitter": MarkdownHeaderTextSplitter,"TokenTextSplitter": TokenTextSplitter,
}

这样可以根据字符串名称动态获取对应的切分器类。


2. 使用 from_tiktoken_encoder 构建切分器

TextSplitter = SPLITTER_CLASS_MAP["RecursiveCharacterTextSplitter"]
text_splitter = TextSplitter.from_tiktoken_encoder(encoding_name=text_splitter_dict["RecursiveCharacterTextSplitter"]["tokenizer_name_or_path"],chunk_size=CHUNK_SIZE,chunk_overlap=OVERLAP_SIZE
)

这段代码使用的是 tiktoken 编码器来计算 token 数量,适用于 GPT-3/4 等 OpenAI 模型。其中:

  • encoding_name: 指定使用的编码器(如 "cl100k_base");
  • chunk_size: 每个 chunk 的最大 token 数;
  • chunk_overlap: 相邻 chunk 的重叠 token 数。

3. 使用默认参数初始化 RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(chunk_size=CHUNK_SIZE,chunk_overlap=OVERLAP_SIZE
)

这是最常用的方式,适用于大多数中文文本的切分任务,不依赖特定的 tokenizer,而是通过字符方式进行切分。


4. 使用 HuggingFace 的 Tokenizer 初始化切分器

from transformers import GPT2TokenizerFast
from langchain.text_splitter import CharacterTextSplittertokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
text_splitter_1 = TextSplitter.from_huggingface_tokenizer(tokenizer=tokenizer,chunk_size=CHUNK_SIZE,chunk_overlap=OVERLAP_SIZE
)

这种方式适用于需要与 HuggingFace 模型配合使用的场景,比如 LLaMA、Bloom 等开源模型。它会根据 tokenizer 来精确控制每个 chunk 的 token 数量。


五、总结与建议

切分方式特点推荐场景
RecursiveCharacterTextSplitter快速简单,支持自定义切分符通用文本处理
SpacyTextSplitter支持多语言语义切分英文为主、语义敏感任务
MarkdownHeaderTextSplitter按标题层级切分文档类 Markdown 处理
TokenTextSplitter基于 token 数量切分适配 GPT、LLM 输入限制

建议:如果你在处理中文文本,推荐优先使用 RecursiveCharacterTextSplitter,并搭配合适的 chunk_size(如 512 或 1024)和 overlap(如 64)。


六、区别

你提到的三个 TextSplitter 实例虽然都来自 LangChain 的 RecursiveCharacterTextSplitter 类,但它们使用了不同的初始化方式(构造方法),因此在底层处理文本的方式上也有所不同。下面我将详细分析这三者的区别:


🧩 一、整体结构回顾

你定义了一个映射字典:

SPLITTER_CLASS_MAP = {"RecursiveCharacterTextSplitter": RecursiveCharacterTextSplitter,...
}

然后通过字符串名称获取类并创建实例:

TextSplitter = SPLITTER_CLASS_MAP["RecursiveCharacterTextSplitter"]
text_splitter = TextSplitter.from_tiktoken_encoder(...)

接着又分别使用了三种不同方式创建了三个 splitter 实例:

  1. text_splitter: 使用 .from_tiktoken_encoder(...)
  2. splitter: 直接使用默认构造函数 RecursiveCharacterTextSplitter(...)
  3. text_splitter_1: 使用 .from_huggingface_tokenizer(...)

这三个 splitter 都是 RecursiveCharacterTextSplitter 的实例,但它们的底层分词逻辑和 chunk 大小控制机制不同


📌 二、逐个分析三个 splitter 的区别

✅ Splitter 1: text_splitter = TextSplitter.from_tiktoken_encoder(...)
初始化方式:
text_splitter = TextSplitter.from_tiktoken_encoder(encoding_name="cl100k_base",chunk_size=CHUNK_SIZE,chunk_overlap=OVERLAP_SIZE
)
特点:
  • 基于 OpenAI 的 tiktoken 编码器
  • chunk_size 是以 token 数量 为单位;
  • 更适合用于与 GPT-3/4 等模型配合使用;
  • 不依赖具体的语言模型 tokenizer,而是使用 OpenAI 官方编码器;
  • 支持中文(取决于使用的 encoding_name);

⚠️ 注意:tiktoken 的 token 划分方式不同于传统的空格或句子划分,它会将中英文混合切分为 subwords 或 bytes。

示例:
"你好 world" -> ["你", "好", "Ġworld"]

✅ Splitter 2: splitter = RecursiveCharacterTextSplitter(...)
初始化方式:
splitter = RecursiveCharacterTextSplitter(chunk_size=CHUNK_SIZE,chunk_overlap=OVERLAP_SIZE
)
特点:
  • 默认使用 字符长度(char length) 来计算 chunk 大小;
  • 按照预设的一组字符递归切分(默认顺序是:\n\n, \n, " ", "");
  • 不依赖任何 tokenizer,只基于字符数量;
  • 适用于通用文本处理,尤其适合中文场景;
  • 最简单、最直接的切分方式;
示例:
text = "这是一个很长的段落..."
splitter.split_text(text)
# 输出:["这是...", "...下一段"]

✅ Splitter 3: text_splitter_1 = RecursiveCharacterTextSplitter.from_huggingface_tokenizer(...)
初始化方式:
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
text_splitter_1 = RecursiveCharacterTextSplitter.from_huggingface_tokenizer(tokenizer=tokenizer,chunk_size=CHUNK_SIZE,chunk_overlap=OVERLAP_SIZE
)
特点:
  • 使用的是 HuggingFace 的 transformers tokenizer(如 GPT2、LLaMA、Bloom 等);
  • chunk_size 也是以 token 数量 为单位;
  • 更适合与开源 LLM 模型配合使用;
  • 支持自定义 tokenizer(如中文 BERT tokenizer);
  • 可以精确控制每个 chunk 的 token 数量,避免超出模型输入限制;

⚠️ 注意:这种方式需要安装 transformers 库,并且加载 tokenizer 可能较慢。


🔍 三、三者的核心区别总结

属性from_tiktoken_encoder(...)__init__(...)from_huggingface_tokenizer(...)
切分依据token 数量(tiktoken 编码器)字符长度token 数量(HuggingFace tokenizer)
是否依赖 tokenizer是(tiktoken)是(transformers)
chunk_size 单位tokenchartoken
中文支持视 encoding 而定(一般较好)✔️ 很好视 tokenizer 而定
典型用途GPT-3/4 类模型适配通用文本处理开源 LLM(如 LLaMA、GPT-Neo)适配
性能快速极快较慢(需加载 tokenizer)

🎯 四、如何选择?

场景推荐方式
使用 OpenAI GPT-3/4 APIfrom_tiktoken_encoder
中文文档处理、快速构建本地知识库__init__()
使用开源 LLM(如 LLaMA、Bloom、GPT-Neo)from_huggingface_tokenizer
需要严格控制 token 数量后两者均可(根据 tokenizer)

📌 五、补充建议

如果你使用的是中文场景,推荐如下组合:

splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n", "。", "!", "?", ",", " ", ""],chunk_size=512,chunk_overlap=64
)

你可以自定义 separators,让它更适合中文语义断句。


文章转载自:

http://925RRZUg.pcbfL.cn
http://jkNQQUjS.pcbfL.cn
http://HISrbxKD.pcbfL.cn
http://IKl96mVo.pcbfL.cn
http://UM6Uf4hw.pcbfL.cn
http://QaY7tWmf.pcbfL.cn
http://s2TE0t3O.pcbfL.cn
http://lBrJYbS7.pcbfL.cn
http://rjaim6Yg.pcbfL.cn
http://ZANgfTiR.pcbfL.cn
http://kWEfvqvp.pcbfL.cn
http://C7bffrrX.pcbfL.cn
http://cZSaw3yt.pcbfL.cn
http://LvWOkMZ2.pcbfL.cn
http://0HwrFu7I.pcbfL.cn
http://9vEpnF4Q.pcbfL.cn
http://TRdjhcGb.pcbfL.cn
http://Bwm6bi8v.pcbfL.cn
http://rgng4FKg.pcbfL.cn
http://UdCnkESv.pcbfL.cn
http://fKLZyiX5.pcbfL.cn
http://LIVfzFVm.pcbfL.cn
http://J45z15tv.pcbfL.cn
http://6MznE7FZ.pcbfL.cn
http://VBpxn6TQ.pcbfL.cn
http://ycPgUGKL.pcbfL.cn
http://4lIvyQHA.pcbfL.cn
http://sbH25qGO.pcbfL.cn
http://JdybsE5i.pcbfL.cn
http://IDjSph9N.pcbfL.cn
http://www.dtcms.com/wzjs/624889.html

相关文章:

  • 深圳网站优化排名公司深圳做分销网站设计
  • 自己做的网站注册用户无法收到激活邮箱的邮件哈尔滨互联网公司
  • 南通市住房建设局网站东莞人才招聘网最新招聘2022
  • 专做零食的网站wordpress网站的彻底清理
  • 温州集团网站建设公司整站排名优化公司
  • 公司网站开发方案小说网站快速做排名
  • 微信小程序个人网站开发网站title keywords
  • 湘潭学校网站建设 x磐石网络苏州网站排名推广
  • 网站建设 维护 编程怎么申请商标品牌
  • 企业网站建设过程做网站教程下载
  • 网站备案每年审吗手机评分网站
  • 网站开发入门培训机构报告老板
  • 云霄网站建设上海企业信息公示网查询全国
  • 料远若近网站建设内蒙古包头网站建设
  • 网站建设素材深圳珠宝网站设计
  • 无锡网站制作价格在线小游戏
  • 千博企业网站管理系统旗舰版家具公司网站页面设计模板
  • 受欢迎的做pc端网站桂建云官网
  • 宁波网站建设培训班网站规划与建设课设报告
  • wordpress网站如何搬家正规网页设计培训怎么样
  • 高级网站开发工程师考试题wordpress修改右键菜单
  • 网站分享按钮免费外网加速器
  • 优购物官方网站直播装修旧房翻新价格表
  • 金华安全网站建设怎么收费网站排名优化专业定制
  • 一个后台管理多个网站代理注册公司怎么样
  • 珠海找工作哪个网站好网站建设的优点
  • 广州建网站价格厦门规划建设网站
  • 统计网站建设手机版网站建设报价
  • 东阳市网站建设简单的网页设计作品源代码
  • 网站备案加急php软件网站建设