本文最后更新于 2024-10-09,文章内容可能已经过时。

私有化部署 Dify+Ollama并快速搭建 AI 应用

Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。

由于 Dify 内置了构建 LLM 应用所需的关键技术栈,包括对数百个模型的支持、直观的 Prompt 编排界面、高质量的 RAG 引擎、稳健的 Agent 框架、灵活的流程编排,并同时提供了一套易用的界面和 API。这为开发者节省了许多重复造轮子的时间,使其可以专注在创新和业务需求上。

docker-compose.png

为什么使用 Dify?

你或许可以把 LangChain 这类的开发库(Library)想象为有着锤子、钉子的工具箱。与之相比,Dify 提供了更接近生产需要的完整方案,Dify 好比是一套脚手架,并且经过了精良的工程设计和软件测试。

重要的是,Dify 是开源的,它由一个专业的全职团队和社区共同打造。你可以基于任何模型自部署类似 Assistants API 和 GPTs 的能力,在灵活和安全的基础上,同时保持对数据的完全控制。

功能比较

功能 Dify.AI LangChain Flowise OpenAI Assistant API
编程方法 API + 应用程序导向 Python 代码 应用程序导向 API 导向
支持的 LLMs 丰富多样 丰富多样 丰富多样 仅限 OpenAI
RAG引擎
Agent
工作流
可观测性
企业功能(SSO/访问控制)
本地部署

系统要求

CPU >= 2 Core   RAM >= 4GB

##red##
注:Ollama可以基于CPU进行处理

部署Dify

为了方便本地快速验证,这里使用Docker Compose 运行。在企业或者生产环境建议采用 K8S环境部署,Dify 依赖较多的中间件,如:weaviate、redis、postgres 等,这些中间件可以采用外部已部署的应用或者容器部署,但是需要注意数据的存储。

前提条件

操作系统 软件 描述
macOS 10.14 or later Docker Desktop 为 Docker 虚拟机(VM)至少分配 2 个虚拟 CPU(vCPU) 和 8GB 初始内存,否则安装可能会失败。有关更多信息,请参考 《在 Mac 内安装 Docker 桌面端》。
Linux platforms Docker 19.03 or later

Docker Compose 1.25.1 or later
请参阅安装 Docker 和安装 Docker Compose 以获取更多信息。
Windows with WSL 2 enabled Docker Desktop 我们建议将源代码和其他数据绑定到 Linux 容器中时,将其存储在 Linux 文件系统中,而不是 Windows 文件系统中。有关更多信息,请参阅使用 WSL 2 后端在 Windows 上安装 Docker Desktop。

克隆 Dify 代码仓库

克隆 Dify 源代码至本地。

git clone https://github.com/langgenius/dify.git

启动 Dify

进入 Dify 源代码的 docker 目录,执行一键启动命令:

cd dify/docker
cp middleware.env.example middleware.env
docker compose up -d

部署结果示例:

[+] Running 9/11
 ⠋ Network docker_ssrf_proxy_network  Created                                                                                                                                                               11.0s 
 ⠦ Network docker_default             Created                                                                                                                                                               10.6s 
 ✔ Container docker-web-1             Started                                                                                                                                                                6.2s 
 ✔ Container docker-ssrf_proxy-1      Started                                                                                                                                                                6.0s 
 ✔ Container docker-sandbox-1         Started                                                                                                                                                                5.8s 
 ✔ Container docker-weaviate-1        Started                                                                                                                                                                5.9s 
 ✔ Container docker-redis-1           Started                                                                                                                                                                5.8s 
 ✔ Container docker-db-1              Started                                                                                                                                                                6.1s 
 ✔ Container docker-worker-1          Started                                                                                                                                                                6.8s 
 ✔ Container docker-api-1             Started                                                                                                                                                                6.6s 
 ✔ Container docker-nginx-1           Started

最后检查是否所有容器都正常运行:

docker compose ps

包括 3 个业务服务 api / worker / web,以及 6 个基础组件 weaviate / db / redis / nginx / ssrf_proxy / sandbox 。

CONTAINER ID   IMAGE                              COMMAND                   CREATED          STATUS                            PORTS                                                                      NAMES
6941261667d2   nginx:latest                       "sh -c 'cp /docker-e…"   12 seconds ago   Up 4 seconds                      0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   docker-nginx-1
815e6921b443   langgenius/dify-api:0.6.15         "/bin/bash /entrypoi…"   12 seconds ago   Up 5 seconds                      5001/tcp                                                                   docker-api-1
48d7df8322c1   langgenius/dify-api:0.6.15         "/bin/bash /entrypoi…"   12 seconds ago   Up 5 seconds                      5001/tcp                                                                   docker-worker-1
e55042c47848   langgenius/dify-sandbox:0.2.1      "/main"                   13 seconds ago   Up 8 seconds                                                                                                 docker-sandbox-1
9c04677fe9fb   semitechnologies/weaviate:1.19.0   "/bin/weaviate --hos…"   13 seconds ago   Up 8 seconds                                                                                                 docker-weaviate-1
d867fe436ec1   ubuntu/squid:latest                "sh -c 'cp /docker-e…"   13 seconds ago   Up 7 seconds                      3128/tcp                                                                   docker-ssrf_proxy-1
3c4e6e1f83ea   langgenius/dify-web:0.6.15         "/bin/sh ./entrypoin…"   13 seconds ago   Up 7 seconds                      3000/tcp                                                                   docker-web-1
dbca771313b3   postgres:15-alpine                 "docker-entrypoint.s…"   13 seconds ago   Up 7 seconds (healthy)            5432/tcp                                                                   docker-db-1
c7e5dfbe7654   redis:6-alpine                     "docker-entrypoint.s…"   13 seconds ago   Up 8 seconds (health: starting)   6379/tcp                                                                   docker-redis-1

更新 Dify

进入 dify 源代码的 docker 目录,按顺序执行以下命令:

cd dify/docker
docker compose down
git pull origin main
docker compose pull
docker compose up -d

同步环境变量配置 (重要!)
如果 .env.example 文件有更新,请务必同步修改您本地的 .env 文件。

检查 .env 文件中的所有配置项,确保它们与您的实际运行环境相匹配。您可能需要将 .env.example 中的新变量添加到 .env 文件中,并更新已更改的任何值。

访问 Dify

在浏览器中输入 http://localhost 访问 Dify。

自定义配置

编辑 .env 文件中的环境变量值。然后,重新启动 Dify:

docker compose down
docker compose up -d

完整的环境变量集合可以在 docker/.env.example 中找到

注册管理员账号

访问 http://192.168.30.10/install,设置管理员账号

image.png

使用刚才设置的邮箱和密码进行登录

image.png

image.png

部署Ollama

Ollama 是一个本地推理框架客户端,可一键部署如 Llama 2, Mistral, Llava 等大型语言模型。 Dify 支持接入 Ollama 部署的大型语言模型推理和 embedding 能力。

下载并启动 Ollama

下载 Ollama

访问 https://ollama.ai/download 下载对应系统 Ollama 客户端。
启动 Ollama

systemctl start ollama

运行 Ollama 并与 Llava 聊天

ollama run llava

启动成功后,ollama 在本地 11434 端口启动了一个 API 服务,可通过 http://localhost:11434访问。

其他模型可访问 Ollama Models 了解详情。

在 Dify 中接入 Ollama

在 设置 > 模型供应商 > Ollama 中填入:

image.png

##red##
为Dify是docker起的服务,所以如果ollama是宿主机上的,需要输入地址为:http://host.docker.internal:11434

  • 模型名称:llava
  • 基础 URL:http://:11434​此处需填写可访问到的 Ollama 服务地址。​若 Dify 为 docker 部署,建议填写局域网 IP 地址,如:http://192.168.1.100:11434 或 docker 宿主机 IP 地址,如:http://172.17.0.1:11434。​若为本地源码部署,可填写 http://localhost:11434。
  • 模型类型:对话
  • 模型上下文长度:4096​模型的最大上下文长度,若不清楚可填写默认值 4096。
  • 最大 token 上限:4096​模型返回内容的最大 token 数量,若模型无特别说明,则可与模型上下文长度保持一致。
  • 是否支持 Vision:是
    当模型支持图片理解(多模态)勾选此项,如 llava。

点击 "保存" 校验无误后即可在应用中使用该模型。

Embedding 模型接入方式与 LLM 类似,只需将模型类型改为 Text Embedding 即可。

配置后ollama效果:

image.png

简单应用

快速创建应用

使用模板快速使用创建一个 Code Interpreter ChatBot 应用

使用本地模型 llava 提问:

image.png
使用本地模型 qwen2 提问:

image.png

使用本地模型 llama3 提问:

image.png

添加知识库

点击 知识库

image.png

创建知识库

image.png

选择文件

image.png

文档分段与清洗

image.png

存储到向量数据库

image.png

基于知识库新建应用

创建空白应用

image.png

选择知识库和模型

image.png

提问测试

image.png

FAQ

如果您使用Docker部署Dify和Ollama,您可能会遇到以下错误:

httpconnectionpool(host=127.0.0.1, port=11434): max retries exceeded with url:/cpi/chat (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f8562812c20>: fail to establish a new connection:[Errno 111] Connection refused'))

httpconnectionpool(host=localhost, port=11434): max retries exceeded with url:/cpi/chat (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f8562812c20>: fail to establish a new connection:[Errno 111] Connection refused'))

这个错误是因为 Docker 容器无法访问 Ollama 服务。localhost 通常指的是容器本身,而不是主机或其他容器。要解决此问题,您需要将 Ollama 服务暴露给网络。

在Mac上设置环境变量

如果 Ollama 作为 macOS 应用程序运行,则应使用以下命令设置环境变量launchctl:

通过调用launchctl setenv设置环境变量:

launchctl setenv OLLAMA_HOST "0.0.0.0"

重启Ollama应用程序。

如果以上步骤无效,可以使用以下方法:

问题是在docker内部,你应该连接到host.docker.internal,才能访问docker的主机,所以将localhost替换为host.docker.internal服务就可以生效了:

http://host.docker.internal:11434

在Linux上设置环境变量

如果Ollama作为systemd服务运行,应该使用systemctl设置环境变量:

vim /etc/systemd/system/ollama.service

[Service]
Environment="OLLAMA_HOST=0.0.0.0"

保存并退出。

重载systemd并重启Ollama:

systemctl daemon-reload
systemctl restart ollama

在Windows上设置环境变量

在Windows上,Ollama继承了您的用户和系统环境变量。

1.首先通过任务栏点击Ollama退出程序

2.从控制面板编辑系统环境变量

3.为您的用户账户编辑或新建变量,比如OLLAMA_HOST、OLLAMA_MODELS等。

4.点击OK/应用保存

5.在一个新的终端窗口运行ollama

如何在我的网络上暴露Ollama?

Ollama默认绑定127.0.0.1端口11434。通过OLLAMA_HOST环境变量更改绑定地址。