跳到正文

RAG 数据清洗与 Chunking 怎么选?

文档处理流程设计,常见切块策略及适用场景

原题:在构建RAG系统时,如何设计数据清洗流程?常见的文本切块(Chunking)策略有哪些,各自适用于什么场景?

文档处理 · 字节真题

回答与解析

数据清洗流程设计

核心目标:保证入库数据质量,避免"垃圾进,垃圾出"

关键步骤

  • 格式标准化:统一编码、处理HTML标签、PDF转文本时保留结构标记
  • 噪声去除:过滤页眉页脚、页码、重复内容、低质量OCR结果
  • 质量过滤:剔除过短片段(<50字符)、检测乱码/无意义文本
  • 语义预处理:统一术语、处理同义词、必要时做指代消解

常见Chunking策略

策略 做法 适用场景
固定长度 按token/字符数硬切(长度作为候选变量) 通用场景,实现简单;适合均匀分布的文档
递归字符切分 优先按段落→句子→单词层级切分 需要保持语义完整性;适合技术文档、文章
语义切分 用embedding模型检测语义边界 对语义连贯性要求高;适合对话、叙事文本
结构化切分 按章节、标题、表格等文档结构切分 PDF/Word等富格式文档;需保留层级关系
Agentic切分 用LLM判断最佳切分点 高质量要求场景,成本较高

工程实践要点

  • 把零重叠、短窗口和较长窗口作为候选,用同一评测集验证是否减少边界信息丢失
  • 保留元数据(来源、页码、标题)用于过滤和重排序
  • 对表格/代码等特殊内容单独处理,不强行按长度切

学习建议

建议系统学习该知识点

口语版讲法(约4分钟)

  • 一句话定位:这道题问的是怎么保证RAG输入质量
  • 数据清洗流程:标准化、去噪、质量过滤
  • 切块策略:固定长度、递归字符、语义切分,实际常用递归+overlap
  • 业务案例:企业SOP文档检索
  • 落地风险:切得太碎丢失上下文,overlap和元数据很关键
  • 延伸可延伸点:切块和Embedding模型的窗口大小要匹配

这道题问的其实是,RAG系统里数据从原始文档变成能被检索的向量块,中间这个管道怎么设计才能保证质量,避免垃圾进垃圾出。我一般把数据清洗和文本切块放在一起考虑,因为这两步是连着的,清洗不好切块也跟着出问题。

先说数据清洗,核心就三件事。先说格式标准化,比如PDF转文本的时候,表格、标题这些结构标记要尽量保留,不然切块后语义就断了。再看噪声去除,像页眉页脚、页码、重复内容,还有低质量OCR出来的乱码,这些要过滤掉。还要看质量过滤,太短的片段,比如少于50个字符,直接丢掉,因为这种片段就算检索到了也没法用。

接下来是切块策略,常见的有几种。固定长度切块最简单,但具体长度必须作为候选变量;它容易把一句话从中间断开,所以要先验证文档结构是否足够均匀。更常用的是递归字符切分,就是优先按段落切,段落太长再按句子切,句子还长再按单词切,这样尽量保持语义完整。语义切分更高级一点,用Embedding模型检测语义边界,比如对话里话题切换的地方,但计算成本高,适合对语义连贯性要求很高的场景。实际落地时,我倾向把递归字符切分和语义切分结合起来,比如先用段落切,对长段落用语义边界做二次切分。

举个例子,企业知识库里有大量SOP文档,比如客服退款流程,里面经常有嵌套的步骤列表和注意事项。如果单纯按固定长度切,很可能把“退款条件”和“退款金额计算”这两个相关步骤切到不同块里,用户问“退款能退多少”就只召回条件那块,漏了计算规则。所以我会用递归字符切分,先按一级标题切,再按段落切,最后对每个段落里的列表项做语义切分,同时比较零重叠、短窗口和较长窗口,用同一评测集验证是否减少边界信息丢失。另外,还要保留元数据,比如来源文档名、章节标题、页码,这样检索后可以过滤或做Rerank。

这里有个坑要注意:切块策略不是越细越好。切得太碎,比如每个块只有几十个token,虽然检索精度高,但上下文信息不够,LLM生成时容易Hallucination。反过来切得太粗,块太大,检索噪声多,召回准确率下降。所以上线前我会拿一批真实query做评测,看不同切块大小下的召回率和回答质量,找到平衡点。

还有一个容易被忽略的点:切块大小要和Embedding模型的窗口大小匹配。比如有些模型窗口只有512,你切1024的块,虽然存进去了,但Embedding时会被截断,检索质量反而下降。所以选模型和定切块参数要一起考虑。

总的来说,数据清洗和切块没有银弹,我会根据文档类型和业务场景灵活组合,但核心原则是保证每个切块语义完整、携带足够的上下文。

关键一句:切块大小要和Embedding模型的窗口大小匹配,否则会被截断影响检索质量

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你要给公司做一个内部知识库问答系统,文档有PDF、Word、网页抓取的各种格式,质量参差不齐。你会怎么设计数据清洗流程?另外,文档切块时你通常用什么策略?

  2. 问法 2 · 层层追问

    RAG系统里,数据入库前一般要做哪些处理?……那文本切块呢,你一般怎么切?……如果文档里既有表格又有代码,直接按固定长度切行不行?你用什么策略处理这种情况?

  3. 问法 3 · 直球架构

    设计一个RAG系统的数据预处理pipeline,重点讲数据清洗流程和文本切块策略。清洗要覆盖哪些环节?切块策略有哪些,各自适合什么场景?

同模块相关题目