AI在线 AI在线

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

前言Dify是一款开源的大语言模型应用开发平台,旨在降低AI应用的开发门槛,帮助开发者和企业快速构建、部署及管理生成式AI应用。 Dify允许用户在画布上构建和测试功能强大的AI工作流。 工作流通过将复杂任务分解为更小的步骤(节点),有效降低了系统的复杂度。

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

前言

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'}
  • 结束节点输出变量numbers的参数值为引用“代码执行”节点的输出变量numbers。

图片

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

图片

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

图片

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

图片

工作流2:check_answer

整体流程如下图:

图片

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

     输入参数

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

• 代码执行节点

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

   • 输入变量:

      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}"}
  • 结束节点

     输出变量

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

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

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

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

图片

工作流3:generate_answer

整体流程如下图:

图片

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

     开始节点

         输入参数

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

  • 代码执行节点

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

  • 输入变量

     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':''}
  • 结束节点

图片

  • 输出变量

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

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

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

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

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

图片

创建Agent应用

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

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

图片

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

总结

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

相关资讯

本地部署DeepSeek+DiFy平台构建智能体应用

在大模型实际应用落地时候,利用智能体平台,构建本地的向量化知识库,基于RAG知识增强技术和大模型的推理能力,提升效率。 本文简要介绍RAG、大模型微调和大模型蒸馏的特点,通用智能体平台,并在本地部署DiFy智能体平台,利用本地部署的DeepSeek模型和知识库构建智能体应用。 1、RAG、微调和蒸馏大模型的落地使用主要有RAG、微调和蒸馏几种方式,每种方式有各自的特点和适用场景。
4/14/2025 12:22:00 AM
大唐小少

智能体常用策略FunctionCalling和ReAct有什么区别?

Dify 内置了两种 Agent 策略:Function Calling 和 ReAct,但二者有什么区别呢? 在使用时又该如何选择呢? 接下来我们一起来看。
5/27/2025 12:00:00 AM
磊哥

Dify工具插件开发和智能体开发全流程实战

前言Dify是一款开源的大语言模型应用开发平台,旨在降低AI应用的开发门槛,帮助开发者和企业快速构建、部署及管理生成式AI应用。 Dify自1.0.0引入全新插件化架构,模型(Models)与工具(Tools)迁移为插件(Plugins),引入 Agent 策略(Agent Strategies)、扩展(Extensions)类型插件和插件集(Bundles)。 通过全新的插件机制,能够增强 AI 应用的感知和执行能力,拓宽AI在软件操作领域的应用能力。
6/6/2025 10:01:25 AM
AI大模型应用开发
  • 1