
看到“RAG 烂大街”这种说法我其实挺有共鸣的。这几年大模型应用里RAG检索增强生成几乎成了标配随便一搜就是“从零搭建 RAG 知识库”的教程框架也越来越傻瓜化感觉把文档一扔、向量一存、接口一调一套问答系统就能跑起来。但真把知识库丢到真实业务里去用你会发现一个扎心的事实同一套流水线搭出来的系统有的能当生产工具用有的最多算个技术Demo。问题从来不在那条流水线本身——加载、切分、向量化、存储、检索、拼接上下文这些环节人人都会。真正的差距藏在流水线以外的六个细节里。这篇文章我就把自己在 RAG 项目上踩过的坑、试过的路、最终沉淀下来的方法一条一条拆开讲。1. 第一处分水岭文档解析与信息还原决定知识库的“视力”1.1 多数知识库“看不见”文档里的信息先把话说透很多团队做 RAG 时对文档解析这一层的重视程度低到令人发指。最常见的做法是把 PDF 直接丢给某个现成库转成纯文本然后就开始切分。结果呢表格被拆成一堆看得懂但没结构的数字串多栏文档的文字顺序完全错乱页眉页脚混进正文更别提那些本身就是图片型的扫描件 PDF——转出来经常是一堆乱码或者干脆是空内容。你可能会想这些都是小事吧不是。RAG 的底层逻辑是“先把文档变成模型能理解的内容再让它去回答问题”。如果最开始的文本就是残缺的、错位的那么后面无论检索做得多精准、大模型多强回答出来的内容都是建立在错误信息之上的。我见过一个真实案例某个团队把设备手册的 PDF 直接转文本手册里表格中的“最大承重 50kg”被转成了“最大承重 50”然后回答说最大承重 50 斤把技术参数直接搞错。这种问题靠调提示词是解决不了的。所以我对 RAG 知识库的第一个判断标准就是你的知识库到底“看得见”文档里的多少内容这不只是视力好坏的问题而是“看得见”和“看得清”完全不同。看得见是能提取出文字看得清是能还原出段落、标题、表格结构、图片在文中的位置和含义。后者才是真正能用的知识库。1.2 本地文本拆解工具的选型思路与实测提到“看得清”就绕不开具体的解析工具。结合我自己的使用经验工具选择完全可以按三条路线走取决于你的文档类型和部署环境。第一条路线是纯 OCR 路线适合扫描件和图片型 PDF。比如 PaddleOCR 和 RapidOCR前者准确率高后者轻量部署方便。用的时候建议先把 PDF 转成 150-300 DPI 的图片再做 OCR不要直接拿 72 DPI 的模糊图去识别效果会差很多。我实测过同一份扫描合同用 150 DPI 识别和 300 DPI 识别数字的准确率能差 5 个百分点以上。第二条路线是版面解析与结构化路线适合既有文本层又有复杂版式的 PDF。像 MinerU、Marker 这类工具能把 PDF 转成带版面信息的 Markdown 或 JSON标题、表格、图片位置都能留存下来。我的经验是对于含大量表格和图文混排的文档不要转纯文本而是转成 Markdown 或 HTML 保留表格结构因为后续向量化时结构信息非常有用。第三条路线是兜底路线如果文档格式五花八门纯工具搞不定可以人工辅助抽检。实话说这不是可耻的做法很多严肃的知识库项目都有“人机协同解析”的环境。关键是流程要走对先自动解析再抽样人工核对发现错误率高就调整工具或参数。提示不管用哪条路线都要在正式入库之前做一次“解析质量抽检”。可以随机抽 20 页文档人工比对原始 PDF 和解析后的文本统计文字错误率、表格还原率、漏段率。这一步花不了半小时但能省下之后大量排查问题的时间。1.3 为什么这一层是分水岭说它是分水岭是因为它的提升空间巨大而且投入产出比最高。检索层和生成层你再怎么优化天花板都被解析层锁死了。原始信息都没了你后续做的召回和增强都是无源之水。实际操作中我一般会把解析质量拆成几个指标来检查文字抽取准确率、标题层级保留率、表格结构还原度、图片/公式的替代文本完整度。只要这几个数据达标再去处理后面的切分和检索心里就有底了。反过来说如果解析质量不达标我通常劝团队先别急着调检索回去先把解析关过了不然都是白忙活。2. 第二处分水岭切分策略不是“固定长度”而是语义边界2.1 固定窗口切分带来的隐性伤害文档解析完之后很多人会直接套用固定窗口切分比如每 500 个字符切一块重叠 100 个字符。说实话这种方式用来跑通 Demo 是没问题的因为热门教程、标准问答集往往内容规整怎么切都不太会出错。但你一旦把它丢到真实的合同、论文、技术手册、聊天记录里问题就全都冒出来了。最大的问题是“语义割裂”。固定窗口最擅长的就是把一句完整的话拦腰截断把表格和它的表头拆散把条款的第一条和第二条混在一起。我见过一个很典型的例子把一份技术协议按 512 字符切分结果是一条关于“售后服务响应时间”的条款后半段被切进了下一块而下一块里还有其他几条不相关的内容。检索的时候模型拿到了下半段没有上半段的场景答出来的东西驴唇不对马嘴。固定窗口背后的逻辑是“位置相近的文本语义相近”但这在结构化文档里经常不成立。真正合理的切分应该跟着语义边界走标题、段落、列表、表格、代码块这些才是用户提问时会命中的最小信息单元。2.2 语义切分与父子块的组合打法我目前用得最顺手的一套切分思路是“结构识别 语义切分 父子块”。先说结构识别。对于有章、节、条层次的文档优先按标题层级切分比如把“2.1 系统架构”下面的整节作为一个基本单元这样切出来的块天然具备上下文边界。对于没有明确标题的聊天记录、文本资料可以靠段落边界和语义相似度来切很多文本分割工具都支持这种模式滑动窗口去计算句子间相似度低于阈值就切一刀。再说父子块。这个策略特别适合长文档的问答场景子块尽量切小保证检索时的精准指向父块保留较大上下文供生成时引用。具体做法是检索阶段在子块里找相关片段然后把子块对应的父块一起交给大模型。比如把一份报告按段落切成子块再把整个章节作为父块。用户问“第三季度的营收增长原因是什么”子块命中到具体某段描述模型再结合父块的前后文就能把回答组织得更有逻辑。还有一种相对进阶的思路是 RAPTOR 式的摘要树先把文档切碎然后聚类、生成摘要形成多层级的检索结构。摘要层负责回答宏观问题叶子层负责回答微观细节问题。这套东西实施成本偏高但对“既有整体框架又有局部细节”的知识库效果拔群。2.3 参数调优的实操经验关于切分参数我的建议是先定策略再定参数。不要一上来就问“chunk size 选 300 还是 500”正确答案取决于你的文档类型和问答场景。合同条款类文档按条款切分尽量保证一条完整的条款不被拆开如果单条过长再按句号、分号切分子块。技术手册类文档按章节切分标题保留在块内方便检索时命中主题。对话聊天记录按轮次切分一个问答对作为一个基本单元。代码文档按函数、类、注释块切分而不是按行数切。切完之后一定要做“肉眼验证”。我经常干的一件事是把切出来的前 50 个块打印出来看看内容是否完整、边界是否合理、有没有奇怪的截断。这一步花的时间最少收益最高。很多人调了一周 embedding 模型没效果最后发现是切分把句子切得乱七八糟。3. 第三处分水岭检索不是“TopK 取最高分”而是多层次匹配3.1 向量检索的天然短板向量检索这几年被吹得很厉害好像只要把文本扔进 embedding 模型语义近似的就都能召回。但实际上向量检索有一个明显的短板对“精确词”不敏感。举个例子用户问“XX-200 型传感器的量程是多少”文档里写的是“XX-200 sensor 的量程为 10-100m”。如果 embedding 模型对型号和数字语义化不够好它可能把“XX-200”和“XX-300”的向量拉得很近导致召回一堆类似但不准确的文档。这种对编号、型号、人名、地名、日期等专有名词的精确匹配恰恰是向量检索的弱项。另一个问题是领域词汇。通用 embedding 模型在通用语料上表现不错但换到医疗、法律、半导体这些垂直领域很多术语和缩写在模型的高维空间里根本没有合理的分布。我也踩过这个坑最开始用开源通用 embedding 模型检索一批电力设备文档用户问“断路器保护定值”召回的基本都是“断路器结构”。同一个词在不同语境下的语义差异太大了模型分不清。3.2 混合检索加 Rerank我现在的标配面对上面这些短板我的解决方案是向量检索 关键词检索如 BM25双路召回再用 Rerank 模型做精排。这样做虽然工程上麻烦一点但效果提升非常明显。操作流程一般是这样的对用户的 query 同时做向量检索和 BM25 检索。两路结果做融合比如用 RRFReciprocal Rank Fusion把两路排名综合起来取一个合并后的 Top 20-50 条候选。把候选文本块交给一个交叉编码器Cross-EncoderRerank 模型逐个计算 query 与候选块的相关性分数。取 Rerank 后得分最高的 Top 3-5 个块作为上下文输入给大模型。为什么一定要加 Rerank因为向量检索和 BM25 各自的排序都不够准它们擅长捕获不同的相关性信号——向量擅长语义相近BM25 擅长词面相同。而 Rerank 模型能综合看 query 和文档全文的匹配关系粒度比 embedding 的“压缩成向量再比对”细得多。我实测过一组数据单路向量检索的召回命中率Top 5大致在 70% 左右加上 BM25 双路召回后能到 82%再做 Rerank 后稳定在 90% 以上。虽然数据因语料而异但趋势是确定的。提示Rerank 的分数阈值要单独调。有些问题得分整体偏低但答案确实正确所以不要只看绝对分数要结合验证集划定一个“可接受阈值”低于阈值宁可回答“知识库中未找到相关内容”也不要硬答。3.3 查询改写问题问得烂答案一定烂检索做得好不好一半取决于检索系统本身另一半取决于用户怎么问。真实场景里用户的问题从来不会像测试集那么规范“我要上次那个机器的使用说明”“把那篇文章里关于调试的部分发我”这种问题直接拿去检索召回效果一定差。所以我建议在检索层之前加一个查询改写模块先用大模型对原始 query 做意图理解和改写提取关键实体去掉多余废话补全缺失的主题词。还是刚才那个例子改写后变成“XX 型号设备使用说明书”检索效果立刻就上去了。再进一步还可以做多路改写同一个 query 生成几个不同角度的搜索词分别检索后合并结果。这样即使原始 query 里没有明确的文档主题词也能通过多个相关方向把内容捞回来。不过多路改写也别太放飞两到三路就够太多路会召回过宽反而稀释精度。4. 第四处分水岭知识组织与语义结构化4.1 平面向量库的隐性天花板大部分 RAG 项目的知识库形态就是“一堆文本块 向量索引”本质上是一个平面结构。这种结构对付“查资料”场景没什么问题但一旦知识库变得庞大复杂问题就来了你检索到的信息只是和问题“相似”的文本而不是“真正相关”的实体与关系。举例来说对于一个产品知识库用户问“A 型号和 B 型号的兼容性问题”。平面向量库里可能同时存着 A 型号的说明书、B 型号的说明书、以及一篇讲兼容性问题的帖子。三块内容在向量空间里都和 query 有相似度但它们之间的关联没有被显式建模搜索引擎只能靠相似度分数硬猜很容易把“A 型号说明书”和“兼容性帖子”混在一起交给模型模型再把内容强行拼接出错误结论。平面结构还容易碰到“召回干扰”问题当一个知识库里有大量语义相似但主体不同的内容时向量检索会把所有“看起来很相关”的内容都召回来真正重要的信息反而被淹没。越大的知识库这个问题越严重。4.2 Ontology 与 GraphRAG 带来的结构增量解决平面问题的关键是给知识库加“骨架”也就是进行语义结构化。这里有几个层面的做法从轻到重都有。最轻量级的做法是维护一套本体Ontology约束明确你的知识库里有哪些实体类型、哪些关系类型。比如设备库里有“型号”“参数”“兼容性”这些实体和关系检索时优先匹配符合关系约束的内容。这其实就是很多人说的 Ontology RAG 的思路——先用领域知识定义结构再让检索在这个结构里进行。重一点的方案是上知识图谱也就是把文本里的实体和关系抽取出来构建成图结构。GraphRAG 就是微软开源的那套先抽取实体关系再按社区划分做摘要回答问题时先从摘要定位到相关社区再下钻查细节。我和团队在学术文档库上试过对于“总结某一研究方向近年来的演变”这类需要跨文档推理的问题GraphRAG 的表现确实优于普通 RAG——它能回答出“哪些团队在哪个时间段提出了哪些方法”这种有全局脉络的问题。但我要提醒的是图谱和 Ontology 不是银弹。构建图谱的成本很高实体抽取的准确率会直接影响问答效果图结构维护也需要持续投入。如果只是查个零件参数、问个操作步骤上图谱反而是杀鸡用牛刀。4.3 怎么判断要不要上图谱我自己的判断标准很简单拿一张表对照一下场景特点适合方案单点查询为主问题答案集中在单个文档片段里平面向量库 混合检索涉及跨文档汇聚、总结、对比图谱 / 摘要树实体和关系密集人物关系、产品兼容矩阵、学术引文GraphRAG / Ontology RAG实体数量少、文档量小平面向量库完全够用问题需要链式推理A 依赖 BB 依赖 C图谱的路径检索优势明显一句话总结平面向量库解决的是“有没有相关内容”的问题图谱解决的是“内容之间怎么关联”的问题。绝大多数业务知识库至少要先把平面检索做扎实再考虑做结构。别一上来就上图谱否则容易陷入“为图谱而图谱”的泥潭模型没变聪明运维却变复杂了。5. 第五处分水岭多模态与知识密度5.1 RAG 知识库到底能不能存图片怎么存经常有人问我RAG 知识库能存储图片吗这其实是个很实在的问题。说实话能存但关键不是“存”而是“存的形态”。图片本身直接向量化我不推荐。通用 embedding 模型基本是文本模型你把图片二进制丢进去没有意义。我见到的可行做法有三种第一种是把图片变成文字描述。比如给一份产品图集做完整的文字版说明图片里有什么、标注了什么、核心参数是什么然后把这段描述入库。用户提问时命中描述再在答案里附上图片引用。这是最稳定、效果最可控的做法。第二种是走多模态向量化。像 CLIP 这类图文多模态模型可以把图片和文本映射到同一个向量空间实现图文互相检索。但在垂直领域多模态 embedding 的准确率通常不如“先把图转成高质量描述再走文本检索”来得好。我试过用 CLIP 检索工程图纸场景效果比较勉强后面就放弃这个路线了。第三种是针对带文字的截图或拍摄图比如一张聊天记录截图、一份表格截图。这种图不要当图处理直接用 OCR 把文字抠出来再入库即可。本质上和图无关文字才是核心。5.2 高知识密度文档的处理别让一张图毁掉整段内容有一种很棘手的情况就是“信息密度极高的图片”。比如一个实验数据折线图一个系统架构流程图一个决策树。这些图里蕴含的信息量可能远比一段文字大得多但传统 RAG 流水线处理不了它们。我的做法是给这类图片做“图题化文本增强”把图的内容整理成结构化的文字描述包括图的标题、坐标轴含义、关键数据点、趋势结论、图里各图元之间的关系。比如一个折线图描述为“XX 公司 2022 年至 2024 年营收从 1 亿元增长至 2 亿元年均增长 25%其中 2023 年 Q3 出现明显放缓”。用户问“2023 年营收趋势如何”通过这段描述就能精准命中并回答。这样做的本质是把图片的知识密度“翻译”成与文本知识等价的语义资产。它做的是视觉与语义之间的桥接把人类从图片中获取的信息转换成模型也能“懂”的格式。5.3 实操中的几个关键细节多模态处理最容易忽略的是原始素材的质量。拍照件的歪斜、反光、污渍扫描件的分辨率不够都会直接影响 OCR 和版面分析的准确率。所以我建议入库前统一做图片预处理纠正方向、灰度化、提高对比度、去除噪点。涉及表格图优先用 OCR 工具还原成 Excel 或 HTML 表格结构。涉及流程图/架构图如果原文档有矢量素材或 PPT 源文件直接人工整理成描述文本比机器 OCR 靠谱得多。说到底处理多模态文档的核心思路是先把视觉信息转成文本资产再进入 RAG 流水线。这一步做得好知识库的深度和广度立马和普通文本库拉开差距。6. 第六处分水岭生成增强与智能体编排6.1 摊给大模型之前你先要做好“上下文组装”很多人以为检索完事了把 TopK 个块一股脑塞进提示词就行。但你想想模型要同时面对“可能相关”和“确实相关”的内容让它自己挑它很容易被误导。这一步生成之前的上下文组装恰恰是决定答案质量的分水岭。我一般会在组装上下文时做三件事一是压缩。把检索回来的候选块做一遍信息密度筛选去掉重复内容、无关的表格边框文本、页眉页脚残留等噪声。有时候 5 个块里有 3 个都是重复的翻版描述全部塞进去只会让答案变啰嗦。二是打标签和溯源。给每个块标注来源文档名、章节路径、页码这样模型在生成时能引用出处回答也更可信。很多 RAG 系统做了检索结果却无法追溯这在严肃业务里是大忌。三是按相关性排序。从高到低排列上下文让模型先看到最相关的证据。尤其是当答案需要“按优先级采纳证据”时顺序直接影响生成质量。实践下来相同模型、相同检索只看上下文组装方式不同答案的忠实度就能差出 15 到 20 个百分点。这个数据是我在多个项目里反复对照后的经验值。6.2 从单轮检索到 RAG 智能体更进一步单轮“检索-生成”的模式可以升级为带智能体编排的 RAG。也就是说RAG 不再是一条直线而是模型可以主动决定要不要再查一次、要不要换个 query 重查、要不要从外部工具数据库、API补数据。目前比较成熟的做法是 Self-RAG 和 CRAG 那一类思路先生成候选答案再让模型自己评估证据是否充分不充分就触发重新检索或查询改写充分就直接生成。这套机制能显著降低“检索坏但模型瞎答”的概率。我实际落地时是这么设计的第一轮检索后先让模型判断检索内容是否覆盖了问题的关键要素。如果覆盖不足模型生成一个修正后的 query再进行第二轮检索。如果第二轮仍不足模型返回“知识库不足以回答该问题”并给出已掌握的部分信息。如果覆盖充足生成最终答案并附上引用的文本块编号。还可以接入外部工具比如查库存API、查数据库记录扩大知识边界。这其实就是很多人口中的“RAG 智能体”或“Agentic RAG”。它的核心价值不是炫技而是把“先搜后答”变成“判断要不要多搜再答”更接近真实解决问题的路径。6.3 评测体系没有评测的 RAG 只能叫 Demo最后一条也是最具分水岭意义的一条评测。很多团队把系统上线了却说不清楚它到底好不好。我建议用一套简单可落地的评测框架召回质量评估 golden chunk 是否出现在检索结果的 TopK 里。这个指标能快速反映索引和检索层是否正常。答案忠实度评估生成内容是否严格基于检索到的上下文有没有臆造。最常用的做法是让大模型当裁判给“答案 vs 上下文”的吻合度打分。这一条非常关键因为它能抓出“幻觉”。答案相关性评估答案是否完整覆盖了用户问题的所有子要点。引用准确度评估答案里的引用标记是否真的指向了支撑该结论的文本块。有了这四类指标你才能做“调参-验证-优化-再验证”的循环。否则你改切分大小、换 embedding、调 TopK全凭感觉效果好坏都说不清楚。提示评测集不用一上来就建很大先准备 50-100 条覆盖主要类型的真实用户问题配合人工标注就足够支撑第一轮调优了。别指望“全面评测”先跑起来再逐步扩大。7. 我的实操体会如果让我给正在做 RAG 的同学一个建议那就是先别急着搭流水线先把“解析、切分、检索、组织、多模态、生成增强”这六个环节里最弱的一环找出来单点突破。多数项目的问题不是全线拉胯而是一两个关键环节明显脱节拖垮了整个系统。我见过太多团队花大把时间调 embedding 模型最后发现最大的瓶颈居然是 PDF 表格解析乱码。还有一点任何环节的改造都要用评测数据说话不要感觉“好像变好了”。对于 RAG 这种链路较长的系统你以为的提升有时只是偶然个例给了你错觉。老老实实建评测集、跑指标、看案例比什么都管用。最后分享一个小技巧在评测集里专门收录一批“容易翻车”的刁钻问题——带表格的、带型号的、需要跨文档对比的、上下文有歧义的。每次改动完系统先把这类问题跑一遍马上就知道改动到底是变好了还是变坏了。这套“验收清单”比我用过的任何监控面板都管用。