前言
随着大语言模型(LLM)技术的飞速发展,检索增强生成(Retrieval-Augmented Generation, RAG)已成为解决大模型知识幻觉、提升垂直领域问答准确性的核心技术方案。尽管近期涌现出支持超长上下文窗口(如 200 万字)的模型,引发了关于'长上下文是否将取代 RAG'的讨论,但在实际生产环境中,RAG 系统凭借其成本效益和可控性,依然占据重要地位。
本文旨在深入探讨 RAG 系统的核心环节——文档切分策略,并通过 Python 代码实践展示如何高效处理 PDF 等文档,同时分析长上下文窗口与 RAG 的适用边界。
RAG 系统搭建的基本流程
构建一个标准的 RAG 系统通常包含以下关键步骤:
- 数据准备:收集并整理特定领域的垂域资料,确保数据的准确性和时效性。
- 文档解析与切分:读取非结构化文档(如 PDF、Word),进行清洗和合理的文本切分(Chunking)。这是影响检索质量的关键步骤。
- 向量化存储:将分割好的文本块通过 Embedding 模型转换为向量,并灌入向量数据库(Vector Database)。
- 检索接口封装:开发查询接口,支持用户输入 Query 后快速匹配相关向量片段。
- 生成流程构建:形成
Query -> 检索 -> Prompt 组装 -> LLM 生成 -> 回复的完整链路。
典型应用场景包括企业知识库问答、智能客服、法律合同审查等。
文档切分策略详解
文档切分是 RAG 系统中决定检索召回率和生成质量的基础。切分过细会导致语义丢失,切分过粗则可能引入噪声或超出上下文限制。目前主流的切分方法可分为以下几类:
一、基于规则的切分方法
这类方法依赖预定义的规则,实现简单但灵活性较低。
- 基于字符分块:按固定字符数目切分,适合对长度敏感的场景,但容易切断句子。
- 固定大小分块:指定每个块的 Token 数或字符数,通常设置重叠区域(Overlap)以保持语义连贯性。
- 基于 Token 的分块:使用与目标 LLM 相同的分词器计算 Token 数,更精准地控制模型输入长度。
- 内容感知分块:利用 NLTK、spaCy 等 NLP 工具识别句子、段落、标题和标点符号,按自然语言结构切分。
- 递归分块:优先按段落或标题分割,若块过大则递归细分。适用于长文档,能较好保持独立性。
- 特定格式分块:针对 Markdown、LaTeX 等结构化文本,按标题、列表、代码块等逻辑单元切分。
二、基于语义聚类的切分方法
此类方法利用嵌入向量计算相似度,确保切分后的文本块在语义上高度相关。
以 LlamaIndex 中的 SemanticSplitterNodeParser 为例,其核心步骤如下:
- 文本嵌入:将文本句子或段落输入 Embedding 模型,生成高维向量。
- 语义分析:计算相邻向量间的余弦相似度,评估语义关系。
- 分块决策:设定相似度阈值,低于阈值的点视为断点,将相似段落归为一个块。
这种方法能有效避免语义割裂,但计算开销较大。
三、基于机器学习模型的方法
利用 BERT 等 Transformer 模型学习文本模式,预测最佳分块点。
- Naive BERT:利用下一句预测(NSP)任务判断句子间连续性。
- Cross Segment Attention:结合 BERT 与双向 LSTM,分析跨片段注意力机制,考虑局部上下文。
- SeqModel:改进版模型,利用自适应滑动窗口提高推理速度,同时建模更长上下文依赖。
四、基于代理的切分方法
利用大语言模型(LLM)作为 Agent 理解文本,将其分解为独立命题(Propositions)并进行聚类。


