企业级 RAG 系统为什么不能只做“文档向量化”:从检索、重排到答案可信度优化

1. 文章背景:为什么这个主题重要

很多团队第一次做知识库问答系统时,通常会采用一条非常直接的路线:

  • 把 PDF、Word、网页、Markdown 等文档解析出来;
  • 按固定长度切成 chunk;
  • 调用 Embedding 模型生成向量;
  • 存入向量数据库;
  • 用户提问时做相似度检索;
  • 把 Top-k 文档片段拼进 Prompt;
  • 最后让大模型生成答案。

这个流程可以很快做出一个 Demo,也能在一些简单问题上表现不错。但一旦进入企业级场景,就会出现大量问题:

  • 用户明明问的是制度细节,但系统召回的是泛泛介绍;
  • 向量相似度最高的内容,不一定真正能回答问题;
  • 文档版本很多,模型引用了过期制度;
  • 检索结果里混入了用户没有权限查看的资料;
  • 大模型回答很流畅,但没有明确依据;
  • 答案看起来合理,实际和原文不一致;
  • Demo 阶段效果不错,上线后业务方不敢用。

这些问题的根源在于:企业级 RAG 系统不能只做“文档向量化”。

文档向量化只是 RAG 的第一步,它解决的是“如何把文本变成可检索的语义表示”。但企业真正需要的是一个完整的知识问答系统,目标不是“搜到相似文本”,而是“基于可信证据生成可靠答案”。

一个可落地的企业级 RAG 系统,至少要回答以下几个问题:

  • 文档如何解析,表格、图片、标题层级怎么处理?
  • chunk 如何切分,才能兼顾召回率和上下文完整性?
  • Embedding 模型怎么选,中文、英文、代码、表格是否都适配?
  • 只用向量检索够不够,是否需要 BM25、关键词和结构化检索?
  • 检索结果如何重排,如何把真正有用的证据放到前面?
  • 大模型回答时如何减少幻觉,如何强制基于证据?
  • 答案如何引用来源,如何让业务人员可追溯?
  • 系统如何评估,如何知道 RAG 是否真的有效?
  • 权限、安全、延迟、成本、可维护性如何处理?

所以,RAG 不是一个简单的“向量数据库项目”,而是一个涉及文档工程、检索系统、排序模型、Prompt 设计、大模型生成、权限控制和评估体系的综合工程。


2. 核心问题:实际开发中会遇到什么问题

2.1 只做向量检索,召回不稳定

Embedding 检索的优势是语义匹配。例如用户问“怎么申请报销”,文档里写的是“费用报销流程”,向量检索大概率能找出来。

但企业文档里有很多内容并不适合只靠语义相似度:

  • 合同条款编号:3.2.1、4.5.6;
  • 产品型号:A100、BMS-2024、X7-Pro;
  • 系统错误码:ERR_502、AUTH_403;
  • 人名、项目名、客户名;
  • 日期、金额、版本号;
  • 表格字段;
  • 制度条款;
  • API 参数名;
  • 日志关键词。

这些内容往往需要关键词检索、精确匹配或结构化查询。只依赖向量检索,会导致召回结果看起来相关,但缺少关键证据。

2.2 chunk 相似,不代表 chunk 有用

很多 RAG 系统直接使用向量检索 Top-k 结果。但相似度高,不等于能回答问题。

例如用户问:

离职员工未休年假如何折算?

系统可能召回以下片段:

召回内容 表面相关性 是否真正有用
年假申请流程 一般
员工离职流程 一般
薪资结算说明 有用
未休年假折算规则 最有用
考勤管理制度 部分有用

从语义上看,“年假申请流程”很相关,但真正回答问题的是“未休年假折算规则”。如果没有 Rerank,最有价值的证据可能排不到前面。

2.3 大模型不是天然的证据判断器

有些开发者会认为,只要把多个 chunk 都塞给大模型,大模型自然会判断哪个重要。实际情况并不稳定。

大模型可能出现以下问题:

  • 混合多个文档,生成一个原文中不存在的结论;
  • 忽略文档版本和生效时间;
  • 把不适用的规则套用到当前问题;
  • 在证据不足时仍然给出肯定回答;
  • 将检索到的背景知识误当成直接答案;
  • 对冲突信息不做提示。

所以企业级 RAG 不能把“证据选择”和“可信度判断”全部交给大模型。检索、重排、证据过滤和答案校验都需要独立设计。

2.4 没有评估体系,系统无法持续优化

很多 RAG 项目上线后,效果只能靠人工感觉判断:

  • 业务方说“这个回答不太对”;
  • 测试人员随机问几个问题;
  • 开发者手动调 Top-k、chunk size、Prompt;
  • 改完之后也不知道整体效果提升还是下降。

这会导致系统无法稳定迭代。

企业级 RAG 必须建立评估体系,至少要区分:

  • 检索是否召回正确文档;
  • 重排是否把正确证据排到前面;
  • 生成答案是否忠于原文;
  • 答案是否完整;
  • 答案是否可追溯;
  • 无答案问题是否能拒答;
  • 不同版本迭代是否真的提升。

没有评估,就没有工程化。


3. 基础概念:用工程视角解释关键概念

3.1 RAG 到底解决什么问题

RAG 的全称是 Retrieval-Augmented Generation,即检索增强生成。它的基本思想是:大模型回答问题前,先从外部知识库检索相关资料,再让模型基于资料回答。

它主要解决三个问题:

  • 大模型训练数据不包含企业私有知识;
  • 大模型知识可能过期;
  • 大模型容易幻觉,需要外部证据约束。

一个简单 RAG 流程如下:

用户问题
  ↓
问题改写 / 查询扩展
  ↓
检索知识库
  ↓
重排候选文档
  ↓
构造 Prompt
  ↓
大模型生成答案
  ↓
答案校验 / 引用来源
  ↓
返回用户

3.2 Embedding:把文本映射到向量空间

Embedding 模型的作用是把文本转成向量,使语义相近的文本在向量空间中距离更近。

例如:

  • “如何申请报销”
  • “费用报销流程是什么”
  • “员工怎么提交报销单”

这些句子表达不同,但语义接近,Embedding 后向量距离应该较近。

但 Embedding 不是万能的。它更擅长语义相似,不一定擅长精确匹配。因此,企业级 RAG 通常不应该只依赖 Embedding。

3.3 向量数据库:负责相似向量检索

向量数据库主要负责存储和检索向量。常见能力包括:

  • 向量写入;
  • Top-k 相似度检索;
  • 元数据过滤;
  • 分区索引;
  • 混合检索;
  • 增量更新;
  • 删除和重建索引。

在企业场景中,向量数据库不是只存向量,还要存元数据。例如:

元数据 作用
document_id 关联原始文档
chunk_id 定位文档片段
title 保留标题语义
source_url 支持引用来源
version 区分文档版本
department 支持部门隔离
permission 支持权限过滤
created_at 判断文档新旧
effective_date 判断制度是否生效

没有元数据,后续权限控制、版本管理、引用溯源都会非常困难。

3.4 Rerank:重新排序检索结果

Rerank 的作用是对初步召回的候选文档重新排序。

向量检索负责“尽可能多地找回相关内容”,Rerank 负责“判断哪些内容最能回答当前问题”。

常见流程是:

向量检索 Top 50
  ↓
BM25 检索 Top 50
  ↓
合并去重
  ↓
Rerank 模型打分
  ↓
取 Top 5 给大模型

Rerank 通常比单纯向量相似度更关注“问题和文档片段是否存在直接回答关系”。这对知识库问答质量提升非常明显。

3.5 答案可信度:不是回答得流畅,而是有依据

企业级 RAG 中,答案可信度至少包含四层含义:

  • 答案是否基于检索证据;
  • 答案是否与原文一致;
  • 答案是否引用了来源;
  • 证据不足时是否能拒答。

一个可信答案不一定要很长,但必须清楚说明依据。对于制度、合同、技术文档、运维手册等场景,答案最好附带来源文档、章节和片段引用。


4. 系统设计:如何搭建完整流程或架构

一个企业级 RAG 系统可以拆成六层:

层级 核心职责
文档处理层 文档解析、清洗、切分、元数据抽取
索引层 Embedding、关键词索引、向量索引、结构化索引
检索层 向量检索、BM25、混合检索、元数据过滤
排序层 Rerank、去重、上下文压缩
生成层 Prompt 构造、答案生成、引用来源
评估与运维层 效果评估、日志分析、权限控制、成本优化

4.1 文档处理层

文档处理是 RAG 的地基。很多系统效果差,不是因为模型差,而是文档处理太粗糙。

常见文档包括:

  • PDF;
  • Word;
  • Excel;
  • Markdown;
  • HTML;
  • Wiki;
  • 数据库记录;
  • API 文档;
  • 代码仓库;
  • 工单系统。

文档处理需要关注:

  • 标题层级是否保留;
  • 页眉页脚是否清理;
  • 表格是否结构化;
  • 图片和流程图是否需要 OCR;
  • 文档版本是否记录;
  • 文档来源是否可追溯;
  • 权限信息是否同步;
  • 是否存在重复文档。

4.2 检索层

检索层不建议只做向量检索,而应采用混合检索。

常见检索方式包括:

检索方式 优点 缺点 适用场景
向量检索 语义召回强 精确匹配弱 FAQ、制度问答、知识解释
BM25 关键词匹配强 语义泛化弱 错误码、条款、型号、字段
结构化查询 精确可靠 需要结构化数据 表格、权限、时间、状态
图谱检索 关系推理强 构建成本高 复杂实体关系

比较稳妥的企业方案是:向量检索 + BM25 + 元数据过滤 + Rerank

4.3 排序层

初步检索的目标是召回,排序层的目标是精准。

例如可以先召回 50 条候选结果,再通过 Rerank 模型选出最有价值的 5 条。

排序层还需要做:

  • 去重;
  • 合并相邻 chunk;
  • 过滤低分结果;
  • 优先选择新版本文档;
  • 优先选择用户有权限的文档;
  • 对冲突证据进行标记。

4.4 生成层

生成层的核心是让大模型基于证据回答,而不是自由发挥。

Prompt 中应该明确约束:

  • 只能根据给定资料回答;
  • 找不到答案时必须说明资料不足;
  • 不要编造制度、数字、日期;
  • 每个关键结论尽量标注引用来源;
  • 如果资料冲突,要提示冲突,而不是强行合并。

一个简单 Prompt 模板可以是:

你是企业知识库问答助手。请严格根据【参考资料】回答用户问题。

要求:
1. 只使用参考资料中的信息回答;
2. 如果参考资料不足以回答,请说明“当前资料不足,无法确定”;
3. 不要编造制度、流程、数字、日期;
4. 回答要简洁清晰;
5. 关键结论后标注来源编号。

【用户问题】
{question}

【参考资料】
{contexts}

请输出答案:

5. 关键实现:核心模块、技术选型和实现细节

5.1 文档切分策略

chunk 切分直接影响召回和生成质量。

如果 chunk 太小,语义不完整;如果 chunk 太大,检索不精准,还会浪费上下文窗口。

常见切分方式:

切分方式 说明 适用场景
固定长度切分 每 N 个 token 切一次 快速 Demo
按标题切分 根据标题层级切分 制度、手册、文档
语义切分 按语义边界切分 长文档、知识文章
表格行切分 按表格行或业务实体切分 Excel、清单类文档
父子切分 小 chunk 检索,大 chunk 生成 复杂长文档

实际工程中比较推荐“父子切分”:

  • 子 chunk 用于向量检索,保证召回精度;
  • 父 chunk 用于生成上下文,保证语义完整。

5.2 混合检索示例

下面是一个简化的混合检索伪代码:

def hybrid_retrieve(query, user_id, top_k=5):
    # 1. 权限过滤条件
    filters = build_permission_filter(user_id)

    # 2. 向量检索
    query_vec = embedding_model.encode(query)
    vector_results = vector_db.search(
        vector=query_vec,
        top_k=30,
        filters=filters
    )

    # 3. 关键词检索
    keyword_results = bm25_search(
        query=query,
        top_k=30,
        filters=filters
    )

    # 4. 合并去重
    candidates = merge_and_deduplicate(vector_results, keyword_results)

    # 5. Rerank
    reranked = rerank_model.rank(query, candidates)

    # 6. 取最终结果
    return reranked[:top_k]

这个流程比单纯向量检索更稳,因为它同时利用了语义召回和关键词召回。

5.3 Rerank 的位置

Rerank 不建议替代召回,而应该放在召回之后。

原因是 Rerank 通常计算成本更高,不适合在全库上直接排序。它更适合对候选集进行精排。

推荐流程:

Query
  ↓
向量检索 Top 30
  ↓
BM25 检索 Top 30
  ↓
合并去重得到候选集
  ↓
Rerank 打分
  ↓
Top 5 进入 Prompt

5.4 引用来源设计

企业级 RAG 一定要支持引用来源。答案没有来源,业务方很难信任。

建议每个 chunk 保留以下信息:

{
  "chunk_id": "doc_001_chunk_023",
  "document_title": "员工休假管理制度",
  "section_title": "第五章 未休年假处理",
  "page": 12,
  "version": "2024-05",
  "source_url": "internal://hr/policy/leave",
  "content": "员工离职时,未休年假按照公司相关规定折算..."
}

生成答案时可以返回:

根据《员工休假管理制度》第五章,员工离职时未休年假需要按照公司规定进行折算。[来源1]

这样用户可以点击来源继续查看原文。

5.5 无答案问题处理

RAG 系统必须能拒答。企业场景中,拒答比胡说更重要。

可以设计以下判断:

  • 检索最高分低于阈值;
  • Rerank 最高分低于阈值;
  • Top-k 文档之间相关性都很弱;
  • 参考资料没有明确结论;
  • 大模型自检认为证据不足。

Prompt 中也要明确要求:

如果参考资料中没有明确答案,请不要推测,请回答:
“当前知识库资料不足,无法确定该问题的答案,建议补充相关文档或联系业务负责人确认。”

6. 常见问题:实际落地中的坑和解决方案

6.1 文档解析质量差

问题表现:

  • PDF 解析出来顺序错乱;
  • 表格变成无意义文本;
  • 页眉页脚反复出现;
  • 章节标题丢失;
  • 图片中的文字没有被提取。

解决方案:

  • 对不同文档类型使用不同解析器;
  • 表格单独处理,不要简单拼接;
  • 保留标题层级;
  • 清理页眉页脚和目录;
  • 对关键图片使用 OCR;
  • 解析后做人工抽样检查。

6.2 chunk 切分不合理

问题表现:

  • 检索到的片段只有半句话;
  • 答案缺少上下文;
  • 一个制度条款被切成多段;
  • 大模型无法判断适用范围。

解决方案:

  • 不要只用固定长度切分;
  • 优先按标题、段落、条款切分;
  • 设置合理 overlap;
  • 使用父子 chunk;
  • 对表格、代码、FAQ 单独切分。

6.3 向量检索召回不到关键词问题

问题表现:

  • 用户搜索错误码,召回不到;
  • 用户搜索合同条款号,召回不到;
  • 用户搜索产品型号,召回错误内容。

解决方案:

  • 引入 BM25;
  • 对关键字段建立倒排索引;
  • 对型号、编号、错误码做正则抽取;
  • 使用混合检索;
  • 对 query 做关键词增强。

6.4 模型回答没有依据

问题表现:

  • 答案写得很完整,但原文没有;
  • 多个文档内容被混合;
  • 生成了不存在的流程;
  • 业务方无法追溯来源。

解决方案:

  • Prompt 中强制基于资料回答;
  • 输出来源编号;
  • 限制无依据扩展;
  • 增加答案校验;
  • 检索不到时拒答。

6.5 权限控制缺失

问题表现:

  • 普通员工问到了管理层文档;
  • A 部门用户检索到 B 部门资料;
  • 离职员工历史权限没有及时回收。

解决方案:

  • 文档入库时写入权限元数据;
  • 检索前根据用户身份构造过滤条件;
  • 权限过滤必须发生在召回阶段,而不是生成后;
  • 同步企业 IAM 或权限系统;
  • 记录用户查询日志和访问日志。

7. 效果评估:如何判断系统是否有效

企业级 RAG 的评估应该分层进行。

7.1 检索评估

检索评估关注:正确证据有没有被召回。

常见指标:

指标 含义
Recall@k Top-k 中是否包含正确证据
Hit Rate 是否命中目标文档
MRR 正确结果排名是否靠前
nDCG 排序质量是否合理

例如,如果正确文档经常在 Top 20 里,但不在 Top 5 里,说明召回还可以,但排序需要优化。

7.2 生成评估

生成评估关注:答案是否正确、完整、可信。

可以从以下维度打分:

维度 说明
正确性 答案是否与原文一致
完整性 是否覆盖问题关键点
忠实性 是否基于检索证据
可追溯性 是否提供来源
可读性 表达是否清晰
拒答能力 资料不足时是否拒答

7.3 端到端评估

端到端评估关注用户真实体验。

可以构建一个测试集:

[
  {
    "question": "离职员工未休年假如何折算?",
    "gold_docs": ["员工休假管理制度"],
    "gold_answer": "根据制度中的未休年假处理规则回答",
    "type": "制度问答"
  },
  {
    "question": "ERR_5021 是什么意思?",
    "gold_docs": ["系统错误码手册"],
    "gold_answer": "根据错误码定义回答",
    "type": "错误码查询"
  }
]

每次修改 chunk、Embedding、Rerank 或 Prompt 后,都跑一遍测试集,比较效果变化。

7.4 线上反馈评估

上线后可以收集:

  • 用户点赞 / 点踩;
  • 是否点击来源;
  • 是否追问;
  • 是否转人工;
  • 问题是否解决;
  • 高风险问题是否被正确拒答;
  • 检索结果是否被用户打开。

这些反馈可以用于后续优化检索策略和知识库质量。


8. 工程优化:性能、成本、稳定性和可维护性

8.1 延迟优化

RAG 链路通常包含多个耗时步骤:

问题改写 → Embedding → 检索 → Rerank → Prompt 构造 → LLM 生成

优化方向:

  • Embedding 结果缓存;
  • 热门问题缓存;
  • 检索和关键词搜索并行执行;
  • 控制候选文档数量;
  • Rerank 只对候选集执行;
  • 使用流式输出;
  • 根据问题复杂度选择不同模型。

8.2 成本优化

大模型调用成本通常来自:

  • 输入 token;
  • 输出 token;
  • Rerank 模型;
  • Embedding 计算;
  • 向量数据库资源;
  • 文档重建索引。

优化建议:

  • 控制 chunk 数量;
  • 对上下文做压缩;
  • 对低风险问题使用小模型;
  • 高频问题做答案缓存;
  • 文档增量更新,避免全量重建;
  • 对长文档先摘要再入库,但要保留原文引用。

8.3 稳定性优化

RAG 系统上线后要考虑异常情况:

  • 向量数据库不可用;
  • Embedding 服务超时;
  • Rerank 服务失败;
  • 大模型接口超时;
  • 文档索引更新失败;
  • 权限系统同步延迟。

需要设计降级策略:

  • Rerank 失败时退化为混合检索排序;
  • 大模型失败时提示稍后重试;
  • 检索为空时拒答;
  • 索引更新失败时保留旧索引;
  • 高风险问题禁止无证据回答。

8.4 可维护性优化

企业知识库会持续变化,因此 RAG 系统必须支持维护。

建议建设:

  • 文档版本管理;
  • 索引更新任务;
  • 文档解析质量检查;
  • 低质量问答样本回流;
  • Prompt 版本管理;
  • 评估集管理;
  • 检索日志分析;
  • 权限同步机制。

一个不能持续维护的 RAG 系统,初期效果再好,也会随着文档变化逐渐失效。


9. 实践建议:给开发者的落地建议

9.1 不要从模型开始,而要从问题集开始

很多团队一开始就纠结用哪个向量数据库、哪个 Embedding 模型、哪个大模型。更合理的做法是先收集真实问题。

例如:

  • 用户最常问什么?
  • 问题来自哪些部门?
  • 哪些问题必须准确回答?
  • 哪些问题允许模糊回答?
  • 哪些问题必须拒答?
  • 哪些问题涉及权限?
  • 哪些问题需要引用来源?

有了问题集,才能设计检索策略和评估体系。

9.2 第一版不要追求复杂,先打通闭环

第一版系统可以先做:

  • 文档解析;
  • 基础切分;
  • Embedding 入库;
  • 混合检索;
  • 简单 Rerank;
  • 来源引用;
  • 人工评估集。

不要一开始就堆复杂 Agent、多轮规划、知识图谱。先把 RAG 基础链路做稳定,比堆概念更重要。

9.3 对不同类型问题使用不同策略

企业问题不是同一种类型。可以简单分类:

问题类型 推荐策略
制度问答 向量检索 + BM25 + 来源引用
错误码查询 关键词检索 + 精确匹配
表格查询 结构化查询 + LLM 解释
多文档总结 多段召回 + 摘要压缩
权限敏感问题 先权限过滤再检索
无答案问题 阈值判断 + 拒答

不要用同一套 Prompt 和检索策略处理所有问题。

9.4 RAG 输出要服务业务动作

企业级 RAG 的价值不是“回答得像人”,而是帮助业务完成动作。例如:

  • 客服能不能根据答案回复用户;
  • 运维能不能根据答案定位问题;
  • HR 能不能根据答案解释制度;
  • 法务能不能根据答案找到合同依据;
  • 研发能不能根据答案定位接口文档;
  • 管理者能不能根据答案做决策。

所以,答案应该尽量结构化:

结论:
依据:
操作步骤:
注意事项:
来源:

这种结构比一大段自然语言更适合企业场景。


10. 总结:提炼核心观点

企业级 RAG 系统不能只做“文档向量化”。文档向量化只是基础能力,它解决的是语义召回问题,但不能单独解决证据可靠性、排序质量、权限控制、答案可信度和效果评估。

一个真正可落地的 RAG 系统,应该至少包含以下能力:

  • 高质量文档解析;
  • 合理的 chunk 切分;
  • Embedding 语义召回;
  • BM25 或关键词检索;
  • 元数据过滤;
  • 权限控制;
  • Rerank 精排;
  • Prompt 约束生成;
  • 来源引用;
  • 无答案拒答;
  • 离线评估和线上反馈;
  • 成本、延迟和稳定性优化。

从工程角度看,RAG 的难点不在于“调用一次向量数据库”,而在于把检索、排序、生成、校验和反馈做成一个稳定闭环。

如果只做文档向量化,系统只能停留在 Demo;如果能把检索、重排、可信生成和评估体系做好,RAG 才有机会真正进入企业生产环境。

我的个人建议是:做企业级 RAG 时,不要一开始就追求复杂框架,而要先抓住三个核心问题:

  • 第一,能不能找到正确证据;
  • 第二,能不能基于证据可靠回答;
  • 第三,能不能评估和持续优化。

只要这三个问题解决得足够扎实,RAG 系统就已经具备了从 Demo 走向生产的基础。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐