1.前言
dify中提供了自定义工具的能力,工具十分容易复用,在需要的流程编排中进行引用即可。根据笔者的经验和理解,自定义工具有点类似微服务,可以把通用的能力封装到工具里面。同时,工具还提供了测试和鉴权等功能,对开发者比较友好。
环境信息:dify-0.8.3,spring-boot-2.7.6
实现效果如下:
2.开发后台接口
这里使用 spring-boot快速开发一个 post接口作为演示,代码如下:
@RestController
@RequestMapping("demo/tools")
public class DemoCtl {@PostMapping("/task")public ResponseEntity<String> queryTask(@RequestParam Map<String, String> params) {String taskName = params.get("taskName");String taskDate = params.get("taskDate");String result = String.format("任务:%s,执行日期:%s,状态:成功", taskName, taskDate);return ResponseEntity.ok(result);}}
上述代码接收两个参数:任务名和任务日期,用于模拟日常工作中的任务查询功能。
3.编写工具定义
这里使用 idea提供的 Generate OpenAPI draft
生成接口的定义信息,然后根据实际情况进行修改形成 dify的工具定义,这里生成的接口定义如下:
openapi: "3.0.3"
info:title: "dify_tools_demo API"description: "dify_tools_demo API"version: "1.0.0"
servers:- url: "http://127.0.0.1:8080"
paths:/demo/tools/task:post:summary: "POST demo/tools/task"operationId: "queryTask"parameters:- name: "taskName"in: "query"required: trueschema:type: "string"- name: "taskDate"in: "query"required: trueschema:type: "string"responses:"200":description: "OK"content:'*/*':schema:type: "string"
把上面编写好的接口定义 yaml复制到 dify工具定义里面就可以创建一个工具,如下:
注意:上图中的 servers是指的接口所在服务器IP和端口号。
4.在流程编排中应用工具
在上面构建的 dify自定义工具需要输入参数进行任务状态的查询,在流程编排里面需要配合参数提取器
进行使用。
补充:参数提取器,可以编写提示词让大模型从用户的提问中提取需要的信息,并存入对应字段。
大致流程是:
-
问题分类
填写分类依据:查询任务执行状态。
-
参数提取
参数提取器里的提示词样例如下:
你是一个平台运维人员,需要提取
{{#context#}}
这段话中的任务名称 taskName,任务执行日期 taskDate。
-
调用自定义工具
这里需要引用第2步提取到的参数信息。
-
输出答复
这里笔者准备了一个接近工作场景的问题:
帮我看看任务 dws-product-d 20241218 执行完了吗
完整的流程编排和效果如下:
5.总结
本文通过一个查询指定日期任务运行状态的流程编排,介绍了 dify自定义工具和参数提取器的用法。自定义工具是通用能力的封装,可以增强流程编排的能力,用于特定的业务场景,并且容易在不同流程编排中复用。