1. Native RAG文档分块策略详解
在构建检索增强生成(RAG)系统时,文档分块是决定后续处理效果的关键前置步骤。合理的分块策略需要平衡语义完整性与计算效率,以下是四种经过实战验证的方法及其Python实现。
1.1 基于句子的分块方法
句子级分块最适合处理正式文档和连贯性强的文本。我们使用正则表达式匹配中文标点作为分割点:
python复制import re
def split_by_sentence(text):
# 匹配中文句号、问号、感叹号及省略号作为分割点
sentence_delimiters = r'。|?|!|……'
raw_segments = re.split(f'({sentence_delimiters})', text)
# 将标点符号重新附加到前句
chunks = []
for seg, punc in zip(raw_segments[::2], raw_segments[1::2]):
if seg.strip(): # 过滤空字符串
chunks.append(seg + punc)
# 处理最后可能存在的无标点内容
if len(raw_segments) % 2 == 1:
chunks.append(raw_segments[-1])
return chunks
注意事项:中文省略号的匹配需要特别注意全角(……)与半角(...)的区别。实际应用中建议添加英文标点支持,并处理连续空格等特殊情况。
1.2 固定字符数分块与重叠窗口
当处理非结构化文本(如网页内容)时,固定长度分块更为可靠。以下是带重叠窗口的实现:
python复制def chunk_by_size(text, chunk_size=200, overlap=50):
chunks = []
start = 0
while start < len(text):
end = min(start + chunk_size, len(text))
chunks.append(text[start:end])
start += (chunk_size - overlap)
# 合并过小的尾块
if len(chunks) > 1 and len(chunks[-1]) < overlap:
chunks[-2] += chunks[-1]
chunks = chunks[:-1]
return chunks
参数选择经验:
- 通用场景建议chunk_size=256-512 tokens
- overla
