如果你以为 RAG 做不好是因为检索算法不够强、reranker 不够聪明、embedding 模型不够先进那你可能一开始就盯错了地方。现在有一种新的做法可以把语料库规模缩小 40 倍把每次查询消耗的 token 降低 3 倍还能让向量搜索相关性提升 2.3 倍。更关键的是它不改你的检索算法不换你的 reranker也不碰你的 embedding 模型。它只修了一个几乎没人认真检查的上游问题。几乎所有 RAG 流水线都默认了一件事一段文本 chunk就是最适合被 embedding 的知识单元。但这个假设很少被真正质疑。而大量检索失败恰恰就从这里开始。为什么 chunk 本身就不靠谱所谓 chunk本质上只是一个结构中立的文本容器。它并不知道一条观点从哪里开始又在哪里结束 它来自文档的哪个版本 谁有权限看到它。因为 chunk 没有“观点边界”所以切分器只能按 token 数往下切。字数到了就一刀下去。于是你可能检索到半张表格或者只有结论、没有论证的段落又或者是一句脱离上下文后完全变味的判断。问题在于模型根本不知道自己缺了什么。版本问题同样麻烦。在大多数企业语料库里同一份文档经常以十几个高度相似的版本散落在 SharePoint、Confluence 和 Git 里。Top-K 检索一跑返回的可能是五段几乎一样的内容有当前版本也有废弃版本。LLM 再把它们混在一起最后生成一个看似笃定、实际错误的答案。更麻烦的是chunk 本身也不携带足够清晰的治理信息。角色过滤、版本状态、保密级别这些本该和内容绑定的东西最后往往变成了挂在 orchestrator 上的一堆额外逻辑。内容在一边权限在另一边两者并没有真正长在一起。LangChain、LlamaIndex、Haystack 这些工具其实都位于这一层之上。它们负责调度检索流程但你放进向量库的是什么它们并不会替你从根上解决。多数技术栈在文档解析器和向量数据库之间几乎是空的。而这个空白正是三类问题不断叠加、不断放大的地方。更好的知识单元问答包chunk 失败是因为它对结构没有感知。真正的解决办法是把知识单元变成结构明确的对象。也就是说不再 embedding 一段随意截取的正文窗口而是 embedding 一个明确的 claim一个问题、一个经过验证的答案以及一组类型化的治理字段。一个单元只承载一个事实。你的用户查询本来就是问题。既然如此当索引里存放的也是“问题对应的答案”匹配就不再只是语义上的碰运气而变成了结构上的对齐。你不再祈祷“正确段落刚好浮到最前面”而是在把一个问题直接匹配到它对应的答案。Iternal Technologies 的预处理层 Blockify就是按照这个思路实现的。它把这种结构称为 IdeaBlock一个问题、一个经过验证的答案再加上保密级别、版本状态、来源等类型化治理字段并且这些信息都挂在同一个对象上。这正好贴合了用户使用 RAG 系统的真实方式他们不是输入一段文档他们是在提问。关键洞察在于当你 embedding 的是一个问答包而不是一段文本窗口时向量所代表的就是一个原子级事实而不是“刚好包含这个事实的一段叙述”。这会直接影响向量空间里的几何分布。在 Blockify 针对 17 份文档、298 页内容做的内部 benchmark 中query 到最佳匹配 block 的平均 cosine distanceIdeaBlock 是 0.1585而朴素 chunk 是 0.3624。这意味着检索距离降低了 2.29 倍。最反直觉的是数据更少效果更好很多人会本能地以为语料库缩小以后检索效果一定会变差。但语义蒸馏带来的结果恰好相反。在 Blockify 的内部 benchmark 中原始文档一开始生成了 2,042 个 raw IdeaBlocks。经过 3 到 5 轮、相似度阈值为 80% 到 85% 的迭代去重之后2,042 个 block 被压缩成 1,200 个 canonical IdeaBlocks 总词数从 88,877 降到 44,537 蒸馏后的数据集在向量准确率上反而比未蒸馏版本高出 13.55%。原因并不复杂。重复内容不是增强信号很多时候反而是在制造噪音。同一段话如果有十五个近似副本就会在 embedding 空间的同一片区域里制造十五个互相竞争的向量。检索时概率质量被这些副本分散真正应该命中的 canonical version分数反而被拉低。把它们合并成一个规范 block信号才会变锋利。你的向量索引不是硬盘不是越塞越好。它是一张检索表面而冗余会磨钝这张表面。整条流水线从文档到 IdeaBlocks真正的修复发生在内容进入向量数据库之前。也就是说需要在 parser 和 vector store 之间增加一条预处理流水线。Blockify 的处理过程分为七个阶段。每个阶段都有明确的输入和输出因此一旦出错问题可以被定位也可以被复现。Stage 1范围定义在任何文档被解析之前先定义索引层级Organization Business Unit Product Persona。这一步决定了后续 block 会被打到哪个访问层级上也会影响之后的去重方式。Stage 2内容摄取文档可以是 DOCX、PDF、PPT、PNG/JPG、Markdown 或 HTML。解析器会把内容交给 LLM 层处理。这里可以运行 fine-tuned LLaMA 3、QWEN 3.5、Gemma4以及其他定制 foundation model 变体将原始 chunk 转成 draft IdeaBlocks一个关键问题、一个两到三句话的验证答案以及类型化治理字段。输入大小通常限制在 1,000 到 4,000 个字符之间实际使用中2,000 字符左右是比较合适的中间值。Stage 3切分与抽取这里的切分不是简单按 token 数硬切而是 context-aware splitting。LLM 会把 chunk 转成 draft IdeaBlocks。也就是说每个输出单元是一个问答对而不是一块没有边界的文本窗口。Stage 4语义去重这一阶段是清理检索表面的关键。系统会按照 80% 到 85% 的 cosine similarity 阈值把 block 聚类并进行 3 到 5 轮迭代处理。近重复内容会通过第二个专门调优过的 LLM 合并为单个 canonical block。整条流水线针对 GPU 做了优化不过也可以通过 Intel Xeon 优化版本使用额外 CPU 资源运行。最终得到的数据集里每一个向量都代表一个不同的 claim而不是十五个近似副本里的一份拷贝。Stage 5自动打标签每个 block 都会获得类型化 metadata包括 clearance levelPUBLIC、INTERNAL、CONFIDENTIAL、SECRET、version stateCurrent、Deprecated、Draft、Approved、product line、export control flags以及 data privacy labels。这些标签由流水线自动应用而不是依赖文档作者手动维护。Stage 6人工验证一个产品语料库如果有 2,000 到 3,000 个 IdeaBlocks可以分配给 5 到 10 位 SME。每个人每个季度只需要花 1 到 2 小时处理自己负责的部分。他们验证的不是一整份原始文档而是带有 source citation 的结构化 claim。这件事的工作量会小很多也更容易保证质量。Stage 7导出经过验证的 block 可以通过 API 推送到向量数据库也可以导出为 JSON-L。支持的向量存储包括 Azure AI Search、Pinecone、Milvus、Vertex Matching Engine。支持的 embedding 模型包括 OpenAI、Bedrock、Mistral、Jina以及开源模型。重点在于无论你使用哪种 parser、哪种 vector store、哪种 embedding 模型这条流水线都坐在文档解析和向量化之间。它不抢检索层的工作。它只是让进入检索层的数据先变得更值得信任。应用层会发生什么变化你 embedding 的知识单元决定了应用层能做什么。首先query construction 会变简单。用户的问题本来就是 question。当索引里存的是问题的答案时匹配关系就从“概率相似”变成了“结构对齐”。你不再需要不停调 similarity threshold去弥补 query shape 和 document shape 之间天然不一致的问题。其次治理会下沉到数据层。基于角色的访问控制、版本状态、保密级别不再是外挂在 orchestrator 上的一堆判断而是每个 block 自带的类型字段。一个 sales engineer 和一个 legal reviewer 查询同一个索引时拿到的数据集不同不是因为检索层临时过滤了一下而是因为 block 本身就带着访问边界。再次更新会从单条记录开始传播。当某个 spec 发生变化时你只需要更新一个 IdeaBlock。所有查询这个 block 的应用在下一次请求时都会拿到修正后的答案。而在朴素 chunking 里同一个事实可能藏在几十段近重复 passage 中散落在多份文档里。要更新它就意味着你必须先找到所有副本。在企业规模下这件事几乎不可操作。所以这种架构并不会改变你如何发起查询。它真正改变的是你能对返回答案信任到什么程度。底层原则错的不是检索是知识单元chunk 原本只是一个解析便利后来却被默认成了检索假设。可它没有观点边界没有版本上下文也没有访问状态。于是过去几年里RAG 技术栈一直在为这个错位打补丁reranker、hybrid search、threshold tuning、prompt engineering。这些方法当然有价值。但它们全都在下游。真正的问题早就发生在数据进入向量库之前。所以解决方案不是一个更强的检索算法而是一个更好的知识单元。地址https://github.com/iternal-technologies-partners/blockify-agentic-data-optimization最后精通 React 面试从零到中高级(针对面试回答)CSS终极指南Vue 设计模式实战指南20个前端开发者必备的响应式布局深入React:从基础到最佳实践完整攻略python 技巧精讲React Hook 深入浅出CSS技巧与案例详解vue2与vue3技巧合集