语义切分是什么
语义切分按内容主题边界切,而不是按字符数切:先对相邻句子分别向量化,计算相邻相似度,在相似度骤降处判断为话题切换并切一刀。这样每块主题更集中,长文与话题切换频繁的材料受益明显。代价是切分阶段就要付出一次向量化成本,且阈值类型与取值会显著影响块数与块长分布,必须固定参数再做对比实验。
基本信息
| 判定依据 | 相邻句子向量的相似度变化(跳变点) |
|---|---|
| 实现示例 | LangChain 的 SemanticChunker,breakpoint_threshold_type 可选百分位等 |
| 成本 | 切分阶段需要一次额外向量化 |
| 产出特征 | 块长不均匀,随主题长度浮动 |
| 配套要求 | 与其它策略对比时保持同一 embedding 模型与评测集 |
典型使用场景
- 长篇技术白皮书:章节内部又细分主题,固定长度切分常把两个主题拼在一起
- 访谈与会议记录:话题切换频繁且没有标题层级可用
- 主题混杂的合集文档:一份文件里并排多篇短文
- 与递归切分做 A/B:在评测集上比 Recall@k 与人工可读性
- 作为二次切分:先按标题切大节,再对大节内部用语义切分细调
SemanticChunker 用法
SemanticChunker 用法
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings
splitter = SemanticChunker(
OpenAIEmbeddings(model='text-embedding-3-small'),
breakpoint_threshold_type='percentile', # 阈值类型要固定下来
)
docs = splitter.create_documents([text])
print(len(docs), docs[0].page_content[:80])与其它切分策略对比
| 策略 | 成本 | 适合 |
|---|---|---|
| 固定长度 | 极低 | 无结构长文本、作为基线 |
| 递归按分隔符 | 低 | 有段落与句子结构的文本 |
| 标题层级 | 低 | Markdown、手册、规范文档 |
| 语义切分 | 高(需向量化) | 话题跳变明显、无标题结构的长文 |
对短文档或高度同质内容,语义切分提升有限而成本照付:先用小样本与递归切分做对照,确认收益再决定是否全面采用。