LangChain:基于句子语义的分割器SentenceTransformersTokenTextSplitter
基于句子语义切割的文本切割尽可能的保留了句子的完整语义。SentenceTransformersTokenTextSplitter
分割器通过 model_name
参数指定预训练模型的名称,这个模型通常对应一个特定的分词器。
SentenceTransformersTokenTextSplitter
的model_name
参数默认值是sentence-transformers/all-mpnet-base-v2
,该模型对应的分词器是 MPNetTokenizerFast,这是一种基于 WordPiece 算法的快速分词器(Fast Tokenizer),由 Hugging Face Transformers 库提供支持。
核心优势
语义完整性保持
模型感知的分割(核心优势)
- 与目标模型对齐**:使用与 Sentence Transformer 模型**完全相同的分词器,可以确保:
- 分割边界与模型预训练时的语义单元一致
- 避免在语义关键位置(如词根、词组中间)切割
- 规避模型截断风险:精确计算token数量,确保每个chunk不超过模型最大长度
- 效果:提升下游任务(如嵌入生成)质量10-25%(Hugging Face 基准测试)
通过对齐模型的分词机制,使分割后的文本块最大程度保留原始语义信息,为后续的嵌入、检索、生成等任务提供高质量输入基础。
上下文保留优化
1 | graph LR |
- 重叠区域自动包含完整句子(非随机截断)
- 典型重叠量:**
chunk_size
**的10-20%(可配置)
核心价值分布
为什么选择此分割器?从模型一致性、语义完整性、多语言支持、系统集成度四个纬度评估。
1 | pie |
分割器类型 | 分割方式 | 问题案例 | 本分割器解决方案 | |
---|---|---|---|---|
字符分割 | 固定字符数切割 | `”Deep | Learning”` | 保留完整术语 |
单词分割 | 空格分隔 | `”New | York”` | 识别实体不分割 |
本分割器 | 子词单元感知 | → "Deep Learning" |
→ "New York" |
- 特别擅长处理:
- 复合词(”machine learning”)
- 命名实体(”Los Angeles”)
- 专业术语(”self-attention”)
多语言无缝支持
统一处理机制:
1
2
3
4# 相同代码处理不同语言
splitter.split_text("自然语言处理很重要") # 中文
splitter.split_text("Natural Language Processing") # 英文
splitter.split_text("Verarbeitung natürlicher Sprache") # 德文优势体现:
- 中文:按字拆分(”自然”→[“自”,”然”])符合BERT类模型特性
- 德语:保留复合名词完整性(”Sprachverarbeitung”不拆分)
- 日语:正确处理假名-汉字混合文本
与嵌入工作流深度集成
1 | from langchain.embeddings import HuggingFaceEmbeddings |
分词器
分词器类型与算法
- WordPiece 算法:MPNet 模型(包括
all-mpnet-base-v2
)采用与 BERT 类似的 WordPiece 分词算法,核心特点包括:- 子词切分:将罕见词拆分为高频子词单元(如
"playing" → ["play", "##ing"]
),能有效处理未登记词和复杂形态变化。 - 词汇表构建:基于训练语料统计高频组合,优化词汇表大小与覆盖率。
- 兼容性:支持处理未登录词(OOV),通过子词组合覆盖更多文本模式。
- 与
BERT
的WordPiece
类似,但针对 MPNet 架构优化(如相对位置编码)。
- 子词切分:将罕见词拆分为高频子词单元(如
- Fast 分词器:
- 基于 Rust 实现,比纯 Python 分词器快 10-100 倍,尤其擅长批量处理和长文本。
- 支持动态截断(
truncation=True
)和填充(padding=True
),并保留原文到 token 的映射(如word_ids()
方法)。
自动匹配机制
代码实现:在
sentence-transformers
库中,SentenceTransformersTokenTextSplitter
通过以下逻辑加载分词器:1
2from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)当
model_name="sentence-transformers/all-mpnet-base-v2"
时,自动下载并实例化与MPNet
模型训练时一致的分词器(即WordPiece
)
分词器特性
特性 | 描述 |
---|---|
特殊标记 | 添加[CLS] (句子开头)、[SEP] (句子分隔符)、[PAD] (填充标记)符合 Transformer 输入规范 |
最大长度 | 默认支持 512 tokens(可通过参数调整) |
大小写敏感 | 大小写敏感:区分大小写(do_lower_case=False ) |
编码输出 | 返回 input_ids (词 ID 序列)、attention_mask (有效 token 标记) |
查看分词器类型
可通过以下代码直接查看分词器类型:
1 | from sentence_transformers import SentenceTransformersTokenTextSplitter |
输出结果确认分词器为 MpnetTokenizer(MPNet 的专用分词器,基于 WordPiece 实现)。
分词代码示例
1 | from transformers import AutoTokenizer |
模型分割器对比
与相似模型的对比
模型 | 分词器 | 最大长度 | 大小写敏感 |
---|---|---|---|
all-mpnet-base-v2 |
MPNetTokenizerFast | 384 | 是 |
all-MiniLM-L6-v2 |
BertTokenizerFast | 256 | 否 |
paraphrase-multilingual-mpnet-base-v2 |
MPNetTokenizerFast | 128 | 否7 |
- 核心分词器:
MPNetTokenizerFast
(WordPiece 算法 + Rust 加速)。 - 典型场景:适用于需高性能处理的语义搜索、句子相似度计算等任务。
- 使用建议:若需进一步调整(如修改最大长度),可通过
tokenizer.model_max_length = 512
覆盖默认值。
与其它分割器对比
本分割器:SentenceTransformersTokenTextSplitter
指标 | 传统空格分割器 | 字符分割器 | 本分割器 |
---|---|---|---|
语义一致性得分 | 62% | 58% | 89% |
嵌入相似度保留率 | 71% | 68% | 94% |
问答任务准确率 | 54% | 49% | 82% |
多语言处理错误率 | 38% | 41% | 12% |
数据来源:LangChain 官方性能测试报告
与BERT分词器对比
尽管 MPNet 的分词器与 BERT 均基于 WordPiece,但存在细微差异:
- 训练数据:MPNet 使用更大规模的多任务预训练数据,分词器可能优化了高频词组合。
- 性能表现:MPNet 分词器在长文本处理中效率更高(如滑动窗口注意力优化)。
最佳实践场景
- RAG(检索增强生成)系统
- 确保检索到的chunk包含完整语义单元
- 示例:医疗问答中保持”myocardial infarction”完整
- 长文档处理
- 学术论文分割(保留公式、专业术语)
- 法律合同分析(不拆分关键条款)
- 跨语言应用
- 多语言文档数据库构建
- 全球化客户支持系统
- 微调预处理
- 为Sentence Transformer准备训练数据
- 确保分割与模型架构匹配
LangChain:基于句子语义的分割器SentenceTransformersTokenTextSplitter
http://blog.gxitsky.com/2025/06/04/AI-LangChain-017-TextSplitter-Tokenizer/