07_1我的RAG语料怎么选和怎么切
我的 RAG 语料怎么选以及怎么切抓完 342 篇语料怎么把它们切成块。我原本以为这是个配置问题——chunk_size填 500 还是 1000搜一下RAG 最佳实践就有答案。真跑了一遍才发现不是。我用最朴素的固定长度切完83.3% 的表格是碎的。表格是我特意转成 Markdown、单独存字段保下来的东西。花了半天保住一天就被切碎了而且没人报错。一、先说语料三条标准第三条最关键做 RAG 第一步是选语料。我定了三条硬标准有规则冲突—— 同一件事不同来源写法不同检索才需要分清楚是谁的规则有适用范围约束—— 哪些模型支持什么、哪些免费、并发多少这类问题答错就是线上事故我能判断答案对错—— 这条最关键。第三条是我敢选这个方向的原因。前五天我亲手测过 DeepSeek、智谱、百炼三家 API缓存 64 token 下限、tool_choice在思考模式下返回 400、高峰档价格翻倍、免费模型并发只有 1。别人做 RAG 最头疼的是标准答案是什么而我脑子里已经有一半答案。按这三条选出来的是三家 LLM 平台的官方 API 文档。顺带说两个我否掉的选项。航空领域文档——我在那行做了很多年语料熟、规则清楚但我不想被钉死在这个行业里它留着当面试的垂直案例讲。开源框架文档——量最大最容易拿但人人都在做没有差异化。二、83.3% 的表格是碎的拿到语料后我写了四种分块策略用那 342 篇真实文档各跑一遍目标块大小 500 字overlap 50 字策略块数p50最长过短%跨章节%表格破损%代码破损%固定长度48165005002.9%22.9%83.3%83.2%递归字符50104736477.2%9.7%52.1%79.8%结构感知588944962323.3%0.0%48.0%79.8%原子感知2274460545337.2%36.5%28.5%0.0%先解释指标。光看平均块多长没有意义250 字和 800 字都能跑通看不出好坏。真正影响检索的是后面三个表格破损块里出现了表格的行但没有完整的表头 分隔行。也就是表格被从中间切开检索出来的人看到一串| --- |和散数字不知道每列是什么。代码破损昨天解析时存下来的代码块是否完整出现在某一个块里。跨章节一个块混了两个章节的内容检索命中就糊。固定长度交出的答卷是每 100 个含表格的块83 个是碎的。这不是 bug是它的工作原理——它不看语义到字数就下刀。表格恰好是最容易被拦腰截断的内容一个定价表可能 800 字500 字处正好在数据行中间。我第一反应是去查最佳实践。但很快意识到一件事那些结论是别人在新闻、论文、维基百科上跑出来的。我的语料是 API 文档——标题层级清晰、表格密集、代码块密集跟他们的实验材料不是一回事。结论依附于语料抄过来就是错的。三、所以第四种是我自己写的递归字符和结构感知都是现成思路效果有限递归把表格破损降到 52.1%结构感知降到 48.0%但代码破损两个都还是 79.8%几乎没动。代码这块卡了我一会儿原因是这样的教程型文档里代码块被我换成了占位符正文里压根没有代码不存在被切的问题参考型文档OpenAPI 规范那类里代码就是正文而且是裸文本——没有 围栏正则根本找不出来。所以靠识别代码块这条路走不通。最后是换了个思路把昨天解析时存下来的code_blocks原文拿回正文里定位。既然我知道每个代码块的确切内容就知道它在哪、到哪结束直接标成不可切割就行。这就是第四种策略我叫它原子感知表格和代码块整体保留只有普通文本才递归切。超长表格必须切时把表头复制到每个片段——没有表头的表格片段就是一堆散数字带上表头至少知道每列是什么。结果是表格破损83.3% → 28.5%代码破损83.2% → 0%。顺带说一个我差点信了的假数字。第一版指标跑出来表格破损率是 84.6%我觉得太高抽了两条出来看——发现是自己的检测逻辑错了语料里表头和|---|之间常夹一个空行我的代码只看了表头的下一行把好表格全判成破损。跳过了空行破损率立刻降了一半。先算再下结论这句话我在自己的博客里已经犯过第二次了。四、代价133 个超大块原子感知不是免费的。代码整体保留之后出现了133 个长度超过 1500 字的块最长的一个 54533 字——那是一整个 OpenAPI 规范。这么大的块有两个麻烦embedding 模型有长度上限bge-small-zh 是 512 token塞不进去就算塞进去一个块涵盖几十个接口语义太杂检索命中也不准。这道题今天没解我知道解法叫什么small-to-big父子块——用小块的精确向量去做检索命中之后返回它所属的完整父块。小块负责找得准大块负责答得全。这属于 W3 的优化策略清单到时候再做。今天先把完整保住明天再解决太长。顺序反了的话你会得到一个长度漂亮但内容残缺的库。我做了什么可以拿走scripts/chunk_explore.py—— 四种分块策略 四个指标跑自己的语料就能出表。支持--show atomic打印实际切出来的样子--out导出 Markdown 报告。docs/分块策略对比.md—— 本次实测结果。25 个单元测试tests/test_chunk.py覆盖表格表头保留、裸代码定位、空行容错、接口一致性。三个我认为通用、不依赖我这批语料的结论别抄分块参数的最佳实践。结论依附于语料你的语料跟文章里的不是一回事。花两小时跑一遍自己的数据比读十篇文章有用。先定什么不能被切再定块大小。顺序反了你会在调完一堆参数之后才发现表格和代码早就碎了。给丢弃类优化配一个回退。我昨天把代码块排除在正文外结果 130 篇参考页被判空丢弃——因为它们的正文就在代码里。任何为了质量而丢弃内容的规则都要有丢了之后剩太少就再算一遍的兜底。最后最值钱的不是那张对比表是我终于开始问对问题了。一开始我问的是chunk_size 该填多少这是个没有答案的问题。现在我问的是哪些内容不能切——这是个有答案的问题而且答案就在昨天解析出来的字段里躺着。本文所有数字均来自本机实测342 篇语料跑出非估算也不是从别人的文章里抄的。