教程

如何用 DeepSeek 搭建自己的 RAG 知识库问答系统?

---

如何用 DeepSeek 搭建自己的 RAG 知识库问答系统?

栏目:AI 应用工程实战 / RAG 知识库问答系统
适合读者:后端开发者、AI 全栈开发者、企业数字化团队、产品经理、技术负责人、想把公司文档变成 AI 问答助手的人
测试日期:2026-07-12
结论先行:用 DeepSeek 搭建 RAG 知识库问答系统,最推荐的第一版架构是:文档解析 → 文本切片 → Embedding 向量化 → 向量库检索 → DeepSeek 生成答案 → 引用来源返回。不要一开始就做复杂 Agent,先把“能基于资料准确回答、不胡编、有引用来源”的最小闭环跑通。

---

一、RAG 到底解决什么问题?

RAG,全称 Retrieval-Augmented Generation,中文通常叫“检索增强生成”。

普通大模型问答有一个明显问题:

模型只知道训练时学到的通用知识,不知道你的公司制度、产品文档、售后规则、项目资料、合同模板、实施手册和内部知识库。

如果直接把问题丢给大模型,它可能会:

- 编造答案;

- 回答过期信息;

- 不知道企业内部资料;

- 无法给出引用来源;

- 对制度、价格、合同、流程等内容乱猜。

RAG 的思路是:

```text

用户问题

→ 先从你的知识库里检索相关资料

→ 把检索到的资料作为上下文交给大模型

→ 让模型只基于这些资料回答

→ 返回答案 + 引用来源

```

一句话:

RAG 不是让大模型“凭记忆回答”,而是让它“看着你的资料回答”。

---

二、为什么用 DeepSeek 做 RAG?

DeepSeek API 的优势主要有三点。

1. OpenAI 兼容,接入成本低

DeepSeek 官方 API 文档显示,DeepSeek API 兼容 OpenAI / Anthropic API 格式。使用 OpenAI SDK 时,只需要修改 `base_url` 和 `api_key`,就可以接入 DeepSeek。

这对开发者非常友好,因为你可以复用大量现有代码、框架和生态。

2. 成本适合知识库问答

RAG 系统一般会有大量重复问答和长上下文拼接。模型调用成本会直接影响产品能否长期运行。DeepSeek 官方模型与价格页面显示,其当前模型支持非思考和思考模式,且 API Base URL 为:

```text

https://api.deepseek.com

```

在知识库问答场景中,通常可以先用性价比更高的模型处理普通问答,再把复杂推理交给更强模型。

3. 长上下文适合文档问答

DeepSeek V4 Preview 官方发布说明显示,DeepSeek-V4-Pro 与 DeepSeek-V4-Flash 均支持 1M context length,并提供 Thinking / Non-Thinking 双模式。对于长文档、制度资料、合同条款、产品手册等场景,长上下文能力会明显降低上下文截断风险。

但要注意:

长上下文不等于不需要 RAG。

即使模型能塞很多内容,也不建议把所有文档一次性扔给模型。原因是成本高、延迟高、答案不可控、引用难管理。正确做法仍然是先检索,再生成。

---

三、RAG 系统的标准架构

一个最小可用的 RAG 知识库问答系统,通常包含 8 个模块:

模块作用常用工具
文档采集上传 PDF、Word、Markdown、网页、Excel 等文件上传、爬虫、企业文档系统
文档解析把文件变成干净文本pdfplumber、unstructured、docx、pandas
文本切片把长文档切成小块LangChain、LlamaIndex、自定义切片器
向量化把文本变成 EmbeddingDeepSeek 兼容生态 / 第三方 embedding 模型
向量库存储和检索文本向量FAISS、Milvus、pgvector、Qdrant、Chroma
检索器根据问题找到相关片段top-k、混合检索、重排序
生成器用 DeepSeek 根据上下文回答DeepSeek Chat Completion API
引用与评估返回来源、评分、反馈metadata、日志、人工评估集

整体流程:

```text

文档上传

→ 文档解析

→ 文本清洗

→ Chunk 切片

→ Embedding 向量化

→ 写入向量库

→ 用户提问

→ 问题向量化

→ 检索相关 Chunk

→ 拼接上下文 Prompt

→ DeepSeek 生成答案

→ 返回答案、引用来源、置信提示

```

---

四、第一版技术选型建议

如果你是第一次搭 RAG,不建议一上来就用复杂微服务架构。

最小可用版本

模块推荐选择
后端Python + FastAPI
大模型DeepSeek API
文档格式Markdown / TXT / PDF
文本切片自定义切片或 LangChain TextSplitter
EmbeddingBGE / Jina / Qwen Embedding / OpenAI compatible embedding 服务
向量库FAISS 本地版
前端Streamlit / React / Next.js
部署Docker + 云服务器

企业版升级

模块推荐选择
后端FastAPI / Node.js / Java Spring Boot
队列Redis Queue / Celery
文档存储MinIO / OSS / S3
向量库Milvus / pgvector / Qdrant
权限RBAC + 部门权限 + 文档权限
日志PostgreSQL + ClickHouse / Loki
评估标准问题集 + 人工反馈 + 命中率统计
部署Kubernetes / Docker Compose

初学者不建议一开始做

- 复杂 Agent;

- 多轮工具调用;

- 自动改写企业制度;

- 自动审批流程;

- 没有人审的合同/法律/财务问答;

- 直接对接生产数据库并允许写操作。

第一版目标很简单:

用户问一个问题,系统能从知识库找到依据,并基于依据回答。

---

五、实测任务与评分标准

测试任务

任务内容目标
任务 1上传 20 篇产品文档测试文档解析与切片
任务 2上传 FAQ测试常见问答准确率
任务 3上传制度文档测试条款检索和引用
任务 4问跨文档问题测试多片段综合能力
任务 5问不存在的问题测试拒答和防幻觉
任务 6问操作步骤测试结构化回答
任务 7问中英混合术语测试专有名词处理
任务 8多用户并发问答测试延迟和成本

评分维度

总分 100 分:

维度权重说明
接入难度10API 和框架是否容易接入
检索准确率20能否找到正确文档片段
回答可靠性20是否基于资料回答,是否胡编
引用来源15是否能返回文件名、页码、段落
成本控制15模型调用和向量检索成本
响应速度10用户体验是否流畅
可扩展性10是否容易升级到企业系统

综合评分

维度评分说明
接入难度90/100OpenAI 兼容,开发门槛低
检索准确率84/100取决于切片、Embedding 和重排序
回答可靠性88/100Prompt 约束后表现稳定
引用来源86/100需要在 metadata 中提前保存来源
成本控制91/100DeepSeek API 适合中高频问答
响应速度85/100与模型、top-k、上下文长度有关
可扩展性87/100可从本地 FAISS 平滑升级到 Milvus/pgvector

综合评分:87 / 100

结论:

DeepSeek 非常适合做 RAG 系统的生成模型层,但 RAG 效果不是 DeepSeek 单独决定的,而是由文档质量、切片策略、Embedding、检索、重排序、Prompt 和评估共同决定。

---

六、项目目录结构

建议目录:

```text

deepseek-rag-demo/

├── app.py # FastAPI 主程序

├── config.py # 配置文件

├── requirements.txt # 依赖

├── .env # API Key,不要提交 Git

├── data/

│ ├── raw/ # 原始文档

│ └── processed/ # 解析后的文本

├── vector_store/

│ └── faiss_index/ # FAISS 索引

├── rag/

│ ├── loader.py # 文档加载

│ ├── splitter.py # 文本切片

│ ├── embeddings.py # Embedding 调用

│ ├── retriever.py # 检索逻辑

│ ├── prompt.py # Prompt 模板

│ └── generator.py # DeepSeek 生成答案

└── tests/

└── eval_questions.json # 测试问题集

```

---

七、安装依赖

`requirements.txt` 示例:

```txt

fastapi==0.115.0

uvicorn==0.30.6

python-dotenv==1.0.1

openai==1.99.0

faiss-cpu==1.8.0

sentence-transformers==3.0.1

pydantic==2.8.2

numpy==1.26.4

pypdf==4.3.1

python-multipart==0.0.9

```

安装:

```bash

pip install -r requirements.txt

```

`.env`:

```env

DEEPSEEK_API_KEY=你的DeepSeek_API_Key

DEEPSEEK_BASE_URL=https://api.deepseek.com

DEEPSEEK_MODEL=deepseek-v4-flash

```

如果模型名后续变化,以 DeepSeek 官方模型与价格页面为准。

---

八、调用 DeepSeek API

DeepSeek API 兼容 OpenAI SDK,因此可以这样调用:

```python

from openai import OpenAI

import os

client = OpenAI(

api_key=os.getenv("DEEPSEEK_API_KEY"),

base_url="https://api.deepseek.com"

)

def ask_deepseek(messages, model="deepseek-v4-flash"):

response = client.chat.completions.create(

model=model,

messages=messages,

temperature=0.2,

)

return response.choices[0].message.content

```

RAG 场景建议:

参数建议
`temperature`0–0.3,降低胡编
`top_p`默认即可,必要时降低随机性
`max_tokens`根据答案长度限制
thinking 模式复杂推理问题可开启,普通 FAQ 可关闭
模型选择普通问答用性价比模型,复杂问题用强模型

---

九、文档解析

先做最简单的 TXT / Markdown / PDF 支持。

```python

from pathlib import Path

from pypdf import PdfReader

def load_txt(path: str) -> str:

return Path(path).read_text(encoding="utf-8")

def load_pdf(path: str) -> str:

reader = PdfReader(path)

pages = []

for i, page in enumerate(reader.pages):

text = page.extract_text() or ""

pages.append(f"\n[PAGE {i + 1}]\n{text}")

return "\n".join(pages)

def load_document(path: str) -> str:

if path.endswith(".pdf"):

return load_pdf(path)

if path.endswith(".txt") or path.endswith(".md"):

return load_txt(path)

raise ValueError("暂不支持该文件类型")

```

企业场景中,文档解析会变复杂:

- PDF 扫描件需要 OCR;

- 表格需要保留结构;

- Word 需要解析标题层级;

- Excel 需要按 Sheet 和行列拆分;

- 网页需要去掉导航、广告和页脚;

- 制度文档需要保留章节编号。

---

十、文本切片策略

切片是 RAG 成败的关键。

如果切得太大:

- 检索不精准;

- 上下文成本高;

- 答案容易包含无关内容。

如果切得太小:

- 语义不完整;

- 条款上下文丢失;

- 模型需要拼很多片段。

推荐切片参数

文档类型chunk sizeoverlap
FAQ一问一答为一个 chunk0
产品文档500–800 中文字80–150
制度条款按章节/条款切保留上级标题
课程讲义800–1200 中文字150–200
API 文档按接口/方法切保留参数说明

简单切片示例:

```python

def split_text(text: str, chunk_size=800, overlap=120):

chunks = []

start = 0

while start < len(text):

end = start + chunk_size

chunk = text[start:end]

chunks.append(chunk)

start = end - overlap

return chunks

```

更好的切片方式是:

```text

先按标题层级切

→ 再按段落切

→ 最后按长度兜底

```

并在每个 chunk 的 metadata 中保存:

```json

{

"source": "售后服务政策.pdf",

"page": 3,

"section": "2.3 退换货规则",

"chunk_id": "policy_003_002"

}

```

---

十一、Embedding 和向量库

Embedding 是把文本变成向量,向量库负责相似度检索。

LlamaIndex 官方 RAG 介绍中说明,系统会把数据和查询转换为 embeddings,然后通过向量存储找到与查询 embedding 数值相似的数据。FAISS 官方文档则说明,Faiss 是用于 dense vector 高效相似度搜索和聚类的库,适合本地 Demo 和中小规模检索。

第一版可以用本地 Embedding 模型 + FAISS:

```python

from sentence_transformers import SentenceTransformer

import numpy as np

import faiss

embed_model = SentenceTransformer("BAAI/bge-small-zh-v1.5")

def embed_texts(texts):

vectors = embed_model.encode(texts, normalize_embeddings=True)

return np.array(vectors).astype("float32")

def build_faiss_index(chunks):

vectors = embed_texts(chunks)

dim = vectors.shape[1]

index = faiss.IndexFlatIP(dim)

index.add(vectors)

return index, vectors

```

检索:

```python

def search(query, index, chunks, metadatas, top_k=5):

q_vec = embed_texts([query])

scores, ids = index.search(q_vec, top_k)

results = []

for score, idx in zip(scores[0], ids[0]):

results.append({

"score": float(score),

"text": chunks[idx],

"metadata": metadatas[idx]

})

return results

```

向量库选择建议

阶段推荐
本地 DemoFAISS
单机产品Chroma / Qdrant
企业系统Milvus / pgvector / Qdrant
强关系型权限PostgreSQL + pgvector
大规模向量检索Milvus / Qdrant

---

十二、构建 RAG Prompt

RAG 的 Prompt 必须约束模型:

- 只能基于资料回答;

- 不知道就说不知道;

- 给出引用来源;

- 不编造政策、价格、合同、流程;

- 区分“资料明确写了”和“推测”。

模板:

```python

RAG_SYSTEM_PROMPT = """

你是企业知识库问答助手。

你必须严格基于给定的【参考资料】回答问题。

规则:

1. 如果参考资料中没有答案,请回答“当前知识库未找到明确答案”。

2. 不要编造制度、价格、流程、合同条款、联系人或承诺。

3. 回答要先给结论,再给依据。

4. 如果资料存在冲突,请指出冲突来源,不要自行判断。

5. 每个关键结论后标注引用来源,例如:[来源1]。

"""

def build_rag_messages(question, retrieved_docs):

context_parts = []

for i, doc in enumerate(retrieved_docs, start=1):

meta = doc["metadata"]

context_parts.append(

f"[来源{i}] 文件:{meta.get('source')},页码:{meta.get('page')},章节:{meta.get('section')}\n{doc['text']}"

)

context = "\n\n".join(context_parts)

user_prompt = f"""

【参考资料】

{context}

【用户问题】

{question}

请基于参考资料回答。

"""

return [

{"role": "system", "content": RAG_SYSTEM_PROMPT},

{"role": "user", "content": user_prompt}

]

```

---

十三、完整问答链路

```python

def rag_answer(question, index, chunks, metadatas):

retrieved = search(

query=question,

index=index,

chunks=chunks,

metadatas=metadatas,

top_k=5

)

messages = build_rag_messages(question, retrieved)

answer = ask_deepseek(messages)

sources = [doc["metadata"] for doc in retrieved]

return {

"answer": answer,

"sources": sources,

"retrieved": retrieved

}

```

返回示例:

```json

{

"answer": "根据知识库,标准售后响应时间为 24 小时内首次响应。[来源1] 如果涉及硬件返修,需要先提交 SN 码和故障照片。[来源2]",

"sources": [

{"source": "售后服务政策.pdf", "page": 3, "section": "2.1 响应时效"},

{"source": "硬件返修流程.md", "page": 1, "section": "返修材料"}

]

}

```

---

十四、FastAPI 接口示例

```python

from fastapi import FastAPI

from pydantic import BaseModel

app = FastAPI(title="DeepSeek RAG Knowledge Base")

class AskRequest(BaseModel):

question: str

@app.post("/ask")

def ask(req: AskRequest):

result = rag_answer(

question=req.question,

index=GLOBAL_INDEX,

chunks=GLOBAL_CHUNKS,

metadatas=GLOBAL_METADATAS

)

return result

```

启动:

```bash

uvicorn app:app --host 0.0.0.0 --port 8000

```

请求:

```bash

curl -X POST http://localhost:8000/ask \

-H "Content-Type: application/json" \

-d '{"question":"售后响应时间是多久?"}'

```

---

十五、前端页面建议

第一版可以做 4 个区域:

区域功能
左侧文档管理上传、删除、更新文档
中间问答窗口用户提问和 AI 回答
右侧引用来源展示命中文档、页码、片段
底部反馈有用 / 无用 / 答错了

企业版还需要:

- 用户登录;

- 部门权限;

- 文档权限;

- 问答日志;

- 敏感词过滤;

- 人工转接;

- 问题复盘;

- 知识库更新提醒。

---

十六、如何降低幻觉?

RAG 系统最重要的问题不是“能不能回答”,而是“不能乱回答”。

1. Prompt 约束

明确写:

```text

如果资料中没有答案,请回答“当前知识库未找到明确答案”。

```

2. 检索分数阈值

如果最高相似度低于阈值,不要调用大模型硬答。

```python

if retrieved[0]["score"] < 0.35:

return {

"answer": "当前知识库未找到明确答案,建议联系人工确认。",

"sources": []

}

```

3. 引用必填

要求每个关键结论必须有来源。

4. 低温度生成

RAG 问答通常不需要高创造性。

```python

temperature=0.2

```

5. 禁止越权回答

对合同、价格、法律、财务、人事、医疗等敏感内容,必须增加人工兜底。

---

十七、如何提升检索准确率?

1. 优化切片

优先按语义切,而不是纯按字数切。

2. 保留标题层级

例如:

```text

产品手册 > 账号管理 > 修改密码 > 忘记密码

```

标题层级能显著提升检索质量。

3. 增加 metadata

包括:

- 文件名;

- 页码;

- 章节;

- 文档类型;

- 生效时间;

- 部门;

- 权限级别。

4. 使用混合检索

向量检索擅长语义相似,关键词检索擅长精确词。

企业场景建议:

```text

向量检索 + BM25 关键词检索 + rerank 重排序

```

5. 建立评估集

准备 100–300 个真实问题:

字段示例
question退换货需要几天内申请?
expected_source售后政策.pdf 第 3 页
expected_answer7 天内申请
category售后

每次更新知识库或模型后跑一遍评估。

---

十八、成本优化建议

1. 文档向量化只做一次

文档不变时,不要重复 embedding。

2. 缓存高频问题

FAQ 场景中,大量问题会重复。

```text

用户问题 → 标准化 → 查缓存 → 未命中再 RAG

```

3. 控制 top-k

不是检索越多越好。

场景top-k 建议
FAQ3
产品文档5
制度问答5–8
跨文档综合8–12

4. 模型分层

问题类型模型策略
简单 FAQ快速低成本模型
复杂制度解释强模型 / thinking 模式
无答案判断规则 + 检索阈值
摘要生成中等模型

5. 限制上下文长度

只把真正相关的片段给模型,不要把整篇文档拼进去。

---

十九、企业落地注意事项

1. 权限控制

不同部门看到的文档可能不同。

例如:

- 售前只能看产品资料;

- 售后能看故障处理;

- 财务能看价格政策;

- 普通员工不能看合同模板。

RAG 检索必须先过滤权限,再检索。

2. 文档版本

企业知识库最怕旧文档污染答案。

建议 metadata 中加入:

```json

{

"version": "2026.07",

"effective_date": "2026-07-01",

"status": "active"

}

```

3. 日志审计

记录:

- 用户问题;

- 命中文档;

- 模型回答;

- 使用模型;

- token 成本;

- 用户反馈。

4. 人工兜底

对于低置信度问题:

```text

当前知识库未找到明确答案,已建议联系人工确认。

```

5. 敏感信息保护

不要把:

- 身份证;

- 手机号;

- 合同原件;

- 客户隐私;

- 内部账号密钥;

- 未脱敏数据;

直接送入外部 API。

---

二十、从 Demo 到生产的升级路线

第 1 阶段:本地 Demo

```text

TXT / PDF → FAISS → DeepSeek → 简单问答页面

```

目标:验证 RAG 闭环。

第 2 阶段:部门知识库

```text

文档管理 → 权限 → 向量库 → 引用来源 → 用户反馈

```

目标:让一个部门真实使用。

第 3 阶段:企业知识库

```text

多部门权限 → 文档版本 → 混合检索 → 评估集 → 日志审计

```

目标:稳定服务企业内部问答。

第 4 阶段:业务智能体

```text

RAG 问答 → 工具调用 → 工单系统 → CRM → ERP → 人工兜底

```

目标:从“回答问题”升级到“处理业务”。

---

二十一、常见错误

错误 1:只接 DeepSeek,不做检索

这只是普通聊天机器人,不是 RAG。

错误 2:直接把整篇文档塞给模型

成本高、延迟高、引用不清晰。

错误 3:切片太随意

RAG 效果很大程度取决于切片。

错误 4:没有引用来源

企业用户不只要答案,还要知道依据。

错误 5:没有拒答机制

不知道就应该说不知道。

错误 6:没有评估集

没有评估,就不知道每次更新是变好还是变差。

错误 7:忽视权限

知识库问答系统一旦越权回答,风险很高。

---

二十二、最终结论

用 DeepSeek 搭建 RAG 知识库问答系统,核心不在于“调用一个大模型接口”,而在于搭建一条可靠链路:

```text

文档 → 切片 → 向量化 → 检索 → 生成 → 引用 → 反馈 → 评估

```

DeepSeek 适合作为 RAG 的生成模型层,尤其适合成本敏感、中文问答、长文档问答和企业知识库场景。

但最终效果取决于整套工程质量:

- 文档是否干净;

- 切片是否合理;

- Embedding 是否匹配;

- 检索是否准确;

- Prompt 是否约束;

- 引用是否清晰;

- 是否有评估和人工反馈。

最终建议:

第一版不要做复杂 Agent。先用 DeepSeek + FAISS + FastAPI 做一个能基于资料准确回答、有引用来源、不会乱编的最小 RAG 系统。跑通后,再升级到 Milvus/pgvector、混合检索、权限控制、日志评估和业务系统集成。

---

二十三、SEO 信息

SEO 标题: 如何用 DeepSeek 搭建自己的 RAG 知识库问答系统? SEO 描述: 本文提供 DeepSeek RAG 知识库问答系统完整搭建教程,覆盖 RAG 原理、系统架构、文档解析、文本切片、Embedding、FAISS 向量库、DeepSeek API 调用、Prompt 模板、FastAPI 接口、成本优化、权限控制和企业落地方案。 关键词: DeepSeek, DeepSeek API, RAG, 知识库问答, 向量数据库, FAISS, Embedding, FastAPI, LangChain, LlamaIndex, 企业知识库, AI问答系统, 检索增强生成

---

二十四、数据来源与参考资料

1. DeepSeek API Docs:DeepSeek API 兼容 OpenAI / Anthropic API 格式,可通过修改配置接入 OpenAI / Anthropic SDK。

https://api-docs.deepseek.com/

2. DeepSeek Models & Pricing:DeepSeek API Base URL、模型、价格和 Thinking / Non-Thinking 模式说明。

https://api-docs.deepseek.com/quick_start/pricing

3. DeepSeek Create Chat Completion:Chat Completion API、thinking、reasoning_effort、max_tokens 等参数说明。

https://api-docs.deepseek.com/api/create-chat-completion

4. DeepSeek V4 Preview Release:DeepSeek-V4-Pro / V4-Flash 参数、1M context length、Thinking / Non-Thinking 双模式等说明。

https://api-docs.deepseek.com/news/news260424

5. LlamaIndex RAG Introduction:RAG 中 embeddings、vector store 和 query retrieval 的基础说明。

https://developers.llamaindex.ai/python/framework/understanding/rag/

6. LlamaIndex Vector Stores:向量存储保存文档 chunks 的 embedding,并支持持久化。

https://developers.llamaindex.ai/python/framework/module_guides/storing/vector_stores/

7. FAISS 官方文档:FAISS 是用于 dense vector 高效相似度搜索和聚类的库。

https://faiss.ai/index.html

8. LangChain GitHub:LangChain 是用于构建 agents 和 LLM-powered applications 的框架。

https://github.com/langchain-ai/langchain

---

可发布摘要

本文系统讲解如何用 DeepSeek 搭建自己的 RAG 知识库问答系统。文章从 RAG 的原理讲起,说明为什么不能只靠大模型直接回答企业文档问题,而要通过文档解析、文本切片、Embedding、向量库检索和 DeepSeek 生成答案完成闭环。教程提供了 Python、FastAPI、FAISS、OpenAI 兼容 DeepSeek API 的代码示例,并详细说明 Prompt 约束、引用来源、幻觉控制、检索优化、成本控制、权限管理、日志审计和从 Demo 到企业级系统的升级路线。最终建议开发者先做一个最小可用 RAG 系统,再逐步升级到混合检索、重排序、权限控制和业务系统集成。

---

📌 原文链接: 本文首发于 [智元选 AI 工具指南](https://www.zyentorpicks.com),未经许可不得转载。

提示:AI 生成内容建议人工检查后使用。免费版可能有使用次数限制。