RAG 中常见的文本分块(chunk)方法及实战代码示例
在构建 RAG(Retrieval-Augmented Generation)系统时,文本切分(chunking)是第一步,决定了检索效果和生成质量。
很多初学者遇到问题的根源就在于“没分好 chunk”!
什么是 Chunk?
在 RAG 场景中,我们会把一整篇文档切成多个“小段”,每一段叫一个 chunk
这些 chunk 会:
- 被转成向量
- 存入向量数据库(如 Faiss / Milvus)
- 后续检索时再被组合成上下文用于大模型生成
常见 Chunk 切分策略
方法 | 简介 | 优点 | 场景 |
---|---|---|---|
固定字符切割 | 每 N 字一个 chunk | 简单易用 | 快速测试、小文件 |
分段分句 | 按 \n\n 、标点切 | 保留语义结构 | 正文清晰的报告类文档 |
滑窗 + 重叠(推荐) | chunk 之间有一定重叠 | 保证上下文连续性 | 长文档、问答类任务最常用 |
参数建议参考
参数 | 说明 | 推荐值 |
---|---|---|
chunk_size | 每段最大长度(字符数) | 500~1000 |
chunk_overlap | 相邻 chunk 的重叠长度 | 100~300 |
separators | 自定义分割符 | [“\n\n”, “\n”, “。”] |
🧪 完整代码:用 LangChain 分割文本为 Chunk
pip install langchain
核心代码:
from langchain.text_splitter import RecursiveCharacterTextSplitter# 1️⃣ 定义示例文本(可替换为你自己的内容)
text = """
RAG(Retrieval-Augmented Generation)是将外部知识与大语言模型结合的一种技术方式,
通过“先检索、再生成”的流程,让模型能结合知识库回答问题。
而文本切分,就是其中的关键第一步。
"""# 2️⃣ 初始化分块器(推荐配置)
text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n", "。"], # 语义感知分段chunk_size=1000, ## 最大长度chunk_overlap=200 ## 重叠长度
)# 3️⃣ 执行分块
chunks = text_splitter.split_text(text)# 4️⃣ 输出查看:前几个 chunk 结果
print(f"总共分成 {len(chunks)} 块:\n")
for i, chunk in enumerate(chunks):print(f"第 {i+1} 块内容:\n{chunk}\n{'-'*30}")