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 · 场景切入
假设你要给公司做一个内部知识库问答系统,文档有PDF、Word、网页抓取的各种格式,质量参差不齐。你会怎么设计数据清洗流程?另外,文档切块时你通常用什么策略?
- 问法 2 · 层层追问
RAG系统里,数据入库前一般要做哪些处理?……那文本切块呢,你一般怎么切?……如果文档里既有表格又有代码,直接按固定长度切行不行?你用什么策略处理这种情况?
- 问法 3 · 直球架构
设计一个RAG系统的数据预处理pipeline,重点讲数据清洗流程和文本切块策略。清洗要覆盖哪些环节?切块策略有哪些,各自适合什么场景?