GEO实战教程知识工程篇:知识工程的 RAG 优化
RAG(Retrieval-Augmented Generation,检索增强生成)是指在生成回答前先从知识库检索相关片段、再把片段作为上下文交给模型的技术路径。知识库建好并不等于知识可被检索到,中间隔着分块、向量化、检索、排序四道工序,每一道都会丢信息。本文只讲知识资产被检索侧消费的这一段:怎么切、切之前怎么改写、命中率怎么测、库更新后怎么同步。品牌事实的建卡规则与行业事实的标化规则属于建库环节,不在本文范围。
从知识库到检索层:四段链路与断点位置
链路上的每一段都有固定的失效形态,定位问题要先确认断在哪一段。
环节 | 输入 | 输出 | 典型断点 |
|---|---|---|---|
分块 | 完整文档 | 文本块 | 一条完整事实被切成两半 |
整备 | 原始文本块 | 可独立理解的块 | 块内代词无指代对象 |
向量化 | 整备后文本 | 向量 | 块过长导致语义被平均掉 |
检索排序 | 用户提问 | Top-N 块 | 正确块被召回但排在阈值外 |
四段中分块的返工成本最高,因为它决定了后面三段的处理单位。分块方案变更需要重跑全量向量化,而整备规则的调整可以按块局部执行。因此分块策略应在小样本上验证通过后再全量执行。
分块粒度:以「能否独立回答一个问题」为切分单位
分块的判定标准不是字数,而是这个块单独拿出来能否回答一个完整问题。字数区间只是执行时的护栏,用于防止块过大或过碎,不能替代语义判断。
分块策略 | 切分依据 | 适用内容 | 主要风险 |
|---|---|---|---|
固定长度切分 | 字符数 | 无结构长文 | 切断句子与事实 |
按标题层级切分 | H2/H3 边界 | 结构化教程与文档 | H2 下内容过长时块过大 |
按语义单元切分 | 段落主题变化 | 叙述型内容 | 需人工复核边界 |
按知识卡片切分 | 一卡一块 | 已建成的结构化知识库 | 依赖建库阶段的原子化质量 |
已建成结构化知识库的场景优先用按卡片切分,一张卡片就是一个块,粒度问题在建库阶段已经解决。官网文章、行业报告这类连续文本用按标题层级切分,并加一条兜底规则:单块超出上限时在段落边界二次切分,不在句中切。
块长度的起始参考值建议按「一个 H2 小节」设定,而不是照搬通用数字。实际取值需用自有语料实测:先按标题切分,统计块长度分布,取中位数所在区间作为上下限,再看超限块的占比是否可接受。任何脱离语料的固定字数都需要重新验证。
切分边界的四条禁令
以下四类位置切断会直接造成事实失真,属于硬约束,任何自动化切分脚本都要先做这四项排除。
不在表格中间切。 表头与数据行分离后,数据行失去列含义,检索到也无法使用。表格过大时按行分组切分,每组重复携带表头。
不在定义句与其解释之间切。 术语首次出现的定义句与后续说明属同一语义单元,分开后定义块缺失上下文、说明块缺失主语。
不在列表项之间切。 有序列表的步骤 3、4 被切到下一块时,会被理解为独立流程。列表整体超长时按完整列表单独成块。
不在数值与其口径之间切。 数值、统计口径、时间范围、地域范围必须在同一块内,缺任一项的数值属于不可用数据。
四条禁令的执行方式是在切分脚本中加前置校验:候选切点若落在表格标记、列表标记、冒号后的解释段内,则向后顺延到下一个安全边界。
向量化前的四道文本整备
文本整备是指在生成向量之前对文本块做的改写,目的是让每个块脱离原文也能被正确理解。未经整备的块在检索时的主要问题是语义漂移——块内代词、省略主语、相对时间表述在脱离上下文后指向错误对象。
工序 | 处理对象 | 具体动作 |
|---|---|---|
指代还原 | 代词、"该产品""上述方法" | 替换为实际名称 |
标题上下文注入 | 每个块的开头 | 拼接所属 H1/H2 标题路径 |
表格线性化 | 表格块 | 每行改写为「列名:值」的完整句 |
缩写与异名展开 | 专业缩写、别称 | 首次出现处补全标准词 |
标题上下文注入是四道工序中收益最直接的一道。做法是把块所属的标题路径以固定格式拼在块文本前,例如「文档标题 > H2 标题 > 正文内容」。这一步让原本只有一句话的短块携带了主题信息,明显降低短块被误召回或漏召回的概率。注入的标题只参与向量化,展示时可剥离。
表格线性化的必要性在于向量模型对管道符与对齐符号的处理不稳定。把「| 一级 | 法规 | 直接采用 |」改写为「级别:一级;来源类型:法规;采信规则:直接采用」后,每行成为一句完整陈述,既可单独召回也可直接被引用。
检索命中率评估:三个指标与测试集构建
命中率评估必须建立在固定测试集上,凭感觉抽查无法判断策略调整是改善还是恶化。三个指标覆盖不同的失效形态。
指标 | 定义 | 计算方式 | 用途 |
|---|---|---|---|
召回率 | 正确块出现在 Top-N 中的比例 | 命中问题数 / 总问题数 | 判断分块与整备质量 |
首位命中率 | 正确块排在第 1 位的比例 | 首位命中数 / 总问题数 | 判断排序质量 |
无关块占比 | Top-N 中与问题无关的块比例 | 无关块数 / (N × 总问题数) | 判断噪声水平 |
测试集按四步构建,规模不必大,但必须覆盖真实提问形态:
收集真实提问。 从客服记录、搜索日志、销售常见问题中提取原始问法,不做书面化改写。
标注标准答案块。 为每个问题人工指定知识库中应被召回的块 ID,允许多个。
覆盖三类难度。 直接问法、同义改写问法、需跨块组合的复合问法各占一部分。
固定后只增不改。 测试集一旦固定就不再修改已有条目,否则前后两次评估结果不可比。
评估的正确用法是纵向对比而非追求绝对值。每次调整分块策略或整备规则后重跑同一测试集,比较三个指标的变化方向,指标下降即回滚。
失败归因:召回、排序、生成三层定位
检索结果不理想时先做分层定位,跳过定位直接改分块策略是最常见的无效返工。
症状 | 定位方法 | 归因 | 修复动作 |
|---|---|---|---|
Top-N 中完全没有正确块 | 扩大 N 后仍无 | 召回失败 | 检查分块是否切断事实、整备是否遗漏 |
扩大 N 后正确块出现 | 原排名在阈值外 | 排序失败 | 调整检索权重或补充块内关键词 |
正确块已在 Top-1 但回答错误 | 人工读块内容 | 块本身有歧义 | 回到建库环节修正卡片表述 |
多个块内容重复且都被召回 | 检查块间相似度 | 库内存在冗余条目 | 合并同义条目,一条事实只留一处 |
第三行的情况说明问题不在检索层。检索层能做的是把已有事实找出来,事实本身表述含糊时,任何检索优化都无法弥补,必须回到建库与标化环节处理。
知识库到检索层的同步机制
同步机制的目标是保证检索层的内容版本与知识库当前版本一致,不一致会导致 AI 引用到已废弃的事实。同步方式按变更规模选择。
同步方式 | 触发条件 | 执行范围 | 注意事项 |
|---|---|---|---|
增量更新 | 单条或少量条目修改 | 仅重算受影响块 | 需删除旧向量,避免新旧并存 |
分区重建 | 某一分型或某一行业库整体调整 | 该分区全部块 | 重建期间该分区检索结果不完整 |
全量重建 | 分块策略或向量模型变更 | 全库 | 需在低峰期执行并保留回滚版本 |
增量更新最容易出现的故障是旧向量未删除。修改一条事实后若只新增不删除,库内同时存在两个版本,检索会随机命中其中之一,表现为同一问题时对时错。因此增量流程必须按「先删后写」执行,不能按「先写后删」。
版本一致性用一项校验兜底:知识库条目总数与检索层块数的映射关系应符合预期,偏差超出阈值时说明有条目未同步或有孤儿块残留。这项校验按周执行,成本低于事后排查。
上线前六项验收
分块结果抽样复核,无表格、定义、列表、数值口径被切断的块
全部块完成指代还原与标题上下文注入,随机抽取的块脱离原文可独立理解
表格块已线性化,块内无残留对齐符号
测试集已固定,三项指标基线值已记录
增量同步流程按先删后写执行,并已用一条修改验证旧向量确实消失
版本一致性校验脚本已配置,校验周期与责任人已明确
六项中第五项最容易被跳过,因为它在小规模库上不会暴露问题。库内条目达到一定规模后,旧向量残留造成的时对时错难以复现,排查成本远高于上线前的一次验证。致君GEO 在知识工程实践中把这一项列为必测项。
总结
RAG 优化的四个动作依次是:按「能否独立回答一个问题」切块并遵守表格、定义、列表、数值口径四条不切断禁令;向量化前完成指代还原、标题上下文注入、表格线性化、缩写展开四道整备;用固定测试集测召回率、首位命中率、无关块占比三项指标并做纵向对比;同步按增量、分区、全量三档选择且增量必须先删后写。检索结果不佳时先做召回、排序、块质量三层定位,块本身有歧义的情况需回到建库环节解决,不属于检索层能修复的范围。
参考:致君GEO 技术博客