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

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

文章目录

  • 【LLM】Dify 0.6.10 在Windows系统上本地化部署
    • 一、参考资料
    • 二、Dify 概述
        • 1、Dify开源项目功能介绍(RAG流水线,Agent工具接入,Prompt配置和工作流编排,大模型接入,LLMOps,BaaS)
        • 2、技术特点
        • 3、系统架构设计
    • 三、Dify 0.6.10 本地化部署前后端
        • 1、配置虚拟机基础环境(这里使用的是`Ubuntu 20.04`的镜像):
        • 2、部署Dify中间件:postgre,redis, weaviate、sandbox、squid中间件
        • 3、部署后端服务
        • 4、部署前端服务
        • 5、功能演示

一、参考资料

  • dify项目主页:https://dify.ai/,https://dify.ai/zh,https://github.com/langgenius/dify
  • dify官方文档:https://docs.dify.ai/user-guide/creating-dify-apps/creating-an-application
  • dify云端体验:https://cloud.dify.ai/explore/apps
  • dify chatFlow节点介绍:https://docs.dify.ai/features/workflow/node
  • dify 技术栈介绍:https://docs.dify.ai/v/zh-hans/getting-started/readme/features-and-specifications
  • dify 应用案例:https://docs.dify.ai/v/zh-hans/learn-more/use-cases

也可以了解下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-腾讯云开发者社区-腾讯云,大模型时代,一个充满机遇的赛道——LLMOps,20 分钟带你搞懂 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

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

  • weaviate:https://weaviate.io/developers/weaviate/configuration/persistence

  • Qdrant:https://qdrant.tech/documentation/

前端

  • React框架 - Next.js:https://nextjs.org/,https://www.nextjs.cn/docs/getting-started

后端

  • Python Flask
3、系统架构设计

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

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

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

而前端项目这里使用

部署步骤如下:

1、配置虚拟机基础环境(这里使用的是Ubuntu 20.04的镜像):
  • 配置SSH:https://blog.csdn.net/devshilei/article/details/139149783

  • 安装Docker

    • 安装docker-CE:https://docs.docker.com/engine/install/ubuntu/,https://blog.csdn.net/qq_39500197/article/details/134754930

      如果docker官网的签名密钥一直不生效,可以使用国内的docker仓库,参考https://www.cnblogs.com/weizhxa/p/12048416.html

      sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
      
    • 配置docker镜像源加速器:修改/etc/docker/daemon.json后重启docker,https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6

  • 安装Node.js:下载tar包安装并在/etc/profile配置环境变量即可https://www.jianshu.com/p/7c11f1355cf5

  • 配置代理(github可能访问不通,需要配置代理):修改/etc/profile并重新加载

    export http_proxy=http://192.168.0.101:7890/
    export https_proxy=http://192.168.0.101:7890/
    export socks_proxy=socks://192.168.0.101:7890/
    export ftp_proxy=ftp://192.168.0.101:7890/
    
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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/697773.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Vue CLI在其他磁盘创建项目出现错误及解决

Vue CLI是Vue.js官方推出的脚手架工具&#xff0c;可以帮我们快速的创建Vue项目框架。 我们创建Vue项目时一般默认都是在C盘&#xff0c;但由于某些因素我们需要在其他磁盘上创建Vue项目。 通过“winr”打开终端时默认位置都是C盘&#xff0c;但是Vue CLI不接受绝对路径作为参…

OpenGL-ES 学习(6)---- Ubuntu OES 环境搭建

OpenGL-ES Ubuntu 环境搭建 此的方法在 ubuntu 和 deepin 上验证都可以成功搭建 目录 OpenGL-ES Ubuntu 环境搭建软件包安装第一个三角形基于 glfw 实现基于 X11 实现 软件包安装 sudo apt install libx11-dev sudo apt install libglfw3 libglfw3-dev sudo apt-get install…

python3.6ssl证书错误无法pip的问题

出现了这个报错&#xff1a; Could not fetch URL https://pypi.python.org/simple/cryptography/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748) - skipping 一开始以为是fiddler开着的原…

iOS——分类、扩展和关联对象

前情回顾 回顾一下什么是分类、什么是扩展&#xff1a; 分类&#xff08;Category&#xff09;和类扩展&#xff08;Extension&#xff09;是两种常见的代码组织方式&#xff0c;用于扩展类的功能。 分类&#xff08;Category&#xff09; 分类是一种将类的实现分散到多个源…

svn的使用

【图文详解】入职必备——SVN使用教程-CSDN博客 使用SVNBucket作为服务端,来辅助学习. 什么时候会产生冲突呢? 原本A,B,服务器的版本都一致,都是最新版. A修改文件m,向服务器提交 B修改文件m,向服务器提交,这时候出现了冲突 双击冲突的文件,手动修改

vscode 访问容器的方式

方法一&#xff1a;先连服务器&#xff0c;再转入容器 配置客户机A M1. 客户机A通过 vscode 连接服务器B&#xff0c;再连接容器C 配置vscode的ssh配置文件&#xff1a;~.ssh\config&#xff08;当需要多个不同的连接时&#xff0c;使用 IdentityFile 指定公钥位置&#xff09;…

【解决问题】QApplication: No such file or directory,C++ 使用Qt或项目未正确加载Cmake报错

运行环境&#xff1a; Clion编译&#xff0c;构建C工程项目报错QApplication: No such file or directory 问题描述 QApplication: No such file or directory 引用的#include <QApplication>飘红 解决方案 1、Qt没有安装正确&#xff0c;请使用对应版本的Qt。或编译…

【Java】Java流中的API

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Vue笔记(二)

Vue&#xff08;一&#xff09;&#xff1a;Vue笔记&#xff08;一&#xff09;-CSDN博客 综合案例&#xff1a;水果购物车 项目功能&#xff1a; 视频链接&#xff1a;034-水果购物车-基本渲染_哔哩哔哩_bilibili 目录结构&#xff1a; index.css .app-container {padding-…

【python】flask 框架

python flask 框架 flask是一个轻量级的python后端框架 (Django, tornado, flask) 官网&#xff1a;欢迎来到 Flask 的世界 — Flask中文文档(3.0.x) 安装&#xff1a;pip install Flask -i https://pypi.douban.com 常识&#xff1a; http,默认端口号为80; https,默认端口号…

【Linux】进程间通信之命名管道

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

linux centos如何安装python3版本但不能影响默认python2版本

在CentOS上安装Python3而不影响系统默认的Python2,具有如何安装呢? 1. 更新系统包 首先,确保系统包是最新的: sudo yum update -y2. 安装EPEL存储库 EPEL(Extra Packages for Enterprise Linux)存储库包含许多额外的软件包,包括Python3: sudo yum install epel-rel…

IDEA:配置Golang的开发环境

1、下载&安装 进入GO的官网下载对应的GO 我们可以下载安装版&#xff0c;不过本人习惯下载解压版&#xff0c;这个因个人而异 2、配置环境变量 GOBIN : %GOROOT%\bin GOPATH : D:\MyGo 工作区间 GOROOT : D:\Program Files\Go GOJDK地址PATH: %GOBIN% ; %GOROOT%\bin ; …

LeetCode 算法:矩阵置零c++

原题链接&#x1f517;&#xff1a;矩阵置零 难度&#xff1a;中等⭐️⭐️ 题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1…

stm32MP135裸机编程:修改基于SD卡的FSBL-A用户程序引导程序(boot)

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf stm32mp135官方开发板原理图&#xff08;mb1635-bdp-v1-0.zip&#xff09; STM32Cube_FW_MP13_V1.0.0 STM32CubeIDE v1.15 1 为什么需要修改FSBL-A用户程序引导程序 FSBL-A用户程序引导程序的作用在《…

PR如何让音频淡入淡出

PR如何让音频淡入淡出 方法一&#xff1a;效果控件关键帧方法二&#xff1a;音频轨道关键帧 以淡入为例&#xff0c;介绍如何设置淡入的两种方法&#xff0c;推荐使用第二种。淡出效果类似。 方法一&#xff1a;效果控件关键帧 选中音频&#xff0c;点击效果控件 在淡入结束的…

Gradio.NET 的简单入门使用

1、最近在网络上由发现了一个好完的东西。 2、Gradio.NET通过简单的C# Web API几行代码就可以实现一网页界面。 3、Python中也有一个Gradio&#xff0c;功能好像都差不多哦&#xff0c;不废话了&#xff0c;我们来开始实操。 4、在Visual Studio 2022 中创建一个 ASP.NET Cro…

Kimichat使用案例012:用Kimichat拆解雷军在小米汽车SU7发布会上的演讲技巧

文章目录 一、介绍二、输入内容三、输出内容四、继续追问五、继续回答六、讲解对比七、对比回答相似之处:不同之处:八、职场人士如何借鉴九、借鉴内容一、介绍 小米SU7发布会可以说是非常成功。雷军的演讲技巧是发布会成功的重要因素之一,很值得借鉴学习。 可以借助Kimichat…

dat.gui图形用户页面

一、导入 1.npm安装 npm install --save dat.gui 引入&#xff1a; // CommonJS: const dat require(dat.gui); // ES6: import * as dat from dat.gui; const gui new dat.GUI(); 二、控制器 <!DOCTYPE html> <html lang"en"> <head><…

振动分析-1-频谱分析的关键步骤及如何看频谱图

振动故障诊断——如何进行振动频谱分析 参考振动频谱分析关键步骤及分析要点 参考怎么看频谱图? 图解滚动轴承故障的频谱波形 1 频谱分析关键步骤 频谱分析准确与否取决于多个方面。 (1)设置仪器频率范围、分辨率等&#xff1b; (2)数据采集位置应根据设备的机械特性、振动传…