【LLM】Dify 0.6.10 在Windows系统上本地化部署(一)

一、参考资料

也可以了解下Dify的竞品FastGPT快速了解 FastGPT | FastGPT

二、Dify 概述

1、Dify开源项目功能介绍(RAG流水线,Agent工具接入,Prompt配置和工作流编排,大模型接入,LLMOps,BaaS)

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流编排、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。以下是其核心功能列表:

  • 1)工作流编排在画布上构建和测试功能强大的 AI 工作流程,利用以下所有功能以及更多功能。

    Dify工作流分为两种类型:

    • Chatflow:面向对话类情景,包括客户服务、语义搜索、以及其他需要在构建响应时进行多步逻辑的对话式应用程序。

    • Workflow:面向自动化和批处理情景,适合高质量翻译、数据分析、内容生成、电子邮件自动化等应用程序。

    具体参考工作流 | 中文 | Dify

  • 2)全面的模型支持:与数百种专有 / 开源 LLMs 以及数十种推理提供商和自托管解决方案无缝集成,涵盖 GPT、Mistral、Llama3 以及任何与 OpenAI API 兼容的模型。完整的支持模型提供商列表可在此处找到。

  • 3)Prompt IDE: 用于制作提示词、比较模型性能以及向基于聊天的应用程序添加其他功能(如文本转语音)的直观界面。

  • 4)RAG Pipeline: 广泛的RAG功能,涵盖从文档摄入到检索的所有内容,支持从 PDF、PPT 和其他常见文档格式中提取文本的开箱即用的支持。

  • 5)Agent 智能体: 您可以基于 LLM 函数调用或 ReAct 定义 Agent,并为 Agent 添加预构建或自定义工具。Dify 为 AI Agent 提供了50多种内置工具,如谷歌搜索、DELL·EStable DiffusionWolframAlpha 等。

    具体参考 工具 | 中文 | Dify

  • 6)LLMOps: 随时间监视和分析应用程序日志和性能。您可以根据生产数据和标注持续改进提示、数据集和模型。

  • 7)后端即服务: 所有 Dify 的功能都带有相应的 API,因此您可以轻松地将 Dify 集成到自己的业务逻辑中

Note:知识点补充

1、什么是RAG?R -> A -> G

参考LLM之RAG理论(六)| 高级RAG指南和技巧大语言模型落地的关键技术:RAG

RAG中的核心组件:检索(Retrieval)、增强(Augmentation)、生成(Generation)

  • RAG中的检索(Retrieval)从哪里找?找的范围?

    检索技术相关的一些关键概念和方法包括检索策略、检索粒度、检索方法、检索效率和外部数据源等;

  • RAG中的增强(Augmentation)数据增强,调整数据分布等

    增强技术相关的一些关键概念和方法包括文本修正、知识融合、上下文增强、控制生成风格、多模态增强、实时更新等;

  • RAG中的生成(Generation)使用哪类生成模型?(文本/图像/视频)基于什么prompt/任务来生成的?(是知识解答,还是对话风格,还是对话质量评估)

    生成相关的一些关键概念和技术包括生成模型、文本生成、控制生成、多模态生成、对话生成、评估生成等;

2、什么是Agent智能体?:能够自主完成某个特定任务,比如问题解答,画图等

3、什么是LLMOps?LLM + Ops一体化)

参考大模型时代的模型运维与部署:LLMops-腾讯云开发者社区-腾讯云大模型时代,一个充满机遇的赛道——LLMOps20 分钟带你搞懂 LLMOps !!

  • LLMOps 的概念可以分解为 LLM 和 Ops 两部分,其中LLM是指大语言模型,即大模型;Ops 则是指平台和工具。LLMOps的完整定义是基于大模型的应用程序的生命周期管理平台或者工具。
    大模型的构建主要分为三个阶段:

    • 第一个阶段是预训练阶段

      在预训练阶段,数据集通过预训练产生预训练模型,这个过程是千模大战的主战场,各类开源闭源的大模型都是通过这个阶段产生的。

    • 第二个阶段是微调阶段

      微调阶段是指特定领域的数据集,在预训练模型的基础上,通过 finetune 手段产生特定领域的模型。

    • 第三个阶段是应用开发阶段

      应用开发阶段只是在预训练模型和特定领域模型的推理功能基础上,为其喂入我们的输入,经过提示工程进行指令编排,最终产生我们所需要的大模型输出。

    大模型应用平台主要关注的是模型微调和应用开发阶段。
    大模型应用的生命周期包括开发、部署、配置和运维。我们着重提出了配置的阶段,prompt engine提示工程。与传统的应用程序不同,配置阶段在大模型里面是非常重要非常核心的阶段

  • 生产中LLM存在的痛点

    • LLM很昂贵:大语言模型的训练非常昂贵,因为它需要对新数据集进行持续的实验和重新训练,以防止模型变得陈旧。更要命的是,推理成本很高。

    • 微调很难:只有少数公司足够成熟,能够不断微调他们的模型并保持数据管道的健康,尤其是在今天大多数数据跨代码、服务、产品团队甚至组织共享的情况下。LLM尽管拥有很多优点,但在生产环境中可能会成为噩梦——你不能只是训练一次然后永远不变。

    • LLM会产生幻觉:这是LLM的一个主要问题,因为它可以传播大量的错误信息。此外,试图理解幻觉发生的原因是困难的,因为LLM推导其输出的方式是一个黑盒子。但是我们知道数据质量、生成方法还有上下文输入会影响幻觉。

    • 规模化和延迟问题客户端编排要比服务器端编排简单得多,真正的挑战是解决现代应用程序的规模化的需求。想象一下,在分布式系统中训练和部署LLM,要考虑到企业级应用缓存、限流和认证授权等一系列关键问题,如何确保系统稳定性、安全性和性能带来了巨大的运营挑战。

    • 隐私和安全:我们已经看到了关于LLM的多个安全问题的实例(比如三星内部数据泄露事件),提示注入已经成为一种流行且有效的绕过LLM基本安全防护的攻击工具。可以预见,在LLM技术栈各个层面加强安全措施之前,企业端的应用不会迅速增长。

  • 下图是海外市场的生态现状,涵盖了整个LLMOps基础设施技术栈的各个领域:

    • 客户端编排工具:这些框架帮助开发者在客户端集成生成式AI应用,将已部署的模型与外部软件API和其他基础模型相连,并促进用户与应用的互动

    • 向量/数据管理工具:利用LLM的一种有效方法是从上下文生成它的数学表示——嵌入(embedding),然后在这些嵌入之上开发ML应用程序, 例如搜索、聚类、推荐、异常检测等

    • 服务器端编排工具:服务器端编排包括在后端执行的代码片段,即用于运行模型的服务器——部署、训练、推理、监控和安全

      • 部署:在考虑利用基础模型时,企业可以使用外部模型或部署自己的模型

      • 可观察性:在生产系统中,我们能够观察、评估、优化和调试代码是至关重要的。由于LLM的黑盒性质,可观察性问题变得更加严重。可观察性包括跟踪和理解性能,识别故障、停机、停机时间,评估系统健康,以及解释输出——解释模型为何做出某个决定等等

      • 隐私/安全:随着严格的隐私和安全法律的发布,我们需要提供准确评估模型公平性、偏见和毒性的工具,以及安全防护栏。企业现在越来越关注训练数据的提取、损坏的训练数据以及专有敏感数据的泄露。除此之外,LLM就像传统的机器学习模型一样容易受到对抗性攻击。因此,我们需要可以保护免受提示注入、数据泄露和有毒语言生成的产品;通过匿名化保证数据隐私;为LLM提供访问控制(例如RBAC);实施对抗性训练和防御蒸馏等等。

2、技术特点
LLM 推理引擎Dify Runtime ( 自 v0.4 起移除了 LangChain)
商业模型支持10+ 家,包括 OpenAI 与 Anthropic新的主流模型通常在 48 小时内完成接入
MaaS 供应商支持7 家,Hugging Face,Replicate,AWS Bedrock,NVIDIA,GroqCloud,together.ai,OpenRouter
本地模型推理 Runtime 支持6 ,Xoribits(推荐),OpenLLM,LocalAI,ChatGLM,Ollama,NVIDIA TIS
OpenAI 接口标准模型接入支持∞ 家
多模态技术ASR 模型GPT-4V 规格的富文本模型
预置应用类型对话型应用文本生成应用(即将下线)
Agent
工作流
群组(Q2 即将推出)
Prompt 即服务编排广受好评的可视化的 Prompt 编排界面,在同一个界面中修改 Prompt 并预览效果
编排模式
- 简易模式编排
- Assistant 模式编排
- Flow 模式编排
- Multi-Agent 模式(Q2 即将推出)
Prompt 变量类型
- 字符串
- 单选枚举
- 外部 API
- 文件(Q2 即将推出)
Agentic Workflow 特性行业领先的可视化流程编排界面,所见即所得的节点调试,可插拔的 DSL,原生的代码运行时,构建更复杂、可靠、稳定的 LLM 应用。支持节点
- LLM
- 知识库检索
- 问题分类
- 条件分支
- 代码执行
- 模板转换
- HTTP 请求
- 工具
RAG 特性首创的可视化的知识库管理界面,支持分段预览和召回效果测试。 索引方式
- 关键词
- 文本向量
- 由 LLM 辅助的问题-分段模式
检索方式
- 关键词
- 文本相似度匹配
- 混合检索
- N 选 1 模式
- 多路召回
召回优化技术
- 使用 ReRank 模型
ETL 技术支持对 TXT、Markdown、PDF、HTML、DOC、CSV 等格式文件进行自动清洗,内置的 Unstructured 服务开启后可获得最大化支持。支持同步来自 Notion 的文档为知识库。
向量数据库支持Qdrant(推荐),Weaviate,Zilliz
Agent 技术ReAct,Function Call
工具支持
- 可调用 OpenAI Plugin 标准的工具
- 可直接加载 OpenAPI Specification 的 API 作为工具
内置工具
- 30+ 款(截止 2024 Q1)
日志支持,可基于日志进行标注
标注回复基于经人类标注的 Q&A 对,可用于相似度对比回复
可导出为供模型微调环节使用的数据格式
内容审查机制OpenAI Moderation 或外部 API
团队协同工作空间与多成员管理支持
API 规格RESTful,已覆盖大部分功能
部署方式Docker,Helm

Note

postgreSQLhttps://aws.amazon.com/cn/rds/postgresql/what-is-postgresql/
向量库

前端

后端

  • Python Flask
3、系统架构设计

三、Dify 0.6.10 本地化部署前后端

官网提供的源码部署文档:Local Source Code Start | English | Dify

官网在Windows系统上部署中间件时,建议使用的是WSL2 + Docker Desktop,由于习惯使用VMWare,这里还是使用虚拟机来部署中间件

而前端项目这里使用

部署步骤如下:

1、配置虚拟机基础环境(这里使用的是Ubuntu 20.04的镜像):
2、部署Dify中间件:postgre,redis, weaviate、sandbox、squid中间件
git clone https://github.com/langgenius/dify.git
cd docker
docker-compose -f docker-compose.middleware.yaml up -d

执行该脚本完成镜像安装后,会启动关于该镜像的容器

此时docker容器已经完成端口的映射,并对外暴露该端口(执行iptables -L可查看):

Note:如果有些镜像源下载失败,配置下新的镜像源,单独用docker pull xxx看是否可以拉取

3、部署后端服务

Windows本地通过conda env虚拟环境安装 flask 环境(windows默认不支持sed,需要下载exe)

conda create --name dify python=3.10
conda activate dify

cd api
cp .env.example .env
openssl rand -base64 42
sed -i 's/SECRET_KEY=.*/SECRET_KEY=<your_value>/' .env


pip install -r requirements.txt

修改数据库的IP地址(这一步需要先部署好中间件,数据库才能初始化成功)

修改.env中的DB_HOST(虚拟机的IP):

再进行数据库迁移

flask db upgrade 

此时就可以在控制台启动后端服务了:

flask run --host 0.0.0.0 --port=5001 --debug
4、部署前端服务

由于在Windows系统中部署前端时,npm run build执行没问题,但是npm run start就报错了:

PS E:\china_unicom_project\gpt\dify\dify\web> npm run start

> dify-web@0.6.9 start
> copy -r .next/static .next/standalone/.next/static && copy -r public .next/standalone/public && cross-env PORT=3000 HOSTNAME=127.0.0.1 node .next/standalone/server.js

系统找不到指定的文件。

修改了package.json后虽然能启动,但是前端服务找不到文件:

因此这里还是在Linux上去部署前端服务,并向外开放端口。

cd web
npm install  // 如果执行很慢,可以在root/npm/logs路径下查看npm install的打印日志

先在虚拟机上telnet下是否能连上主机上的后端服务

若可以则修改.env.example所指向的后端服务地址

接着打包并启动前端服务

npm run build
npm run start

接着修改防火墙配置,开放3000端口:

# 添加防火墙规则
firewall-cmd --zone=public --add-port=3000/tcp --permanent

#重启防火墙
firewall-cmd --reload

接着查看开放端口:firewall-cmd --list-ports

5、功能演示

工作流编排

在这里插入图片描述

创建知识库

在这里插入图片描述

大模型接入和Prompt IDE

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐