解决什么问题

手头有一堆文档——产品手册、规章制度、技术笔记——希望”问一句就能得到引用原文的回答”,而不是自己去 Ctrl+F 翻文件。这就是 RAG(检索增强生成)最典型的场景。自己写检索、拼接、调用模型的胶水代码当然可行,但分段、向量化、召回、引用这些活每一件都有工程量。Dify 把这条流水线做成了可视化配置:上传文档、配好模型、勾选知识库,一个能引用你文档的问答应用就出来了。模型层接 DeepSeek API,成本可控;文档层放在自己服务器上,数据不出门。

这篇按最小可用路径走完全程:部署 Dify、配 DeepSeek、补一个绕不开的 Embedding 模型、建库传文档、发布应用。

环境与版本

说明
服务器2 核 4 GB 起步(Dify 官方 README 的最低线),磁盘 20 GB 起步;文档多就往上加
系统能装 Docker 的 Linux 均可;Windows/macOS 桌面机跑 docker compose 也行,适合先试水
Dify社区版,GitHub 仓库 langgenius/dify,当前版本【待补:最新版本号】
DeepSeek开放平台 API Key,价格见站内价格文【待补:当前价格】
EmbeddingDeepSeek 不提供 embedding 接口,需另配一个向量模型(下文用本地 Ollama + bge-m3 解决)

先说清楚最后一行,这是全文最大的前置知识:DeepSeek 的开放接口只有对话类模型,没有 embedding 模型,而 Dify 建知识库必须选一个 embedding 模型做向量化。所以”只配 DeepSeek 就去建库”这条路走不通,下面第三步专门处理它。

第一步:部署 Dify 社区版

部署细节在站内已有专文(见文末相关阅读),这里给最小可用命令序列:

git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d
docker compose ps   # 各容器全部 Up 即部署成功

浏览器访问 http://服务器IP(nginx 默认占 80 端口),首次进入会要求设置管理员账号。之后的全部操作都在这个 Web 界面里完成。

第二步:把 DeepSeek 配成模型供应商

右上角头像 →「设置」→「模型供应商」,列表里直接找到 DeepSeek,粘贴 API Key 保存即可,不需要填接口地址——Dify 内置了 DeepSeek 的接入定义。

Dify 模型供应商列表中的 DeepSeek 入口

同一个设置页里的「系统模型设置」,把「系统推理模型」指定为 deepseek-chat(需要深度推理的任务可以选 deepseek-reasoner)。到这里,新建一个聊天助手已经能正常对话了——但先别急着建知识库,还差一块拼图。

第三步:补一个 Embedding 模型

知识库的向量化必须用 embedding 模型,DeepSeek 不提供,两个方案选一个:

方案 A(云端):在模型供应商里再配一家有 embedding 接口的服务,按用量计费,零运维。

方案 B(本地):服务器上装 Ollama,拉一个向量模型,数据完全不出机器:

# 服务器安装好 Ollama 之后
ollama pull bge-m3
ollama list   # 确认模型已在本地

然后回到 Dify 的模型供应商列表选 Ollama,地址填 http://服务器内网IP:11434。这里有个著名的坑:填 localhost:11434 大概率连不上——Dify 跑在容器里,容器里的 localhost 不是宿主机。Ollama 默认只监听本机回环地址 127.0.0.1,跨机访问要把它的服务地址改为 OLLAMA_HOST=0.0.0.0 并重启 Ollama。Docker Desktop(Windows/macOS)环境下,宿主机地址则填 host.docker.internal

配好供应商后,进「系统模型设置」把「Embedding 模型」指定为刚接入的向量模型。

第四步:建知识库、传文档

左侧「知识库」→ 创建 → 上传文档,txt、md、pdf、docx 等常见格式都支持。分段设置先用默认值【待补:当前默认分段参数】,索引方式选「高质量」——它走向量检索,召回质量比不走向量化的「经济」模式好一档,代价是每段文档都要消耗一次 embedding 调用:

索引方式原理成本适用
高质量向量检索(embedding)每段一次 embedding 调用正式知识库
经济不走向量化近零小文档、先试水

等待索引完成,先用知识库自带的「召回测试」打几个真实问题,确认能命中预期片段再往下走【待补:召回测试的真实示例】。召回都不对,接上模型也只是”一本正经地胡说”。

第五步:创建应用并关联知识库

「创建应用」→ 聊天助手 → 编排页右侧「上下文」勾选刚建的知识库 → 调试预览里问一句只有你文档里才有的内容,验证回答确实引用了文档 → 发布。发布后应用自带服务 API(密钥以 app- 开头),外部系统可以直接调:

curl -X POST "http://服务器IP/v1/chat-messages" \
  -H "Authorization: Bearer app-你的应用API密钥" \
  -H "Content-Type: application/json" \
  -d '{"inputs": {}, "query": "报销流程是什么?", "user": "demo"}'

常见坑

坑一:只配了 DeepSeek 就去建知识库,Embedding 下拉永远是空的。 根因如前所述:DeepSeek 没有 embedding 接口。这是新手卡住时间最长的地方,先按第三步补供应商,再回来建库。

坑二:Ollama 地址填 localhost 连不上。 容器网络隔离,加上 Ollama 默认只监听 127.0.0.1,两个因素叠加。修法见第三步:填内网 IP、把 Ollama 改成监听 0.0.0.0、Docker Desktop 环境用 host.docker.internal。

坑三:80 端口被占。 服务器上常见于已装 nginx 或宝塔面板。改 dify/docker/.env 里的端口再重启即可:

# 编辑 dify/docker/.env
EXPOSE_NGINX_PORT=8080
EXPOSE_NGINX_SSL_PORT=8443
# 然后在 dify/docker 目录下重新拉起
docker compose up -d

坑四:扫描版 PDF 召回为空。 扫描件本质是图片,抽不出文本,索引”成功”但全是空壳。先 OCR 转成带文本层的文件再上传;纯文本 PDF 没有这个问题。

坑五:分段不合理,答非所问。 经验法则:手册类文档按标题层级分;合同、制度这类条款文档按条款分;一问一答的 FAQ 直接按问答对分。默认分段不适合你的文档结构时,改分段比换模型见效快,成本也低。

最终效果

成品是一个部署在你自己服务器上的问答应用:网页里问”报销流程是什么”,回答基于你上传的制度文档并给出引用;外部系统拿 app- 开头的密钥调 API,得到同样能力的回答。模型调用按 DeepSeek 单价计费【待补:本次实战实际花费】,文档与向量库都在自己的机器上。后续文档更新,只需往知识库里追加文件重新索引,应用侧不用动。

相关阅读