DeepSeek RAG 知识库搭建教程
从零开始,用 DeepSeek 和 LangChain 搭建企业级知识库问答系统。文档加载、向量嵌入、语义检索、带源引用的智能问答,完整代码,即学即用。
开始学习什么是 RAG?为什么需要它?
RAG(Retrieval-Augmented Generation,检索增强生成)是让大模型回答私有知识的核心技术。没有 RAG,大模型只能回答训练数据中的内容;有了 RAG,大模型可以基于你的文档、数据库、知识库进行准确回答。
RAG 原理概述
理解 RAG 的工作原理,是搭建高质量知识库的前提。RAG 由三个核心环节组成:检索(Retrieval)、增强(Augmented)、生成(Generation)。
RAG 的三个核心环节
| Retrieval(检索) | 将用户问题转换为向量,在向量数据库中找到最相关的文档片段。这是 RAG 的"查找"环节。 |
| Augmented(增强) | 将检索到的文档片段作为上下文,拼接到 Prompt 中。这是 RAG 的"注入知识"环节。 |
| Generation(生成) | DeepSeek 模型基于增强后的 Prompt 生成答案。这是 RAG 的"输出"环节。 |
RAG 架构流程
完整的 RAG 架构分为离线阶段和在线阶段两部分:
离线阶段(知识库构建):
- 文档加载:读取 PDF、TXT、Markdown、网页等各类文档
- 文本分割:将长文档切分为适当大小的文本块(Chunk)
- 向量嵌入:将文本块转换为向量表示
- 向量存储:将向量存入 ChromaDB 等向量数据库
在线阶段(问答):
- 用户提问:接收用户输入的问题
- 向量检索:将问题转为向量,在数据库中查找最相似的文本块
- 上下文拼接:将检索结果作为上下文,构建增强 Prompt
- 模型生成:DeepSeek 基于增强 Prompt 生成答案,并附上来源引用
RAG vs 微调(Fine-tuning)
| 对比维度 | RAG | 微调(Fine-tuning) |
|---|---|---|
| 知识更新 | 实时更新,增删文档即时生效 | 需要重新训练,周期长 |
| 成本 | 低,只需向量数据库 | 高,需要 GPU 训练资源 |
| 可解释性 | 可溯源到具体文档 | 黑盒,难以追溯知识来源 |
| 适用场景 | 知识库问答、文档检索、客服系统 | 风格模仿、特定领域术语、指令遵循 |
大多数企业场景推荐 RAG + 微调的组合方案:用 RAG 处理动态知识,用微调优化模型行为。了解更多模型细节请查看 DeepSeek 模型架构详解。
环境准备
安装必要的 Python 依赖包。以下命令一次性安装所有 RAG 开发所需的库。
安装核心依赖
DeepSeek API 配置
RAG 系统使用 DeepSeek API 作为生成模型。设置环境变量存储 API Key:
提示
如果你使用 Ollama 本地部署的 DeepSeek 模型,无需 API Key,只需将 API Base URL 指向 http://localhost:11434/v1。详见 DeepSeek 本地部署教程。
文档加载
LangChain 提供了丰富的文档加载器(Document Loader),支持 PDF、TXT、Markdown、网页、CSV 等多种格式。选择适合你文档格式的加载器。
加载 PDF 文档
加载 TXT 和 Markdown
加载网页
使用 Unstructured 加载通用文档
Unstructured 是一个强大的文档解析库,支持 PDF、Word、PPT、Excel、HTML、图片等 20+ 格式。推荐用于复杂文档场景:
文本分割
文本分割是 RAG 质量的关键环节。分割太大会导致检索不精准,分割太小会丢失上下文。LangChain 的 RecursiveCharacterTextSplitter 是最推荐的文本分割器。
RecursiveCharacterTextSplitter 核心参数
| 参数 | 说明 | 推荐值 |
|---|---|---|
| chunk_size | 每个文本块的最大字符数 | 500-1000 |
| chunk_overlap | 相邻文本块之间的重叠字符数 | 50-200 |
| separators | 分割优先级:先按段落,再按句子,最后按字符 | 默认即可 |
文本分割代码
文本分割最佳实践
- chunk_size 按内容类型调整:技术文档用 500-800,长篇文章用 800-1200,FAQ 类用 300-500
- chunk_overlap 不能省略:重叠可以避免关键信息被切分在边界处,建议设为 chunk_size 的 10%-20%
- 保留元数据:分割时保留文档来源、页码等元数据,方便后续溯源
- 中文分割:在 separators 中加入中文标点(。!?),确保按语义边界分割
- 先加载再分割:先加载完整文档,再统一分割,避免重复加载和分割
向量嵌入
向量嵌入是将文本转换为高维向量(数字数组)的过程。语义相近的文本,其向量在空间中距离更近。这是 RAG 检索的核心数学基础。
嵌入模型选择
| 模型名称 | 维度 | 中文支持 | 模型大小 | 推荐场景 |
|---|---|---|---|---|
| BAAI/bge-large-zh-v1.5 | 1024 | 极佳 | 1.3GB | 中文文档首选 |
| BAAI/bge-small-zh-v1.5 | 512 | 极佳 | 96MB | 轻量级中文 |
| sentence-transformers/all-MiniLM-L6-v2 | 384 | 一般 | 80MB | 英文为主 |
| shibing624/text2vec-base-chinese | 768 | 极佳 | 400MB | 中文语义匹配 |
向量嵌入代码
嵌入模型选择建议
中文文档强烈推荐 BGE 系列模型,在中文语义理解上明显优于通用英文模型。本地部署用 HuggingFaceEmbeddings 加载,无需 API 费用。如果追求极致性能和稳定性,可以使用云端嵌入 API。
向量数据库 — ChromaDB
ChromaDB 是轻量级开源向量数据库,专为 LLM 应用设计。无需独立服务器,数据保存在本地文件,完美适合中小规模 RAG 应用。
创建向量数据库并存储
加载已有的向量数据库
相似度搜索
其他向量数据库选项
- FAISS:Meta 开源的向量索引库,纯内存运算,检索速度极快,适合百万级数据
- Milvus:企业级分布式向量数据库,支持十亿级向量,适合大规模生产环境
- Weaviate:开源向量数据库,内置向量化和混合搜索,支持 GraphQL API
- Pinecone:商业向量数据库服务,免运维,适合不想管理基础设施的团队
- Qdrant:高性能 Rust 编写的向量数据库,支持过滤和分组检索
构建检索链
将向量检索和 DeepSeek 模型连接起来,构建完整的 RAG 问答链。LangChain 的 RetrievalQA 链封装了检索到生成的全流程。
构建 RetrievalQA 链
测试问答
chain_type 参数说明
| 类型 | 说明 | 适用场景 |
|---|---|---|
| stuff | 将所有检索结果一次性放入 Prompt | 文档较少(k <= 4),最常用 |
| map_reduce | 先对每个文档单独总结,再合并总结 | 文档多且长,需要全局理解 |
| refine | 逐个文档迭代优化答案 | 需要高质量答案,不介意延迟 |
| map_rerank | 对每个文档打分,选最高分答案 | 需要精确匹配特定文档 |
带源引用的问答
RAG 的核心优势之一是可溯源。每个答案都能追溯到具体的文档来源,让用户验证信息的准确性。下面展示如何在 UI 中呈现带源引用的问答结果。
格式化源引用
源引用在 Prompt 中的格式
在 Prompt 中要求模型在引用时标注来源编号,可以有效提高可追溯性:
构建 Web 问答 API
使用 FastAPI 将 RAG 系统封装为 Web API:
高级 RAG 技巧
基础 RAG 可以解决 80% 的场景,但复杂场景需要更高级的检索策略。以下技巧可以帮助你显著提升 RAG 系统的回答质量。
多查询检索(Multi-Query Retrieval)
用大模型将用户问题自动改写为多个不同角度的查询,分别检索后合并结果,提高召回率:
父文档检索器(Parent Document Retriever)
检索用小文本块(提高精度),但返回大文本块(保留上下文)。解决小 chunk 丢失上下文的问题:
上下文压缩(Contextual Compression)
检索到文档后,用压缩器提取与问题最相关的部分,去除冗余信息:
重排序(Re-ranking)
先用向量检索获取候选文档,再用精排模型对候选文档进行二次排序,大幅提升检索精度:
高级技巧总结
| 技巧 | 解决的问题 | 成本 |
|---|---|---|
| 多查询检索 | 用户问题表述不精确导致检索失败 | 额外 LLM 调用 |
| 父文档检索 | 小 chunk 丢失上下文 | 存储翻倍 |
| 上下文压缩 | 检索结果包含大量无关内容 | 额外 LLM 调用 |
| 重排序 | 向量检索不够精准 | 额外模型推理 |
完整实战项目
将前面所有步骤整合为一个完整的文档问答系统:加载 PDF 文件夹、创建向量数据库、交互式问答、带源引用输出。
完整代码:deepseek_rag.py
运行项目
与 Dify 集成
如果你不想写代码,Dify 平台提供了可视化的 RAG 知识库功能。将上述 RAG 概念应用到 Dify 中,无需编码即可搭建企业级知识库问答系统。
Dify 中的 RAG 对应关系
| RAG 环节 | 代码实现 | Dify 对应功能 |
|---|---|---|
| 文档加载 | PyPDFLoader / TextLoader | 知识库 → 上传文档(支持 PDF/Word/TXT/网页) |
| 文本分割 | RecursiveCharacterTextSplitter | 知识库 → 分段设置(自定义分段长度和重叠) |
| 向量嵌入 | HuggingFaceEmbeddings | 模型供应商 → 嵌入模型配置 |
| 向量存储 | ChromaDB | Dify 内置向量数据库(Qdrant/Weaviate/ChromaDB) |
| 检索 | vectorstore.similarity_search() | 知识库 → 召回设置(TopK、分数阈值) |
| 生成 | ChatOpenAI + RetrievalQA | 应用编排 → 添加 DeepSeek 模型 + 知识库节点 |
Dify 配置步骤
- 部署 Dify:使用 Docker Compose 一键部署(详见 DeepSeek 生态工具 中的 Dify 章节)
- 配置模型:在「设置 → 模型供应商」中添加 DeepSeek(OpenAI-API-compatible 方式)
- 创建知识库:上传文档,设置分段参数(chunk_size 500, chunk_overlap 100)
- 构建应用:创建「对话型应用」或「Agent」,在编排画布中添加知识库节点
- 发布使用:一键发布为 Web 应用或 API,支持内嵌到已有系统
Dify 的优势
- 可视化操作,无需编写代码
- 内置向量数据库,自动管理索引
- 支持混合检索(向量检索 + 关键词检索)
- 内置引用溯源,自动标注答案来源
- 对话日志和分析,持续优化问答效果
- 一键发布为 API,方便集成到业务系统
更多 Dify 使用技巧和 DeepSeek 集成方案,请查看 DeepSeek 生态工具 和 DeepSeek 部署教程。
DeepSeek RAG 知识库常见问题
DeepSeek 相关教程
深入学习 DeepSeek 模型的使用、部署和生态工具。