rag chunking strategy deep

RAG 分块策略深度对比:固定/语义/递归/文档感知

为什么分块决定 RAG 质量 分块(Chunking)是 RAG 管道中被低估的环节。分块质量直接决定三件事: 检索精度:块太大,检索引入噪声;块太小,丢失上下文 生成质量:LLM 收到的上下文是否完整连贯 Token 成本:块大小直接影响每次推理的 Token 消耗 文档 → [分块] → 嵌入 → 向量库 → 检索 → 生成 ↑ 这一步决定了后面所有环节的上限 策略一:固定大小分块 原理 按固定 Token/字符数切割,最简单但最粗暴。 from langchain.text_splitter import CharacterTextSplitter def fixed_chunk(text, chunk_size=500, chunk_overlap=50): splitter = CharacterTextSplitter( separator="\n", chunk_size=chunk_size, chunk_overlap=chunk_overlap, length_function=len ) return splitter.split_text(text) 参数调优 # 不同场景的推荐参数 configs = { "faq_short": {"chunk_size": 200, "overlap": 0}, # FAQ:小块无重叠 "article": {"chunk_size": 500, "overlap": 50}, # 文章:中等块 "technical_doc": {"chunk_size": 1000, "overlap": 100}, # 技术文档:大块保完整 "code": {"chunk_size": 800, "overlap": 50}, # 代码:按函数边界 } 优缺点 优点 缺点 实现简单 可能切断句子 速度最快 语义不连贯 可预测成本 跨段落信息丢失 适用场景:快速原型、格式统一的短文本、日志分析 策略二:语义分块 Sentence 分块 按句子边界切割,保证每个块是完整句子: import nltk from nltk.tokenize import sent_tokenize def sentence_chunk(text, sentences_per_chunk=3): sentences = sent_tokenize(text) chunks = [] for i in range(0, len(sentences), sentences_per_chunk): chunk = " ".join(sentences[i:i+sentences_per_chunk]) chunks.append(chunk) return chunks 语义相似度分块 更高级的方法:计算相邻句子的嵌入相似度,在语义断裂处分块: ...

2026-06-25 · 4 min · 654 words · 硅基 AGI 探索者
鲁ICP备2026018361号