SemanticChunker 语义相似拆分

from langchain_experimental.text_splitter import SemanticChunker

 

SemanticChunker 不是 LangChain 的内置组件,而是属于 langchain-experimental 包,这是一个 实验性功能 的扩展库,包含了一些尚未稳定或官方不推荐生产使用的模块。

✅ 一句话总结:

SemanticChunker 是一个基于 语义相似性 进行文本分块的实验性工具,它通过嵌入模型判断段落之间的语义距离,动态决定在哪里切分文本。

🔍 内部实现机制简介

SemanticChunker 的核心思想是:
不是按字符数或token数硬切,而是根据语义相似度“智能”切分。

1. 工作流程概览:

表格
复制
步骤描述
1. 句子分割 先用正则或NLTK等方式把文本切成句子列表。
2. 嵌入向量化 对每个句子调用嵌入模型(如OpenAI、SentenceTransformer)生成向量。
3. 计算相似度 计算相邻句子之间的余弦相似度。
4. 断点检测 如果相似度低于某个阈值,就认为这里是“语义断裂点”,可以切分。
5. 合并块 根据断裂点将句子合并成块,控制块的最大长度(如token数)。

🧠 关键参数(初始化时)

Python
复制
SemanticChunker(
    embeddings,              # 嵌入模型,如 OpenAIEmbeddings()
    buffer_size=1,           # 每次比较的句子窗口大小
    breakpoint_threshold_type="percentile",  # 断点判断方式
    breakpoint_threshold_amount=70,           # 阈值百分比
    sentence_split_regex=r'[.!?。]',        # 句子分割正则
)
 

🧪 示例代码

Python
复制
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
text_splitter = SemanticChunker(embeddings)

text = "你的长文本内容..."
docs = text_splitter.create_documents([text])

for doc in docs:
    print(doc.page_content)
 

⚠️ 注意事项

表格
复制
项目说明
性能 每句都要调嵌入模型,速度慢,不适合大批量实时处理。
成本 如果用OpenAI嵌入,token费用高。
实验性 接口可能随时变,不建议生产环境使用。

✅ 替代方案(稳定版)

如果你需要稳定的语义分块,可以考虑:
  • RecursiveCharacterTextSplitter(LangChain内置)
  • 自定义语义分块:用SentenceTransformer + 聚类/滑动窗口自己实现。

📌 总结一句话:

SemanticChunker 是 langchain-experimental 提供的“语义感知”分块器,用嵌入模型找语义断点,聪明但贵慢,适合实验,不适合量产。

posted on 2025-10-11 17:43  ExplorerMan  阅读(41)  评论(0)    收藏  举报

导航