首页/AI/RAG 与向量库速查/语义切分(按主题跳变)

语义切分(按主题跳变)

语义切分按相邻句子的向量相似度寻找主题跳变点,在相似度骤降处切分,使每块主题更集中;适合长文与主题切换多的材料,成本较高。

RAG 与向量库速查AI更新于 2026-10-13

语义切分是什么

语义切分按内容主题边界切,而不是按字符数切:先对相邻句子分别向量化,计算相邻相似度,在相似度骤降处判断为话题切换并切一刀。这样每块主题更集中,长文与话题切换频繁的材料受益明显。代价是切分阶段就要付出一次向量化成本,且阈值类型与取值会显著影响块数与块长分布,必须固定参数再做对比实验。

基本信息

判定依据相邻句子向量的相似度变化(跳变点)
实现示例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、手册、规范文档
语义切分高(需向量化)话题跳变明显、无标题结构的长文
对短文档或高度同质内容,语义切分提升有限而成本照付:先用小样本与递归切分做对照,确认收益再决定是否全面采用。

易错点

  • 阈值类型与数值不同结果差异巨大,对比实验未固定参数导致结论不可复现
  • 对短文档或高度同质内容使用,白付向量化成本却看不出提升
  • 切出的块长极不均匀,个别块远超 embedding 长度上限被截断
  • 切分与入库用了不同 embedding 模型,句向量空间不一致,边界判断失真
  • 先在切片上切好再改清洗规则,切分产物的元数据与内容不再对应
  • 按句子逐条向量化时未做长度过滤,标题与页眉这类短句干扰边界判断,切出大量碎块

数据来源与参考

  • LangChain 官方文档(SemanticChunker)
  • Greg Kamradt, 5 Levels of Text Splitting(语义切分思路)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌