保姆级教程:使用dify源码本地部署LLM应用开发平台

2024-06-23 14:30:17 浏览数 (2)

最近太忙太忙了...这篇文章拖了好久了,再不写又要放弃了...

0. LLM应用平台介绍

现在大模型应用平台让人挑花了眼,想创建个人智能体的选择越来越多了,列举一些国内主流AI平台:

腾讯元器:https://yuanqi.tencent.com/my-creation/agent

头条coze: www.coze.cn/

智普GLM:chatglm.cn

百度千帆:console.bce.baidu.com/qianfan/ove…

文心一言:chat.baidu.com/app/create

月之暗面:https://www.moonshot.cn/

猴子无限: ai.infmonkeys.com/

等等...

本文就不做测评了,大家去注册体验会发现这些平台在创建智能体的功能和流程上都差不多,只是在插件和底座大模型上使用了自家服务,打造自己生态。

以腾讯元器为例:

创建流程:

创建智能体主要包括:名称,简介,头像,详细设定,插件,知识库,工作流。

官方插件

Bot商店

只要你有好点子,编排好你的工作流,借助插件工具和底座大语音模型,你就是"超级个体"。创建的智能体还可以方便的发布到QQ和微信平台。

但是这些平台到底算不算使用了Agent,每个人应该有不同的见解吧。

理想中Agent:Agent = LLM Planning Feedback Tool use

平台智能体执行流程:人类编排 LLM Tool use

我们可以看出来通用的应用平台,将一些不稳定和更多创造性的事情还给了人类,而是更多了应用了大模型的辅助任务执行和对话能力。

去年年底我写过一篇关于Agent的文章:AIAgent:我不是只有AI脑!

文章在提到Agent的框架和思路时有写到,在体验完全使用大模型进行规划 执行过程中,效果不好,所以我们完全可以人工规划(工作流编排),每个任务可借助大模型去执行(插件),而且微软开源的PromptFlow就是这个思路,只是它的使用门槛比较高,会让很多不是开发的同学望而却步。没想到几个月后,便捷的可视化智能体平台就遍地开花了。好卷啊!

仔细想想,去年学术界其实已经有很多论文铺好了应用思路,几个月后后好多产品级别的AI应用平台就出现了。

学术研究员们的思路是超前的,企业员工的执行力是超强的。

但是,本文不介绍Agent技术,也不介绍智能体创建流程,更不介绍我们应该选取哪个商业平台。

本文介绍,如何基于Dify在本地部署一个自己的LLM应用开发平台。你不需要半年,你只需要半天,心怀感激的站在巨人肩膀打造自己的平台。

虽然dify官方有详细教程如何本地部署,但是我在使用过程中有遇到一些问题,另外会总结一些自己的思考,提供保姆级教程,希望能帮助到想了解AI应用的非技术人员和新手。

1. dify平台介绍

Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和LLMOPs的理念,使开发者可以快速搭建生产级的生成式 AI 应用。

由于 Dify 内置了构建 LLM 应用所需的关键技术栈,包括对数百个模型的支持、直观的 Prompt 编排界面、高质量的 RAG 引擎、稳健的 Agent 框架、灵活的流程编排,并同时提供了一套易用的界面和 API。相比偏技术和研究的LangChain框架,Dify提供了更接近生产需要的完整方案,并且经过了精良的工程设计和软件测试。

这为开发者节省了许多重复造轮子的时间,让人类可以专注在擅长的思路创新和业务需求上。

2. Dify使用场景

Dify最大的优势是,它开源并且具备成熟和完善的功能,可以进行本地部署。

官网有给出使用Dify平台的优势和使用场景:

创业,快速的将你的 AI 应用创意变成现实,无论成功和失败都需要加速。在真实世界,已经有几十个团队通过 Dify 构建 MVP(最小可用产品)获得投资,或通过 POC(概念验证)赢得了客户的订单。

将 LLM 集成至已有业务,通过引入 LLM 增强现有应用的能力,接入 Dify 的 RESTful API 从而实现 Prompt 与业务代码的解耦,在 Dify 的管理界面是跟踪数据、成本和用量,持续改进应用效果。

作为企业级 LLM 基础设施,一些银行和大型互联网公司正在将 Dify 部署为企业内的 LLM 网关,加速 GenAI 技术在企业内的推广,并实现中心化的监管。

探索 LLM 的能力边界,即使你是一个技术爱好者,通过 Dify 也可以轻松的实践 Prompt 工程和 Agent 技术,在 GPTs 推出以前就已经有超过 60,000 开发者在 Dify 上创建了自己的第一个应用。

如果你只是想体验创建智能体,或者想有好的创意想快速变为现实,其实使用平台功能更好,它们提供了更完善的功能和服务。

如果你工作中有私有化部署的需求,或者想从技术角度了解创建智能体平台的技术栈,就可以进入下一步了。

3. 如何本地化部署

3.1 环境准备

我使用的是Ubuntu环境,首先需要安装dockerdocker compose

我的docker compose安装的v2版本。

代码语言:javascript复制
sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

然后clone源码

代码语言:javascript复制
git clone https://github.com/langgenius/dify.git

最后部署业务需要的中间组件PostgresSQL / Redis / Weaviate,使用如下命令启动:

代码语言:javascript复制
cd docker
docker compose -f docker-compose.middleware.yaml up -d

3.2 后端服务部署和启动

3.2.1 conda环境

代码语言:javascript复制
conda create --name dify python=3.10
conda activate dify

3.3.2 部署后端服务

这部分安装教程步骤即可

代码语言:javascript复制
# 后端服务在api文件夹中
cd api
# 拷贝环境配置
cp .env.example .env
# 生成随机密钥,并替换 .env 中 SECRET_KEY 的值
openssl rand -base64 42
sed -i 's/SECRET_KEY=.*/SECRET_KEY=<your_value>/' .env
# 安装环境
pip install -r requirements.txt
#  数据库迁移
flask db upgrade

3.3.3 启动后端服务

代码语言:javascript复制
# 启动API接口服务
flask run --host 0.0.0.0 --port=5001 --debug
代码语言:javascript复制
# 启动worker服务,异步队列消费服务
celery -A app.celery worker -P gevent -c 1 -Q dataset,generation,mail --loglevel INFO

3.3 前端服务部署和启动

3.3.1 安装环境

这里注意一定要根据指南安装 Node.js v18.x (LTS) ,不然后续install会报错

代码语言:javascript复制
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
apt-get install nodejs -y

安装依赖包

代码语言:javascript复制
# 前端代码在web文件夹
cd web
npm install

如果你也出现了如下错误

可以参考:https://github.com/langgenius/dify/issues/4549

将package.json 移到上一层的root目录下,在此目录执行npm install.

配置环境变量:在web目录下创建文件 .env.local,并复制.env.example中的内容。根据需求修改这些环境变量的值:

代码语言:javascript复制
# For production release, change this to PRODUCTION
NEXT_PUBLIC_DEPLOY_ENV=DEVELOPMENT
# The deployment edition, SELF_HOSTED
NEXT_PUBLIC_EDITION=SELF_HOSTED
# The base URL of console application, refers to the Console base URL of WEB service if console domain is
# different from api or web app domain.
# example: http://cloud.dify.ai/console/api
NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api
# The URL for Web APP, refers to the Web App base URL of WEB service if web app domain is different from
# console or api domain.
# example: http://udify.app/api
NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api

# SENTRY
NEXT_PUBLIC_SENTRY_DSN=
NEXT_PUBLIC_SENTRY_ORG=
NEXT_PUBLIC_SENTRY_PROJECT=

最后构建代码

代码语言:javascript复制
npm run build

3.3.2 启动服务

代码语言:javascript复制
npm run start

3.4 访问dify

最后访问http://127.0.0.1:3000 即可使用本地部署的 Dify了~

需要注意的是,你需要去设置中配置LLM(需要key)

提供的工具,很多也需要去申请key。

本文就不介绍创建应用的流程了,和其他平台流程差不多。

3.5 启动脚本总结

我们总结下本地化服务的启动脚本:

代码语言:javascript复制
# 进入conda环境
conda activate dify

# 后端
cd api
# 启动API服务
flask run --host 0.0.0.0 --port=5001 --debug
# 启动worker服务
celery -A app.celery worker -P gevent -c 1 -Q dataset,generation,mail --loglevel INFO

# 前端
cd web
# 启动前端
npm run start

# 访问
http://127.0.0.1:3000

其实在部署后端和前端环境时,根据安装包,中间组件和requirements.txt 大致就能了解需要的技术栈了,我是前端后端的小白~但不妨碍我们部署。

4. dify VS langchain

咱们看看Agent相关代码,现在看AI框架代码,首当其冲看什么?看prompt!

代码语言:javascript复制
ENGLISH_REACT_COMPLETION_PROMPT_TEMPLATES = """Respond to the human as helpfully and accurately as possible. 

{{instruction}}

You have access to the following tools:

{{tools}}

Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input).
Valid "action" values: "Final Answer" or {{tool_names}}

Provide only ONE action per $JSON_BLOB, as shown:

```
{
  "action": $TOOL_NAME,
  "action_input": $ACTION_INPUT
}
```

Follow this format:

Question: input question to answer
Thought: consider previous and subsequent steps
Action:
```
$JSON_BLOB
```
Observation: action result
... (repeat Thought/Action/Observation N times)
Thought: I know what to respond
Action:
```
{
  "action": "Final Answer",
  "action_input": "Final response to human"
}
```

Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation:.
{{historic_messages}}
Question: {{query}}
{{agent_scratchpad}}
Thought:"""

ENGLISH_REACT_COMPLETION_AGENT_SCRATCHPAD_TEMPLATES = """Observation: {{observation}}
Thought:"""

ENGLISH_REACT_CHAT_PROMPT_TEMPLATES = """Respond to the human as helpfully and accurately as possible. 

{{instruction}}

You have access to the following tools:

{{tools}}

Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input).
Valid "action" values: "Final Answer" or {{tool_names}}

Provide only ONE action per $JSON_BLOB, as shown:

```
{
  "action": $TOOL_NAME,
  "action_input": $ACTION_INPUT
}
```

Follow this format:

Question: input question to answer
Thought: consider previous and subsequent steps
Action:
```
$JSON_BLOB
```
Observation: action result
... (repeat Thought/Action/Observation N times)
Thought: I know what to respond
Action:
```
{
  "action": "Final Answer",
  "action_input": "Final response to human"
}
```

Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation:.
"""

ENGLISH_REACT_CHAT_AGENT_SCRATCHPAD_TEMPLATES = ""

怎么这么熟悉!!!!和langchain关于Agent的system_prompt一模一样~不要误会,dify框架完全不依赖langchain。

关于dify和langchainDify vs Langchain中有提到:

Dify倾向于通过UI和平台集成功能实现,而LangChain则更多依赖于代码层面的灵活配置。选择哪个平台取决于你的开发风格和具体需求。如果你喜欢通过界面操作并希望更直观的集成体验,Dify可能更适合。

如果你习惯于代码配置并希望在代码层面进行精细控制,LangChain会更适合。

总结来说,Dify在架构创新和灵活性方面表现出色,提供了广泛的交互点以增强集成,而Langchain则通过其开发库和集中的模型集成解决方案采取了更简化的方法。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

参考:

https://docs.dify.ai/v/zh-hans

https://cloud.tencent.com/developer/article/2354001

https://cloud.tencent.com/developer/article/2354001

0 人点赞