基于 DeepSeek 搭建 RAG 系统:环境搭建与最小链路实战
发布时间:2026/9/30 0:34:54 锦皓数字建站

简介这份文档面向希望快速上手检索增强生成系统的开发者与运维人员围绕基于DeepSeek搭建RAG环境这一主题提供从技术栈认知到多服务器部署的完整实战指引。内容涵盖CUDA并行计算、vLLM大模型推理、Docker容器化等关键工具并按Dify服务器、Rerank与Embedding模型服务器、DeepSeek模型服务器三台ECS实例逐步展开涉及xinference安装、bge-reranker-large与bge-large-zh-v1.5部署、环境版本选定及Python依赖配置等具体环节。资源包为1个docx文档大小约580KB目录结构清晰便于按模块查阅。目前已有324人学习下载适合需要系统掌握RAG环境搭建流程、对照实操与查漏补缺的中高级开发者参考。1. 基于 DeepSeek 搭建 RAG 系统环境搭建这一步到底卡在哪很多人第一次尝试基于 DeepSeek 搭建 RAG 系统卡住的地方不是模型调用而是环境搭建。Python 版本冲突、CUDA 驱动对不上、向量库编译失败、Embedding 模型下载超时这些问题会在你写第一行业务代码之前就把耐心消耗干净。我见过太多人在这步翻车最后误以为是 DeepSeek 的 API 不好用其实是本地环境根本没跑通。这篇内容面向的是想用 DeepSeek 作为生成模型、在本地或服务器上搭一套可复现 RAG 环境的工程师。我会把环境搭建拆成可执行的步骤从 Python 与依赖管理、DeepSeek API 接入、Embedding 与向量库选型到最小可运行检索链路再到常见报错排查。读完你应该能在一台干净的机器上从零把 RAG 的底座跑起来并且知道每个参数为什么这么设。2. 环境搭建前的选型DeepSeek 接入方式与依赖边界2.1 用 API 还是本地部署 DeepSeek基于 DeepSeek 搭建 RAG第一步要决定生成模型怎么接。常见做法有两种调用 DeepSeek 官方 API或者用 Ollama、vLLM 在本地拉起 DeepSeek 蒸馏版本。两者对环境的要求完全不同。API 方式对本地机器几乎没要求只要能发 HTTPS 请求即可。你不需要 GPU不需要 CUDA不需要几十 GB 显存。缺点是依赖网络且按 token 计费。对于大多数想快速验证 RAG 链路的团队我一般建议先用 API 把流程跑通再考虑本地化。本地部署方式需要 GPU 和推理框架。以 Ollama 为例它把模型权重和推理引擎打包在一起安装相对简单但显存要求取决于模型参数量。7B 级别的模型在 8GB 显存上可以跑量化版本但上下文长度和并发能力会受限。如果你选 vLLM吞吐更高但环境依赖更重对 CUDA 版本、PyTorch 版本、显卡驱动都有明确要求。选型判断可以按这个逻辑走验证阶段用 API成本低、环境干净数据敏感或需要离线运行时再上本地部署但要提前确认显存和驱动。不要一上来就在本地折腾大模型环境搭建的复杂度会指数级上升。2.2 Python 版本与虚拟环境别让依赖打架RAG 系统涉及多个库HTTP 客户端、Embedding 模型、向量数据库、文本切分工具。这些库对 Python 版本和彼此之间的依赖有要求。我踩过的坑是系统 Python 是 3.12但某个向量库的预编译包只支持到 3.11pip 直接源码编译然后卡在 C 编译错误上。稳妥做法是固定 Python 3.10 或 3.11并用 conda 或 venv 隔离环境。下面是我常用的 conda 初始化流程# 创建独立环境指定 Python 3.11 conda create -n rag-deepseek python3.11 -y # 激活环境 conda activate rag-deepseek # 确认 Python 版本 python --version # 升级 pip避免旧版解析依赖出错 pip install --upgrade pip setuptools wheel逻辑说明conda create的-n指定环境名python3.11锁定解释器版本。升级pip、setuptools、wheel是为了让后续安装能正确解析 wheel 包减少源码编译。参数上如果你团队已有统一环境规范按规范来如果没有3.11 是目前兼容性较好的选择。提示不要用 sudo pip install 往系统 Python 里装包后期排查依赖冲突会非常痛苦。2.3 核心依赖清单与安装顺序RAG 环境的核心依赖可以分成四类DeepSeek 调用、Embedding、向量库、文本处理。安装顺序建议按依赖关系从底层往上装避免版本回退。类别常用库作用安装注意HTTP 调用openai、requests调用 DeepSeek APIopenai 兼容接口即可Embeddingsentence-transformers本地文本向量化会拉取 PyTorch向量库chromadb、faiss-cpu存储与检索向量faiss-cpu 无需 GPU文本处理langchain-text-splitters文档切分轻量依赖少环境变量python-dotenv管理 API Key避免硬编码安装命令可以合并执行# 一次性安装核心依赖 pip install openai sentence-transformers chromadb faiss-cpu langchain-text-splitters python-dotenv逻辑说明openai库用来调用 DeepSeek 的兼容接口因为 DeepSeek API 兼容 OpenAI 的请求格式。sentence-transformers会连带安装 PyTorch如果你机器上没有 GPU它会装 CPU 版本下载体积较大。chromadb和faiss-cpu二选一即可我通常两个都装方便对比。python-dotenv用来从.env文件读取 API Key避免把密钥写进代码。参数上如果你确定不用本地 Embedding可以跳过sentence-transformers改用 DeepSeek 或其他 API 提供的 Embedding 服务。但大多数 RAG 入门场景还是本地 Embedding 更可控。3. 从零跑通最小 RAG 链路配置、切分、检索、生成3.1 配置 DeepSeek API 与 Embedding 模型环境装好后先配置 DeepSeek 的 API 访问。你需要在项目根目录建一个.env文件写入密钥和基础地址。注意不要把这个文件提交到版本库。# .env 文件内容 DEEPSEEK_API_KEY你的密钥 DEEPSEEK_BASE_URLhttps://api.deepseek.com然后在 Python 里读取并初始化客户端import os from dotenv import load_dotenv from openai import OpenAI # 加载 .env 文件中的环境变量 load_dotenv() # 初始化 DeepSeek 客户端兼容 OpenAI 接口格式 client OpenAI( api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL) ) # 测试连通性发一条最简单的对话请求 response client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: 回复 ok}], temperature0 ) print(response.choices[0].message.content)逻辑说明load_dotenv()从.env读取变量。OpenAI客户端通过base_url指向 DeepSeek 的接口地址。model参数填deepseek-chat这是对话模型。temperature0让输出更稳定适合 RAG 场景中需要忠实于检索内容的生成。如果这一步报连接错误先检查网络和密钥不要急着往下走。Embedding 模型用sentence-transformers加载。首次运行会下载模型权重建议选一个体积适中的多语言模型from sentence_transformers import SentenceTransformer # 加载 Embedding 模型首次运行会自动下载 # 这里选一个轻量多语言模型适合中英文混合场景 embed_model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) # 测试编码把一句话转成向量 vec embed_model.encode(RAG 环境搭建) print(vec.shape) # 输出维度通常是 384逻辑说明SentenceTransformer的参数是模型名称首次调用会从远端拉取权重。encode返回 numpy 数组shape可以看到向量维度。这个维度必须和后续向量库的配置一致否则检索时会报维度不匹配。如果你换模型维度可能变成 768 或 1024记得同步改向量库的配置。3.2 文档切分与向量入库的完整脚本RAG 的核心是把文档切成语义片段转成向量存起来。下面是一个最小可运行脚本覆盖读取文本、切分、编码、入库四个步骤。import chromadb from langchain_text_splitters import RecursiveCharacterTextSplitter # 1. 准备原始文档这里用字符串模拟 raw_text DeepSeek 是一家专注于大模型研发的公司。 RAG 是检索增强生成的缩写用于提升回答准确性。 环境搭建是 RAG 系统的第一步涉及 Python、向量库和模型接入。 向量数据库用于存储文本的向量表示支持相似度检索。 # 2. 切分文档按字符递归切分块大小 200重叠 50 splitter RecursiveCharacterTextSplitter( chunk_size200, chunk_overlap50, separators[\n\n, \n, 。, ] ) chunks splitter.split_text(raw_text) print(f切分后块数: {len(chunks)}) # 3. 初始化 Chroma 客户端持久化到本地目录 chroma_client chromadb.PersistentClient(path./chroma_db) # 4. 创建或获取集合指定距离函数为余弦相似度 collection chroma_client.get_or_create_collection( namerag_demo, metadata{hnsw:space: cosine} ) # 5. 编码并入库 for i, chunk in enumerate(chunks): vec embed_model.encode(chunk).tolist() collection.add( ids[fchunk_{i}], embeddings[vec], documents[chunk] ) print(f入库完成当前集合数量: {collection.count()})逻辑说明RecursiveCharacterTextSplitter的chunk_size控制每块最大字符数chunk_overlap让相邻块有重叠避免语义被切断。separators按优先级尝试切分中文场景加入。更自然。PersistentClient把数据存到磁盘重启不丢。get_or_create_collection的metadata里hnsw:space设为cosine表示用余弦距离和 Embedding 模型的训练目标匹配。参数上chunk_size不是越大越好。太大检索精度下降太小上下文不完整。200 到 500 字符是常见起点具体要看文档类型。chunk_overlap一般取chunk_size的 10% 到 20%。3.3 检索与 DeepSeek 生成把上下文拼进 Prompt入库之后检索和生成是最后一步。用户提问时先把问题编码成向量在向量库里找最相似的块再把块内容拼进 Prompt 交给 DeepSeek。def rag_query(question, top_k2): # 1. 把问题编码成向量 q_vec embed_model.encode(question).tolist() # 2. 在向量库中检索最相似的 top_k 个块 results collection.query( query_embeddings[q_vec], n_resultstop_k ) # 3. 拼接检索到的上下文 contexts results[documents][0] context_text \n.join(contexts) # 4. 构造 Prompt要求模型基于上下文回答 prompt f基于以下上下文回答问题不要编造上下文之外的信息。 上下文 {context_text} 问题{question} # 5. 调用 DeepSeek 生成 response client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: prompt}], temperature0.2 ) return response.choices[0].message.content # 测试 answer rag_query(RAG 环境搭建涉及哪些组件) print(answer)逻辑说明collection.query的n_results控制返回块数top_k越大上下文越丰富但也会引入噪声并增加 token 消耗。Prompt 里明确要求“不要编造上下文之外的信息”这是 RAG 减少幻觉的常用手段。temperature0.2比 0 稍微灵活一点但仍在低随机性范围。参数上top_k从 2 到 5 开始调。如果回答经常缺信息先检查切分是否合理再考虑增大top_k。如果回答里出现无关内容说明检索精度不够可以换更好的 Embedding 模型或调整切分策略。4. 环境搭建避坑五个让我加班到凌晨的报错4.1 现象pip 安装 chromadb 卡在编译报 C 错误原因Python 版本过高或系统缺少编译工具链pip 找不到预编译 wheel回退到源码编译。解决固定 Python 3.10 或 3.11先升级 pip再安装。如果仍失败装build-essential和python3-dev或者改用faiss-cpu替代。4.2 现象Embedding 模型下载超时卡在 0%原因模型权重托管在境外网络不稳定。解决设置镜像源或提前用工具下载权重到本地缓存目录再用SentenceTransformer的cache_folder参数指向本地路径。不要反复重试容易把临时文件搞坏。4.3 现象DeepSeek API 返回 401 或 404原因API Key 没读到或者base_url写错。解决检查.env文件是否在运行目录下load_dotenv()是否在读取密钥之前调用。base_url不要多加路径按官方给的地址填。打印os.getenv确认值不为 None。4.4 现象检索结果维度不匹配报 shape 错误原因Embedding 模型换了但向量库集合还是旧维度。解决删除旧的持久化目录重新建集合。Chroma 的集合维度在创建时固定不能直接改。换模型必须重建库。4.5 现象回答内容正确但格式混乱夹杂无关片段原因top_k太大或切分过碎检索到噪声块。解决先降低top_k再检查切分后的块是否语义完整。可以在 Prompt 里加一句“如果上下文不包含答案直接说不知道”减少模型强行拼接。5. 进阶技巧用缓存和批量编码把环境压到可复用环境跑通之后下一步是让它可复用、可迁移。我自己的习惯是把 Embedding 结果缓存起来避免每次调试都重新编码。sentence-transformers支持批量编码一次传多个文本比循环单条快很多。# 批量编码把多个块一次性转成向量 chunk_texts [文本块一, 文本块二, 文本块三] vectors embed_model.encode(chunk_texts, batch_size32, show_progress_barTrue) # 入库时按批次添加 collection.add( ids[fbatch_{i} for i in range(len(chunk_texts))], embeddingsvectors.tolist(), documentschunk_texts )batch_size根据内存调整32 到 64 是常见值。show_progress_bar在调试时打开生产环境关掉。另一个技巧是把 DeepSeek 的调用封装成带重试的函数网络抖动时自动重试两次避免单次失败打断整个流程。验证环境是否真正可复现我的做法是删掉虚拟环境按文档重新建一次跑通最小链路。如果第二次能顺利跑通说明环境搭建是可靠的。这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。