智能体开发实战 | 基于Dify自定义工作流工具构建游戏智能体

Dify是一款开源的大语言模型应用开发平台,旨在降低AI应用的开发门槛,帮助开发者和企业快速构建、部署及管理生成式AI应用。本文以24点游戏智能体为案例,展示了Dify基于工作流的Agent应用开发。通过把工作流发布为工具,Agent通过推理可以智能调用相应工作流解决问题。

前言

Dify是一款开源的大语言模型应用开发平台,旨在降低AI应用的开发门槛,帮助开发者和企业快速构建、部署及管理生成式AI应用。

Dify允许用户在画布上构建和测试功能强大的AI工作流。工作流通过将复杂任务分解为更小的步骤(节点),有效降低了系统的复杂度。这种方法减少了对提示词技术和模型推理能力的依赖,从而提升了 LLM 在处理复杂任务时的性能,同时增强了系统的可解释性、稳定性和容错性。

本文以实现24点游戏为例。24点的游戏规则:给出一组4个随机整数(1至13之间,且不重复),用加、减、乘、除(可加括号)把给出的4个数字算成24,每个数必须用一次且只能用一次。

这个智能体需要具备如下能力:

  • 出题:生成一组4个随机整数(1至13之间,且不重复),并确保生成的随机数能计算出24。
  • 校验用户输入的表达式计算结果是否为24。
  • 解题:根据用户给出的随机数,生成答案。

通过设置合适的提示词,为智能体设定角色和处理逻辑。智能体会根据大语言模型对人物设定和回复逻辑的理解,来响应用户问题。因此提示词编写的越清晰明确,智能体的回复也会越符合预期。可以在提示词中指定用工作流作逻辑处理,实现通过prompt无法实现的功能。

创建工作流工具

在http://localhost/apps页面点击“创建空白应用”,选择“工作流”。填写应用名,点击创建。依次创建三个工作流:

  • generate_random_numbers:为24点游戏生成一组随机数
  • check_answer:校验表达式计算结果是否为24
  • generate_answer:根据一组随机数生成24点游戏的答案

工作流1:generate_random_numbers

整体流程如下图:

图片

  • 名称:generate_random_numbers
  • 描述:为24点游戏生成一组随机数
  • 开始节点: 用默认配置,无需添加输入字段
  • 代码执行节点

图片

  • 输入变量:无
  • 输出变量:numbers,类型为Array[Number]
  • 代码:

复制

import random
from itertools import permutations, product

def main() -> dict:
    while True:
        numbers = []
        while len(numbers) < 4:
            num = random.randint(1, 13)
            if num not in numbers:
                numbers.append(num)
        res = generate_answer(numbers)
        # 确保生成的随机数能计算出24
        if res['code'] == 'ok':
            return {'numbers': numbers}

def generate_answer(numbers):
    if len(numbers) != 4:
        return {'code': 'error', 'msg': "随机数个数不正确"}
    
    operations = ['+', '-', '*', '/']
    for num_perm in permutations(numbers):
        for ops in product(operations, repeat=3):
            # 尝试所有不同的括号组合
            expressions = [
                f'(({num_perm[0]} {ops[0]} {num_perm[1]}) {ops[1]} {num_perm[2]}) {ops[2]} {num_perm[3]}',
                f'({num_perm[0]} {ops[0]} ({num_perm[1]} {ops[1]} {num_perm[2]})) {ops[2]} {num_perm[3]}',
                f'({num_perm[0]} {ops[0]} {num_perm[1]}) {ops[1]} ({num_perm[2]} {ops[2]} {num_perm[3]})',
                f'{num_perm[0]} {ops[0]} (({num_perm[1]} {ops[1]} {num_perm[2]}) {ops[2]} {num_perm[3]})',
                f'{num_perm[0]} {ops[0]} ({num_perm[1]} {ops[1]} ({num_perm[2]} {ops[2]} {num_perm[3]}))',
            ]
            for expr in expressions:
                try:
                    if eval(expr) == 24:
                        return {'code': 'ok', 'answer': expr}
                except ZeroDivisionError:
                    continue
    return {'code': 'error'}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 结束节点输出变量numbers的参数值为引用“代码执行”节点的输出变量numbers。

图片

  • 运行点击右上角的“运行”,验证是否可以正确输出一组随机数

图片

  • 发布工作流测试通过后,点击右上角的“发布”按钮。
  • 发布为工具发布成功后,点击“发布为工具”

图片

填入工具调用名称和工具描述,并保存。

图片

工作流2:check_answer

整体流程如下图:

图片

  • 名称:check_answer
  • 描述:校验表达式计算结果是否为24
  • 开始节点

     输入参数

     expression:类型为String,显示名称为“表达式”

• 代码执行节点

   • 输入变量:

      expression,引用开始节点的expression变量

   • 输出变量:

      code,类型为String 

      msg, 类型为String

  • 代码

复制

def main(expression:str) -> dict:
    try:
        val = eval(expression)
        if val == 24:
            return {'code': 'ok', 'msg':'ok'}
        else:
            return {'code': 'error', 'msg': f"表达式{expression}计算结果为{val}, 不是24"}
    except Exception as e:
        return {'code': 'error', 'msg': f"计算出错。{e}"}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 结束节点

     输出变量

        code,引用代码执行节点的code输出变量

        msg, 引用代码执行节点的msg输出变量

  • 测试并发布工作流
  • 发布为工具

     发布成功后,点击”发布为工具“。填入工具调用名称和工具描述,并保存。

图片

工作流3:generate_answer

整体流程如下图:

图片

  • 名称:generate_answer
  • 描述:根据一组随机数生成24点游戏的答案

     开始节点

         输入参数

            numbers:类型为String,显示名称为“一组随机整数,JSON格式”

  • 代码执行节点

  • 输入变量

     numbers,引用开始节点的numbers变量

• 输出变量

      code,类型为String

      msg, 类型为String

      answer, 类型为String

   • 代码

复制

from itertools import permutations, product
import json

def main(numbers:str) -> dict:
    numbersArray = json.loads(numbers)
    if len(numbersArray) != 4:
        return {'code': 'error', 'msg': "随机数个数不正确", 'answer':''}
    
    operations = ['+', '-', '*', '/']
    for num_perm in permutations(numbersArray):
        for ops in product(operations, repeat=3):
            # 尝试所有不同的括号组合
            expressions = [
                f'(({num_perm[0]} {ops[0]} {num_perm[1]}) {ops[1]} {num_perm[2]}) {ops[2]} {num_perm[3]}',
                f'({num_perm[0]} {ops[0]} ({num_perm[1]} {ops[1]} {num_perm[2]})) {ops[2]} {num_perm[3]}',
                f'({num_perm[0]} {ops[0]} {num_perm[1]}) {ops[1]} ({num_perm[2]} {ops[2]} {num_perm[3]})',
                f'{num_perm[0]} {ops[0]} (({num_perm[1]} {ops[1]} {num_perm[2]}) {ops[2]} {num_perm[3]})',
                f'{num_perm[0]} {ops[0]} ({num_perm[1]} {ops[1]} ({num_perm[2]} {ops[2]} {num_perm[3]}))',
            ]
            for expr in expressions:
                try:
                    if eval(expr) == 24:
                        return {'code': 'ok', 'msg':'ok', 'answer': expr}
                except ZeroDivisionError:
                    continue
    return {'code': 'error', 'msg': 'error', 'answer':''}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 结束节点

图片

  • 输出变量

     code,引用代码执行节点的code输出变量

     msg, 引用代码执行节点的msg输出变量

     answer, 引用代码执行节点的answer输出变量

  • 测试并发布工作流
  • 发布为工具

     发布成功后,点击”发布为工具“。填入工具调用名称和工具描述,并保存。

图片

创建Agent应用

在http://localhost/apps页面点击“创建空白应用”,选择“Agent”。填写应用名,点击创建,进入编排界面。编排界面如下:

图片

  • 设置提示词内容为:

复制

你是一个24点游戏助手。
- 开始游戏时,你需要生成一组随机数,提示用户回答,然后使用工作流check_answer校验用户的回答。
- 如果用户表示回答不了问题,请使用工作流generate_answer生成答案。
- 用户可以向你提供一组数字提问如何计算,你需要使用工作流generate_answer生成答案。
  • 1.
  • 2.
  • 3.
  • 4.
  • 添加工具把3个工作流添加为工具。
  • 选择模型使用qwen-plus
  • 调试和预览在下方输入内容和Agent进行游戏互动

图片

  • 测试通过后,点击右上角的“发布”按钮。
  • 发布后,点击“运行”即可打开应用的访问链接。

总结

本文以24点游戏智能体为案例,展示了Dify基于工作流的Agent应用开发。通过把工作流发布为工具,Agent通过推理可以智能调用相应工作流解决问题。

<think>好的,用户想了解如何在Dify自定义智能体。首先,我需要回忆Dify的相关文档和功能。根据提供的引用,Dify允许用户通过自定义工具和插件来扩展智能体的能力,比如搜索、发微信或查询数据。用户可能希望知道具体的步骤,比如如何创建工具、配置工作流,以及如何集成到智能体中。 用户的问题提到了教程或文档,我需要确认官方文档是否有相关部分。引用3提到Dify是一个开发平台,允许构建知识库、自动化流程等,而引用2则说明可以自定义工具或发布工作流作为工具使用。因此,自定义智能体可能涉及工具创建和工作流配置。 接下来,用户可能需要分步指导,比如登录控制台、创建工具、配置参数、测试和部署。同时,用户可能关心如何将自定义工具集成到智能体中,以及是否有示例可以参考。官方文档和GitHub资源(引用4)应该包含这些信息,需要引导用户查阅。 还要考虑用户可能的深层需求,比如是否想将智能体接入微信(引用1),或者是否需要处理复杂逻辑,这时发布工作流工具可能更合适。因此,在回答中应涵盖这些方面,并提供相关引用链接,方便用户进一步阅读。确保回答结构清晰,步骤明确,并且引用正确。</think>### 如何自定义 Dify 智能体 Dify自定义智能体功能主要通过**工具(Tools)**和**工作流(Workflows)**实现。以下是具体步骤: --- #### 1. **创建自定义工具** Dify 允许开发者通过代码定义工具,扩展智能体的能力。例如,创建一个查询天气的工具: - **步骤**: 1. 登录 Dify 控制台,进入「工具」模块[^2][^3]。 2. 点击「新建工具」,选择「自定义工具」。 3. 编写工具代码(支持 Python/JavaScript),定义输入参数和执行逻辑: ```python def get_weather(city: str): # 调用天气 API 并返回结果 return f"{city}天气:晴,25℃" ``` 4. 配置工具参数(如名称、描述、输入字段),完成后保存。 - **特点**:工具可复用,支持与其他工具组合使用。 --- #### 2. **配置智能体调用工具** 在智能体中集成自定义工具: - **步骤**: 1. 创建或编辑已有智能体,进入「工具」配置页。 2. 勾选已创建的自定义工具(如 `get_weather`)。 3. 设置触发条件(例如:用户提问包含“天气”时自动调用)。 4. 测试工具交互效果,调整参数后发布[^3]。 --- #### 3. **通过工作流扩展复杂逻辑** 若需多工具协作或复杂逻辑处理,可将其封装为工作流: - **步骤**: 1. 在「工作流」模块中设计流程图,添加工具节点和判断逻辑。 2. 将工作流发布为工具,供智能体调用。 3. 例如:设计一个「旅行规划」工作流,串联天气查询、酒店推荐、路线生成工具。 --- #### 4. **接入外部系统(如微信)** 若需将智能体部署到微信等平台: - 参考官方文档《手摸手教你把 Dify 接入微信生态》[^1],配置 API 接口和回调逻辑。 --- #### 文档资源 - **官方教程**:[Dify 工具开发指南](https://docs.dify.ai/v/zh-hans/guides/tools)[^4] - **代码示例**:GitHub 仓库中的 `dify/examples/custom-tool`[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值