Chunking
分块把长文档切成小块再向量化——块太大检索不精,太小丢失上下文。
详解
Chunking(分块)是 RAG 索引阶段的第一步:把原始文档切成若干小片段,每片段单独做 embedding 存入向量库。这一步看似简单,实则直接影响最终检索质量。块太大(>1000 词)会导致一个 embedding 包含太多不同话题,稀释相关性,搜出来的段落"有点相关但不够精准";块太小(<50 词)则可能让每块都失去完整语义,比如把"苹果公司的 iPhone 发布"切成"苹果公司"和"iPhone 发布"两块,分别都含义不完整。实践中最常用 RecursiveCharacterTextSplitter,默认 chunk_size=512 token,chunk_overlap=50 token(重叠是为了防止一个句子被切断成两块时都丢失上下文)。对于结构化文档(Markdown、代码),推荐按语义边界(标题、函数)分块。
一个类比
把一本书做成"知识卡片库":把每章切成一张张卡片,方便回答问题时取出最相关的那几张。卡片太厚(一整章)找起来浪费,卡片太薄(一句话)意思不完整,说不清楚。卡片之间稍微重叠一点内容,防止一个完整的意思被切断在两张卡片的边缘。
举个例子
用 LangChain 的 RecursiveCharacterTextSplitter 分块:
```python
from langchain_text_splitters import RecursiveCharacterTextSplitter
text = "RAG 是检索增强生成。它分三步:索引、检索、生成。索引阶段把文档切块并向量化。检索阶段找最相关的块。生成阶段把检索结果塞进 Prompt 让模型回答。"
# 注:chunk_size 单位是字符数;生产环境通常用 512 token
splitter = RecursiveCharacterTextSplitter(
chunk_size=40, # 每块最多 40 字符(演示用,生产取 512 token)
chunk_overlap=8, # 相邻块重叠 8 字符,防止语义截断
)
chunks = splitter.split_text(text)
for i, c in enumerate(chunks):
print(f"[{i}] {c}")
```PYTHON 示例
相关概念
- → Embedding· 向量嵌入
- → Retrieval / Top-K· 检索