作者:他们都叫我老宁
很多小伙伴要求老宁安排一期大语言模型(LLM)相关的文章,今天它终于来了。
Dify 是一款开源的大语言模型 ( LLM ) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。
上面是 Dify 官方对自己的介绍,用大家听得懂的话来说就是:
对于普通用户来说,可以毫不费力地使用 Dify 来打造专属于自己的 AI 机器人。利用 Dify 的内建工具,可以赋予机器人更多的能力,并且它们可以通过 web 界面轻松地与家人共享。
对于企业用户,Dify 不仅可以接入第三方的语言模型,还支持接入自建的本地或云端开源模型。借助 Dify 的知识库功能,企业能够方便地构建一套完全保障隐私、不会发生信息泄露的客户服务机器人。
老宁会详细介绍在群晖上的部署步骤、Dify 的主要功能以及使用演示。
项目地址
https://github.com/langgenius/dify
安装部署
下面介绍两种部署的方法,通过 Docker Compose 和群晖部署,本文会着重介绍通过群晖来部署。
Docker Compose
克隆 Dify 源码到本地机器
git clone https://github.com/langgenius/dify.git
进入 Dify 源代码中的 docker 目录,执行如下命令启动 Dify:
cd dify/docker docker compose up -d
群晖部署
Dify 涉及到镜像众多,环境变量也非常复杂,所以我们要借助群晖 Container Manager 套件的项目来运行 docker 容器。
打开 docker-compose 文件https://github.com/langgenius/dify/blob/main/docker/docker-compose.yaml并下载到本地。
打开群晖,新建用以存放 Dify 配置的文件夹 dify,并把前面下载的 docker-compose.yaml 文件上传到该文件夹中。
打开 docker-compose 文件,把最后面的 nginx 相关的配置注释。
同时修改 api 下的几个环境变量为将要反代的 URL 地址。
放开 api 下 ports 的 5001 端口注释。如果端口被其他服务占用,可以修改左边的 5001 为其他任意端口(5001 一般都会被群晖占用,演示修改为 5301)。
web 下的 URL 地址也要同时修改,并放开 ports 的注释。如果端口被其他服务占用,可以修改左边的 3000 为其他任意端口。
根据 docker-compose 配置的内容,分别在 dify 文件夹中 按照以下路径新建对应的文件夹。
/volumes/app/storage
/volumes/db/data
/volumes/redis/data
/volumes/weaviate
比如 /volumes/app/storage 代表在 volumes 文件夹中创建 app 文件夹,再在 app 文件夹中创建 storage 文件夹。
至于为什么要创建上面的文件夹,是因为后面通过 Container Manager 启动项目时,不是以 root 用户进行操作,只有以 root 用户操作才能自动创建文件夹。
我们怎么知道该创建哪些文件夹呢?
这些文件夹是根据每个服务(api 服务、worker 服务、db 服务等)的挂载路径来配置的(:号前面的宿主机路径就是要创建的文件夹)。
创建完文件夹后,需要把 dify 文件夹增加 Everyone 可读写权限,并勾选应用到这个文件夹、子文件夹及文件选项。
打开 Container Manager 套件,点击项目,点击新增后,选择前面的 dify 文件夹, docker-compose 文件会被自动导入。
输入项目名称后,点击下一步创建项目并启动。
等待项目构建完毕后,可以点击 dify 查看容器下的几个容器是否全部启动成功,全部成功才代表整个项目部署成功。
反向代理
为了保证服务能在外部访问,需要配置反向代理,下面以 Nginx Proxy Manager 进行演示。
打开 Nginx Proxy Manager 后台,增加新的一个域名,转发的 IP 为群晖内网 IP,端口为前面 docker-compose 文件中web 服务的端口。
在 Custom locations 中,新增 /console/api、/api、/v1、/files 路径,都转发群晖的 IP 上,转发的端口和前面 docker-compose 文件中API 服务的端口号保持一致(截图只截了一个,一定要把四个路径都添加上去)。
选择好 SSL 证书后,点击保存。
Dify 功能
用浏览器打开【https:// 反代域名 /install】进行管理员账户设置。
配置完管理员账户后,就能登录到 Dify 主界面了。
探索
探索提供了非常多的模版应用。
在探索界面可以把模版应用添加到自己的工作区。
工作室
工作室可以创建并管理应用。
可以创建空白应用或根据模版创建。
知识库
可以在知识库中新建知识库,创建好的知识库可以被工作室中的应用调用。
工具
Dify 提供了许多内置的工具。用户也可以创建自定义工具。
聊天机器人
接下来演示如何创建一个 AI 机器人聊天应用。
首先要配置模型供应商。点击右上角的用户名,再点击设置。
选择模型供应商选项后,可以看到 Dify 默认集成了市面主流的模型供应商,包括我们熟悉的 GPT、Gemini、文心一言、通义千问。
Dify 还支持基于 OpenLLM部署的自建的开源模型以及兼容 Open AI 的模型供应商。如果你想要使用本地模型,那么就可以自己根据 https://github.com/bentoml/OpenLLM的文档自己部署并接入。
这里使用兼容 OpenAI API 的模型供应商来演示。点击 OpenAI-API-compatible 选项卡后,输入模型名称、API Key 以及 API 的 URL 地址,点击保存。如果配置没有问题会弹出成功的提示框。
配置完成后,我们在工作室内创建一个空白应用,类型选择聊天助手。
进入到应用,可以看到当前应用可以使用的模型,如果配置了多个模型,可以点击切换。
在输入框中输入文字来测试对话功能是否正常。
调试没有问题后,就可以把应用发布给其他人使用了。点击发布后,可以看到 Dify 提供了三种访问方式:运行、嵌入网站和访问 API。
运行,就是打开一个类似 GPT 的独立聊天页面,对于普通用户来说非常方便。
嵌入网站,站长可以把写好的机器人嵌入到自己的网站中。
访问 API,开发者可以自己根据 API 接口实现与机器人的对话。
知识库
上面的演示可能让你感觉到好像和https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web类似,并没有什么过人之处。
接下来我们看看 Dify 提供的知识库功能,有了知识库才能让你的机器人更为专业,更懂你。
知识库数据源的导入方式有两种,已有文本和同步 Notion 内容。
创建一段 txt 并导入。
进行文本分段和清洗。
分段和清洗完成。
回到工作室修改老宁的小助手,添加上下文为刚刚创建的知识库,现在他就会根据知识库的内容进行回答了(GPT 本身不知道老宁是谁,也不知道老宁的课程表)。
如果它的回答不知道或者回答不准确,那么需要调整你的知识库,重新清洗或者分段。
Dify 提供了统计面板,用户可以看到消息数、活跃用户、token 消耗等情况。
工作流
最后我们来演示工作流。有了工作流,可以让我们的 AI 机器人更为强大。
老宁做了一个工作流应用来演示。当用户向工作流应用提问时,会从知识库中查询符合条件的内容,查询到符合的内容,就交给 LLM 进行处理,再调用 HTTP 请求把结果发送给企业微信机器人。
如果没有在知识库中查询到相关内容,就会调用必应搜索的 API 接口进行查询,再把查询到的结果发送到企业微信机器人。
首先需要在开始节点中添加一个查询字段,变量名为:query,用以接受用户的输入。
增加知识检索节点,选择查询变量为前面新建的query,并添加需要检索的知识库。
为空代表没有查询到结果,进入必应搜索,不为空就进入 LLM 节点。
处理检索的信息。
必应查询的内容同样为query变量对应的内容。必应搜索需要调用 API,免费用户可以每月调用 1000 次,付费计划可以参考官方https://www.microsoft.com/en-us/bing/apis/pricing。
配置发送 HTTP 请求节点。Dify 提供了发送到企业微信机器人工具,没研究怎么配置请求参数,所以直接采用 HTTP 节点调 机器人的 Webhook URL(注意 BODY 请求体中必须包含 msgtype 字段)。
运行测试工作流是否正常。
企业微信收到从知识库中获取的信息。
询问与知识库无关的内容,会执行必应搜索。
企业微信收到调用必应搜索查询到的消息。
后记
经过老宁对 Dify 的讲解,想必大家对它有了一个初步的认识,这篇文章只能说是抛砖引玉,大家可以发挥自己的想象力,结合自身的需要打造出一个适合自己,适合企业的专属机器人。
你说没有的免费 GPT API,还不会使用 OpenLLM部署的开源模型?请持续关注老宁,这些内容都会慢慢安排。
我是老宁
一个热爱技术的程序员和极客,群晖 NAS 深度玩家!
专注 NAS 相关技术分享,原创!干货!
觉得老宁的文章对你有帮助,记得点赞、收藏、加关注!