---
title: "企业 RAG 知识库实战"
author: Miles Ma
date: 2026-05-11
section: 知识系统
url: https://immilesma.com/blog/enterprise-rag-knowledge-base/
description: "从文档切分、Embedding 和向量库选择，一直讲到查询改写、混合检索、权限与评估，完整解释企业级 RAG 为什么不是把文档上传就结束。"
---

# 企业 RAG 知识库实战

> 从文档切分、Embedding 和向量库选择，一直讲到查询改写、混合检索、权限与评估，完整解释企业级 RAG 为什么不是把文档上传就结束。

我照着网上的教程搭了个 RAG 系统，把公司 10 万个文档扔进去。测试了一下，效果完全不行。

员工问「公司年假政策是什么」，AI 回答「根据文档，年假政策很复杂，建议咨询人事部」。员工问「怎么申请报销」，返回了一堆无关的文档。员工问长问题，系统直接卡死。

这篇文章记录我怎么把基础 RAG 改成企业级 RAG 的。

---

## 第一章：RAG 和 Embedding 是什么

RAG = Retrieval-Augmented Generation = 检索增强生成。

传统方式下，你问 AI 问题，AI 只能根据训练时的知识回答。如果是新的信息，AI 不知道。RAG 的方式是，你问 AI 问题，AI 先去知识库里找相关文档，然后根据文档回答。核心区别在于，传统方式 AI 的知识是固定的，RAG 方式 AI 可以实时查询最新的文档。

完整流程分为五步：用户问问题 → 系统去知识库里找相关文档 → 把文档给 AI → AI 根据文档生成答案。

Embedding 就是把文字变成数字。计算机不认字，只认数字。你要让 AI 知道「苹果」和「水果」很像，就得把它们都变成数字，然后算距离。用 Embedding 模型，把文字变成一串数字（向量），比如「苹果」可能变成 `[0.2, 0.8, 0.3, ...]`，这串数字有 1024 个或 1536 个。这样可以算相似度，「苹果」的向量和「水果」的向量很接近，「苹果」的向量和「电脑」的向量就很远。

整个 RAG 系统的工作原理是：把所有文档切成小段，用 Embedding 模型把每段文字变成向量，把向量存到向量数据库里。用户问问题时，把问题也变成向量，然后在数据库里找最相似的文档，把找到的文档和问题一起给 AI，AI 生成答案。

---

## 第二章：企业级 RAG 需要什么 - 数据层面

基础 RAG 对个人用户够了，但对企业用户不够。企业要求准确率高、稳定性好。数据层面要解决三个核心问题：文档怎么切分、怎么向量化、怎么选数据库。

### 2.1 文档切分：不同文件类型的处理策略

简单的滑动窗口切分在企业场景下完全不够用。企业的文档类型复杂，Excel、PDF、Word、PPT、代码文件、邮件、聊天记录，每种文件的结构完全不同，需要针对性处理。

**Excel 表格的处理：**

Excel 不能按行切分，因为单独一行没有意义。正确的做法是识别表格的语义结构，把每一行转换成完整的自然语言描述。比如员工信息表，「张三 | 技术部 | 工程师 | 15000」要转换成「张三在技术部担任工程师，月薪 15000 元」。如果表格有多个 sheet，每个 sheet 要单独处理，并且保留 sheet 名称作为上下文。

更复杂的情况是，Excel 里可能有合并单元格、多级表头、嵌套表格。这时候需要先解析表格结构，识别出主表头、子表头、数据行，然后按照层级关系拼接成自然语言。比如财务报表，「2023 年 Q1 | 收入 | 产品 A | 100 万」要转换成「2023 年第一季度产品 A 的收入为 100 万元」。

**PDF 文档的处理：**

PDF 分三种：纯文本 PDF、扫描版 PDF、混合 PDF。纯文本 PDF 可以直接提取文字，但要注意保留段落结构，不能把所有文字连成一串。扫描版 PDF 需要 OCR 识别，识别完了要做后处理纠错，因为 OCR 的准确率不是 100%。混合 PDF 既有文字又有图片，文字部分直接提取，图片部分要么 OCR，要么用多模态模型生成描述。

PDF 的切分不能简单按页切，因为一页可能包含多个主题。正确的做法是先识别文档结构（标题、段落、列表、表格），然后按照语义单元切分。比如技术文档，一个配置项的说明可能跨越两页，你不能把它切成两段，要保持完整性。

**Word 和 PPT 的处理：**

Word 和 PPT 有格式信息（标题、加粗、列表），这些格式代表了内容的重要性。去掉格式，AI 就不知道哪些是重点。正确的做法是保留格式信息，用 Markdown 语法表示。比如「**重要提示**：本产品不适用于孕妇」，保留加粗标记，AI 才知道这是重点。

PPT 的切分要按照幻灯片的逻辑结构来，一张幻灯片通常是一个完整的观点，不要把它切碎。如果一张幻灯片内容太多，可以按照标题和正文分开处理，但要保留幻灯片编号作为上下文。

**代码文件的处理：**

代码文件不能按行切分，因为代码的语义单元是函数、类、模块。正确的做法是用 AST（抽象语法树）解析代码结构，按照函数、类、模块切分。每个函数要保留函数签名、注释、函数体，这样 AI 才能理解这个函数是干什么的。

如果代码文件很大，一个类有几百行，可以按照方法切分，但要保留类名和类注释作为上下文。比如「UserService 类的 login 方法」，要包含类名、方法签名、方法注释、方法体。

**邮件和聊天记录的处理：**

邮件和聊天记录有时间线和对话结构。邮件要保留发件人、收件人、主题、时间、正文，这些都是重要的上下文信息。聊天记录要保留对话的上下文，不能把每条消息单独切分，要按照对话轮次切分。比如一个问题和三条回复，要作为一个完整的对话单元。

**切分的多种策略：**

切分不是简单的按字数切，而是要根据文档的结构和语义来切。常见的切分策略有以下几种：

按段落切分。这是最常见的方式，一个自然段作为一个 chunk。适合结构清晰的文档，比如新闻稿、博客文章。但要注意，有些段落很长，可能超过 Embedding 模型的输入限制，需要进一步切分。

按标题层级切分。识别文档的标题结构（一级标题、二级标题、三级标题），按照标题层级切分。一个二级标题下的所有内容作为一个 chunk。这种方式适合结构化的文档，比如技术文档、产品手册。切分后要保留标题信息作为上下文，让 AI 知道这段内容属于哪个章节。

按语义单元切分。用 NLP 模型识别文档的语义边界，在语义发生转换的地方切分。比如一段话讲完了配置方法，下一段话开始讲注意事项，这就是一个语义边界。这种方式最精准，但实现成本高，需要训练或使用语义分割模型。

按完整观点切分。识别文档中的完整观点或论述单元，一个完整的观点作为一个 chunk。比如「RAG 的优势有三点：第一，可以实时更新知识；第二，可以引用来源；第三，可以降低幻觉」，这是一个完整的观点，不能切碎。这种方式适合观点性的文档，比如分析报告、评论文章。

按固定窗口切分（滑动窗口）。设定一个固定的窗口大小（比如 500 字），每次滑动一定的步长（比如 400 字），切出一个新的 chunk。窗口大小减去步长就是重叠部分（比如 100 字）。这种方式最简单，但可能会把一个完整的观点切碎。只适合作为兜底方案，当其他方式都不适用时使用。

**通用的切分原则：**

不管用哪种切分策略，核心原则是保持语义完整性。一个完整的观点、一个完整的配置项、一个完整的对话，不能被切碎。同时要保留足够的上下文信息，让 AI 知道这段内容是在什么场景下的。

切分的粒度要根据文档类型动态调整。技术文档可以切得细一些，每个配置项单独一段。政策文档要切得粗一些，一个完整的政策条款作为一段。代码文件按照函数切分，邮件按照邮件线程切分。

实际操作中，往往需要组合多种切分策略。先按标题层级做粗切分，再按段落做细切分，最后用滑动窗口处理超长段落。切分完了要检查每个 chunk 的长度，确保在 Embedding 模型的输入限制内。

### 2.2 向量化：模型选择和输入处理

向量化的核心是选对模型和控制输入长度。Embedding 模型是在特定语言的数据上训练的，用英文模型处理中文，效果会很差。中文场景下，`bge-large-zh` 是目前效果最好的开源模型，维度是 1024。英文场景下，OpenAI 的 `text-embedding-3-large` 效果最好，维度是 1536。如果是多语言混合的场景，用 `multilingual-e5-large`。

向量维度是固定的，输入越长，信息密度越低。输入 1 个字，1536 维表达 1 个字的信息，信息密度很低。输入 1 万字，1536 维表达 1 万字的信息，信息被压缩，细节丢失。就像你用一个 1MB 的 U 盘去装 1GB 的电影，要么装不下，要么画质糊成马赛克。

所以要控制输入长度。`bge-large-zh` 的最大输入是 512 Token（约 400 字），推荐输入 300-400 字。`text-embedding-3-large` 的最大输入是 8191 Token（约 6000 字），但推荐输入 500-1000 字，因为输入太长会导致信息密度下降。

实际操作中，切分后的每个 chunk 要控制在推荐长度内。如果某个 chunk 超长，要进一步切分。但不能切得太碎，要保持语义完整性。这是一个平衡的过程，需要根据实际效果调整。

**图片和图表的向量化：**

企业文档里有大量的图片和图表，这些视觉信息也需要向量化。纯文本的 Embedding 模型处理不了图片，需要用多模态的方法。

第一种方法是 OCR + 文本 Embedding。用 OCR 把图片里的文字识别出来，然后用文本 Embedding 模型向量化。这种方法适合图片里主要是文字的场景，比如截图、扫描件。但 OCR 只能识别文字，识别不了图表的结构和含义。

第二种方法是多模态视觉 Embedding 模型。这类模型可以直接把图片变成向量，不需要先转成文字。OpenAI 的 CLIP 模型就是这类模型，可以把图片和文字映射到同一个向量空间。用户问「销售额趋势图」，系统可以直接检索出相关的图表。

第三种方法是图片描述 + 文本 Embedding。用多模态 LLM（比如 GPT-4V）给图片生成文字描述，然后用文本 Embedding 模型向量化。这种方法的好处是，描述可以包含图片的语义信息，比如「这是一张柱状图，显示了 2023 年各季度的销售额，Q4 的销售额最高」。

实际操作中，这三种方法可以结合使用。对于包含文字的图片，用 OCR 提取文字。对于图表，用多模态 LLM 生成描述。对于需要精确检索的场景，用多模态视觉 Embedding 模型。把 OCR 结果、图片描述、图片向量都存起来，检索的时候可以多路召回，提高召回率。

### 2.3 向量数据库选型

向量数据库的选择取决于三个因素：数据量、是否需要实时更新、成本。

数据量在 10 万条以内，用 Faiss 就够了。Faiss 是 Facebook 开源的向量检索库，本地部署，免费，性能很好。但 Faiss 不支持实时更新，只能离线建索引，适合数据不经常变化的场景。

数据量在 10 万到 100 万条，用 Milvus 或 Qdrant。这两个都是开源的向量数据库，支持实时插入和删除，支持分布式部署。Milvus 的社区更活跃，文档更完善，生态更好。Qdrant 的性能更好，但社区相对小一些。

数据量超过 100 万条，用 Pinecone 或 Weaviate。Pinecone 是商业产品，托管服务，不用自己部署，性能很好，但要付费。Weaviate 是开源的，支持超大规模数据，但需要自己部署和运维。

我的场景是 10 万条数据，需要实时更新，预算有限，所以选了 Milvus。

索引类型的选择也很重要。Milvus 支持多种索引类型，IVF_FLAT 适合中小规模，准确率高。IVF_SQ8 适合大规模，速度快但准确率略低。HNSW 适合超大规模，速度最快。我用的是 IVF_FLAT，因为我的数据量不大，更看重准确率。

---

## 第三章：企业级 RAG 需要什么 - 检索策略

数据搞定了，只是成功了 80%。剩下 20% 在检索策略上。检索策略要解决四个核心问题：长问题怎么处理、怎么提高召回率、怎么提高准确率、怎么做综合排序。

### 3.1 长问题的处理：压缩和改写

用户输入 1000 字的需求文档，问「这个需求怎么实现」。Embedding 模型只能处理 500 字，超出部分被截断，信息丢失。这时候需要对问题进行预处理。

第一种方法是压缩。用 LLM 把 1000 字总结成 500 字，保留核心信息，去掉冗余内容。但压缩有风险，可能会丢失关键细节。所以压缩的时候要明确告诉 LLM，哪些信息是必须保留的。

第二种方法是改写成多个子问题。把一个大问题拆成 3-5 个小问题，每个小问题单独检索，最后合并结果。比如「我们要做一个电商平台，需要支持多商户、多语言、多货币，怎么实现？」可以拆成三个子问题：「电商平台怎么支持多商户？」「电商平台怎么支持多语言？」「电商平台怎么支持多货币？」

改写的好处是可以提高召回率。一个大问题可能只召回 10 条文档，但 3 个小问题可以召回 30 条文档（去重后可能 20 条）。就像散弹枪，一枪打出去，覆盖面更广。

实际操作中，压缩和改写可以结合使用。先判断问题的长度，如果超过 500 字，先压缩到 500 字以内。如果问题包含多个子问题，再拆分成多个子问题。

### 3.2 召回率优化：粗排和精排

召回率的核心问题是，如果你只召回 Top-10，可能把真正相关的文档排在第 15 名，就漏掉了。但如果你召回 Top-100，大部分都是噪音，AI 看不过来。

解决方案是两阶段检索：粗排和精排。

粗排阶段用向量检索，快速召回 Top-100。向量检索的速度很快，对 50 万条文档做检索，耗时不到 100 毫秒。粗排的目标是「不漏」，把可能相关的都找出来，宁可多召回一些，也不能漏掉关键信息。

精排阶段用 Rerank 模型，对这 100 条重新打分，返回 Top-10。Rerank 模型的速度很慢，对 50 万条文档做 Rerank，耗时超过 30 分钟。但对 100 条文档做 Rerank，耗时不到 1 秒。精排的目标是「准确」，把真正相关的挑出来。

粗排和精排的组合，既保证了召回率，又保证了准确率，还保证了速度。

### 3.3 准确率优化：Rerank 模型的使用

向量检索是「模糊匹配」，只要文档里出现「报销」「申请」这些词，就会被召回。但大部分文档内容无关。比如用户问「怎么申请报销」，系统召回了「报销流程」「报销政策」「报销表格」「报销系统」，但真正有用的只有「报销流程」。

Rerank 模型和 Embedding 模型的工作原理完全不同。Embedding 模型只看文本本身，把文本变成向量，然后算向量之间的距离。Rerank 模型把问题和文档一起输入，直接判断相关性，输出一个 0 到 1 之间的分数。

举个例子，问题是「怎么申请报销」，文档 1 是「报销流程：先填写报销单，然后提交给财务部审核」，文档 2 是「公司年假政策：员工每年有 10 天年假，其中 5 天必须在上半年使用」。

Embedding 模型可能觉得文档 2 也相关，因为都提到了「公司」「政策」这些词。但 Rerank 模型会判断文档 1 的相关性是 0.95，文档 2 的相关性是 0.1，明显文档 1 更相关。

中文场景下，`bge-reranker-large` 是目前效果最好的开源 Rerank 模型。英文场景下，Cohere 的 `cohere-rerank` 效果最好，但是商业产品，要付费。

### 3.4 综合排序：多因素加权

单纯的相似度排序有一个问题，可能把旧文档排在前面。用户问「公司年假政策是什么」，检索出来的是 3 年前的旧文档，但公司的年假政策可能已经改了。

解决方案是多因素排序，不只看相似度，还要考虑时间、权重、其他评分。

最终得分的计算公式是：最终得分 = 相似度 × 0.5 + 时间衰减 × 0.3 + 权重 × 0.2

时间衰减的计算方式是，越新的文档，得分越高。今天的文档，时间衰减 = 1.0。1 年前的文档，时间衰减 = 0.37。3 年前的文档，时间衰减 = 0.05。具体的衰减函数可以用指数衰减，也可以用线性衰减，根据实际情况调整。

权重是人工标注的重要性。「公司政策」类的文档权重设为 1.0，「会议纪要」类的文档权重设为 0.3。权重的设置需要根据业务场景来定，不同类型的文档重要性不同。

除了相似度、时间、权重，还可以加入其他评分因素。比如用一个分类模型，判断文档是不是真的在回答这个问题，输出一个 0 到 1 的分数。或者用一个 LLM，让它给每个文档打分，判断文档的质量和相关性。

多因素排序的权重系数（0.5、0.3、0.2）需要根据实际效果调整。如果发现时效性很重要，可以把时间衰减的权重调高。如果发现文档质量参差不齐，可以加入质量评分，并且给它一个较高的权重。

实际操作中，多因素排序是一个持续优化的过程。上线后要收集用户反馈，看哪些文档被点击了，哪些文档被忽略了，根据反馈调整权重系数。

**混合检索：向量检索 + 关键词检索**

单纯的向量检索有时候会漏掉一些精确匹配的结果。比如用户问「员工编号 E12345 的信息」，向量检索可能检索不到，因为编号是精确匹配，不是语义相似。

解决方案是混合检索，同时用向量检索和关键词检索，然后合并结果。向量检索负责语义相似的文档，关键词检索负责精确匹配的文档。

关键词检索可以用 Elasticsearch 或者传统的全文检索引擎。检索的时候，向量检索召回 Top-50，关键词检索召回 Top-50，合并去重后得到 Top-80，再用 Rerank 模型精排到 Top-10。

混合检索的权重分配也很重要。如果用户的问题包含专有名词、编号、日期这些精确信息，关键词检索的权重要高一些。如果用户的问题是语义性的，向量检索的权重要高一些。可以用一个分类模型判断问题的类型，动态调整权重。

**查询扩展：同义词和相关词**

用户的问题可能用词不准确，导致检索不到相关文档。比如用户问「怎么请假」，但文档里用的是「休假申请流程」，向量检索可能检索不到。

解决方案是查询扩展，把用户的问题扩展成多个相关的表达方式。「怎么请假」可以扩展成「请假流程」「休假申请」「假期申请」「请假手续」。每个表达方式单独检索，然后合并结果。

查询扩展可以用同义词词典，也可以用 LLM 生成。用 LLM 的好处是可以生成更多样化的表达方式，不局限于同义词。但要注意控制扩展的数量，扩展太多会增加检索时间，也会引入噪音。

**负反馈学习：从用户行为中学习**

用户的点击行为、停留时间、反馈评分，都是宝贵的信号。如果一个文档被检索出来了，但用户没有点击，说明这个文档可能不相关。如果用户点击了但很快关闭，说明文档的内容不符合预期。

可以收集这些负反馈信号，用来优化检索模型。比如用户问「怎么申请报销」，系统返回了文档 A、B、C，用户只点击了 A，没有点击 B 和 C。下次再有类似的问题，B 和 C 的排序就应该降低。

负反馈学习可以用点击率模型（CTR）或者学习排序模型（Learning to Rank）。这些模型可以从用户行为中学习，不断优化检索结果的排序。

---

## 总结

企业级 RAG 和基础 RAG 的核心区别在于，企业级 RAG 要处理复杂的数据类型，要保证高召回率和高准确率，要考虑时效性和文档质量。

数据层面，不同文件类型要用不同的切分策略。Excel 要转换成自然语言，PDF 要识别文档结构，代码要按照函数切分，邮件要保留对话上下文。向量化要选对语言的模型，控制输入长度。数据库要根据数据量和实时性需求选择。

检索层面，长问题要压缩或改写成多个子问题。召回率要用粗排和精排的两阶段检索。准确率要用 Rerank 模型重新打分。排序要综合考虑相似度、时间、权重、其他评分因素。

搞定数据和检索这两个层面，你的 RAG 就能达到企业级的要求。

---

## 第四章：个人用户怎么做 - 内容创作场景

企业级 RAG 很复杂，但对个人用户来说，RAG 可以很简单，而且非常实用。

最常见的场景是内容创作。你写了很多文章、读了很多书、收藏了很多资料，这些都是你的知识资产。但时间久了，你记不清哪篇文章讲了什么，哪本书有什么观点。每次写作的时候，要翻很久才能找到相关的素材。

用 RAG 可以解决这个问题。把你的文章、书籍、笔记都做成向量数据库，存在本地。写作的时候，直接检索相关内容，AI 帮你找出相关的素材，甚至直接生成初稿。

### 4.1 怎么构建个人知识库

第一步是收集内容。把你的文章、书籍、笔记、收藏的网页，都整理成文本文件。Markdown 格式最好，因为保留了格式信息，而且方便处理。

第二步是切分和向量化。个人知识库的数据量不大，几千到几万条，用简单的切分方式就够了。按段落切分，每段 300-500 字。用开源的 Embedding 模型，比如 `bge-large-zh`，把每段文字变成向量。

第三步是存储。个人知识库用 Faiss 就够了，本地部署，免费，速度快。把向量和原文都存起来，建立索引。

第四步是检索。写作的时候，输入你想写的主题或者问题，系统检索出相关的段落，返回给你。你可以直接引用，也可以让 AI 基于这些素材生成初稿。

### 4.2 怎么设计 Prompt 去检索

检索的关键在于 Prompt 的设计。你不是在问 AI 问题，而是在告诉 AI 你想找什么样的内容。

**场景 1：找相关素材**

你在写一篇关于「AI 对内容创作的影响」的文章，想找相关的素材。

Prompt 可以这样写：

```
我在写一篇关于「AI 对内容创作的影响」的文章。
请从我的知识库中检索相关的内容，包括：
1. AI 工具在内容创作中的应用案例
2. AI 对创作者的影响（正面和负面）
3. 未来内容创作的趋势

返回最相关的 10 段内容。

```

这样 AI 知道你要找什么，检索的时候会更精准。

**场景 2：生成初稿**

你想写一篇文章，但不知道从哪里开始。

Prompt 可以这样写：

```
我想写一篇关于「个人知识管理」的文章。
请从我的知识库中检索相关的内容，然后生成一个 800 字的初稿。

初稿要求：
1. 包含我之前写过的观点和案例
2. 结构清晰，有开头、正文、结尾
3. 引用我的原文时，标注来源

检索范围：我的所有文章和笔记。

```

AI 会先检索相关内容，然后基于这些内容生成初稿。生成的初稿会引用你之前的观点，保持你的写作风格。

**场景 3：找具体的信息**

你记得之前读过一本书，讲了某个概念，但忘了是哪本书。

Prompt 可以这样写：

```
我记得之前读过一个概念，叫「认知负荷」，是关于学习和记忆的。
请从我的读书笔记中检索相关的内容，告诉我：
1. 这个概念出自哪本书
2. 具体的定义是什么
3. 有哪些应用场景

返回最相关的 5 段内容。

```

AI 会检索出相关的读书笔记，告诉你这个概念的出处和详细信息。

### 4.3 为什么这样做很有价值

个人知识库的价值在于，它把你的知识资产变成了可检索、可复用的资源。

**第一，节省时间。**

以前写作要翻很久才能找到素材，现在几秒钟就能检索出来。以前要重新阅读整本书才能找到某个观点，现在直接检索就能找到。

**第二，减少 Token 消耗。**

如果你每次写作都把所有文章和笔记都给 AI，Token 消耗会很大。用 RAG 的方式，只检索相关的内容，Token 消耗大幅降低。比如你有 100 篇文章，每篇 2000 字，总共 20 万字。如果全部给 AI，需要 20 万 Token。用 RAG 检索，只返回 10 段相关内容，每段 500 字，只需要 5000 Token。

**第三，保持一致性。**

你的文章、笔记、观点，都是你的思考积累。用 RAG 的方式，AI 生成的内容会基于你的知识库，保持你的观点和风格。不会出现 AI 生成的内容和你之前的观点矛盾的情况。

**第四，持续积累。**

每次写完文章，加入知识库。每次读完书，加入读书笔记。知识库会越来越丰富，检索的效果会越来越好。这是一个正向循环，你的知识资产会不断增值。

### 4.4 实际操作建议

个人知识库不需要很复杂，简单实用就好。

数据量小，用 Faiss 本地部署。不需要服务器，不需要付费，在自己电脑上就能跑。

切分简单，按段落切就行。不需要复杂的语义切分，不需要识别文档结构。

检索简单，用向量检索就够了。不需要 Rerank，不需要多因素排序。数据量小，Top-10 的结果基本都是相关的。

Prompt 设计是关键。要明确告诉 AI 你想找什么，检索范围是什么，返回什么格式。Prompt 设计得好，检索效果就好。

定期更新知识库。每次写完文章，读完书，做完笔记，都加入知识库。保持知识库的新鲜度，检索的时候才能找到最新的内容。
