从零开始构建 RAG + DeepSeek Demo

从零开始构建 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_urlapi_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 的完整核心流程。

相关推荐
302AI2 小时前
大白话聊一聊:为什么OpenClaw那么火
llm·agent·vibecoding
掘金安东尼3 小时前
养龙虾之前?先搞懂 Skills!
人工智能
数据智能老司机3 小时前
AI 智能体与应用——使用 LangGraph 构建基于工具的智能体
llm·agent
数据智能老司机3 小时前
AI 智能体与应用——问题转换
llm·agent
chaors3 小时前
从零学RAG0x03第一个实战应用:医疗知识混合检索实战
人工智能·aigc·ai编程
数据智能老司机3 小时前
AI 智能体与应用——使用 LangGraph 构建智能体工作流
llm·agent
数据智能老司机4 小时前
AI 智能体与应用——构建研究摘要引擎
llm·agent
阿聪谈架构4 小时前
第02章:Prompt 工程 —— 用语言精准指挥 AI
人工智能
数据智能老司机4 小时前
AI 智能体与应用——使用 LangChain 和 LangSmith 构建 Q&A 聊天机器人
llm·agent