1.前言
dify的核心能力有:支持接入常见的 LLM、工作流编排、知识库和聊天助手等,架构图如下:
本文将结合实际项目落地经验,针对工作流编排中的常用编排组件进行介绍,以及如何在后端调用工作流编排。
2.落地案例
某 DevOps智能助手,可以通过自然语言对话回答常见运维问题 和自动查询模型关联的跑数任务状态,工作流编排如下:
上图中,省略了开始组件,直接从意图识别开始。
在意图识别这里需要借助 LLM的能力识别用户想问什么,在这里最主要的是问模型管理的跑数任务状态,其次询问运维问题和通用业务问题。其中运维问题和业务问题都需要项目地提供对应的知识库作为支撑,否则大模型只会回答通用的内容,作用不大。
重点说一下问跑数任务分支:首先,从用户问题提取模型名称、日期批次和平台类型作为参数;其次,需要对模型名称进行校验,通过后继续;然后,根据平台类型调用需要的接口;最后,把查询结果作为提示词的一部分给 LLM,拿到答复后进行格式化输出。
3.编排组件
这里对工作流编排中常用的:LLM、问题分类器、知识检索和代码执行等组件进行介绍。
3.1 LLM
调用大语言模型回答问题或者对自然语言进行处理,需要设置模型、选择上下文、系统提示词和用户提示词等。
系统提示词(System Prompt):
-
样例
你是一个经验丰富的数据建模工程师,任务是根据需求标题、需求描述分析数据模型结构,生成数据模型的DDL语句。
-
定义
作为输入对话框的一种初始指令,通常用于引导模型以某种方式或风格来运行。它有助于设定模型整体行为的框架或指导。一般由服务提供者或开发人员指定,而不是终端用户指定。
-
作用
为对话提供高层指导。
定义模型的整体行为约束、告诉模型它的角色和责任、控制全局语气、写作风格(正式、非正式)、以及模型的细节化程度。
用户提示词(User Prompt):
-
样例
以下是你的思维链和工作流程:
1、需求内容分析
-
根据需求标题和需求描述,推断数据表包含的字段;
-
根据业务逻辑确定合适的主键字段。
...
2、DDL语句生成
-
按照Markdown语法规则,输出完整的DDL语句;
-
DDL语句中包括数据表的英文名、中文名、字段英文名(全大写)、字段中文名(放在comment中)、字段类型、长度、精度、是否允许空;
...
3、字段长度设置
-
字符型字段长度按照下面标准进行设置,体现在DDL语句中;
-
中文字段名中包含用户名、姓名、编码、号码、业务类型、名称等相关文字,字段长度在50个字符以上;
...
-
-
定义
由终端用户输入的实际请求或问题内容,代表了用户的意图和需求,通常是直接与模型交互时的动态输入。
-
作用
提供上下文,明确单次交互的目标,提出问题或任务,模型基于用户需求给出对应的回答。
3.2 问题分类器
定义用户问题的分类条件,LLM能够根据分类描述定义对话的进展方式,需要设置模型、输入变量和分类依据等。
比如 下面几个分类:
-
检查SQL语法逻辑是否有误
-
语义找表,找一张表,找表,数据表,包含哪些字段
-
根据模型名查找关联的任务名
3.3 代码执行
执行一段 python或 nodejs代码实现自定义逻辑,需要设置输入变量、出数变量和编写代码片段等。
比如 下面这个代码片段:
python
def main() -> dict:
return {
"result": datetime.now().strftime('%Y%m%d')
}
上面的代码根据一定规则生成当前时间,后续可以用于参数向后传递。
3.4 参数提取器
利用 LLM从自然语言内推理提取出结构化参数,用于后置的工具调用或 http请求,需要填写输入变量、选择模型、创建参数和编写指令等。
比如 下面的这个提取参数的指令:
这是一段城市缩写、城市名称、城市编号的文本,格式如下:
城市缩写&城市名称&城市编号
实际数据如下:
ZG&自贡&10
CD&成都&20
MY&绵阳&30
LS&乐山&40
GH&广汉&50
BZ&巴中&60
...
DY&德阳&200
你是一名大数据领域的运维专家,需要提取
{{#context#}}
这段话中的平台 platform,表名 tableName,batchNo,城市,并把城市转成缩写存到变量 city里面。
tableName可能会有多个,用 ","进行连接。
如果参数提取异常,你可以给参数设置如下默认值:
platform=datacenter,city=CD
上面这段指令不仅给出了如何提取参数,还指定了参数的映射规则,以及默认值。
3.5 HTTP请求
允许通过 http协议发送 get、post和put等请求,需要填写URL、选择请求方式和填写请求体等。
3.6 直接回复
定义一个聊天对话框的回复内容,可以引用前面步骤的结果和参数,对话类的都要用这个组件输出内容给用户。
3.7 知识检索
从知识库中查询与用户问题相关的内容,与知识库搭配使用,可以显著增强大模型的业务知识。
3.8 条件分支
根据 if/else 条件将 workflow 拆分成两个分支,对于开发人员来说再熟悉不过了,落地案例中用于参数校验、接口调用结果检查和按平台走不同的业务流程等。
4.后台调用编排流程
在流程编排界面点击左侧的 访问API
可以看到后端服务如何调用该编排流程。首次打开该界面,需要点击右上角的 API密钥
创建访问密钥,后面需要配置到调用方。如下:
上图中右侧有一个 curl请求样例,可以用于测试编排流程。
5.总结
本文主要通过一个实际落地案例,介绍工作流编排中常用的 问题分类器、参数提取器、知识库和 LLM等组件,其中着重介绍了系统提示词和用户提示词,最后对后台服务如何调用工作流编排进行了说明。