RAG 在大模型中的角色:高效文档切分与长上下文探讨
本文深入探讨了 RAG 在大模型中的核心作用,重点分析了文档切分的多种策略,包括基于规则、语义聚类、机器学习及代理方法。通过 Python 代码实践展示了 PDF 文档解析与文本分块的具体实现,强调了 chunk_size 和 overlap 参数对检索质量的影响。此外,文章对比了长上下文窗口与 RAG 的优劣,指出长上下文虽提升了连贯性,但 RAG 在成本控制、知识时效性及幻觉抑制方面仍具不可替代性,是企业级应用的首选架构。

本文深入探讨了 RAG 在大模型中的核心作用,重点分析了文档切分的多种策略,包括基于规则、语义聚类、机器学习及代理方法。通过 Python 代码实践展示了 PDF 文档解析与文本分块的具体实现,强调了 chunk_size 和 overlap 参数对检索质量的影响。此外,文章对比了长上下文窗口与 RAG 的优劣,指出长上下文虽提升了连贯性,但 RAG 在成本控制、知识时效性及幻觉抑制方面仍具不可替代性,是企业级应用的首选架构。

随着大语言模型(LLM)技术的飞速发展,检索增强生成(Retrieval-Augmented Generation, RAG)已成为解决大模型知识幻觉、提升垂直领域问答准确性的核心技术方案。尽管近期涌现出支持超长上下文窗口(如 200 万字)的模型,引发了关于'长上下文是否将取代 RAG'的讨论,但在实际生产环境中,RAG 系统凭借其成本效益和可控性,依然占据重要地位。
本文旨在深入探讨 RAG 系统的核心环节——文档切分策略,并通过 Python 代码实践展示如何高效处理 PDF 等文档,同时分析长上下文窗口与 RAG 的适用边界。
构建一个标准的 RAG 系统通常包含以下关键步骤:
Query -> 检索 -> Prompt 组装 -> LLM 生成 -> 回复 的完整链路。典型应用场景包括企业知识库问答、智能客服、法律合同审查等。
文档切分是 RAG 系统中决定检索召回率和生成质量的基础。切分过细会导致语义丢失,切分过粗则可能引入噪声或超出上下文限制。目前主流的切分方法可分为以下几类:
这类方法依赖预定义的规则,实现简单但灵活性较低。
此类方法利用嵌入向量计算相似度,确保切分后的文本块在语义上高度相关。
以 LlamaIndex 中的 SemanticSplitterNodeParser 为例,其核心步骤如下:
这种方法能有效避免语义割裂,但计算开销较大。
利用 BERT 等 Transformer 模型学习文本模式,预测最佳分块点。
利用大语言模型(LLM)作为 Agent 理解文本,将其分解为独立命题(Propositions)并进行聚类。
此方法效果最佳,但成本较高,适合对精度要求极高的场景。
在实际工程中,PDF 是最常见的非结构化数据来源。Python 的 pdfminer.six 库提供了强大的解析能力。
pip install pdfminer.six
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
import re
def extract_text_from_pdf(filename, page_numbers=None, min_line_length=1):
'''从 PDF 文件中提取文字并按段落重组'''
paragraphs = []
buffer = ''
full_text = ''
# 提取全部页面文本
for i, page_layout in enumerate(extract_pages(filename)):
if page_numbers is not None and i not in page_numbers:
continue
for element in page_layout:
if isinstance(element, LTTextContainer):
full_text += element.get_text() + '\n'
# 按空行分隔重组段落
lines = full_text.split('\n')
for text in lines:
if len(text) >= min_line_length:
buffer += (' ' + text) if not text.endswith('-') else text.strip('-')
elif buffer:
paragraphs.append(buffer)
buffer = ''
if buffer:
paragraphs.append(buffer)
return paragraphs
# 调用示例
paragraphs = extract_text_from_pdf(, min_line_length=)
para paragraphs[:]:
(para + )
正确的 chunk_size(块大小)和 overlap(重叠)配置直接影响检索效果。重叠部分有助于保留跨块的上下文信息。
def split_text(paragraphs, chunk_size=300, overlap_size=100):
'''按指定 chunk_size 和 overlap_size 交叠切割文本'''
# 中文句子分割正则
sentences = [s.strip() for p in paragraphs for s in re.split('(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s', p)]
chunks = []
i = 0
while i < len(sentences):
chunk = sentences[i]
overlap = ''
prev_len = 0
prev = i - 1
# 向前计算重叠部分
while prev >= 0 and len(sentences[prev]) + len(overlap) <= overlap_size:
overlap = sentences[prev] + ' ' + overlap
prev -= 1
chunk = overlap + chunk
next_idx = i + 1
# 向后计算当前 chunk
while next_idx < len(sentences) and len(sentences[next_idx]) + len(chunk) <= chunk_size:
chunk = chunk + ' ' + sentences[next_idx]
next_idx += 1
chunks.append(chunk)
i = next_idx
return chunks
chunks = split_text(paragraphs, chunk_size=300, overlap_size=100)
print(f"Total chunks: {len(chunks)}")
为了进一步提升 RAG 性能,除了基础切分外,还需关注以下方面:
随着 Kimi 等模型支持 200 万字上下文,有人提出 RAG 将被淘汰。然而,两者各有优劣:
因此,长上下文并未完全取代 RAG,而是形成了互补关系。在大规模知识库场景中,RAG 仍是首选架构。
RAG 系统的核心在于高质量的数据处理。文档切分策略需根据业务场景灵活选择,规则法适合通用场景,语义法适合高精度需求。Python 提供的丰富库(如 pdfminer)使得落地变得便捷。面对长上下文模型的挑战,RAG 凭借其在成本、时效性和准确性上的优势,依然是企业级 AI 应用的重要基石。后续工作可进一步探索向量数据库选型及混合检索策略,以构建更健壮的 AI 系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online