1. RAG技术中的文本分块:为什么这是个必问题?
面试官抛出"RAG为什么要切块"这个问题时,实际上是在考察你对检索增强生成(Retrieval-Augmented Generation)核心机制的理解深度。我在实际构建RAG系统时发现,文本分块策略直接决定了后续检索效果的上限——就像盖房子时地基没打好,后续装修再精美也解决不了结构性问题。
文本分块(Chunking)的本质是信息密度与检索效率的博弈。原始文档可能长达数万字,而语言模型的上下文窗口有限(比如GPT-3.5的4k token),必须将大文档拆解为适合处理的片段。但简单按固定字数切割会导致语义碎片化,这就是为什么需要设计智能分块策略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分块策略的技术权衡
2.1 固定长度分块的致命缺陷
最朴素的实现是用滑动窗口按固定token数切分(比如512个token一块)。我早期项目曾用这种方法处理技术文档,结果出现:
- 表格数据被拦腰截断,检索时返回半张表格
- 代码块被分割到不同chunk,失去可执行性
- 关键论点与论据分离(比如问题描述和解决方案被分开)
python复制# 典型错误示例:用简单字符数切割
def naive_chunk(text, chunk_size=500):
return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
2.2 语义分块的实现方案
现在主流方案采用基于语义的分块,我推荐以下几种实践验证过的方法:
-
递归式分块(LangChain常用):
- 先按段落分割
- 过大段落再按句子分割
- 最后按词语微调
- 优点:保留文档层级结构
-
内容感知分块:
python复制from langchain.text_splitter import MarkdownHeaderTextSplitter headers_to_split_on = [ ("#", "Header 1"), ("##", "Header 2") ] markdown_splitter = MarkdownHeaderTextSplitte
