这道题问的是文档清洗预处理,其实本质是在问:你如何在信息密度和检索效率之间做取舍,同时避免污染生成质量。很多人在做领域 [[RAG]] 时只关注模型或检索策略,但数据源头要是脏的,后面怎么调都没用。
先说通用清洗层,这层是必须做的,但别做过头。格式标准化、去乱码、过滤页眉页脚这些是基本功。但有个坑:过度清洗可能会丢掉有价值的信息。比如技术手册里的页脚可能是版本号,你一刀切掉,后面检索时版本匹配就出问题。所以我会把这层当成「安全网」,只做保守操作,把判断权留给后面。
真正拉开差距的是领域特化清洗。举个例子,在企业合规文档场景里,同一个缩写在不同部门含义完全不同,比如“PP”在财务是采购订单,在法务是隐私政策。所以我会事先建立领域词典做术语规范化,把缩写统一展开,同形异义词根据上下文消歧。另外,结构化抽取也很关键,比如技术手册按章节、论文按IMRaD结构识别边界,这直接决定了后续 [[Chunk]] 的语义完整性。
然后是分块策略,这块我倾向动态分块而非固定 token 数。固定切分容易把逻辑上完整的段落拦腰切断,导致检索时召回一堆碎片。我一般会结合语义边界,比如用 BERT 做分割点检测,或者直接利用文档原有的标题层级。对于表格,我通常整表保留,并附加表头元数据,因为单独切一行会丢失上下文。重叠窗口不能默认必加;我会把无重叠、短重叠和较长重叠放进同一评测集,比较跨块召回、答案质量和冗余成本。
元数据和[[向量化]]增强这块容易被忽略,但实际效果很明显。我会保留来源文档、章节层级、发布时间这些元数据,这样检索时可以按时间或来源过滤,[[重排]] 时也能加权。对于长文档,我同时存文档级摘要向量和细粒度段落向量,这样既能快速定位相关文档,又能精确命中具体段落。embedding 模型最好用领域语料微调一下,否则通用模型在专业术语上表现很差。
质量闭环是上线前必须做的。我会建一套清洗效果指标,比如分块语义完整性评分、术语覆盖率。上线后通过检索命中率和生成事实性来反向驱动清洗规则迭代。常见失败场景是:清洗规则太激进,导致某些低频但重要的术语被误删,生成时 [[Hallucination]] 反而增加。所以上线我会特别关注那些长尾 query 的召回变化。
说到质量闭环,其实还有一个延伸点:清洗规则本身可以自动化迭代。比如用 LLM 做清洗质量评估,或者用 [[NER]] 模型自动检测术语覆盖率,这样能减少人工维护成本。但前提是领域语料足够丰富,否则模型自己也会出错。
所以整体上,我更倾向把文档清洗看成一套持续迭代的工程系统,而不是一次性预处理。核心思路是:清洗宁可保守,不要激进;分块先保语义边界,再用评测证明是否需要重叠;元数据宁可多存,不要漏掉。这样虽然前期工作量稍大,但后期检索和生成质量会稳定很多。