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) 收藏 举报
浙公网安备 33010602011771号