微信扫码
添加专属顾问
我要投稿
文档切块是RAG系统的灵魂,15种神技让你的AI模型"消化"更高效! 核心内容: 1. Chunking的核心原理与三大考量因素 2. 15种实用切块技术详解(含代码示例) 3. 不同场景下的最优切块策略选择
❝你以为RAG系统的“聪明才智”全靠大模型?错!真正的高手,都是切块(Chunking)切得好!
大家好,我是你们的AI技术侃侃君。今天我们聊点硬核又接地气的:RAG系统里的文档切块(Chunking)。
你是不是也遇到过这种尴尬:明明有一份厚厚的文档,想让大模型帮你总结、问答、检索,结果模型一脸懵逼——“对不起,token太多,我吃不下!”
别急,这不是模型太菜,而是你没掌握切块的艺术。
RAG(Retrieval-Augmented Generation)系统,已经是NLP圈的“顶流”了。无论是智能问答、知识库、文档摘要,还是企业内部的智能检索,RAG都能大显身手。但你要让它“吃得好、消化快、输出香”,Chunking绝对是核心秘诀。
今天,侃侃君就带你一口气盘点15种Chunking神技,让你的RAG系统聪明到飞起!
Chunking,直译就是“切块”。在RAG系统里,就是把一份大文档,拆成模型能“咀嚼”的小块。
为什么要切?
所以,Chunking不是简单的“切”,而是信息架构的艺术。
你要在“保留上下文”和“适配模型能力”之间,找到那个黄金分割点。
块的大小(Chunk Size)
太大,token超限,检索慢;太小,语义丢失,生成质量差。
建议:100~500 tokens/块,根据模型实际能力灵活调整。
上下文保留(Context Preservation)
切块不能“断句断意”,否则模型“看不懂”。
滑动窗口、语义切块等方式,可以有效保留上下文。
多模态处理(Modality Handling)
文档里可能有表格、图片、代码块,不同内容类型要用不同切块策略。
原理:按固定词数或token数切分。
适用:结构简单的小文档。
优点:实现简单,速度快。
缺点:可能切断句子,丢失语义。
def fixed_size_chunk(text, max_words=100):
words = text.split()
return [' '.join(words[i:i + max_words]) for i in range(0, len(words), max_words)]
原理:按句子边界切分。
适用:需要保留语义完整性的文档。
优点:语义清晰,上下文连贯。
缺点:句子长度不一,chunk大小不稳定。
import spacy
nlp = spacy.load("en_core_web_sm")
def sentence_chunk(text):
doc = nlp(text)
return [sent.text for sent in doc.sents]
原理:按段落切分。
适用:结构清晰的文档,如论文、报告。
优点:自然分段,语义完整。
缺点:段落长度不一,可能超token限制。
def paragraph_chunk(text):
return text.split('\n\n')
原理:基于语义相似度进行切块。
适用:技术文档、复杂文本。
优点:上下文保留好。
缺点:实现复杂,需依赖模型。
def semantic_chunk(text, max_len=200):
doc = nlp(text)
chunks = []
current_chunk = []
for sent in doc.sents:
current_chunk.append(sent.text)
if len(' '.join(current_chunk)) > max_len:
chunks.append(' '.join(current_chunk))
current_chunk = []
if current_chunk:
chunks.append(' '.join(current_chunk))
return chunks
原理:文本、表格、图片分别处理。
适用:PDF、技术手册等混合内容文档。
优点:保留多种模态信息。
缺点:实现复杂。
def modality_chunk(text, images=None, tables=None):
text_chunks = paragraph_chunk(text)
return {'text_chunks': text_chunks, 'images': images, 'tables': tables}
原理:相邻chunk之间有重叠。
适用:法律、学术文档。
优点:上下文连贯。
缺点:内容重复,处理量大。
def sliding_window_chunk(text, chunk_size=100, overlap=20):
tokens = text.split()
chunks = []
for i in range(0, len(tokens), chunk_size - overlap):
chunk = ' '.join(tokens[i:i + chunk_size])
chunks.append(chunk)
return chunks
原理:按章节、段落、子段落分层切块。
适用:结构化文档,如论文、合同。
优点:保留文档结构。
缺点:实现复杂。
def hierarchical_chunk(text, section_keywords):
sections = []
current_section = []
for line in text.splitlines():
if any(keyword in line for keyword in section_keywords):
if current_section:
sections.append("\n".join(current_section))
current_section = [line]
else:
current_section.append(line)
if current_section:
sections.append("\n".join(current_section))
return sections
原理:根据内容特征动态调整切块策略。
适用:电子书、技术文档。
优点:灵活适应不同内容。
缺点:逻辑复杂。
def content_aware_chunk(text):
chunks = []
current_chunk = []
for line in text.splitlines():
if line.startswith(('##', '###', 'Introduction', 'Conclusion')):
if current_chunk:
chunks.append('\n'.join(current_chunk))
current_chunk = [line]
else:
current_chunk.append(line)
if current_chunk:
chunks.append('\n'.join(current_chunk))
return chunks
原理:将表格独立切块。
适用:财务报表、技术文档。
优点:保留表格结构。
缺点:格式可能丢失。
import pandas as pd
def table_aware_chunk(table):
return table.to_markdown()
原理:按token数切块,适配Transformer模型。
适用:GPT、BERT等模型。
优点:适配模型限制。
缺点:可能切断句子。
from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
def token_based_chunk(text, max_tokens=200):
tokens = tokenizer(text)["input_ids"]
chunks = [tokens[i:i + max_tokens] for i in range(0, len(tokens), max_tokens)]
return [tokenizer.decode(chunk) for chunk in chunks]
原理:基于NER识别实体进行切块。
适用:简历、合同、法律文档。
优点:保留实体信息。
缺点:需训练NER模型。
def entity_based_chunk(text):
doc = nlp(text)
return [ent.text for ent in doc.ents]
原理:使用LDA等主题模型进行切块。
适用:新闻、研究论文等多主题文档。
优点:按主题聚合信息。
缺点:需额外建模。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
def topic_based_chunk(text, num_topics=3):
sentences = text.split('. ')
vectorizer = CountVectorizer()
sentence_vectors = vectorizer.fit_transform(sentences)
lda = LatentDirichletAllocation(n_components=num_topics, random_state=42)
lda.fit(sentence_vectors)
# 省略主题分配逻辑
return sentences
原理:按PDF页面切块。
适用:PDF文档。
优点:实现简单。
缺点:可能断句。
def page_based_chunk(pages):
return pages
原理:按关键词切分。
适用:结构清晰的文档。
优点:符合文档结构。
缺点:需预定义关键词。
def keyword_based_chunk(text, keywords):
chunks = []
current_chunk = []
for line in text.splitlines():
if any(keyword in line for keyword in keywords):
if current_chunk:
chunks.append('\n'.join(current_chunk))
current_chunk = [line]
else:
current_chunk.append(line)
if current_chunk:
chunks.append('\n'.join(current_chunk))
return chunks
原理:结合多种策略。
适用:复杂文档。
优点:灵活强大。
缺点:实现复杂。
def hybrid_chunk(text):
paragraphs = paragraph_chunk(text)
hybrid_chunks = []
for paragraph in paragraphs:
hybrid_chunks += sentence_chunk(paragraph)
return hybrid_chunks
侃侃君小贴士:
很多人以为Chunking就是“把文档切碎”,其实这是信息架构的高级设计。
切得好,RAG系统如虎添翼;切得烂,模型再大也白搭。
最后,侃侃君送你一句话:
❝“RAG系统的聪明,不在于模型多大,而在于你切块多巧。”
如果你正在做RAG系统,建议把这15种Chunking神技收藏起来,结合你的业务场景,灵活搭配,逐步优化。
让你的RAG系统,吃得下、消化好、输出香!
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-19
2025-04-16
2025-05-08
2025-04-23
2025-06-06
2025-04-16
2025-05-30
2025-05-19
2025-06-05
2025-06-05
2025-07-09
2025-07-04
2025-07-01
2025-07-01
2025-07-01
2025-07-01
2025-06-30
2025-06-29