1. 为什么文本分块是RAG技术的命门?
当我在2023年首次尝试构建企业知识库系统时,曾天真地认为直接把300页PDF扔给大模型就能获得精准回答。结果遭遇了经典的"大海捞针"问题——模型要么回答无关内容,要么直接说"信息不足"。这个惨痛教训让我意识到:文本分块(Text Chunking)的质量直接决定RAG(Retrieval-Augmented Generation)系统90%的最终效果。
文本分块本质上是在做信息密度与语义完整性的平衡术。太小的分块(如单句)会丢失上下文,就像只给人看半句话;太大的分块(如整章)则会让检索系统陷入信息过载。经过半年多的实战验证,我发现最优分块策略往往需要结合文档类型、业务场景和模型特性三重因素来设计。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础分块策略:从规则到语义
2.1 机械分块法:简单但有效
python复制# 基于字符数的分块示例
def chunk_by_size(text, chunk_size=500):
return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
这是最基础的滑动窗口分块法,我在处理法律条文这类格式规整的文本时仍在使用。关键参数是chunk_size和overlap:
- 中文建议300-800字符(约100-250字)
- overlap通常设10-15%防止截断关键信息
- 适合技术文档、合同等结构化文本
警告:直接按段落分块在遇到长段落时会失效。我曾有个客户的技术文档单段落超过5000字,导致检索完全崩坏。
2.2 语义分块进阶:句子边界感知
当处理技术论坛这类非正式文本时,我改用spaCy的句子分割:
python复制import spacy
nlp = spacy.load("zh_core_web_sm")
def chunk_by_sentence(text, max_length=5):
doc = nlp(text)
chunks = []
current_chunk = []
for sent in doc.sents:
if len(current_chunk) >= max_length:
