基于 DeepSeek 搭建 RAG 系统:环境搭建与最小链路实战

发布时间:2026/9/30 0:36:27

基于 DeepSeek 搭建 RAG 系统:环境搭建与最小链路实战 简介这份文档面向希望快速上手检索增强生成系统的开发者与运维人员围绕基于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 的调用封装成带重试的函数网络抖动时自动重试两次避免单次失败打断整个流程。验证环境是否真正可复现我的做法是删掉虚拟环境按文档重新建一次跑通最小链路。如果第二次能顺利跑通说明环境搭建是可靠的。这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/9/30 0:36:27

腾讯WeKnRAG:多智能体知识库引擎的部署与调优实战

微信开源侧最近动作不少,但要说知识库方向最值得关注的一个,肯定是tencent/WeKnRAG。标题党一点说,这个项目对做知识库的人来说确实够得上"神级"——不是因为它代码完美无瑕,而是因为它把文档解析、向量检索、重排序、多…

2026/9/30 0:36:27

YOLOv11车流检测与自适应红绿灯控制实战

简介:本资源是一份面向智能交通系统开发者、计算机视觉初学者及城市交通优化研究者的完整技术方案文档,聚焦于利用YOLOv11实现车流量实时统计与红绿灯自适应控制。文档共28页PDF,结构严谨,含引言、YOLOv11原理详解、车流量统计算法…

2026/9/30 0:31:27

从算力投入到AI编程编队:开源模型落地与工程实践全解析

智谱50亿美元投向算力与模型研发,开源榜单连续20周洗牌,AI编程从“一人一助手”变成“千人编队”——这三条消息放在同一天,基本就代表了当下AI行业的三个风向标。早上刷到这条新闻流的时候,我第一反应不是“又来了”,…

2026/9/30 1:31:30

设计模式之策略模式:从if-else重构到生产级代码示例

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 1:31:30

nRF54L系列新成员:低功耗多协议SoC选型与迁移实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 1:31:30

STM32F103开发板实战:从环境搭建到外设驱动全链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 1:31:30

Linux动态链接全解析:从PLT/GOT到ELF加载与库搜索路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 1:26:30

STM32上电启动全解析:从复位向量到RTOS任务切换的完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑