跳至主要内容

Dify AI:带演示项目的指南

了解什么是 Dify,以及如何使用其低代码拖拽界面构建一名 AI 旅行助手。
· 12分钟 阅读

使用 AI 探索

Dify 是一个易用的平台,帮助您以低代码或零代码方式构建 AI 应用。它通过拖拽具有不同功能的模块来工作。信息在模块之间流动,被处理并组合以生成答案。

在本文中,我将通过一步步创建一名 AI 旅行助手,带您了解 Dify 的基础知识。

我们通过发送 The Median(每周五发布的免费通讯,梳理本周 AI 关键信息)来为读者持续更新 AI 最新动态。订阅即可每周几分钟快速掌握要点:

什么是 Dify?

Dify 是一个旨在简化 AI 应用开发的平台,无需深厚的编码技能。它提供友好的低代码环境,用户可以通过拖拽不同组件来构建应用。

可以把 Dify 想象成一个数字工具箱,里面装满了可拼接的现成模块,用于搭建可用的软件。此方式让技术更易触达,使编程经验有限的人也能将想法变为现实。

每种模块都有输入,并根据模块类型将其转换为不同的输出。信息在各模块间传递和转换,最终产生结果。

开始使用 Dify

我们有两种使用 Dify 的方式:

  • 本地部署。
  • 使用云端版本。

本教程使用云端版本。Dify 的云端版本提供免费方案,因此无需付费订阅即可跟随教程操作。

如果您对本地部署感兴趣,最简单的方法是:

  1. 从官方仓库下载或克隆 Dify。
  2. 按仓库 README 的快速开始部分说明使用 Docker 运行 Dify。

在 Dify 中创建 Chatflow

Dify 提供多种应用类型。我们将专注于构建 Chatflow 应用,这是一种让用户通过聊天界面与智能体交互的 AI 流程。

要创建新的 Chatflow 应用,先点击 "Create from blank",然后选择 "Chatflow" 选项。

在 Dify 中从空白创建流程

创建流程时,我们设置一个名称,然后点击“Create”按钮:

在 Dify 中创建 Chatflow

这将创建如下默认流程:

Dify 中的默认 Chatflow

该流程包含三个模块:

  • 起始模块负责启动流程。对于 Chatflow,流程由用户发送消息触发。
  • LLM 节点将用户消息作为输入并发送给 LLM,本例中为 gpt-4。
  • 最终节点用于在聊天中显示消息。在此示例中,它连接到 LLM 节点,因此 LLM 节点的输出会发送到聊天界面。

这三个节点共同构成了一个类似 ChatGPT 的 AI 聊天。运行该应用前,我们需要安装并配置 OpenAI 插件。

安装并设置 OpenAI 插件

安装 OpenAI 插件的步骤如下:

  1. 点击右上角的 "Plugins" 按钮。

在 Dify 中添加 openai 插件

  1. 点击 “Install from Marketplace”。

在 Dify 中访问应用市场

  1. 在搜索框中输入 "openai",然后点击 OpenAI 插件。

在 Dify 中安装 OpenAI 插件

  1. 选中 OpenAI 插件并点击 “Install”。

接下来,我们需要设置 OpenAI API 密钥。如果您还没有,请在此处创建。请注意,使用 OpenAI API 并非免费,您需要为 API 密钥绑定支付方式。

拿到密钥后,按以下步骤进行配置:

  1. 选择 LLM 节点。

选择一个 Dify 模块

  1. 点击模型名称旁的配置图标。

在 Dify 中配置 LLM 模块

  1. 点击顶部的模型下拉菜单。

模型下拉菜单

  1. 点击列表底部的 "Model Provider Settings"。

在 Dify 中配置模型提供方

  1. 在 API key 部分点击 "Setup"。

在 Dify 中进行模型设置

  1. 粘贴 API 密钥并点击 “Save”。

在 Dify 中配置 OpenAI API 密钥

运行应用

现在我们可以点击预览按钮来运行应用:

预览应用

目前它并不算有趣,因为只是一个 AI 聊天机器人。请记住,在用户发送消息之前,它不会执行任何操作。

Dify 中的示例聊天

创建变量

Dify 允许通过为变量赋值来存储应用状态,这些变量对所有模块可见。

要创建变量,点击变量按钮:

在 Dify 中添加变量

让我们创建一个变量来存储用户名:

在 Dify 中配置变量

此配置创建了名为 name 的变量,用于存储字符串(文本)。我们将默认值留空,因此变量初始为空字符串。

有多种方式可以填充它,但最常见的是使用 AI 模块从对话中自动识别。稍后我们会学习如何实现。在此之前,我们先学习如何检查变量的值以控制应用流程。

IF/ELSE 模块

要检查变量的值,我们可以使用 IF/ELSE 模块。该模块用于根据变量的值执行不同操作。

要添加新模块,点击底部的“+”按钮:

在 Dify 中添加模块

然后选择要添加的模块。本例中我们选择 "IF/ELSE":

Dify 中的 IF/ELSE 模块

接着点击该模块进行配置,选择我们之前创建的 name 变量。

为测试起见,我们添加两个 Answer 模块。这些模块用于在聊天中显示消息。将其中一个连接到 IF 输出(条件为真时运行),另一个连接到 ELSE 输出(条件为假时运行)。

在 Dify 中使用 IF/ELSE 控制流程

对于 IF 输出,我设置字符串 "Sorry, I don't know your name.";而对于 ELSE,我设置为 "Hello, {name}!"。我们可以用花括号在字符串中插入变量。这在后续构建提示词时也很有用。

点击 "Preview" 按钮即可试用该 Chatflow。请注意,Chatflow 由用户消息触发,因此需要先发送一条消息,比如 "Hi"。以下是根据是否设置了名字的不同结果(第二个示例中我在界面变量里手动设置了名字):

流程控制的结果

变量赋值器与参数提取器模块

我们可以使用参数提取器模块借助 AI 识别并提取变量的值。该模块使用 LLM 从对话中提取信息。

参数提取器模块

我们先在 IF 分支后添加一个参数提取器模块。以下是模块配置:

在 Dify 中配置参数提取器

  • INPUT VARIABLE 设置为 sys.query,即用户消息。这意味着参数提取器模块将尝试从用户消息中提取值。
  • 在 EXTRACTION PARAMETERS 中,我们定义要提取的信息。遗憾的是,这里不能直接指定变量,因此需要点击“+”按钮重新定义该信息。

参数配置

  • INSTRUCTION 字段是提示词,用于引导 LLM 要做什么。
  • 接着我们添加一个变量赋值器模块,将参数提取器提取到的值(若有)赋给 name 变量。

变量赋值器模块

务必将提取到的 name 赋给 name 变量。

变量赋值器配置

完成此步后,name 变量可能仍未定义,因为用户可能没有提供姓名。因此我们再添加一个 IF/ELSE 模块进行检查:若名字已设置,则向用户问好;否则询问其姓名。

姓名提取流程

以下是一个交互示例:

在 Dify 中使用姓名提取流程的示例聊天

此流程展示了 Dify 工作流的基本原理。无论用户消息是什么,只要姓名未定义,就尝试从消息中提取;若失败则询问;否则便用其姓名致意。

此时还没有 LLM 模块,因此该智能体不会执行其他任务。

代码模块

代码模块可用于执行自定义 Python 代码。我们来修改上一个流程,改为提取用户所在地而不是姓名。然后使用一个代码模块请求天气 API,并将天气预报发送给用户。

  • 创建一个名为 location 的新变量。
  • 将 IF/ELSE 模块改为检查 location 而非 name。
  • 将参数提取器模块改为提取所在地而非姓名。
  • 将变量赋值器模块改为将提取的值赋给 location 变量。
  • 修改 Answer 模块,分别用于询问所在地并显示所在地。

完成这些步骤后,流程应如下所示:

在 Dify 中的所在地提取流程

以下是一个示例交互:

所在地提取示例聊天

下一步是在得到所在地后添加代码模块。该模块向OpenWeather API 发起请求,获取该地的天气预报。

该 API 可免费使用,但需控制请求次数。

将第二个 Answer 模块替换为代码模块。

代码模块

配置其接收一个参数,即 location 的值。

配置代码模块

对于 Python 代码,下面演示如何使用 requests 包从 OpenWeather API 获取天气:

import requests

API_KEY = "PASTE_YOUR_API_KEY_HERE"

def main(location: str) -> str:
    base_url = "http://api.openweathermap.org/data/2.5/weather"
    params = {
        "q": location,
        "appid": API_KEY,
        "units": "metric",
    }
    response = requests.get(base_url, params=params)
    data = response.json()
    if response.status_code == 200:
        weather_desc = data["weather"][0]["description"]
        temp = data["main"]["temp"]
        return {
            "result": f"Current weather in {location}: {weather_desc}, Temperature: {temp}°C"
        }
    else:
        return {
            "result": "Could not retrieve weather data",
        }

最后,将代码节点的输出连接到一个 Answer 节点,向用户展示结果。

展示代码模块结果

现在我们已有一个能告知天气预报的 Chatflow:

天气智能体的示例对话

项目:创建旅行规划 AI 智能体

现在我们已经具备构建 AI 旅行助手所需的工具。可能性很多,但为避免过度复杂化,本教程将保持简洁。

该智能体将专注于规划旅行中的单日行程。它会先收集用户的所在地以及其喜欢的活动类型。为此我们使用两个变量:

  • location:存储用户旅行目的地。
  • activities:字符串数组,存储用户想做的活动。

在 Dify 中配置 activities 变量

以下是可用于同时提取这两个变量的流程:

在 Dify 中的双参数提取流程

在此示例中,我们首先使用一个变量提取模块,同时提取 location 以及 activities 列表。

双参数提取器配置

然后我们使用 IF/ELSE 模块检查是否成功提取到每个参数,并在成功时更新变量。与之前的示例相反,这使得用户可以更新这些值。

在完成取值与变量赋值后,再添加一个 IF/ELSE 模块检查是否仍有缺失。如果缺少某项,就明确向用户索取。

当用户未提供时请求补充信息

如果 location 和 activities 都已定义,我们使用之前创建的代码模块获取该地天气。最后将天气、所在地与活动信息提供给一个 LLM 模块,为用户规划当天行程。

旅行助手 LLM 配置

LLM 模块配置了系统提示词,告诉模型要做什么。所在地、活动与天气将被注入其中。以下是流程的最后部分:

最终流程

以下是与该智能体的示例交互:

在 Dify 中与旅行助手的示例交互

从回复中可以看到,由于代码节点的加入,智能体不仅能提供天气信息,还能在规划活动时加以考虑。

由于流程的设置方式,如果用户在第一条消息中就直接提供了信息,智能体会直接给出当天的行程计划。

用户直接提供信息时的另一个示例交互

定义自定义问候语

您可能注意到,智能体会先向用户发送一条问候消息:

问候消息

要启用此功能,我们需要激活 Conversation Opener 功能。

访问 Dify 功能

在 Dify 中启用问候消息

Dify 工具

在本教程中,我们学习了 Dify 的基础构建模块。还有一个方面尚未涉及:工具(Tools)。

在 Dify 中,工具是强大的扩展,使您的 AI 智能体能够突破语言模型的限制,与外部世界交互。虽然 LLM 能基于训练数据和提示上下文进行推理并生成回答,但它无法实时访问在线数据或外部服务。

工具通过让智能体发起 API 调用、查询数据库、执行计算、检索文档等,充当 AI 与外部信息源之间的桥梁,从而解决这一问题。

访问 Dify 工具

您可以通过平台的可视化界面配置工具,指定工具类型(如 HTTP 请求、代码解释器或第三方插件)、输入/输出模式以及身份验证要求。配置完成后,这些工具可通过 Tool 模块在智能体流程中使用,您可以在模块间传递数据,并将结果馈送至 LLM 节点或其他逻辑模块。

添加工具模块

这不仅让您的智能体更“聪明”,也更具行动力,能够通过与真实世界服务交互,提供最新、具上下文相关性的答案。

在我们的示例中,我们使用了代码模块请求天气 API。另一种做法是创建一个工具,并将该工具提供给 LLM 使用。

结语

在本教程中,我们探索了开始使用 Dify 所需的一些基础模块。不过,Dify 还有许多功能与能力有待发掘。

为加深理解,一个很好的练习是对我们创建的旅行助手进行增强。例如,加入互联网搜索能力以在线发现本地活动,从而丰富智能体的功能并提供更具动态性的建议。

如果您对像 Dify 这样的 AI 智能体搭建工具感兴趣,推荐继续阅读我们的其他教程:

François Aubry

作者

François Aubry

全栈工程师,CheapGPT 创始人。我一直热爱教学。从学生时代起,我就积极寻找机会为同学提供辅导与帮助。这份热情促使我攻读博士学位,并在此期间担任助教,以支持我的学术追求。那些年里,我在传统课堂环境中收获了极大的成就感,既建立联系也促进学习。随着在线学习平台的兴起,我也看到了数字教育的变革潜力。事实上,我曾参与我们大学一款此类平台的建设。我致力于将传统教学理念与创新的数字方法相融合。我的热情在于打造既有吸引力、信息量充足,又能让当代学习者轻松获取的课程。

主题