# 2 - RAG - 搭建企业私有&个人知识库

本章是全书里第一篇把 **RAG 与知识库** 落到产品和平台上的章节。前面的 [1-3 RAG、微调、续训与智能体选型](1-3-RAG、微调、续训与智能体选型.md) 更偏“为什么选 RAG、什么时候该选 RAG”；本章更偏“如果已经决定用 RAG，该怎样把知识库搭起来”；后面的 [19-RAG检索增强生成](19-RAG检索增强生成.md) 会继续从 LangChain 代码侧，把文档加载、切块、Embedding、向量库、检索与生成串成完整工程链路。

---

**本章课程目标：**

- 理解 RAG 是什么、为什么需要，以及它与知识库、向量库、Embedding、提示词增强之间的关系。
- 建立对 RAG 两阶段流程的完整认识：**知识库构建（离线）** 与 **检索生成（在线）**。
- 知道什么是“个人/企业知识库”，哪些人适合先从知识库入手，而不是一上来就考虑微调。
- 能使用 **Cherry Studio**、**ima**、**Dify** 三种方式搭建知识库，保留直观的产品体验与操作路径。

**学习建议：** 这篇适合一边看平台，一边画出 RAG 链路：文档从哪里来、如何切分和索引、用户提问时怎么召回、召回内容又怎么交给模型。按钮不用一次记全，但每做一步都要问自己：这一步是在“准备知识”，还是在“查询知识”。能分清这两段，后面换 Cherry Studio、ima 或 Dify 都不容易迷路。

**官方文档与资源**：详见 [工具导航与参考资料索引 - RAG与向量检索](工具导航与参考资料索引.md#RAG与向量检索)。

---

## 1、RAG 的理解

### 1.1 什么是 RAG

RAG（Retrieval-Augmented Generation，检索增强生成）是一种把 **信息检索** 与 **大模型生成** 结合起来的应用架构。

它的核心思路并不复杂：

1. 用户先提问。
2. 系统先去外部知识源里找相关资料。
3. 把“问题 + 资料”一起发给大模型。
4. 由大模型基于这些资料生成答案。

RAG 的重点不是“重新训练模型”，而是**在运行时给模型补充它当前需要的上下文**。入门阶段先记住：

> **RAG = 先查资料，再回答问题。**

再说得更工程化一点：

- **Retrieval（检索）**：先找到和问题最相关的资料片段。
- **Augmented（增强）**：把检索到的资料拼进当前 Prompt 或消息上下文。
- **Generation（生成）**：让大模型基于这些资料生成最终答案。

所以，RAG 常被形容成“让模型开卷答题”，而不是“再学一遍新知识”。它不改模型参数，不改变模型的“大脑”；它做的是给模型外挂一个可检索的资料层。

### 1.2 为什么需要 RAG

第一次接触知识库时，很多人会把 RAG 当成更高级的聊天技巧。这个理解不准确。RAG 出现的根本原因，是大模型单独使用时天然有几类限制，而这些限制在真实项目里很常见。

常见问题有三类：

- **知识冻结**：模型训练完成后，知识并不会自动随现实世界更新。
- **私有知识缺失**：企业制度、内部文档、项目资料、课程讲义这类内容，模型训练时通常没见过。
- **幻觉与不可追溯**：模型没把握时容易“猜一个像样答案”，而且很难告诉你依据来自哪里。

可以从两个角度理解这件事。

**第一，时间维度。**
随着模型规模增大，训练成本和周期也更高，因此大模型不可能天天重新训练。于是“最新信息、刚变更的信息、实时更新的信息”天然不是它的强项。

**第二，数据来源维度。**
大模型主要学到的是公开语料，而企业内部资料、个人笔记、项目规范、客户材料、课程总结，往往根本不在训练范围内。你直接问模型，它要么不知道，要么半猜半答。

**举例 1：**

随着 LLM 规模扩大，训练成本与周期相应增加。因此，包含最新信息的数据难以融入模型训练过程，无法及时反映最新的信息或动态变化，导致 LLM 难以应对诸如“请推荐当前热门影片”等时间敏感性问题。

**举例 2：**

大型语言模型（LLM）的训练依赖于网络上`海量公开的静态数据`，而某些`特定领域`（如企业内部资料、专有技术文档等）的数据通常不会作为公开的训练数据，导致模型在面对这些领域的查询时，可能因缺乏足够的信息而生成不准确甚至虚构的回复。

RAG 的价值就在这里：它不要求模型“自己就知道”，而是让系统在回答前先去你的资料里找证据。

**解决方案：**

为了解决这一问题，RAG 技术通过引入`向量数据库（Vector Database）`等外部知识源，把模型缺失的知识以结构化、可检索的方式提供出来。完整的 RAG 不只是“向量数据库”四个字，它背后还包括文档加载、清洗、切块、Embedding、检索、Prompt 组装和最终生成等一整条链路。

**举例 1：**

LLM 在考试的时候面对陌生的领域，答复能力有限，然后就准备放飞自我了，而此时 RAG 给了一些提示和思路，让 LLM 懂了开始往这个提示的方向做，最终考试的正确率从 60%到了 90%！

![RAG 通过外部知识提示模型答题并提升正确率的示意图](images/2/2-1-2-1.png)

**举例 2：**

![RAG 结合外部资料回答领域问题的示意图](images/2/2-1-2-2.png)

放到真实项目里，大致是：

- 公司有制度、产品说明、FAQ、接口文档；
- 模型自己并不知道这些资料；
- 但当用户提问时，系统先去资料里找最相关的部分；
- 然后让模型基于这些资料回答。

这样回答会更像“有依据地作答”，而不是“靠模型印象发挥”。

### 1.3 执行流程

理解 RAG，最重要的是把它看成**两个阶段**，而不是一句“先检索再生成”。

第一阶段是 **知识库构建**，面向的是原始资料；第二阶段是 **检索与答案生成**，面向的是用户提问。

```mermaid
flowchart LR
    subgraph Offline["阶段一：知识库构建（离线）"]
        D["原始资料<br/>PDF / Word / Markdown / 网页"] --> Parse["文档解析与清洗"]
        Parse --> Split["文本切分<br/>Chunk"]
        Split --> EmbedDoc["Embedding<br/>文本转向量"]
        EmbedDoc --> Store["向量库 / 知识库<br/>保存文本块、向量、元数据"]
    end

    subgraph Online["阶段二：检索与生成（在线）"]
        Q["用户问题"] --> EmbedQuery["问题向量化"]
        EmbedQuery --> Retrieve["检索相关文本块"]
        Store --> Retrieve
        Retrieve --> Augment["Prompt 增强<br/>问题 + 检索结果"]
        Augment --> LLM["大模型生成"]
        LLM --> Answer["带依据的回答"]
    end
```

![LangChain 与 ChatGLM 构建知识库及问答流程的整体示意图](images/2/2-1-3-1.png)

**流程说明：**

整张图分为**两个阶段**：上方是**知识库构建**，下方是**查询与答案生成**。它做的事情是：先把本地文档变成一个可检索的知识库，再在用户提问时动态查资料，并把资料增强进模型输入。

| 步骤                       | 英文名              | 中文名         | 在做什么                                                                     |
| -------------------------- | ------------------- | -------------- | ---------------------------------------------------------------------------- |
| **阶段一：知识库构建**     |
| 1                          | Local Documents     | 本地文档       | 流程起点：你的 PDF、Word、Markdown、TXT 等原始文件，是私有知识库的数据来源。 |
| 2                          | Unstructured Loader | 非结构化加载器 | 读取并解析各种格式的本地文档，从中抽出纯文本，统一成后续可处理的格式。       |
| 3                          | Text                | 文本           | 加载器产出的纯文本内容。                                                     |
| 4                          | Text Splitter       | 文本分割器     | 把长文本按规则切成小块，便于嵌入和放入 LLM 上下文。                          |
| 5                          | Text Chunks         | 文本块         | 分割后得到的一段段文本，是后续嵌入和检索的基本单位。                         |
| 6                          | Embedding           | 嵌入           | 用嵌入模型把每个文本块转成向量。语义相近的块，向量距离也更近。               |
| 7                          | VectorStore         | 向量存储       | 把文本块的向量、原文和元数据存入向量数据库，支持后续按相似度检索。           |
| **阶段二：查询与答案生成** |
| 8                          | Query               | 查询           | 用户用自然语言提出的问题或请求。                                             |
| 9                          | Embedding           | 嵌入           | 用**同一套**嵌入模型把用户查询也转成向量，保证和知识库在同一向量空间里。     |
| 10                         | Query Vector        | 查询向量       | 用户查询的向量表示。用它去向量库里找最相关的文档块。                         |
| 11                         | Vector Similarity   | 向量相似度     | 在向量存储中做相似度搜索，找出与问题最接近的文本块。                         |
| 12                         | Related Text Chunks | 相关文本块     | 检索得到的文本片段，是回答问题时最关键的依据。                               |
| 13                         | Prompt Template     | 提示模板       | 把“用户问题 + 检索结果”组装成一段结构化输入。这里对应 RAG 里的“增强”。       |
| 14                         | Prompt              | 提示           | 最终送入大模型的内容。                                                       |
| 15                         | LLM                 | 大语言模型     | 基于检索结果和用户问题生成答案。这里对应 RAG 里的“生成”。                    |
| 16                         | Answer              | 答案           | 模型基于检索到的资料给出的最终回答。                                         |

![RAG 从知识库构建到检索增强生成的完整架构图](images/2/2-1-3-2.png)

> 检索-增强-生成过程：**检索**对应第 9 ～ 11 步（查询嵌入 → 查询向量 → 向量相似度搜索）；**增强**对应第 13 步（把检索结果注入到提示词 / 消息上下文）；**生成**对应第 15 步（LLM 输出答案）。

> **你可能会问：** 为什么“建知识库”和“用户提问时”都要用**同一套**嵌入模型？因为嵌入模型本质上是在定义一套“语义坐标系”。建库用模型 A、提问时用模型 B，就像拿两种完全不同的尺子去量距离，算出来的相似度会乱掉，检索效果就会明显变差。

理解这张图时，还建议先记住四个最容易混的词：

- **知识库**：承载外部知识的整体容器，可能包含文档、分块、向量、元数据、检索配置等。
- **向量库**：知识库内部用于做相似度检索的存储组件，不等于整个知识库。
- **Embedding**：把文本变成向量的模型或过程。
- **Prompt 增强**：把检索结果交给模型的那一步。

如果你后面继续看 [19-RAG检索增强生成](19-RAG检索增强生成.md)，会发现这四个词会分别落到更具体的代码对象上，例如：

- 文档 -> `Document`
- 文本分割 -> `TextSplitter`
- 向量化 -> `Embeddings`
- 检索 -> `Retriever`
- 增强输入 -> `PromptTemplate / ChatPromptTemplate`

**强调一下难点的步骤（蓝色部分）：**

![RAG 中最容易影响效果的关键步骤示意图](images/2/2-1-3-3.png)

这张图提醒的是：RAG 最难的地方通常不在“上传文件”本身，而在这些环节是否做得合理：

- 文档有没有被正确解析
- 文本是不是切得太碎或太大
- Embedding 模型是否合适
- 检索出来的内容是否真的相关
- 拼给模型的上下文里有没有太多噪音

RAG 不是“有知识库就一定答得好”，而是“知识库链路质量越高，回答越稳”。

### 1.4 RAG 工程质量框架

理解流程之后，再看一个更贴近真实项目的问题：**为什么同样叫知识库，有的回答很稳，有的却经常胡说？**

可以用这个公式做排查：**RAG 效果 = 文档质量 x 解析质量 x 切分质量 x 检索质量 x 重排质量 x Prompt 组织质量 x 生成模型质量 x 评测闭环**

这里的乘号表示：只要某个环节特别差，整体效果就会被明显拉低。

知识库答不准时，不要一上来就怪模型。可以先看现象，再往回查：

```mermaid
flowchart TD
    Start["RAG 效果不好"] --> A{"完全找不到资料？"}
    A -- "是" --> A1["查入库链路<br/>文档是否上传、解析是否成功、Embedding 是否一致"]
    A -- "否" --> B{"召回内容答非所问？"}
    B -- "是" --> B1["查检索策略<br/>关键词检索、向量检索、Top K、阈值、Rerank"]
    B -- "否" --> C{"资料找到了但模型乱答？"}
    C -- "是" --> C1["查 Prompt 约束<br/>仅基于资料回答、允许不知道、要求引用来源"]
    C -- "否" --> D{"答案不完整或漏重点？"}
    D -- "是" --> D1["查上下文组织<br/>Chunk 大小、Overlap、Top K、上下文窗口"]
    D -- "否" --> E{"无法追溯来源？"}
    E -- "是" --> E1["查元数据与引用<br/>文件名、页码、标题、段落 ID"]
    E -- "否" --> F["整理一组测试问题<br/>记录召回片段、引用和最终答案"]
```

---

## 2、知识库的概述

这一节从“产品使用者”的角度来理解知识库。可以把知识库理解成：**把你的资料做成可检索、可引用、可被大模型调用的一套外部知识层。**

它不只是一个“文件夹”，也不只是一个“向量库”：

- 从用户视角看，知识库像是“把很多资料整理成一个能问答的仓库”。
- 从工程视角看，知识库背后通常包含文档、切块、Embedding、向量检索、元数据、召回策略等多个环节。

### 2.1 什么是知识库

先给一个简短定义：

> **知识库 = 让模型能访问你自己的资料，并在提问时按需调用这些资料。**

它特别适合下面这些人群：

**小型企业主或创业者：**
经常要查阅和分享制度文档、产品说明、客户反馈、市场分析。把这些资料整理成知识库后，问答和复用效率会明显提高。

**职场打工人或自由职业者：**
无论是写作、设计、开发，还是视频制作，你都会积累大量素材、需求、规范和项目资料。知识库的价值不是“存起来”，而是“下次还能快速找到并继续用”。

**教育工作者或学生：**
老师可以整理课程资料、讲义、案例、答疑文档；学生可以把课堂笔记、论文资料、考试重点、知识点总结做成自己的复习型知识库。

**生活中的普通人：**
旅行计划、阅读笔记、兴趣资料、学习记录、求职资料，全部都可以做成个人知识库。知识库不是企业专属工具，它同样适合个人成长与日常信息管理。

从“为什么值得做”这个角度看，知识库至少有三层价值：

- **管理资料**：资料不再散落在聊天记录、网盘、文件夹里。
- **快速检索**：不必每次手动翻 PDF 或翻网页。
- **增强生成**：检索结果还能继续交给模型做总结、改写、问答和二次创作。

### 2.2 知识库各个搭建平台对比

本仓库里会分别从**平台搭建**和**代码实现**两个方向讲 RAG。站在平台视角，你可以先把常见工具按能力定位分成三类。这里列举的是学习和选型时常见的代表工具，不是固定排名；具体功能、价格和部署方式会随版本变化，以各平台官方说明为准。

1. **个人轻量型**：上手快、图形化强、适合个人或小团队先做 Demo。
2. **平台协作型**：不仅能做知识库，还能接工作流、应用发布、团队协作。
3. **复杂文档解析型**：重点是文档理解质量，尤其适合长 PDF、复杂表格、扫描件。

**2.2.1 核心定位和技术特点**

**AnythingLLM、Cherry Studio**：`桌面/图形化 AI 助手 + 知识库（RAG）`，支持对接云模型与本地模型，适合`个人/小团队`快速验证。在“多租户治理、复杂系统集成、生产化观测”等方面通常不如平台型产品。

**Dify、FastGPT**：`LLM 应用与工作流编排平台`，支持创建知识库，并把知识库接到对话应用、工作流、Agent 中，更适合“从 Demo 走向团队协作和应用交付”的场景。

**RAGFlow**：强调`复杂文档解析`、`高精度混合检索`、`重排`、`可视化干预`，适合把“文档解析质量”和“召回质量”看得很重的场景。这类工具的重点不是“能不能上传文件”，而是能不能把复杂文档解析成更适合检索和引用的知识片段。

**2.2.2 典型场景与选型建议**

**1. 个人知识管理（轻量级）**

- 需求：快速验证、低预算、个人/小团队使用，以“先跑起来”为主。
- 推荐工具：Cherry Studio / AnythingLLM / ima
- 理由：
  - 部署和操作简单，上手快
  - 适合接在线模型 API，也可接本地模型
  - 更适合做“个人知识助手”而不是复杂业务平台

**2. 应用化交付与团队协作（平台型场景）**

- 需求：将知识库能力封装成可复用 AI 应用、支持多人协作、工作流编排、权限与版本管理。
- 推荐工具：Dify / FastGPT
- 理由：
  - 知识库只是整个平台的一部分，后续还能接工作流、工具调用、Agent
  - 更适合与业务系统集成
  - 更贴近“内部产品交付”而不是单机个人使用

**3. 企业级文档解析（高精度需求）**

- 需求：处理复杂版式、长 PDF、扫描件、图文混排、表格等，强调解析质量与引用可追溯。
- 推荐工具：RAGFlow
- 理由：
  - 更强调文档理解与检索精度
  - 支持混合检索、重排与更强的文档处理链路
  - 适合把“RAG 效果”当成核心竞争力的场景

![Cherry Studio、AnythingLLM、Dify、FastGPT 与 RAGFlow 等知识库平台对比图](images/2/2-2-2-1.png)

---

## 3、Cherry Studio 搭建个人知识库

> 后续我们会重点拿 Coze 和 Dify 讲工作流和智能体，所以知识库这里，先选更适合个人快速上手的 **Cherry Studio** 和腾讯出品的 **ima**。

### 3.1 Cherry Studio 特点

Cherry Studio 更适合被理解成一个“**个人向、桌面化、模型聚合型 AI 工作台**”。它的优势不是企业平台能力，而是：上手快；图形化强；适合个人快速搭知识库和多模型对比。

**小白友好**：Cherry Studio 致力于降低技术门槛，零基础用户也能快速上手，让用户更专注于工作、学习或创作本身。

**一问多答**：支持同一问题通过多个模型同时生成回复，方便对比不同模型的表现。

![Cherry Studio 一问多答功能界面示意图](images/2/2-3-1-1.png)

**助手市场**：内置千余个行业专用助手，涵盖翻译、编程、写作等场景，同时支持自定义助手。

![Cherry Studio 助手市场界面示意图](images/2/2-3-1-2.png)

**服务商模型聚合**：支持 OpenAI、Gemini、Anthropic、Azure 等规范的三方服务商接入，兼容性较强。

![Cherry Studio 服务商模型聚合配置界面](images/2/2-3-1-3.png)

**数据安全**：支持全本地场景使用，结合本地大模型时，更适合对数据安全较敏感的用户。

### 3.2 LLM 的使用

在 Cherry Studio 里，知识库问答并不是“只要上传文件就行”。你至少要先把**聊天模型**和**Embedding 模型**两个角色理解清楚：

- **聊天模型（LLM）**：负责最后生成回答。
- **Embedding 模型**：负责把文档和问题变成向量，用于检索。

所以要先完成模型接入。

**步骤 1：下载与安装客户端工具**

下载地址：https://www.cherry-ai.com/download

**步骤 2：硅基流动注册账号**

这里的大模型服务，以硅基流动平台为例说明。

网址：https://siliconflow.cn/zh-cn/models

**步骤 3：创建 API 密钥**

![在硅基流动平台创建 API 密钥的界面](images/2/2-3-2-1.png)

**步骤 4：复制 API 密钥**

**步骤 5：配置 API 密钥**

![在 Cherry Studio 中配置 API 密钥的界面一](images/2/2-3-2-2.png)

**步骤 6：选择大语言模型**

![在 Cherry Studio 中选择大语言模型的界面一](images/2/2-3-2-3.png)

![在 Cherry Studio 中选择大语言模型的界面二](images/2/2-3-2-4.png)

到这里完成的是“生成模型”接入，也就是后面负责回答问题的那部分能力。

### 3.3 知识库的使用

这一部分是从“普通聊天”进入“知识库问答”的关键。建议你一边做，一边记住：**上传文档不是终点，能不能检索对、能不能基于知识库生成，才是效果关键。**

**步骤 1：添加嵌入模型**

根据下图确认名称：

![确认嵌入模型名称的界面示意图](images/2/2-3-3-1.png)

回到 Cherry Studio 添加：

![在 Cherry Studio 中添加嵌入模型的界面](images/2/2-3-3-2.png)

这一步对应的是 RAG 里的“Embedding”环节。后续上传文档建库、用户提问检索，都会依赖这一模型。

**步骤 2：创建知识库**

![在 Cherry Studio 中创建知识库的界面](images/2/2-3-3-3.png)

提供知识库内容：

![在 Cherry Studio 中向知识库导入文件、网页或文本内容的界面](images/2/2-3-3-4.png)

这里支持不同格式文件、文件夹、网页地址、大段文本内容等多种方式添加到知识库。

> 注意：上传文件如果包含大量手写内容、复杂表格、扫描件、公式或复杂版式，解析效果通常会明显下降。很多人以为“RAG 效果差”是模型问题，实际上常常是文档解析阶段已经出了问题。

**步骤 3：支持直接检索**

检索：

![Cherry Studio 知识库直接检索结果界面](images/2/2-3-3-5.png)

这里展示的是“先搜知识库”的能力。此时系统还没有让大模型长篇生成，而是在数据库中基于 RAG 思路做召回。相关片段和匹配得分都能看到，很适合用来排查效果。

**步骤 4：基于知识库生成**

选中后，提问：

![Cherry Studio 基于知识库生成回答的界面一](images/2/2-3-3-6.png)

![Cherry Studio 基于知识库生成回答的界面二](images/2/2-3-3-7.png)

这一步对应的才是“完整 RAG”：先检索，再增强上下文，再由模型生成答案。

**补充：增强文档解析能力**

如果上传文件中有手写内容、复杂表格、扫描件或复杂公式，解析效果会较差。此时可以先用专门的文档解析工具做预处理，再把处理后的内容上传到知识库。

使用工具：Doc2X

网址：https://doc2x.noedgeai.com/

![Doc2X 文档解析工具官网界面](images/2/2-3-3-8.png)

这里你要建立一个很实用的工程意识：

- **RAG 效果不是只由大模型决定**，还会受到文档质量、解析质量、切分质量、检索质量、重排质量和 Prompt 组织质量影响。
- 不是所有问题都该怪模型，很多问题发生在前面的数据链路里。

### 3.4 流程分析

![个人知识库从导入资料到检索生成的整体流程图](images/2/2-3-4-1.jpg)

Cherry Studio 这整套流程可以拆成：

1. 接好聊天模型
2. 接好 Embedding 模型
3. 上传文档并建知识库
4. 先检索相关内容
5. 再基于知识库生成回答

这条链路和前面第 1 节讲的 RAG 标准流程是一一对应的。也正因为如此，后面你切换到 Dify、LangChain、RAGFlow 时，虽然界面不同，但底层思路并没有变。

---

## 4、ima 搭建个人知识库

### 4.1 ima 特点

如果说 Cherry Studio 更像“桌面化模型工作台”，那么 **ima** 更像“更偏 C 端、更轻量、上手成本更低的知识助手”。它特别适合初学者快速体验“把资料接进模型”这件事。

- **操作简单、零上手成本**：界面和流程都很直观，更偏普通用户使用。
- **多端同步**：支持客户端、小程序、网页等多端访问与同步。
- **共享知识库**：支持将知识库分享给他人，方便协作与传递。
- **模型与入口**：通常会接入平台方提供或合作的大模型能力，并支持通过客户端、微信等入口提问，模型基于知识库生成答案。具体模型名称和入口形态会随产品版本变化。

在入门阶段，ima 的价值主要是：**很容易先建立“知识库问答”的使用直觉**。它的可定制化不如 Dify，但上手门槛更低。

### 4.2 搭建知识库过程

**步骤 1：下载与安装**

网址：https://ima.qq.com/

![ima 登录界面](images/2/2-4-2-1.png)

**步骤 2：新建知识库**

![在 ima 中新建知识库的界面](images/2/2-4-2-2.png)

**步骤 3：导入本地文件**

![在 ima 中导入本地文件的界面三](images/2/2-4-2-3.png)

**步骤 4：基于知识库「生成」**

![ima 基于知识库生成回答的界面一](images/2/2-4-2-4.png)

![ima 基于知识库生成回答的界面二](images/2/2-4-2-5.png)

这部分最值得你体会的是：即使平台界面和 Cherry Studio 不同，但底层做的事情仍然是同一套逻辑：

- 把文件导入
- 变成可检索内容
- 用户提问
- 检索知识
- 基于知识回答

### 4.3 组合互联网网页构成知识库

知识库不一定只来自本地文件，也可以来自网页内容。这个能力在做个人学习型知识库时很常用。

步骤 1：在微信公众号中搜索相关主题的文章，并将它们加入到 ima。

步骤 2：在 ima 中新建个人知识库，将相关文章加入到此知识库。

![在微信公众号中查找可加入知识库的文章界面一](images/2/2-4-3-1.png)

步骤 3：文章导入完成后，即可生成知识库，并基于大模型进行检索与问答。

![ima 基于网页文章构建知识库后的界面一](images/2/2-4-3-2.png)

这个案例很有代表性，因为它说明了一个重要认知：

> **知识库不等于“上传 PDF”**。只要资料能整理成可用文本，它就有机会成为知识库的一部分。

### 4.4 添加第三方知识库

![ima 查看第三方知识库的界面一](images/2/2-4-4-1.png)

![ima 查看第三方知识库的界面二](images/2/2-4-4-2.png)

这一点对应的是“知识库协作和复用”的能力。对于企业或团队来说，知识库的价值不只是你自己能查，而是它能成为多人共享的知识入口。

---

## 5、使用 Dify 搭建知识库

### 5.1 Dify 介绍

Dify 是一个开源的大语言模型（LLM）应用开发平台。和 Cherry Studio、ima 相比，它更偏向“**应用平台 + 工作流平台 + 知识库平台**”的综合形态。

这意味着 Dify 里的知识库不只是“让你自己问答”的工具，还可以继续被接到：

- 聊天应用
- 工作流
- Agent
- API 对外服务

结合官方文档，Dify 知识库可以理解为：

- 知识库是你自有数据的集合
- 每个知识库可以包含多个文档
- 每个文档最终会被切成多个分段（chunks）
- 应用在运行时会从这些分段中检索相关内容，再交给模型生成回答

所以，如果 Cherry Studio / ima 更像“个人先用起来”，Dify 更像“知识库要进入产品和工作流体系”。

### 5.2 源数据格式

通过 Dify，可以方便快捷地构建私有知识库，并进一步把知识库放到工作流和应用中协同使用。Dify 提供了相对完整的可视化界面来管理文档、分段、检索策略和应用接入。

目前 Dify 支持多种源数据格式，包括：

- **长文本内容**：TXT、Markdown、DOCX、HTML、JSON、PDF
- **结构化数据**：CSV、Excel

从 Dify 官方知识库文档的表述看，知识库里最关键的对象关系是：

- **Knowledge Base（知识库）**：整体容器
- **Document（文档）**：导入的文件或数据源
- **Chunk（分段）**：文档切分后的可检索片段

**注：** 私有知识库要达到较好效果，通常需要配合 **Embedding 模型**与 **Rerank 模型**使用。Embedding 决定“怎么找相关文本”，Rerank 决定“候选结果怎么重新排序”。在要求更高的场景下，Rerank 往往值得开启。

### 5.3 构建私有知识库

这一部分的重点不只是“按步骤点完”，更重要的是理解：**为什么这些参数会直接影响最终知识库问答质量。**

**步骤 1：首先创建一个新的知识库**

![在 Dify 中创建知识库的界面](images/2/2-5-3-1.png)

**步骤 2：上传知识库文件**

这里准备的是一份《刑法》的 TXT 格式文本，按自然段划分了每一条法条。

![在 Dify 中上传知识库文件的界面](images/2/2-5-3-2.png)

这个案例适合作为入门演示，因为法律条文天然分段清晰、知识边界明确，也更容易观察检索是否准确。

**步骤 3：分段设置**

大语言模型存在有限的上下文窗口，因此通常需要先把长文本进行分段，再从中召回与问题关联度最高的几个段落。分段太粗会带来噪音，分段太细又会把语义切碎，所以“怎么切块”是 RAG 里最关键的调参点之一。

分段标识符如果是 `\n`，则是以换行为一个分段；如果是 `\n\n`，则是以一个段落为一个分段。点击“预览块”可以查看目前块划分的情况。

分段重叠长度一般是分段最大长度的 `10%-20%`。

知识库文档中若有 URL、邮箱等，也可以在预处理时过滤掉。

**分段设置说明（这些项是干嘛的、对知识库有什么影响）**

| 配置项           | 作用                                                                 | 对知识库的影响                                                                                                                                               |
| ---------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **分段标识符**   | 决定“按什么边界”把长文切成小块。`\n` = 按换行切，`\n\n` = 按空行切。 | 选得合适，切出来的块语义更完整；选得不合适，可能把一整段话切碎，后面检索就容易只命中半句。                                                                   |
| **分段最大长度** | 单块文本的字数 / 字符上限，超过就再切一刀。                          | 设太大，单块里无关内容太多，容易把噪音带进 Prompt；设太小，语义被拆散，召回容易漏关键信息。一般可从 200～800 字（或约 100～500 token）起步，再按文档类型调。 |
| **分段重叠长度** | 相邻两块之间重复一段文字，避免边界处语义断裂。                       | 有一定重叠，边界上的句子不容易被截断；重叠太大则会造成内容重复、存储浪费和检索噪声。                                                                         |

![Dify 知识库分段设置界面](images/2/2-5-3-3.png)

**步骤 4：选择索引方式**

这里自动选择高质量。高质量的准确性更高，但 token 消耗也会增加；如果用的是本地部署模型，成本敏感度会低一些。

![Dify 知识库索引方式选择界面](images/2/2-5-3-4.png)

还有 **Q&A 方式**：如果文档本身就是问答对形式，这种方式通常更契合。

**步骤 5：检索设置**

在这里可选择 **Embedding 模型**与 **Rerank 模型**，也可以设置 Top K，也就是选出最相似的前 n 条。还可以设置 Score 阈值，即筛选文本的相似度下限。

![Dify 知识库检索设置界面](images/2/2-5-3-5.png)

混合检索：既包括向量检索（可选用 Rerank 模型做精排），也包含全文检索。

**检索设置说明（这些项是干嘛的、对知识库有什么影响）**

| 配置项             | 作用                                                                            | 对知识库的影响                                                                                                                               |
| ------------------ | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Embedding 模型** | 把“文档块”和“用户问题”都变成向量，用来算语义相似度。                            | 建库和检索必须用**同一个** Embedding 模型，否则向量不在同一个空间里，检索效果会明显变差。                                                    |
| **向量检索**       | 用问题向量在向量库里找“最像”的文档块。                                          | 是 RAG 的核心检索步骤，没有它就无法按语义从知识库中召回内容。                                                                                |
| **Rerank 模型**    | 在向量检索拿到一批候选块后，再用专门模型对“问题 + 每条候选”打更精细的相关性分。 | 不开 Rerank 时，只靠向量相似度，有时会混进“看起来相关但答非所问”的片段；开启后通常能显著提升最终送给模型的上下文质量，但也会增加延迟与成本。 |
| **Top K**          | 检索时最多取几条文档块交给后续步骤。                                            | K 太小，可能漏掉关键信息；K 太大，又容易把无关内容塞进上下文，增加噪音与 token 开销。一般可先试 5，再根据效果微调。                          |
| **Score 阈值**     | 相似度下限，只有达到阈值的块才会被保留。                                        | 阈值高，结果更干净但可能漏召回；阈值低，信息更全但噪音变多。排查效果时，可以根据“找不到内容”还是“召回太杂”来升降阈值。                       |
| **混合检索**       | 同时做向量检索和全文检索，再合并、去重、排序。                                  | 当文档里既有自然语言段落，又有条目编号、专有名词、法条编号时，混合检索通常比纯向量检索更稳。                                                 |

设置完成后，保存并处理即可。

![Dify 保存并处理知识库的界面](images/2/2-5-3-6.png)

这一节最值得你带走的工程结论是：

> **RAG 的效果，不是“上传完文件”那一刻决定的，而是由文档质量、切块策略、Embedding 质量、检索策略和重排策略共同决定的。**

如果你想继续把这些平台里的配置项和代码实现一一对上，可以把这一节和 [19-RAG检索增强生成](19-RAG检索增强生成.md) 的“文档加载器、文本分割器、检索器”几节对照着看，理解会更快。

### 5.4 测试

接下来进行测试。创建一个聊天助手，将提示词设置为：

```text
你是一个法律小助手，请只根据知识库中的信息，简要回答用户提问的案件触犯了哪些法律
```

知识库选择刚才添加的 `刑法.txt`，然后可以开始提问。

可以观察到，聊天助手会自动引用知识库中的内容进行回答。

![Dify 中基于知识库进行测试问答的界面](images/2/2-5-4-1.png)

这个案例和前面 Cherry Studio、ima 的案例一起看，会更容易形成完整理解：

- Cherry Studio：更适合个人快速搭一个知识库试试效果
- ima：更适合普通用户低门槛体验知识库问答
- Dify：更适合把知识库放进应用、工作流和团队协作环境里

---

**章节思考题：**

1. 如果一个知识库问答效果不好，你会先检查文档、切块、Embedding、检索参数还是提示词？为什么？

   **参考思路：** 先看问题表现。完全找不到资料，优先查文档是否入库、切块是否合理、Embedding 是否一致；召回很多杂内容，再调 Top K、阈值、Rerank；召回对了但回答乱，再看提示词和引用约束。

2. 为什么“上传了文件”不等于“知识库已经可用”？

   **参考思路：** 文件还要被解析、清洗、切块、向量化、写入索引，并且查询时能被正确召回。任何一环出问题，用户看到的都是“答不准”。知识库质量不是上传动作决定的，而是整条处理链路决定的。

3. Cherry Studio、ima、Dify 这类平台适合分别用来验证什么？

   **参考思路：** Cherry Studio 适合个人快速试效果，ima 适合低门槛体验知识库问答，Dify 更适合把知识库接进应用、工作流和团队协作。选择平台时看目标是个人验证、普通使用，还是工程交付。

4. 给一个新人解释 Top K、阈值、Rerank 时，你会用什么排查例子？

   **参考思路：** 可以用“查资料”类比：Top K 决定拿几段材料，阈值决定太不相关的材料要不要丢掉，Rerank 决定候选材料重新排序。答案漏信息时可能 K 太小或阈值太高，答案跑偏时可能 K 太大或缺少重排。

**本章小结：**

- **RAG 是什么**：检索（从你的文档里找相关段落）→ 增强（把段落塞进当前输入）→ 生成（大模型基于这些内容回答）；它不改模型参数，而是在运行时补上下文。
- **为什么需要 RAG**：它主要解决知识冻结、私有知识缺失、最新信息不可用和幻觉等问题。很多业务问题本质上不是“模型不会”，而是“模型没看到资料”。
- **知识库是什么**：知识库是承载外部知识的整体容器，不等于向量库。知识库背后通常包含文档、分块、Embedding、检索、元数据和检索策略等环节。
- **三类平台怎么理解**：Cherry Studio、ima 适合个人快速上手；Dify 更适合应用化交付和工作流集成；RAGFlow 更适合复杂文档解析和高精度检索场景。
- **真正影响效果的因素**：文档质量、解析质量、分块策略、Embedding 模型、Rerank、Top K、阈值，都会直接影响“查得准不准、答得稳不稳”。

**建议下一步：**

- 如果你想继续往平台化应用和工作流方向走，建议接着看 [3-基于Coze&Dify平台的智能体开发](3-基于Coze&Dify平台的智能体开发.md) 和 [4-Python调用Dify平台工作流](4-Python调用Dify平台工作流.md)。
- 如果你想从代码角度真正把 RAG 跑起来，建议先看 [18-向量数据库与Embedding实战](18-向量数据库与Embedding实战.md)，再继续看 [19-RAG检索增强生成](19-RAG检索增强生成.md)。
