mcpField
C
chunking-strategy

chunking-strategy

github.com/giuseppe-trisciuoglio数据与数据库3653.8k 次安装7 周前更新
代码仓库

关于 chunking-strategy

面向 RAG、向量检索和文档处理场景的分块策略指南,帮助开发者按内容结构选择分块方式并评估检索效果。涵盖从固定长度到语义分块的策略及验证流程。

主要功能

  1. 01多种分块策略选择
  2. 02分块大小与重叠建议
  3. 03按文档结构保留语义单元
  4. 04语义连贯性验证
  5. 05精确率与召回率评估

适用场景

  1. 01构建 RAG 文档处理流程
  2. 02优化向量检索效果
  3. 03为 Markdown、代码或表格分块
  4. 04排查检索精确率或召回率偏低

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill chunking-strategy

安装后在 Claude Code 中输入/chunking-strategy确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
advanced-strategies.md
evaluation.md
implementation.md
research.md
semantic-methods.md
strategies.md
tools.md
visualization-tools.md

详细介绍

RAG 系统的分块策略

概述

为 RAG 系统、向量数据库和文档处理提供分块策略。推荐分块大小、重叠比例和边界检测方法;验证语义连贯性;评估检索指标。

适用场景

在构建或优化 RAG 系统、向量搜索管道、文档分块工作流,或为检索质量不佳的现有系统调优性能时使用。

说明

选择分块策略

根据文档类型和使用场景进行选择:

  1. 固定大小分块(第 1 级)

    • 适用于没有明确结构的简单文档
    • 从 512 个 token 和 10-20% 的重叠率开始
    • 调整方式:事实型查询使用 256,分析型查询使用 1024
  2. 递归字符分块(第 2 级)

    • 适用于具有结构边界的文档
    • 分层分隔符:段落 → 句子 → 单词
    • 根据文档类型(HTML、Markdown、JSON)进行自定义
  3. 结构感知分块(第 3 级)

    • 适用于结构化内容(Markdown、代码、表格、PDF)
    • 保留语义单元:函数、章节、表格块
    • 分割后验证结构是否得到保留
  4. 语义分块(第 4 级)

    • 适用于主题有变化的复杂文档
    • 基于嵌入的边界检测,相似度阈值为 0.8
    • 缓冲区大小:3-5 个句子
  5. 高级方法(第 5 级)

    • 面向长上下文模型的 Late Chunking
    • 面向高精度要求的 Contextual Retrieval
    • 监控计算成本与检索收益

参考:references/strategies.md。

实现分块管道
  1. 预处理文档

    • 分析结构、内容类型和信息密度
    • 识别多模态内容(表格、图像、代码)
  2. 选择参数

    • 分块大小:嵌入模型上下文窗口 / 4
    • 重叠率:大多数情况下为 10-20%
    • 策略专属设置
  3. 处理并验证

    • 应用分块策略
    • 验证连贯性:运行 evaluate_chunks.py --coherence(见下文)
    • 使用有代表性的文档进行测试
  4. 评估并迭代

    • 测量精确率和召回率
    • 如果精确率 < 0.7:将 chunk_size 减少 25%,然后重新评估
    • 如果召回率 < 0.6:将重叠率增加 10%,然后重新评估
    • 监控延迟和内存使用情况

参考:references/implementation.md。

验证分块质量

运行验证命令以评估分块质量:

# Check semantic coherence (requires sentence-transformers)
python -c "
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
chunks = [...]  # your chunks
embeddings = model.encode(chunks)
similarity = (embeddings @ embeddings.T).mean()
print(f'Cohesion: {similarity:.3f}')  # target: 0.3-0.7
"

# Measure retrieval precision
python -c "
relevant = sum(1 for c in retrieved if c in relevant_chunks)
precision = relevant / len(retrieved)
print(f'Precision: {precision:.2f}')  # target: >= 0.7
"

# Check chunk size distribution
python -c "
import numpy as np
sizes = [len(c.split()) for c in chunks]
print(f'Mean: {np.mean(sizes):.0f}, Std: {np.std(sizes):.0f}')
print(f'Min: {min(sizes)}, Max: {max(sizes)}')
"

参考:references/evaluation.md。

示例

固定大小分块
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=256,
    chunk_overlap=25,
    length_function=len
)
chunks = splitter.split_documents(documents)
结构感知代码分块
import ast

def chunk_python_code(code):
    tree = ast.parse(code)
    chunks = []
    for node in ast.walk(tree):
        if isinstance(node, (ast.FunctionDef, ast.ClassDef)):
            chunks.append(ast.get_source_segment(code, node))
    return chunks
语义分块
def semantic_chunk(text, similarity_threshold=0.8):
    sentences = split_into_sentences(text)
    embeddings = generate_embeddings(sentences)
    chunks, current = [], [sentences[0]]
    for i in range(1, len(sentences)):
        sim = cosine_similarity(embeddings[i-1], embeddings[i])
        if sim < similarity_threshold:
            chunks.append(" ".join(current))
            current = [sentences[i]]
        else:
            current.append(sentences[i])
    chunks.append(" ".join(current))
    return chunks

最佳实践

核心原则
  • 平衡上下文保留与检索精确率
  • 保持分块内部的语义连贯性
  • 针对嵌入模型的上下文窗口限制进行优化
实现
  • 从固定大小分块开始(512 个 token,15% 重叠率)
  • 根据文档特征进行迭代
  • 部署前使用特定领域的文档进行测试
避免的陷阱
  • 过度分块:小分块缺乏上下文
  • 分块不足:过大的分块会遗漏信息
  • 忽略语义边界和文档结构
  • 对多种内容类型采用一刀切的方案

限制和警告

资源注意事项
  • 语义方法需要大量计算资源
  • Late Chunking 需要长上下文嵌入模型
  • 复杂策略会增加处理延迟
  • 处理大型文档批次时监控内存
质量要求
  • 后处理后验证语义连贯性
  • 部署前使用有代表性的文档进行测试
  • 确保分块保持独立含义
  • 为格式错误的内容实现错误处理

References

评论

支持 Markdown