三台机器搭建RAG环境:Dify+Xinference+vLLM部署实战
简介这份实战教程面向希望快速上手检索增强生成系统的开发者与运维人员围绕DeepSeek模型系统讲解RAG环境从零搭建的完整流程。内容涵盖技术栈概要、Dify服务器、Rerank与Embedding模型服务器、DeepSeek模型服务器三台ECS的分步部署并涉及CUDA驱动、vLLM推理库、Docker容器化、xinference框架以及bge-reranker-large、bge-large-zh-v1.5等中文模型的安装与调用帮助读者掌握多机协作下的模型部署与排错思路。资源包为1个docx文档约580KB目录结构清晰按技术栈与安装部署两大模块组织便于对照查阅。目前已有326人学习适合具备一定深度学习基础、需要落地RAG系统的技术人员参考。1. 三台机器、三个模型、一条链路这套 RAG 环境搭建到底在解决什么很多团队第一次搭 RAG都会卡在同一个地方模型能跑但检索结果排序不对生成答案就开始胡说。这套教程的核心思路很直接——把 RAG 拆成三个独立环节分别部署在三台服务器上每台只干一件事。Dify 负责流程编排和知识库管理ECS-2 跑 Embedding 和 Rerank 两个检索侧模型ECS-3 用 vLLM 拉起 DeepSeek-R1-Distill-Qwen-14B 做生成。三台机器通过内网 API 串起来哪一环出问题就单独排查不用在同一个环境里反复折腾依赖冲突。适合正在做企业知识库、智能客服、文档问答的开发者尤其是手里有 GPU 但不知道怎么把模型部署和编排平台接起来的场景。2. 技术栈选型为什么是 Dify Xinference vLLM 这套组合2.1 三个模块各管什么这套方案里每个组件都有明确的边界。Dify 是应用开发平台负责知识库上传、分段、检索策略配置、对话流程编排它本身不跑模型推理只通过 API 调用外部模型服务。Xinference 是模型推理框架专门用来部署 Embedding 和 Rerank 这类中小模型支持自定义模型注册适合把 HuggingFace 上的模型拉到本地跑。vLLM 则是大模型推理引擎核心优势是 PagedAttention 和连续批处理能把 14B 级别的模型在单卡 V100 上跑出可用的吞吐。模块部署位置作用关键依赖DifyECS-1流程编排、知识库管理Docker、Docker ComposeXinferenceECS-2Embedding Rerank 推理Python 3.8、CUDA 11.4vLLMECS-3DeepSeek 大模型推理Python 3.10、CUDA 12.1选 Xinference 而不是自己写 Flask 服务是因为它自带模型注册、启动、注销的完整生命周期管理bge 系列模型直接注册就能用省掉大量胶水代码。选 vLLM 而不是 HuggingFace Transformers 直接推理是因为 14B 模型用 Transformers 跑显存碎片严重并发一上来就 OOMvLLM 的显存管理能把这部分压下去。2.2 模型选型的实际考量Embedding 用bge-large-zh-v1.5输出 768 维向量最大 512 token中文场景下检索召回率比 m3e 系列稳。Rerank 用bge-reranker-large对检索回来的 top-k 结果做二次排序把真正相关的文档顶到前面。生成模型用DeepSeek-R1-Distill-Qwen-14B蒸馏自 Qwen-2.5 系列14B 参数量在 V100 32G 上刚好能跑精度用 half 模式显存占用约 28G留一点余量给 KV Cache。注意模型选型不是越大越好。14B 在单卡 V100 上能跑起来换成 32B 就需要多卡或者量化部署复杂度直接翻倍。先跑通链路再考虑升级。3. ECS-2 部署实战Xinference 拉起 Embedding 和 Rerank3.1 环境准备与 Xinference 安装ECS-2 的镜像是 Ubuntu 20.04 with Tesla Driver 470 和 CUDA 11.4Python 用 3.8。这个环境版本不是随便选的——Xinference 对 CUDA 版本有要求11.4 能兼容 bge 系列模型的推理后端再高反而容易遇到 PyTorch 版本不匹配。# 安装 xinference 完整版包含所有推理后端 pip install xinference[all] # 配置模型存储路径避免默认路径磁盘爆满 export XINFERENCE_HOME/tmp/xinference # 验证安装是否成功 xinference --helpXINFERENCE_HOME这个环境变量建议写进~/.bashrc否则每次重启终端都要重新 export。模型文件默认下载到~/.xinference下如果系统盘小一定要改到数据盘。启动 Xinference 有两种方式调试阶段用前台启动看日志稳定后用后台启动# 前台启动端口固定 9997 xinference-local --host 0.0.0.0 --port 9997 # 后台启动日志输出到 nohup.out nohup xinference-local --host 0.0.0.0 --port 9997 nohup.out 端口 9997 是 Xinference 的默认端口Dify 那边配置模型 API 地址时要对应上。--host 0.0.0.0是为了让 ECS-1 能通过内网 IP 访问如果只写 127.0.0.1Dify 就连不过来。3.2 注册自定义 Rerank 模型bge-reranker-large 需要先从 HuggingFace 下载到本地再上传到服务器。这一步和 Xinference 安装可以并行做模型文件大概 1.3G上传时间取决于内网带宽。模型上传后在模型目录下创建config.json{ model_name: custom-bge-reranker-large, type: normal, language: [en, zh], model_id: BAAI/bge-reranker-large, model_uri: file:///path/to/bge-reranker-large }model_name是自定义名称后面启动和调用都用这个名字。model_uri必须用file://前缀加绝对路径相对路径会注册失败。language字段声明支持中英文不影响推理但影响 Xinference 的模型列表展示。注册命令# 将自定义模型注册到 xinference xinference register --model-type rerank --file model.json --persist # 检查注册结果 xinference registrations --model-type rerank--persist参数表示持久化注册信息不加的话重启 Xinference 后模型列表就丢了。注册成功后用registrations命令能看到custom-bge-reranker-large出现在列表里。启动 Rerank 模型xinference launch --model-name custom-bge-reranker-large --model-type rerank启动后 Xinference 会加载模型到 GPUT4 16G 显存跑 bge-reranker-large 大概占 2G 左右余量充足。如果启动报 CUDA out of memory先检查是不是有其他进程占着显卡。3.3 注册自定义 Embedding 模型Embedding 模型的注册流程和 Rerank 几乎一样区别在config.json的字段{ model_name: custom-bge-large-zh-v1.5, dimensions: 768, max_tokens: 512, language: [zh], model_id: BAAI/bge-large-zh-v1.5, model_uri: file:///path/to/bge-large-zh-v1.5 }dimensions必须和模型实际输出维度一致bge-large-zh-v1.5 是 768 维写错了 Dify 那边向量检索会直接报维度不匹配。max_tokens是 512超过这个长度的文本会被截断知识库分段时要注意控制每段长度。# 注册 embedding 模型 xinference register --model-type embedding --file model.json --persist # 验证注册 xinference registrations --model-type embedding # 启动模型 xinference launch --model-name custom-bge-large-zh-v1.5 --model-type embedding两个模型都启动后Xinference 的 API 端点就准备好了。Dify 里配置 Embedding 模型时填http://ECS-2内网IP:9997/v1模型名填custom-bge-large-zh-v1.5Rerank 同理。提示如果后续要换模型先用xinference unregister注销旧模型再注册新的。直接覆盖注册有时候会残留旧配置导致启动时加载错误的模型文件。4. ECS-3 部署实战vLLM 拉起 DeepSeek-14B4.1 驱动、CUDA 与 Python 环境ECS-3 的镜像是 CentOS 7.9CUDA 11.4但 vLLM 0.43 需要 CUDA 12.1所以驱动和 CUDA 都要重新装。这里有个坑如果先装了 CUDA 再装驱动驱动安装程序会检测到已有 CUDA 然后报错退出。正确顺序是先装驱动再单独装 CUDA Toolkit安装时取消勾选驱动选项。驱动选 530.30.02 版本对应 CUDA 12.1。安装完成后验证# 查看驱动版本 nvidia-smi # 查看 CUDA 版本 nvcc -V两个命令输出的 CUDA 版本要一致不一致说明环境变量没配好。CUDA 安装后需要手动加环境变量# 编辑 ~/.bashrc vim ~/.bashrc # 在文件末尾添加路径根据实际安装位置调整 export PATH/usr/local/cuda-12.1/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH # 刷新环境变量 source ~/.bashrcPython 用 conda 创建独立环境版本 3.10conda create -n myenv python3.10 -y conda activate myenvPyTorch 必须装和 CUDA 12.1 匹配的版本否则 vLLM 安装时会报错pip install torch2.3.0 torchvision0.18.0 torchaudio2.3.0 --index-url https://download.pytorch.org/whl/cu121这个命令里的--index-url指定了 PyTorch 官方 CUDA 12.1 的 wheel 源不指定的话默认装 CPU 版本后面 vLLM 跑起来会提示找不到 GPU。4.2 vLLM 安装与模型启动pip install vllm0.43安装过程中如果报依赖版本冲突按照报错信息逐个指定版本安装。常见的是pydantic和fastapi版本不兼容vLLM 0.43 要求pydantic2.0如果环境里有旧版本先卸载。DeepSeek 模型文件提前下载好上传到服务器14B 的 half 精度模型大约 28G上传前确认磁盘空间足够。启动命令python -m vllm.entrypoints.openai.api_server \ --model /root/work/ds/pretrained \ --dtype half \ --trust-remote-code \ --tensor-parallel-size 1 \ --max-model-len 5120 \ --enforce-eager \ --gpu-memory-utilization 0.95 \ --max-num-batched-tokens 5120 \ --max-num-seqs 5 \ --host 0.0.0.0 \ --served-model-name DeepSeek-R1-14B \ --port 8008 逐项说明关键参数--dtype half用 FP16 精度加载显存占用减半V100 对 FP16 有硬件加速。--tensor-parallel-size 1单卡推理如果是多卡就改成卡数。--max-model-len 5120最大上下文长度设太大 KV Cache 会吃掉大量显存。--enforce-eager禁用 CUDA Graph牺牲一点性能换稳定性V100 上建议开启。--gpu-memory-utilization 0.95显存利用率上限留 5% 给系统。--max-num-seqs 5最大并发序列数根据实际并发调整设太高会 OOM。--served-model-name DeepSeek-R1-14BAPI 调用时的模型名称Dify 里填这个。启动后看到Uvicorn running on http://0.0.0.0:8008就说明服务起来了。用 curl 测一下curl http://localhost:8008/v1/models返回模型列表里有DeepSeek-R1-14B就正常。4.3 Dify 侧对接与链路验证Dify 用 Docker 部署在 ECS-1 上安装流程参考官方文档。部署完成后进入设置页面在模型供应商里添加 OpenAI-API-compatible 类型Embedding 模型API Base 填http://ECS-2内网IP:9997/v1模型名custom-bge-large-zh-v1.5Rerank 模型API Base 同上模型名custom-bge-reranker-largeLLM 模型API Base 填http://ECS-3内网IP:8008/v1模型名DeepSeek-R1-14B配置完成后创建一个知识库上传一个测试文档用默认分段策略。然后在应用编排里把检索策略设为混合检索加 Rerank生成模型选 DeepSeek。问一个文档里有的问题如果回答准确且引用了原文说明整条链路通了。5. 避坑与排查三台机器联调时最容易翻车的几个点5.1 Xinference 注册模型后启动报 “model not found”现象是xinference launch时提示模型不存在但registrations列表里明明有。原因通常是注册时--persist没加或者XINFERENCE_HOME在注册和启动时指向了不同路径。解决方法是先确认echo $XINFERENCE_HOME输出一致然后重新注册并加上--persist。5.2 vLLM 启动时 CUDA out of memoryV100 32G 跑 14B half 模型权重占约 28G如果--gpu-memory-utilization设成 0.95留给 KV Cache 的空间只有 1.6G 左右。--max-model-len 5120和--max-num-seqs 5的组合下KV Cache 需求可能超过这个值。解决办法是降低max-model-len到 4096或者把max-num-seqs降到 3。如果还是不够检查是不是有其他进程占着显卡nvidia-smi看一下。5.3 Dify 调用 Embedding 接口超时Dify 默认的模型请求超时是 60 秒如果 ECS-2 和 ECS-1 之间网络延迟高或者 Embedding 模型首次加载慢就会超时。在 Dify 的模型配置里把超时时间调到 120 秒。另外确认 ECS-2 的安全组开放了 9997 端口只允许 ECS-1 的内网 IP 访问。5.4 Rerank 模型返回分数全部接近检索回来的文档经过 Rerank 后分数都在 0.5 左右区分度很低。这通常是因为bge-reranker-large对输入文本的长度敏感如果知识库分段太长超过了模型的最佳处理长度分数就会趋同。把 Dify 里的分段长度从默认的 500 调到 300 左右重叠 50重新索引后再试。5.5 vLLM 服务启动后 Dify 调用返回 404Dify 里配置的模型名和 vLLM 启动时的--served-model-name不一致会导致 404。检查 Dify 模型配置里的模型名称是否严格等于DeepSeek-R1-14B大小写和连字符都不能差。另外确认 API Base 填的是http://IP:8008/v1末尾的/v1不能少。6. 二次开发与调优从跑通到跑好的几个改造方向链路跑通只是第一步真正用到生产环境还要做几件事。第一是 Embedding 和 Rerank 的批处理优化。Xinference 默认单条推理如果知识库文档量大索引速度会很慢。可以在 Dify 的知识库设置里把批处理大小调大同时确认 Xinference 那边的--batch-size参数如果有也相应调整。我一般会先用 100 篇文档测一下索引耗时再决定批大小。第二是 vLLM 的并发调优。--max-num-seqs设成 5 是保守值实际能跑多少取决于请求的平均生成长度。如果用户问题短、回答也短可以逐步往上调每次加 2观察nvidia-smi的显存占用和 vLLM 日志里的吞吐数据。调到显存占用稳定在 90% 左右就差不多了。第三是 Rerank 的 top-k 策略。Dify 默认检索 top-10 然后 Rerank 取 top-3如果发现回答经常漏掉关键信息可以把 Rerank 后的 top-k 调到 5。但注意上下文长度限制top-k 越大塞进 DeepSeek 的 token 越多超过max-model-len就会被截断。第四是加一层缓存。Embedding 和 Rerank 的结果对相同输入是确定的可以在 Dify 前面加一个 Redis 缓存把 query 的 embedding 向量和 rerank 分数缓存起来重复问题直接命中缓存减少 GPU 压力。验证改造效果的方法很简单准备 20 个测试问题覆盖知识库里不同文档的内容记录每个问题的回答准确率和响应时间。改一个参数跑一遍对比数据。不要凭感觉调参血泪经验是感觉往往不准。从那以后我每次部署新环境都会先用一个最小知识库跑通全链路再逐步加文档、调参数。先保证链路通再谈优化这个顺序不能反。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

NetSpot安装与Wi-Fi优化实战:从信号扫描到信道调整

NetSpot安装与Wi-Fi优化实战:从信号扫描到信道调整

简介:这份资源是面向家庭用户与小型企业网络管理者的 NetSpot Wi-Fi 优化工具使用详解文档,针对无线网络信号干扰、覆盖盲点与频道规划混乱等常见问题,提供从软件安装到分析排障的完整指引。资源包内含 1 个 docx 文件,约 1.15MB&…

2026/10/16 21:12:35 阅读更多 →
接口对接方案设计:从耦合原理到API版本管理避坑指南

接口对接方案设计:从耦合原理到API版本管理避坑指南

简介:《软件系统平台对接接口方案文档》面向系统集成商、软件开发商及后端架构人员,聚焦多系统互联互通中的接口设计与落地难题。文档围绕接口设计原则、接口定义与分类、接口设计模式、接口实现方式及接口详细设计五大模块展开,涵盖高内聚低…

2026/10/16 21:12:35 阅读更多 →
SHOT特征描述子原理与工程实践:从局部参考坐标系到点云配准

SHOT特征描述子原理与工程实践:从局部参考坐标系到点云配准

做三维视觉的,迟早要和点云打交道。无论是做配准、分割还是目标识别,点云本质上就是一堆无序的坐标点,计算机没法直接拿它们和另一个场景里的点云做“比对”。这时候就得靠特征描述子,把局部几何信息浓缩成一个可量化的向量。SHOT…

2026/10/16 21:11:34 阅读更多 →

最新新闻

TurboVLA 0.2B模型如何实现32Hz实时推理与0.9GB显存优化

TurboVLA 0.2B模型如何实现32Hz实时推理与0.9GB显存优化

1. TurboVLA 到底解决了什么问题第一次看到“0.2B 参数、32Hz 实时推理、RTX 4090 只占 0.9GB 显存”这组数字,我的反应是:这要么是标题党,要么是在某个特定任务上做了极致裁剪。因为按常规经验,一个 0.2B 的模型想在消费级卡上跑…

2026/10/16 21:57:14 阅读更多 →
PCL 点云处理与三维模型提取:VS2017 环境配置到工程实现全攻略

PCL 点云处理与三维模型提取:VS2017 环境配置到工程实现全攻略

很多人第一次在 Visual Studio 2017 里编译 PCL,大概率会被一连串 LNK2019 砸到怀疑人生。我也不例外,装 PCL 1.8.1 那几天,光"找不到 DLL"就碰见三四回,最后狠心把各种 bin 目录全写进 PATH 才算消停。可一旦把这些环境…

2026/10/16 21:57:14 阅读更多 →
上海医保五期接口设计拆解:有状态账本、两阶段确认与身份令牌机制

上海医保五期接口设计拆解:有状态账本、两阶段确认与身份令牌机制

简介:上海五期医保接口说明文档,是一份指导 HIS 系统对接医保中心系统的技术参考,面向医院信息系统开发、实施与维护人员。文档从引言、业务分析到接口描述逐层展开,涵盖读卡、电子凭证解码、挂号收费请求与确认、登记与撤销、明细…

2026/10/16 21:56:13 阅读更多 →
权力的游戏86节点深度解析:三条线索交汇与叙事结构拆解

权力的游戏86节点深度解析:三条线索交汇与叙事结构拆解

1. 从“86”这个数字说起:为什么这个节点值得单独拎出来聊“A Game of Thrones(86)”这个标题,第一次看到的人大概率会愣一下——括号里的86是什么意思?是第86章?第86集?还是某个版本编号?如果你追过这套作…

2026/10/16 21:56:13 阅读更多 →
linear-cli 退出码全解析:0/2/3/4/5 各代表什么,脚本如何精准判断失败原因?

linear-cli 退出码全解析:0/2/3/4/5 各代表什么,脚本如何精准判断失败原因?

【免费下载链接】linear-cli linear without leaving the command line: list, start, and create PRs for linear issues. agent friendly. 项目地址: https://gitcode.com/gh_mirrors/lin/linear-cli 点击查看 免费下载 linear-cli 是一个让你不离开命令行就能管…

2026/10/16 21:56:13 阅读更多 →
STK 11自带案例从入门到改造:卫星仿真与覆盖分析实战

STK 11自带案例从入门到改造:卫星仿真与覆盖分析实战

简介:STK11(System Tool Kit 11)是由AGI推出的空间系统模拟分析软件,在航天、国防、通信等领域应用广泛。这份压缩包内含其自带的应用案例,适合刚接触STK11的工程师与在校学生通过实例快速上手。包内共396个文件&#…

2026/10/16 21:56:13 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →