站长直接切入正题。本地知识库的核心痛点从来不是“模型不够聪明”,而是“检索链路断裂”与“依赖组件版本错位”。ollama 负责把大模型压在本地显存里,dify 负责把 RAG 流程编排成可视化管道。这套组合拳打好了,你就能彻底摆脱云端 API 的账单焦虑和隐私泄露风险。以下配置过程基于站长多次重装后的经验浓缩,每一步都标注了最容易翻车的暗坑。
一、前置依赖:版本锁定比最新版更重要
⚡ 【免费资源】DeepSeek/Ollama 部署排错手册 + 全套 AI 提示词资料包
站长已将大模型部署排错指南、常用环境配置文件及 AI 提效指令库整合分享至夸克网盘,可极速免费转存:
先别急着 docker pull。站长见过太多案例是 dify 最新版要求 docker compose 版本高于 2.20,而服务器上还是老掉牙的 1.29,导致 network 配置直接报错。你的基础环境必须满足以下硬性指标,缺一不可:
# 检查 docker compose 独立二进制版本(不要用 docker-compose 软链接)
docker compose version
# 要求输出 v2.20.0 以上,否则直接升级
sudo apt-get remove docker-compose-plugin -y
sudo apt-get install docker-compose-plugin -y
# 检查显存驱动(NVIDIA 用户必须执行)
nvidia-smi | grep "CUDA Version"
# 如果这里没有输出,你的 ollama 将无法调用 GPU,知识库 embedding 速度会慢到怀疑人生
另一个隐藏依赖是 内存与 Swap 的比值。dify 的 API 服务和 worker 容器同时启动时,峰值内存占用轻松突破 8GB。如果你的机器只有 8GB 物理内存,务必提前分配 4GB Swap,否则容器会被 OOM Killer 随机处决,且日志里不会留下任何 ERROR 痕迹,只会显示“Container exited with code 137”。
二、ollama 安装与模型拉取:别用默认端口
ollama 的安装脚本默认监听 11434 端口,但 dify 的默认配置里写的是 localhost:11434。如果你把 ollama 装在 docker 容器里,就必须让 dify 能通过宿主机 IP 访问到它。站长推荐直接裸机安装 ollama,省去一层 NAT 转发烦恼:
# 裸机安装(不要加 sudo,ollama 默认安装到用户目录)
curl -fsSL https://ollama.com/install.sh | sh
# 修改监听地址,使其允许 docker 网段访问(关键步骤)
sudo systemctl edit ollama.service
# 在打开的编辑器中填入以下内容:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_KEEP_ALIVE=24h"
# 保存并退出,然后重启服务
sudo systemctl daemon-reload
sudo systemctl restart ollama
# 拉取对话模型(推荐 qwen2.5:7b,中文知识库效果均衡)
ollama pull qwen2.5:7b
# 拉取 embedding 模型(必须用 nomic-embed-text,不要用 mxbai 或 bge)
ollama pull nomic-embed-text
避坑要点:如果你同时使用 dify 的多个应用,务必设置 OLLAMA_KEEP_ALIVE=24h。默认的 5 分钟卸载策略会导致每次请求都重新加载模型,知识库问答延迟直接翻倍。另外,embedding 模型的选择直接决定检索质量。站长测试过 bge-m3 在 dify 里会出现维度不匹配报错,因为 dify 预设的向量维度是 768,而 bge-m3 输出 1024 维。nomic-embed-text 输出 768 维,与 dify 的向量数据库 schema 完美对齐。
三、dify 部署与配置:docker-compose 文件魔改
💡 关联延伸阅读:如果你在配置过程中遇到相关报错,请参阅站长之前的解决教程:dify+ollama+deepseek部署本地大模型+知识库搭建:高并发调优与生产环境API调用实战指南
不要直接 git clone dify 官方仓库然后 docker compose up -d。官方默认配置里包含 sandbox、plugin_daemon 等一堆你暂时用不到的服务,白白吃掉 2GB 内存。站长教你手动裁剪:
# 只克隆必要文件
git clone --depth 1 https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
# 编辑 .env 文件,重点修改以下参数(用 vim 或 nano)
vim .env
在 .env 里你必须修改的内容如下(其他保持默认即可):
# 强制指定向量数据库为 weaviate(默认是 qdrant,但对本地资源不友好)
VECTOR_STORE=weaviate
WEAVIATE_EMBEDDING_DIM=768
# 禁用遥测和插件市场(减少外部网络请求,避免启动卡死)
TELEMETRY_ENABLED=false
MARKETPLACE_ENABLED=false
# 关键:配置 ollama 的 base_url,注意是 http:// 且 IP 不能是 localhost
OLLAMA_BASE_URL=http://宿主机实际IP:11434
# 修改 dify 的 web 端口,避免与 ollama 冲突(如果 ollama 也开了 web 界面)
EXPOSE_NGINX_PORT=8080
修改完 .env 后,站长建议你只启动核心依赖服务,而不是一股脑全启动:
# 先启动中间件(数据库、缓存、向量库)
docker compose up -d db redis weaviate
# 等待 30 秒让数据库初始化完成
sleep 30
# 再启动 api 和 worker(不要加 -d,先看日志确认无报错)
docker compose up api worker
看到 Worker started 和 API server started 后,按 Ctrl+C 停掉,然后正式后台运行:
docker compose up -d api worker web
四、知识库创建与模型绑定:三步走避坑
打开浏览器访问 http://服务器IP:8080,设置管理员账号后进入主界面。站长带你走一遍完整流程:
第一步:添加模型供应商。在“设置”->“模型供应商”里找到 Ollama,点击“添加模型”。这里有两个独立模型需要分别添加:
# 模型 1:对话推理模型
模型类型:LLM
模型名称:qwen2.5:7b
基础 URL:http://宿主机IP:11434
上下文长度:32768(必须手动改,默认 4096 会导致长文档截断)
# 模型 2:Embedding 模型
模型类型:Text Embedding
模型名称:nomic-embed-text
基础 URL:http://宿主机IP:11434
维度:768(必须手动填,否则报错)
第二步:创建知识库。点击“知识库”->“创建知识库”,上传你的 PDF/TXT/Markdown 文件。切分规则站长强烈建议选择“自定义”,分段标识符填 \n\n(两个换行),最大分段长度设为 800,重叠长度设为 100。这个参数组合能兼顾检索精度与上下文连贯性,默认的“自动切分”经常把代码块或表格拦腰截断。
第三步:应用编排。创建一个“聊天助手”应用,在提示词编排页面把模型切换成你刚添加的 qwen2.5:7b,然后在“上下文”区域点击“添加”并选择你刚建的知识库。检索模式选“向量检索”,TopK 设为 4,Score 阈值设为 0.3。低于 0.3 的匹配结果基本是噪声,宁可答不上来也不要胡说八道。
五、高频踩坑排查清单:站长替你趟过的雷
坑 1:容器内无法访问宿主机 ollama。症状是 API 报 503 或 connection refused。原因多半是 .env 里写了 localhost。记住,docker 容器里的 localhost 指向容器自己,不是宿主机。必须改成局域网 IP,或者在 docker-compose.yml 的 api 服务下添加 extra_hosts: - "host.docker.internal:host-gateway",然后 .env 里写 http://host.docker.internal:11434。
坑 2:知识库问答时总说“未找到相关文档”。先别怀疑模型,去 weaviate 里查向量数据是否存在:
docker exec -it weaviate /bin/sh
# 进入后执行(查询文档数量)
wget -qO- http://localhost:8080/v1/schema | jq '.classes[] | {name: .class, count: .properties}'
如果返回空,说明 embedding 根本没写入。检查 ollama 日志:journalctl -u ollama -f,看是否有维度错误或显存溢出。
坑 3:dify 界面能打开但登录后白屏。这是前端资源加载失败,多半是 nginx 容器没有正确代理。检查 docker compose ps 里 nginx 是否处于 healthy 状态。如果不是,手动重启:docker compose restart nginx,并清空浏览器缓存(特别是 Service Worker,这玩意儿会缓存错误页面)。
坑 4:回答速度极慢(超过 30 秒)。首先确认 ollama 是否真正使用了 GPU:ollama ps 查看显存占用。如果显示 100% CPU,说明你的 llama.cpp 编译版本没启用 CUDA。需要重新安装带 GPU 支持的版本:
# 卸载原版
sudo rm -rf /usr/local/bin/ollama
sudo rm -rf /usr/local/lib/ollama
# 下载 GPU 版本(注意区分 amd 和 nvidia)
curl -fsSL https://ollama.com/install.sh | OLLAMA_GPU_DRIVER=cuda sh
坑 5:上传大 PDF 时内存溢出。dify 的文档解析器用的是 PyPDF2,对 100MB 以上的文件会直接吃掉 2GB 内存。站长建议先用工具拆分 PDF:pdftk input.pdf cat 1-50 output part1.pdf,或者干脆转成纯文本再上传。知识库不是越大越好,分段后总 token 数超过模型上下文长度时,检索效果会断崖式下跌。
六、性能调优终极参数
当基础链路跑通后,站长给你一组实测过的优化参数,直接提升 40% 响应速度:
# 在 dify 的 .env 里追加以下配置
# 开启异步任务队列
CELERY_WORKER_CONCURRENCY=8
# 增大 embedding batch 大小(默认 10 太保守)
BATCH_EMBEDDING_SIZE=64
# 关闭无用的日志输出
LOG_LEVEL=WARNING
同时,在 ollama 侧创建模型别名,减少每次请求时的 prompt 模板处理开销:
ollama create dify-qwen -f - <
然后在 dify 的模型配置里把模型名从 qwen2.5:7b 改成 dify-qwen。注意:修改模型名后,原来创建的对话应用需要重新选择一次模型才能生效,否则会报“模型不存在”的 404 错误。
七、数据备份与迁移
本地知识库最大的价值就是数据主权。站长建议每周备份一次向量库和数据库:
# 备份 weaviate(先暂停写入)
docker compose stop api worker
docker run --rm -v dify_weaviate_data:/data -v $(pwd):/backup alpine tar czf /backup/weaviate_$(date +%Y%m%d).tar.gz -C /data .
docker compose start api worker
# 备份 postgres(知识库元数据)
docker exec -t dify-db pg_dump -U postgres -d dify > dify_backup.sql
恢复时只需把 tar.gz 解压回对应 volume,然后用 psql 导入 sql 文件。注意版本一致性:dify 升级大版本后,旧备份可能无法直接恢复,建议升级前先做完整备份,且不要跨大版本升级。
八、总结:本地化不是终点,稳定才是
这套 ollama + dify 组合跑通后,你收获的是一个完全离线、无隐私泄漏、无调用费的知识库系统。但站长必须提醒你:本地部署最大的敌人是“版本漂移”。ollama 更新频繁,dify 迭代也快,每次升级前先读 changelog,重点看向量数据库 schema 和 embedding 维度有没有变化。一旦维度变了,旧数据全部作废,必须重新 embedding。保持克制,能用就不要乱升级,这是本地化服务的长久生存之道。最后,把 ollama 和 dify 的容器设为开机自启,并配置 UFW 防火墙只放行 8080 端口,你的知识库就正式投产了。
相关 AI 排错与深度技术延伸
⚡ 开发者实操必备资源与算力限时特惠通道
阅读完本教程准备实操?站长已将 AI 部署排错手册、提示词全集与服务器限时优惠整理如下,即拿即用: