ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

本地优先云端兜底:Dify+Ollama+DeepSeek搭建私有AI平台实战

本地优先云端兜底:Dify+Ollama+DeepSeek搭建私有AI平台实战 1. 为什么我决定不再给云端 API 打工1.1 从一次账单惊吓说起去年年底我收到某大模型平台的月度账单数字比我预想的高出三倍。排查后发现团队里几个自动化脚本在跑知识库问答每次都要把整段文档塞进上下文token 消耗像开了水龙头。更麻烦的是有几个内部项目涉及客户资料走云端 API 意味着数据要离开我们的内网合规同事每次都要我写说明。那一刻我意识到把核心业务逻辑绑在别人的 API 上本质上就是在给 API 打工——你付钱、你担风险、你受限于对方的限流和调价而模型能力本身并不属于你。于是我开始折腾一套自己的方案本地优先、云端兜底。核心思路很简单——日常高频、数据敏感的请求走本地模型本地扛不住或者需要更强推理能力的场景再自动切到云端 API。整套平台用 Dify 做编排层Ollama 做本地模型运行时DeepSeek 作为云端兜底和本地可选模型。这套东西搭完之后我最大的感受是主动权回到了自己手里。下面我把整个搭建过程、踩过的坑、以及那些文档里不会写的细节完整地摊开讲一遍。1.2 这套平台到底能做什么先给不太熟悉的朋友一个直观印象。搭好之后你打开浏览器访问本地的一个地址就能看到一个类似 ChatGPT 的对话界面但它背后连的是你自己电脑或服务器上跑的模型。你可以上传 PDF、Word、Markdown 建知识库可以拖拽式地编排工作流可以接入企业微信、飞书这类工具做机器人。具体能力包括本地对话Ollama 拉取 DeepSeek、Qwen 等模型断网也能用数据不出机器。知识库问答Dify 负责文档解析、切片、向量化检索后喂给模型。工作流编排把用户提问→检索→判断→调用模型→格式化输出串成可视化流程。云端兜底本地模型答不好或超时自动路由到 DeepSeek 云端 API。多租户隔离Dify 社区版较新版本支持多租户团队多人用互不干扰。适合谁来参考我的判断是有一定 Linux 或 Docker 基础、手头有台像样机器至少 16G 内存最好有张显卡、并且对数据隐私或成本敏感的个人开发者和中小团队。纯小白也能跟着做但遇到报错时需要一点排查耐心。1.3 为什么是 Dify Ollama DeepSeek 这个组合选型这件事我纠结了挺久试过 FastGPT、LangChain 手搓、还有几个开源对话前端。最后定下来这个组合理由如下。Dify 做编排层是因为它把 RAG检索增强生成和工作流这两块做得足够开箱即用。你不用自己写向量检索代码不用自己处理文档解析界面上拖拖拽拽就能出一个能用的应用。社区活跃文档相对全遇到问题搜得到答案。Ollama 做本地运行时核心优势是一条命令跑模型。它把模型下载、量化、推理服务封装得很干净ollama run deepseek-r1:7b就能起一个服务还自带 OpenAI 兼容的 API 接口Dify 直接就能连。相比自己用 vLLM 或 llama.cpp 折腾Ollama 的上手成本低太多。DeepSeek 做云端兜底一是因为它 API 价格便宜、上下文长二是因为它同时有开源权重可以本地跑。这意味着同一套 prompt 在本地和云端行为接近切换时不用大改。本地跑 DeepSeek 的小参数版本云端调 DeepSeek 的大参数版本体验连贯。提示选型没有绝对最优只有适不适合。如果你机器很强、追求极致吞吐vLLM 可能比 Ollama 更合适如果你完全不想碰云端那兜底层可以换成第二个本地模型。我这里的组合是成本、隐私、易用三者平衡后的结果。2. 环境准备与核心组件拆解2.1 硬件与系统的最低门槛在动手之前先确认你的机器扛不扛得住。我整理了一张对照表按使用强度分档。使用场景内存显卡显存推荐模型规模体验预期单人轻度试用16G无纯 CPU1.5B~3B能跑但慢适合验证流程单人日常使用32G8G7B~8B流畅知识库问答可用小团队共享64G16G~24G14B~32B多人并发基本够用团队重度使用128G24G×2 或 48G32B~70B接近云端体验我自己的主力机是一台 32G 内存 RTX 4060 Ti 16G 的机器跑 7B 和 14B 的量化模型很稳。如果你只有 CPU也不是不能玩但要有心理准备——7B 模型在纯 CPU 上大概每秒出几个字对话会有点卡。操作系统方面LinuxUbuntu 22.04 最省心 macOS Windows。Windows 上 Docker 和 Ollama 都能装但路径、权限、网络转发的问题会多一些后面我会专门讲 Windows 的坑。2.2 Docker 与 Docker Compose 的安装要点Dify 官方推荐用 Docker Compose 部署这是最省事的方式。安装 Docker 本身不复杂但有几个细节决定了后面顺不顺。Linux 上一键脚本装完之后记得把当前用户加进 docker 组否则每次都要 sudosudo usermod -aG docker $USER newgrp docker装完验证一下docker --version docker compose versionDocker Compose 现在一般是 v2 版本命令是docker compose中间空格不是老的docker-compose。这个区别在照抄老教程时特别容易踩坑。注意如果你在国内网络环境拉取 Docker 镜像可能会很慢甚至超时。建议提前配置镜像加速具体加速地址各云厂商都有提供配置在/etc/docker/daemon.json里改完sudo systemctl restart docker生效。2.3 Ollama 的安装与国内下载优化Ollama 的安装Linux 下一条命令curl -fsSL https://ollama.com/install.sh | sh装完ollama --version验证。macOS 直接下 dmg 拖进应用文件夹。Windows 下 exe 双击。真正的痛点在下载模型。ollama pull deepseek-r1:7b动辄几个 G国内直连经常龟速甚至断流。我试过几种办法最稳的是设置镜像源环境变量。Ollama 支持通过OLLAMA_HOST和镜像相关配置调整但更通用的做法是export OLLAMA_MODELS/data/ollama/models把模型目录指到大盘避免默认目录塞满系统盘。至于下载加速可以找国内可用的模型镜像站把模型文件手动放到OLLAMA_MODELS对应目录下Ollama 能识别已存在的 blob。另一个技巧是离线安装包。如果你有多台机器在一台上下好模型把整个models目录打包拷过去省得每台都重新下。模型文件结构是blobsmanifests整个目录复制即可。2.4 DeepSeek 云端 API 的申请与密钥管理云端兜底需要 DeepSeek 的 API Key。去官方平台注册、实名、充值然后在控制台创建 API Key格式类似sk-开头的一长串。这里有个高频报错要提前说unexpected status 401 unauthorized: incorrect api key provided。这个错误九成是三种原因——Key 复制时多了空格、Key 已过期或被删、或者你把 Key 填到了错误的字段。排查时先把 Key 重新复制一遍注意首尾不要带空格。密钥管理我的建议是永远不要把 Key 硬编码在代码或配置文件里提交到仓库。Dify 里配置模型时填一次就行它会加密存储。如果要在脚本里用走环境变量。export DEEPSEEK_API_KEYsk-你的密钥提示云端 API 是兜底不是主力。建议在 Dify 里给云端模型设置调用上限或预算告警避免某天脚本跑飞了又收到账单惊吓。3. Dify 部署实操与关键配置3.1 拉取代码与目录结构说明Dify 的部署从克隆仓库开始git clone https://github.com/langgenius/dify.git cd dify/docker进入docker目录后你会看到.env.example和docker-compose.yaml。第一步是复制环境变量文件cp .env.example .env这个.env是整个部署的核心端口、数据库密码、密钥全在里面。目录结构大致是docker-compose.yaml定义服务.env定义变量volumes目录存数据。Dify 默认会起一堆容器api、worker、web、dbPostgreSQL、redis、weaviate向量库、nginx、sandbox 等。第一次docker compose up -d会拉很多镜像耐心等。启动完成后访问http://你的IP默认 80 端口。首次进入会让你设置管理员账号。3.2 端口冲突与 SSL 错误的处理端口冲突是最常见的启动失败原因。80 端口如果被 nginx 或其它服务占了Dify 的 nginx 起不来。解决办法是改.env里的EXPOSE_NGINX_PORT比如改成 8080然后访问http://IP:8080。SSL 错误热搜里那个dify ssl错误通常出现在两种场景一是你配了 HTTPS 但证书路径不对或证书过期二是容器内部服务之间用 HTTPS 互访但证书不被信任。如果你只是内网自用最省事的做法是先不配 SSL用 HTTP 跑通等业务稳定了再上反向代理加证书。真要配 SSL建议在 Dify 的 nginx 前面再套一层宿主机的 nginx 或 Caddy 做 TLS 终止Dify 内部继续走 HTTP。这样证书管理集中在宿主机升级 Dify 时不用动证书配置。3.3 数据库与向量库的持久化Dify 默认用 PostgreSQL 存业务数据用 Weaviate 存向量。这两个的数据必须持久化否则容器一重建你的应用、知识库全没了。检查docker-compose.yaml里的 volumes 配置确保 db 和 weaviate 的数据目录映射到了宿主机。默认配置一般已经做了但如果你改过 compose 文件务必确认。volumes: - ./volumes/db/data:/var/lib/postgresql/data - ./volumes/weaviate:/var/lib/weaviate注意做任何升级或迁移前先备份volumes目录。我吃过一次亏升级时没备份结果数据库 schema 迁移失败应用配置全丢只能重建。血的教训。3.4 首次登录与基础设置启动成功后浏览器打开地址设置管理员邮箱和密码。进去之后先做几件事第一去设置→模型供应商里配置模型。这里先配 DeepSeek 云端把 API Key 填进去测试连接。如果报an error occurred during credentials validation多半是 Key 或网络问题先确认 Key 有效、机器能访问外网。第二去设置→成员里按需添加团队成员。社区版较新版本支持多租户可以给不同人分配不同工作空间。第三熟悉一下界面布局应用、知识库、工具、工作流几个大模块。建议先建一个最简单的对话应用练手跑通提问→模型回答这条链路再往上加知识库和工作流。4. 本地模型接入与云端兜底策略4.1 Ollama 服务暴露与 Dify 对接Ollama 默认只监听127.0.0.1:11434Dify 跑在容器里访问不到宿主机的 localhost。所以要让 Ollama 监听所有网卡export OLLAMA_HOST0.0.0.0:11434如果是 systemd 管理的 Ollama改 service 文件里的 Environment然后systemctl daemon-reload systemctl restart ollama。然后在 Dify 的模型供应商里选 Ollama填地址。这里有个关键点如果 Dify 在 Docker 里Ollama 在宿主机地址不能填localhost要填宿主机的内网 IP或者用 Docker 的特殊域名host.docker.internalLinux 下需要额外配置。填完地址后Dify 会去拉取 Ollama 的模型列表。如果列表为空说明网络不通先在宿主机curl http://localhost:11434/api/tags确认 Ollama 正常再从容器内curl宿主机地址确认连通性。4.2 模型选择本地跑哪个云端用哪个我的策略是本地跑日常对话和知识库问答云端跑复杂推理和长文本。本地推荐模型deepseek-r1:7b或deepseek-r1:8b推理能力不错7B 量化后 8G 显存能跑。qwen2.5:7b中文表现好指令跟随稳。qwen2.5:14b如果显存够14B 是体验分水岭。云端兜底用 DeepSeek 的大参数版本上下文长、推理强。在 Dify 里你可以给一个应用配置多个模型然后在工作流里用条件判断决定走哪个。比如先让本地模型回答如果回答里出现我不确定或者置信度低再触发云端模型重答。4.3 工作流里的条件路由设计这是整套平台最核心的部分。在 Dify 的工作流编辑器里大致这样搭开始节点接收用户输入。知识库检索节点从向量库召回相关文档片段。条件分支节点判断问题类型。简单事实问答走本地复杂推理走云端。LLM 节点分别配置本地模型和云端模型。结束节点输出结果。条件判断的依据可以是问题长度、是否包含特定关键词、或者先让一个轻量模型做意图分类。我实测下来用关键词 长度做粗筛能覆盖八成场景剩下的交给模型自己判断。提示工作流里最容易出问题的是上下文超长。热搜里那个maximum context length is 1048576 tokens报错就是检索回来的文档太多加上历史对话超过了模型上限。解决办法是在检索节点限制召回数量比如 top 3并给历史对话做截断。4.4 知识库流水线配置Dify 的知识库支持上传 PDF、Word、TXT、Markdown 等。上传后要配置分段和清洗规则。分段策略直接影响检索质量。我的经验是中文文档按 500~800 字分段重叠 50~100 字。分太碎会丢上下文分太大检索不准。清洗规则里可以去掉页眉页脚、多余空行、乱码。如果文档里有表格Dify 的默认解析可能处理不好这时候可以考虑接入外部解析服务。热搜里提到的dify unstructured api url is not configured for doc file processing就是没配外部解析服务导致的如果你不需要解析复杂格式忽略即可需要的话可以自建一个文档解析服务填进去。向量模型的选择也重要。本地可以用 Ollama 拉一个 embedding 模型比如nomic-embed-text中文场景可以用bge-m3。云端可以用 DeepSeek 或其它厂商的 embedding 接口。5. 常见报错与排查速查5.1 认证类错误报错信息可能原因解决方向401 unauthorized: incorrect api keyKey 错误、过期、带空格重新复制 Key检查首尾空格credentials validation失败Key 无效或网络不通确认 Key 有效测试外网连通no api key for provider未配置对应供应商去模型供应商里补配 Key认证类错误排查有个通用套路先在命令行用 curl 直接调 API排除 Dify 的干扰。如果 curl 能通说明是 Dify 配置问题如果 curl 也不通说明是 Key 或网络问题。curl https://api.deepseek.com/v1/chat/completions \ -H Authorization: Bearer $DEEPSEEK_API_KEY \ -H Content-Type: application/json \ -d {model:deepseek-chat,messages:[{role:user,content:hi}]}5.2 模型运行类错误ollama run时报500 internal server error: llama-server process通常是显存不够或模型文件损坏。先看显存占用nvidia-smi确认再确认模型是否下载完整可以删了重拉。ollama下载慢是高频问题前面讲过镜像和离线包两种思路。如果只是偶尔慢可以挂后台慢慢下Ollama 支持断点续传。模型加载后回答乱码或胡言乱语多半是量化版本和硬件不匹配换个量化等级试试比如从 q4 换到 q5。5.3 网络与容器类错误Dify 容器访问不到 Ollama是部署阶段最磨人的问题。排查顺序宿主机curl http://localhost:11434/api/tags是否正常。宿主机curl http://宿主机IP:11434/api/tags是否正常验证监听地址。进入 Dify 容器docker exec -it 容器名 shcurl http://宿主机IP:11434/api/tags是否正常。三步定位问题在哪一层。如果第三步不通是 Docker 网络问题检查防火墙和 Docker 网络模式。注意Linux 下host.docker.internal默认不生效需要在 compose 文件里给服务加extra_hosts: - host.docker.internal:host-gateway或者直接用宿主机内网 IP。5.4 我的独家避坑清单升级前必备份volumes目录整个打包别偷懒。端口规划提前做80、5432、6379 这些默认端口容易冲突部署前先netstat看一眼。模型目录单独挂盘模型动辄几十 G别放系统盘。日志是朋友docker compose logs -f 服务名能解决八成问题报错信息里往往直接写了原因。别一次配太多先把对话跑通再加知识库再加工作流一步步来出问题好定位。6. 从能跑到好用性能与体验优化6.1 推理速度优化本地模型慢主要是显存和量化的问题。几个实测有效的点开启 GPU 加速。Ollama 会自动检测 GPU但要确认它真的用上了。ollama ps能看到模型加载情况如果显示 CPU 占比高说明没走 GPU。选对量化等级。q4_K_M 是速度和质量的平衡点q5 质量更好但更慢q8 基本没必要除非你显存多到用不完。控制上下文长度。Ollama 默认上下文可能设得很大实际用不到那么长调小能省显存、提速。可以在 Modelfile 里设PARAMETER num_ctx 4096。并发控制。Ollama 默认单并发多人同时用会排队。可以设OLLAMA_NUM_PARALLEL提高并发但会吃更多显存量力而行。6.2 知识库检索质量提升检索质量差模型再强也白搭。几个提升点分段策略调优。前面说的 500~800 字是起点具体要看文档类型。技术文档可以小一点叙述性文档可以大一点。混合检索。Dify 支持向量检索和关键词检索开启混合检索能兼顾语义和精确匹配。重排序。检索回来的片段用 rerank 模型重新排序把最相关的放前面。本地可以跑bge-reranker效果提升明显。元数据过滤。给文档打标签检索时按标签过滤能大幅缩小范围。6.3 成本与隐私的平衡云端兜底虽然方便但用多了成本还是会上来。我的做法是本地优先默认走本地只有本地明确答不了才走云端。缓存高频问题缓存答案避免重复调用。预算告警在云端平台设消费告警超了自动降级到本地。敏感数据不出内网涉及客户信息的请求强制走本地工作流里用条件判断拦截。隐私这块本地模型是底线保障。只要数据不出机器合规上就踏实很多。7. 我踩过的那些坑和最后的体会7.1 三个印象最深的坑第一个坑是Docker 网络。我一开始怎么都连不上 Ollama折腾了一晚上最后发现是 Ollama 只监听了 localhost。改成0.0.0.0之后秒通。这个坑的本质是没理解容器和宿主机的网络隔离。第二个坑是升级丢数据。有次看到 Dify 出新版本手贱直接git pull然后docker compose up -d结果数据库 schema 迁移失败应用配置全没了。后来我养成了升级前先备份volumes的习惯再也没出过事。第三个坑是上下文超长。知识库文档多的时候检索回来的内容加上历史对话轻松超过模型上限报maximum context length错误。解决办法是限制召回数量 截断历史现在稳得很。7.2 给不同阶段朋友的建议如果你刚起步先把最简单的对话跑通别一上来就搞知识库和工作流。跑通之后再逐步加功能每加一个都验证一下。如果你已经跑起来了重点优化检索质量。模型能力是固定的但检索质量是可以持续调的这块投入产出比最高。如果你要团队用提前规划多租户和权限。Dify 社区版较新版本支持多租户但配置要提前想清楚后期改起来麻烦。7.3 后续还能怎么扩展这套平台搭好之后扩展空间很大。可以接入企业微信或飞书做机器人可以做定时任务自动生成日报可以把工作流封装成 API 给内部系统调用。我最近在试的是多模型路由——根据问题类型自动选模型代码问题走一个文案问题走另一个。Dify 的工作流支持这种编排配起来不难。最后分享一个小技巧给每个应用写清楚用途和负责人。团队用起来之后应用会越来越多没有注释的话过两个月自己都忘了哪个是干嘛的。这个习惯能省很多沟通成本。整套东西搭下来最大的收获不是省了多少钱而是心里有底了。数据在自己手里模型在自己机器上云端只是锦上添花。这种掌控感是给任何 API 打工都换不来的。
返回列表