如何用 DeepSeek 搭建自己的 RAG 知识库问答系统?
一、RAG 到底解决什么问题?
RAG,全称 Retrieval-Augmented Generation,中文通常叫“检索增强生成”。
普通大模型问答有一个明显问题:
模型只知道训练时学到的通用知识,不知道你的公司制度、产品文档、售后规则、项目资料、合同模板、实施手册和内部知识库。
如果直接把问题丢给大模型,它可能会:
- 编造答案;
- 回答过期信息;
- 不知道企业内部资料;
- 无法给出引用来源;
- 对制度、价格、合同、流程等内容乱猜。
RAG 的思路是:
用户问题 → 先从你的知识库里检索相关资料 → 把检索到的资料作为上下文交给大模型 → 让模型只基于这些资料回答 → 返回答案 + 引用来源一句话:
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 为:
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、自定义切片器 |
| 向量化 | 把文本变成 Embedding | DeepSeek 兼容生态 / 第三方 embedding 模型 |
| 向量库 | 存储和检索文本向量 | FAISS、Milvus、pgvector、Qdrant、Chroma |
| 检索器 | 根据问题找到相关片段 | top-k、混合检索、重排序 |
| 生成器 | 用 DeepSeek 根据上下文回答 | DeepSeek Chat Completion API |
| 引用与评估 | 返回来源、评分、反馈 | metadata、日志、人工评估集 |
整体流程:
文档上传 → 文档解析 → 文本清洗 → Chunk 切片 → Embedding 向量化 → 写入向量库 → 用户提问 → 问题向量化 → 检索相关 Chunk → 拼接上下文 Prompt → DeepSeek 生成答案 → 返回答案、引用来源、置信提示四、第一版技术选型建议
如果你是第一次搭 RAG,不建议一上来就用复杂微服务架构。
最小可用版本
| 模块 | 推荐选择 |
|---|---|
| 后端 | Python + FastAPI |
| 大模型 | DeepSeek API |
| 文档格式 | Markdown / TXT / PDF |
| 文本切片 | 自定义切片或 LangChain TextSplitter |
| Embedding | BGE / 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 分:
| 维度 | 权重 | 说明 |
|---|---|---|
| 接入难度 | 10 | API 和框架是否容易接入 |
| 检索准确率 | 20 | 能否找到正确文档片段 |
| 回答可靠性 | 20 | 是否基于资料回答,是否胡编 |
| 引用来源 | 15 | 是否能返回文件名、页码、段落 |
| 成本控制 | 15 | 模型调用和向量检索成本 |
| 响应速度 | 10 | 用户体验是否流畅 |
| 可扩展性 | 10 | 是否容易升级到企业系统 |
综合评分
| 维度 | 评分 | 说明 |
|---|---|---|
| 接入难度 | 90/100 | OpenAI 兼容,开发门槛低 |
| 检索准确率 | 84/100 | 取决于切片、Embedding 和重排序 |
| 回答可靠性 | 88/100 | Prompt 约束后表现稳定 |
| 引用来源 | 86/100 | 需要在 metadata 中提前保存来源 |
| 成本控制 | 91/100 | DeepSeek API 适合中高频问答 |
| 响应速度 | 85/100 | 与模型、top-k、上下文长度有关 |
| 可扩展性 | 87/100 | 可从本地 FAISS 平滑升级到 Milvus/pgvector |
综合评分:87 / 100
结论:
DeepSeek 非常适合做 RAG 系统的生成模型层,但 RAG 效果不是 DeepSeek 单独决定的,而是由文档质量、切片策略、Embedding、检索、重排序、Prompt 和评估共同决定。
六、项目目录结构
建议目录:
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示例:
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安装:
pipinstall-rrequirements.txt.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,因此可以这样调用:
fromopenaiimportOpenAIimportos client=OpenAI(api_key=