微信扫码
添加专属顾问
我要投稿
RAG技术如何通过语义分块优化上下文检索,实现更准确的信息回复。 核心内容: 1. RAG技术结合大语言模型与外部知识检索的重要性 2. 分块技术在RAG中的作用及其对模型性能的影响 3. 实现语义分块的关键步骤和方法
检索增强生成(RAG)技术异军突起,席卷了整个大语言模型领域。通过将大语言模型(LLMs)的强大能力与外部知识检索相结合,RAG使得模型能够生成准确且有依据的回复,即便在专业领域也不例外。在每一个表现卓越的RAG流程背后,都有一个默默发挥关键作用的 “英雄”:分块技术,尤其是语义分块。
RAG代表了人工智能系统获取和利用知识方式的重大变革。传统的大语言模型仅依赖于其预先训练的知识,这可能存在局限性或时效性问题。RAG通过在生成过程中从外部资源(如数据库、文档或互联网)检索相关信息,很好地解决了这一局限性。这些外部知识就像补充弹药,极大地扩展了模型的知识边界,使其能够应对各种复杂问题。
在RAG流程中,分块是至关重要的一环。分块指的是在对文档进行嵌入和索引之前,将其分割成较小单元的过程。这些分块在查询时被检索出来,并输入到大语言模型中用于生成回复。然而,分块并非简单的切割操作,其方式直接影响着RAG系统的性能。如果分块过大,它们可能无法适配模型的上下文窗口,导致信息丢失;而如果分块过小或分割不当,语义信息会被破坏,使模型难以理解和处理,进而影响最终回复的质量。
以一段医学文章为例,假设内容如下:“蝙蝠侠主要在哥谭市活动,这是一个犯罪猖獗、腐败横行的大都市。他的宿敌小丑在混乱和不可预测中如鱼得水。尽管布鲁斯·韦恩资助了哥谭市的许多社会项目,但他仍在为自己作为亿万富翁和义警的双重身份而苦苦挣扎。” 如果使用简单的分块方法,可能会将其分割为:
此时,若用户提问:“是什么让蝙蝠侠的生活如此矛盾?” 检索器可能会随机获取到句子中间的某个分块,或者遗漏关于他双重身份的关键信息,进而导致给出的答案笼统或错误。这清晰地展现了不恰当分块带来的问题,突出了语义分块的重要性和必要性。
语义分块旨在以一种保留每个单元有意义、自包含上下文的方式分割文档。它尊重自然的边界,比如段落、句子或主题,确保每个分块都能独立回答相关的查询。实现语义分块通常涉及以下几个关键步骤:
常见的分块策略有多种,从简单到语义化程度高依次介绍如下:
CharacterTextSplitter
进行固定大小分块。示例代码如下:from langchain.text_splitter import CharacterTextSplitter
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_text(document)
这种方法的优点是简单直接,易于实现。但它存在明显的缺陷,可能会在句子中间进行分割,破坏句子的完整性和上下文连贯性,影响语义的表达。NLTKTextSplitter
可以实现基于句子的分块,示例代码为:from langchain.text_splitter import NLTKTextSplitter
splitter = NLTKTextSplitter(chunk_size=3, chunk_overlap=1)
chunks = splitter.split_text(document)
该方法能够保留句子边界,一定程度上保证了语义的完整性。然而,它可能仍然会在分块过程中分割主题,导致一个主题被分散到多个分块中,不利于模型对完整主题的理解和处理。RecursiveCharacterTextSplitter
提供了递归分块的功能,代码如下:from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
separators=["\n\n", "\n", ".", " ", ""],
chunk_size=500,
chunk_overlap=100
)
chunks = splitter.split_text(document)
递归分块尝试在较大的边界(如段落、句子、单词)上进行分割,能够在分块长度和语义保持之间取得较好的平衡。不过,它可能仍然需要根据具体应用场景进行微调,以达到最佳效果。from sentence_transformers import SentenceTransformer, utilimport nltkmodel = SentenceTransformer('all-MiniLM-L6-v2')sentences = nltk.sent_tokenize(document)embeddings = model.encode(sentences)similarities = [util.cos_sim(embeddings[i], embeddings[i+1]) for i in range(len(embeddings)-1)]chunks = []chunk = [sentences[0]]for i, score in enumerate(similarities): if score < 0.6: # 可根据需要调整阈值 chunks.append(" ".join(chunk)) chunk = [] chunk.append(sentences[i+1])if chunk: chunks.append(" ".join(chunk))
分块策略的优劣直接影响RAG系统下游的各个环节,因此评估分块质量至关重要。可以从以下几个方面进行评估:
为了实现有效的语义分块,需要遵循以下最佳实践:
语义分块对于实际的RAG系统来说至关重要,甚至可以决定系统的成败。以一个企业应用案例(法律合同问答机器人)为例,从简单分块切换到递归 + 语义分块后,取得了显著的效果:
语义分块是RAG技术中不可或缺的关键环节。它通过优化文档的分割方式,提升了上下文检索的效果,进而显著提高了RAG系统的性能。随着人工智能技术的不断发展,语义分块技术也将不断演进和完善,为更多领域的应用提供有力支持。无论是开发内部知识机器人,还是构建特定领域的智能助手,深入理解和应用语义分块技术都将带来巨大的优势,推动人工智能应用向更加智能、高效的方向发展。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-05-07
精|RAG与推理协同全面综述:背景、目的、模式、实现、评估、实践、趋势
2025-05-07
图像也能通过 RAG 加入知识库啦
2025-05-07
RAGflow分片策略与文档解析器
2025-05-07
从RAG到QA-RAG:整合生成式AI以用于药品监管合规流程
2025-05-07
从复杂文档到AI秒懂的高质量数据:EasyDoc解析实战指南
2025-05-07
Golang 基于 Redis 实现文档向量索引与检索系统(RAG)
2025-05-07
使用Ragas自动化评测RAG知识问答系统的各项表现
2025-05-07
Social RAG群助手AI , Matrix虚拟社交网络AI评论点赞
2024-10-27
2024-09-04
2024-05-05
2024-07-18
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-05-05
2025-04-30
2025-04-29
2025-04-29
2025-04-26
2025-04-25
2025-04-22
2025-04-22