支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


基于Embedding分块 - 文本分块(Text Splitting),RAG不可缺失的重要环节

发布日期:2025-04-19 18:56:42 浏览次数: 1518 作者:AI取经路
推荐语

SemanticChunker:文本分块的新突破,优化RAG模型效率与准确性。

核心内容:
1. SemanticChunker的主要应用场景与优势
2. 核心原理:基于语义连贯性的文本分块策略
3. 实际应用:参数设置与使用示例

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

-推荐关注-

-正文-

SemanticChunker 是一种文本分块策略,旨在保持语义连贯性。它通过嵌入模型理解文本语义,与传统的字符分割方法相比, 更能保持段落的完整性。本文详细介绍了其原理、使用场景、优缺点及应用建议,帮助开发者选择最合适的文本分块策略,提升RAG应用的效率和准确性。

  • 1. SemanticChunker的主要用途
  • 2. 核心原理
  • 3. 流程图
  • 4. SemanticChunker的使用
    • 1. 初始化参数详解
    • 2. 断点阈值类型对比
    • 3. 完整使用示例
  • 5. 优缺点分析
  • 总结

-- 领取学习资料大礼包,见文末

在 RAG 的核心步骤中,有一个至关重要的步骤:“文本分块(Text Splitting)”

它的主要作用就是把一大段文本切分成更小、更合理的片段,这样模型才能更好地理解、处理或者存储这些内容。

如果一整篇文章不拆开,那 embedding 的颗粒度太粗,问答的时候很容易不准。所以切得好不好,直接影响最后答案的相关性和准确性。

LangChain框架提供了多种文本分块器,其中RecursiveCharacterTextSplitter因其基于字符和分隔符的递归分割策略而广泛应用,这种方法处理速度快且资源消耗低。

然而,这种纯粹基于结构的分块方式有时可能会切断语义完整的段落。

为了解决这个问题,可以使用SemanticChunker,它利用嵌入模型进行语义理解,旨在根据内容的语义关联性智能地划分边界,从而更好地保持文本的语义完整性。

相关阅读:

文本分块(Text Splitting),RAG不可缺失的重要环节

基于文本结构分块 - 文本分块(Text Splitting),RAG不可缺失的重要环节

1. SemanticChunker的主要用途

SemanticChunker 是一款 基于语义相似度的文本切分器 (text splitter) 。它的核心优势在于能够智能地识别文本中的语义边界,主要适用于以下场景:

  • 保持语义连贯性: 当你需要将长文本分割成多个片段,但希望避免破坏内容的自然联系,确保分块既不过于零碎,又能体现上下文关联时。
  • 优化 RAG 检索: 作为 Embedding 或向量检索前的理想预处理步骤,生成语义完整的文本块,有助于提升后续检索和生成任务的准确性。
  • 智能识别主题变化: 当你需要自动检测文本中语义不连续的地方(即语义“断点”),例如新话题的开始或上下文的显著转变时。
  • 超越简单切割: 与基于固定字符数或分隔符的传统方法相比,它能根据内容的语义“跳跃”来动态确定分割点,实现更符合人类阅读习惯的智能分块。

2. 核心原理

  1. 先按句子拆(正则分句,比如以 . ? ! 分割);
  2. 把每句前后几句组合在一起(根据 buffer_size 参数);
  3. 对每一组句子做 embedding(用传进来的 Embeddings 模型);
  4. 计算前后组合句子的语义差异(具体就是余弦距离);
  5. 根据语义差异的“跳跃”位置来分段,比如:差异特别大的地方 → 可能话题换了、内容跳了 → 就断一下;
  6. 分段方式支持几种选择:
  • 百分位数(percentile)
  • 均值 + 标准差(standard_deviation)
  • 均值 + 四分位距(interquartile)
  • 梯度百分位(gradient)

相关阅读:

一文说清楚人工智能的嵌入(Embedding)是什么

人工智能小白到高手:余弦相似度(Cosine Similarity)的简单理解

3. 流程图



4. SemanticChunker的使用

1. 初始化参数详解

semantic_splitter = SemanticChunker(
    embeddings,                    # 必需: 嵌入模型实例
    buffer_size=1,                 # 可选: 组合句子时的上下文窗口大小
    add_start_index=False,         # 可选: 是否在元数据中添加起始索引
    breakpoint_threshold_type="percentile",  # 断点阈值类型
    breakpoint_threshold_amount=None,  # 断点阈值数值
    number_of_chunks=None,        # 可选: 期望的分块数量
    sentence_split_regex=r"(?<=[.?!])\s+",  # 句子分割正则
    min_chunk_size=None           # 可选: 最小分块大小
)

注意:默认的句子分割正则不能很好的分割中文,需要自定义,比如:sentence_split_regex=r"(?<=[。?!])\s*"

2. 断点阈值类型对比

类型
计算方式
适用场景
默认值
percentile
百分位数(默认95%)
通用场景
95
standard_deviation
均值 + N倍标准差
正态分布数据
3
interquartile
均值 + N倍四分位距
有离群值的数据
1.5
gradient
距离变化率的百分位数
关注语义突变点
95

3. 完整使用示例

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings

# 创建OpenAI嵌入实例
embeddings = OpenAIEmbeddings(openai_api_key="hk-iwtbie91e427",
                              model="text-embedding-3-large",
                              base_url="https://api.openai-hk.com/v1")



# 读取示例文本
with open('example_text_2.txt''r', encoding='utf-8'as file:
    text = file.read()

# 创建两种分块器
recursive_splitter = RecursiveCharacterTextSplitter(
    chunk_size=300,
    separators=["\n\n""\n""。"","" """]
)

semantic_splitter = SemanticChunker(
    embeddings=embeddings,
    sentence_split_regex=r"(?<=[。?!])\s*",
    breakpoint_threshold_type = "percentile",
    breakpoint_threshold_amount=95
)

# 使用递归分块器处理文本
print("RecursiveCharacterTextSplitter的分块结果:")
recursive_chunks = recursive_splitter.split_text(text)
for i, chunk in enumerate(recursive_chunks, 1):
    print(f"\n块 {i}:")
    print(chunk)
    print("-" * 80)

# 使用语义分块器处理文本
print("\nSemanticChunker的分块结果:")
semantic_chunks = semantic_splitter.split_text(text)
for i, chunk in enumerate(semantic_chunks, 1):
    print(f"\n块 {i}:")
    print(chunk)
    print("-" * 80)

# 输出分块数量的比较
print(f"\n分块数量比较:")
print(f"RecursiveCharacterTextSplitter: {len(recursive_chunks)} 块")
print(f"SemanticChunker: {len(semantic_chunks)} 块")

分块结果:

RecursiveCharacterTextSplitter的分块结果:

块 1:
技术发展的三个维度

编程语言的演进历程
从最早的机器语言开始,编程语言经历了汇编语言、高级语言的发展阶段。20世纪50年代,FORTRAN等早期高级语言的出现,大大提高了编程效率。随后,面向对象编程范式兴起,C++、Java等语言引领了软件开发的新方向。近年来,Python、Go等现代语言的流行,反映了开发者对简洁性、高效性的追求。函数式编程的回归和新型编程范式的出现,预示着编程语言仍在不断创新。
--------------------------------------------------------------------------------

块 2:
Web技术的变革之路
互联网技术的发展始于简单的HTML页面。Web 1.0时代,静态网页是主流,用户只能被动接收信息。Web 2.0带来了交互革命,AJAX技术让动态交互成为可能,社交媒体和用户生成内容改变了互联网的面貌。如今的Web 3.0时代,语义网技术和去中心化应用正在重塑网络空间,区块链等创新技术为Web世界带来了新的可能。
--------------------------------------------------------------------------------

块 3:
云计算的发展趋势
云计算技术经历了从传统主机到虚拟化,再到现代云服务的演变。IaaS、PaaS、SaaS等服务模式的出现,为企业提供了灵活的IT解决方案。容器技术和微服务架构的普及,推动了应用部署和扩展的革新。边缘计算的兴起补充了传统云计算的不足,而混合云战略则满足了企业对灵活性和安全性的双重需求。未来,云原生技术将继续引领数字化转型的方向。
--------------------------------------------------------------------------------

SemanticChunker的分块结果:

块 1:
技术发展的三个维度

编程语言的演进历程
从最早的机器语言开始,编程语言经历了汇编语言、高级语言的发展阶段。 20世纪50年代,FORTRAN等早期高级语言的出现,大大提高了编程效率。 随后,面向对象编程范式兴起,C++、Java等语言引领了软件开发的新方向。 近年来,Python、Go等现代语言的流行,反映了开发者对简洁性、高效性的追求。 函数式编程的回归和新型编程范式的出现,预示着编程语言仍在不断创新。 Web技术的变革之路
互联网技术的发展始于简单的HTML页面。 Web 1.0时代,静态网页是主流,用户只能被动接收信息。 Web 2.0带来了交互革命,AJAX技术让动态交互成为可能,社交媒体和用户生成内容改变了互联网的面貌。 如今的Web 3.0时代,语义网技术和去中心化应用正在重塑网络空间,区块链等创新技术为Web世界带来了新的可能。 云计算的发展趋势
云计算技术经历了从传统主机到虚拟化,再到现代云服务的演变。
--------------------------------------------------------------------------------

块 2:
IaaS、PaaS、SaaS等服务模式的出现,为企业提供了灵活的IT解决方案。 容器技术和微服务架构的普及,推动了应用部署和扩展的革新。 边缘计算的兴起补充了传统云计算的不足,而混合云战略则满足了企业对灵活性和安全性的双重需求。 未来,云原生技术将继续引领数字化转型的方向。 
--------------------------------------------------------------------------------

分块数量比较:
RecursiveCharacterTextSplitter: 3 块
SemanticChunker: 2 块

5. 优缺点分析

优点:

  • 分块更智能,能保持语义的完整性
  • 适合处理复杂的长文本
  • 分块结果更符合人类理解方式

缺点:

  • 需要调用嵌入模型,处理成本较高
  • 处理速度相对较慢
  • 依赖外部API服务

选择建议

  • 如果项目对文本理解的准确性要求高,且有预算支持,建议使用SemanticChunker
  • 如果项目需要快速处理大量文本,或者文本结构比较规整,可以选择RecursiveCharacterTextSplitter
  • 在实际应用中,可以根据具体场景的需求来选择合适的分块器

总结

文本分块是优化RAG性能的关键步骤。

SemanticChunker 利用嵌入模型理解语义,智能地保持内容连贯性,适合处理复杂、主题多变的长文本,但成本较高且依赖外部API。

RecursiveCharacterTextSplitter 基于字符和分隔符递归分割,速度快、成本低、可离线,适用于结构化文本或需要快速处理的场景,但可能破坏语义。

选择哪种分块器取决于项目对准确性、预算、处理速度和文本特性的具体要求。

SemanticChunker提供了多种阈值计算方式(如百分位数、标准差等),需根据文本类型仔细调优参数以达最佳效果。

理解不同分块器的原理和适用场景,有助于构建更高效、精准的RAG系统。





往日推荐

  1. GPT-4.1 发布:全面升级! 100万长文本和编程能力提升
  2. PDF 翻译神器,读文献靠谱!
  3. LangChain实战 | 通过MultiVectorRetriever 提高信息检索的准确性和效率
  4. 人工智能小白到高手:RAG通过重排(Reranking)提升信息检索的质量


有需要的,在公众号「AI取经路」发消息「学习资料」即可获取。

--END--

点亮“赞”“在看”“分享”好友一起看


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询