从零开始构建 RAG + DeepSeek Demo
本地 Python 环境 · 向量检索 · 大模型问答
一、什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将「向量检索」与「大模型生成」结合的架构,核心思路是:
- 将私有文档切片,用 Embedding 模型转为向量,存入向量数据库
- 用户提问时,先检索最相关的文档片段
- 将检索到的片段作为上下文(Context)拼接进 Prompt,让 LLM 作答
这样既避免了大模型「幻觉」,也无需重新训练模型,是目前企业落地 AI 知识库的主流方案。
本 Demo 技术栈:
| 组件 | 选型 |
|---|---|
| Embedding 模型 | sentence-transformers / all-MiniLM-L6-v2(本地,免费) |
| 向量数据库 | ChromaDB(本地内存模式) |
| LLM | DeepSeek Chat(API 调用) |
| 运行环境 | 本地 Python 3.11 虚拟环境(venv) |
二、环境准备
2.1 前置要求
- Python 3.11(推荐,兼容性最佳, 3.14会有兼容性错误)
- pip 已更新至最新版
- 已注册 DeepSeek 账号并获取 API Key:platform.deepseek.com
2.2 创建并进入虚拟环境
在项目目录下打开终端,依次执行:
bash
# macOS
python -m venv venv
source venv/bin/activate
激活成功后,终端提示符前方会显示 (venv),例如:
ruby
(venv) user@machine:rag-demo %
注意:以下所有命令都应在激活虚拟环境后执行,确保依赖隔离不影响系统环境。
2.3 安装依赖
在已激活的虚拟环境中,逐行安装三个核心库:
bash
# 1. Sentence Transformers ------ 本地 Embedding 模型
pip install sentence-transformers
# 2. ChromaDB ------ 本地向量数据库
pip install chromadb
# 3. OpenAI SDK ------ 兼容 DeepSeek API
pip install openai
首次安装 sentence-transformers 会自动下载模型权重(约 90 MB),请保持网络畅通。
2.4 设置 DeepSeek API Key
DeepSeek 的 API 与 OpenAI 接口格式兼容,只需替换 base_url 与 api_key。推荐将 Key 设置为环境变量,避免硬编码在代码中:
bash
# macOS / Linux
export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxx"
# Windows (PowerShell)
$env:DEEPSEEK_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxx"
安全提示: 请勿将 API Key 提交到 Git 仓库,在 .gitignore 中添加 .env。
三、准备知识库文件 data.txt
RAG 的第一步是准备「知识库」。本 Demo 使用一个纯文本文件 data.txt,每个知识段落之间用**空行(双换行)**分隔。
在项目目录创建 data.txt,内容示例:
css
DeepSeek 是由深度求索公司开发的大语言模型,支持中英文对话。
它提供了与 OpenAI 兼容的 API 接口,开发者可以低成本接入。
RAG(检索增强生成)通过向量数据库检索相关文档,
将检索结果作为上下文传给大模型,有效减少幻觉。
ChromaDB 是一个轻量级的本地向量数据库,
支持内存模式与持久化模式,适合快速原型开发。
sentence-transformers 提供了多种预训练 Embedding 模型,
all-MiniLM-L6-v2 体积小、速度快,适合本地运行。
实际使用时,可以将公司文档、FAQ、产品手册等内容按段落整理到此文件中。
四、核心代码 main.py 详解
4.1 完整代码
python
from sentence_transformers import SentenceTransformer
import chromadb
from openai import OpenAI
import os
# 1. 加载 Embedding 模型(本地,首次运行自动下载)
model = SentenceTransformer("all-MiniLM-L6-v2")
# 2. 创建内存向量数据库
client = chromadb.Client()
collection = client.create_collection("docs")
# 3. 读取知识库,按空行切分为段落列表
with open("data.txt", "r", encoding="utf-8") as f:
docs = f.read().split("\n\n")
# 4. 批量生成段落的向量表示
embeddings = model.encode(docs).tolist()
# 5. 将文档与向量存入 ChromaDB
collection.add(
documents=docs,
embeddings=embeddings,
ids=[str(i) for i in range(len(docs))]
)
# 6. 初始化 DeepSeek 客户端(复用 OpenAI SDK)
llm = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
# 7. 接收用户提问
query = input("请输入问题: ")
# 8. 将问题也转为向量
query_embedding = model.encode(query).tolist()
# 9. 在向量数据库中检索最相关的 3 个段落
results = collection.query(
query_embeddings=[query_embedding],
n_results=3
)
# 10. 打印检索到的相关内容
print("\n最相关内容:")
top_docs = results["documents"][0]
for doc in top_docs:
print("-", doc)
# 11. 将检索结果拼接为上下文
context = "\n".join(top_docs)
# 12. 构造包含上下文的 Prompt
prompt = f"""
请根据以下内容回答问题。
内容:
{context}
问题:
{query}
如果答案不在内容中,请回答:我不知道。
"""
# 13. 调用 DeepSeek LLM 生成答案
response = llm.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": prompt}]
)
# 14. 输出最终答案
print("\n最终答案:")
print(response.choices[0].message.content)
4.2 各步骤说明
步骤 1-2:加载模型与数据库
SentenceTransformer("all-MiniLM-L6-v2") 会从 HuggingFace 下载并缓存模型。chromadb.Client() 创建纯内存数据库,程序退出后数据不保存(适合 Demo)。
步骤 3-5:构建向量索引
将 data.txt 按双换行分割为段落,批量计算每段的 384 维向量,存入 ChromaDB。每个文档分配唯一 ID(字符串类型)。
步骤 6:初始化 DeepSeek 客户端
DeepSeek 提供了完全兼容 OpenAI SDK 的 API,只需替换 base_url 即可。API Key 从环境变量读取,避免硬编码。
步骤 7-9:向量检索
将用户的问题同样转为向量,在向量数据库中做余弦相似度搜索,返回最相关的 3 个段落。
步骤 10-12:构造 Prompt
将检索到的段落拼接为上下文,构造 Prompt 告诉 LLM「只根据以下内容作答,如果不知道就说不知道」。这是 RAG 的核心,防止模型凭空捏造。
步骤 13-14:调用 LLM 并输出
model="deepseek-chat" 是 DeepSeek 当前的通用对话模型,支持中英文。response.choices[0].message.content 获取模型回复文本。
五、运行 Demo
5.1 目录结构
bash
rag-demo/
├── venv/ # 虚拟环境(不提交到 Git)
├── data.txt # 知识库文件
├── main.py # 主程序
└── .gitignore # 建议忽略 .venv/ 和 .env
5.2 执行命令
bash
# 确保虚拟环境已激活
source venv/bin/activate # macOS/Linux
# 设置 API Key
export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxx"
# 运行主程序
python main.py
5.3 示例运行结果
diff
请输入问题: DeepSeek 的 API 和 OpenAI 兼容吗?
最相关内容:
- DeepSeek 是由深度求索公司开发的大语言模型,支持中英文对话。
它提供了与 OpenAI 兼容的 API 接口,开发者可以低成本接入。
- RAG(检索增强生成)通过向量数据库检索相关文档...
- ChromaDB 是一个轻量级的本地向量数据库...
最终答案:
是的,DeepSeek 提供了与 OpenAI 兼容的 API 接口,
开发者可以使用 OpenAI 的 SDK 直接调用,只需将 base_url
替换为 https://api.deepseek.com 即可,成本也相对较低。
六、后续扩展方向
- 持久化向量数据库 --- 使用 ChromaDB
PersistentClient保存到磁盘 - 支持 PDF / Word 文档 --- 用 PyMuPDF 或 python-docx 提取文本
- 流式输出 --- 在 API 调用中添加
stream=True实现打字机效果 - Web UI --- 用 Gradio 或 Streamlit 包装,5 分钟变成网页应用
- 多轮对话 --- 维护
messages历史,实现上下文连续问答 - 混合检索 --- 结合 BM25 关键词检索与向量检索,提升召回率
至此,一个完整的本地 RAG + DeepSeek Demo 已全部完成。全部代码不超过 60 行,却覆盖了 RAG 的完整核心流程。