微信扫码
添加专属顾问
我要投稿
SemanticChunker:文本分块的新突破,优化RAG模型效率与准确性。核心内容:1. SemanticChunker的主要应用场景与优势2. 核心原理:基于语义连贯性的文本分块策略3. 实际应用:参数设置与使用示例
-推荐关注-
SemanticChunker 是一种文本分块策略,旨在保持语义连贯性。它通过嵌入模型理解文本语义,与传统的字符分割方法相比, 更能保持段落的完整性。本文详细介绍了其原理、使用场景、优缺点及应用建议,帮助开发者选择最合适的文本分块策略,提升RAG应用的效率和准确性。
-- 领取学习资料大礼包,见文末
在 RAG 的核心步骤中,有一个至关重要的步骤:“文本分块(Text Splitting)”。
它的主要作用就是把一大段文本切分成更小、更合理的片段,这样模型才能更好地理解、处理或者存储这些内容。
如果一整篇文章不拆开,那 embedding 的颗粒度太粗,问答的时候很容易不准。所以切得好不好,直接影响最后答案的相关性和准确性。
LangChain框架提供了多种文本分块器,其中RecursiveCharacterTextSplitter
因其基于字符和分隔符的递归分割策略而广泛应用,这种方法处理速度快且资源消耗低。
然而,这种纯粹基于结构的分块方式有时可能会切断语义完整的段落。
为了解决这个问题,可以使用SemanticChunker
,它利用嵌入模型进行语义理解,旨在根据内容的语义关联性智能地划分边界,从而更好地保持文本的语义完整性。
相关阅读:
SemanticChunker
是一款 基于语义相似度的文本切分器 (text splitter) 。它的核心优势在于能够智能地识别文本中的语义边界,主要适用于以下场景:
. ? !
分割);buffer_size
参数);Embeddings
模型);相关阅读:
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*"
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 块
优点:
缺点:
选择建议
文本分块是优化RAG性能的关键步骤。
SemanticChunker
利用嵌入模型理解语义,智能地保持内容连贯性,适合处理复杂、主题多变的长文本,但成本较高且依赖外部API。
RecursiveCharacterTextSplitter
基于字符和分隔符递归分割,速度快、成本低、可离线,适用于结构化文本或需要快速处理的场景,但可能破坏语义。
选择哪种分块器取决于项目对准确性、预算、处理速度和文本特性的具体要求。
SemanticChunker
提供了多种阈值计算方式(如百分位数、标准差等),需根据文本类型仔细调优参数以达最佳效果。
理解不同分块器的原理和适用场景,有助于构建更高效、精准的RAG系统。
有需要的,在公众号「AI取经路」发消息「学习资料」即可获取。
--END--
点亮“赞”和“在看”,“分享”好友一起看
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-19
RAG升级-基于知识图谱+deepseek打造强大的个人知识库问答机器人
2025-04-19
RAG vs. CAG vs. Fine-Tuning:如何为你的大语言模型选择最合适的“脑力升级”?
2025-04-19
低代码 RAG 只是信息搬运工,Graph RAG 让 AI 具备垂直深度推理能力!
2025-04-18
微软PIKE-RAG全面解析:解锁工业级应用领域知识理解与推理
2025-04-18
AI 记忆不等于 RAG:对话式 AI 为何需要超越检索增强
2025-04-18
Firecrawl:颠覆传统爬虫的AI黑科技,如何为LLM时代赋能
2025-04-18
什么是RAG与为什么要RAG?
2025-04-18
Anthropic工程师揭秘高效AI Agent的三大秘诀
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-04-19
2025-04-18
2025-04-16
2025-04-14
2025-04-13
2025-04-11
2025-04-09
2025-04-07