可视化工作流引擎
夜月AI应用平台 的核心功能之一是可视化工作流引擎,允许用户通过拖拽式界面构建复杂的AI工作流,无需编写代码即可实现多步骤AI流水线。
核心特性
- 13种内置节点类型:覆盖LLM对话、知识检索、条件分支、工具调用等场景
- 可视化编排:拖拽式界面,直观构建复杂流程
- 上下文传递:节点间通过
ref_inputs配置实现数据流转 - Token统计:实时跟踪整个工作流的Token消耗
- SSE流式响应:支持Server-Sent Events流式输出
节点类型
流程控制节点
| 节点 | 类型 | 说明 |
|---|---|---|
| START | 入口节点 | 工作流起点,可配置开场白 |
| END | 终止节点 | 工作流终点 |
| IF_ELSE | 条件分支 | 根据条件执行不同分支 |
LLM节点
| 节点 | 类型 | 说明 |
|---|---|---|
| LLM | 文本对话 | 基础文本LLM对话节点 |
| MULTIMODAL_LLM | 多模态 | 支持图像、音频、视频输入 |
知识检索节点
| 节点 | 类型 | 说明 |
|---|---|---|
| KNOWLEDGE_RETRIEVAL | RAG检索 | 从向量存储中检索知识 |
| KG_RETRIEVAL | 图谱检索 | 从知识图谱中检索知识 |
工具节点
| 节点 | 类型 | 说明 |
|---|---|---|
| DOC_EXTRACTOR | 文档提取 | 提取文档内容 |
| DATETIME_TOOL | 日期时间 | 获取当前日期时间 |
| WEB_SEARCH_TOOL | 网络搜索 | 执行网络搜索 |
| HTTP_REQUEST_TOOL | HTTP请求 | 发送HTTP请求 |
| CUSTOM_TOOL | 自定义工具 | 用户自定义工具 |
| COMMAND_EXEC_TOOL | 命令执行 | 执行系统命令 |
工作流执行流程
mermaid
graph TD
A[START] --> B[LLM节点]
B --> C{IF_ELSE条件}
C -->|条件1| D[KNOWLEDGE_RETRIEVAL]
C -->|条件2| E[WEB_SEARCH_TOOL]
D --> F[END]
E --> F- 从START节点开始执行
- 按照节点连接顺序依次执行
- IF_ELSE节点根据条件选择分支
- 每个节点输出作为下一个节点的输入
- 到达END节点完成执行
技术实现
图遍历算法
工作流引擎使用图遍历算法执行节点,支持:
- 顺序执行
- 条件分支
- 并行执行(计划中)
上下文传递
节点间通过 ref_inputs 配置实现数据流转:
json
{
"ref_inputs": {
"user_query": "{{START.output}}",
"context": "{{KNOWLEDGE_RETRIEVAL.results}}"
}
}Token统计
实时跟踪整个工作流的Token消耗,包括:
- 输入Token数
- 输出Token数
- 总Token数
使用场景
智能客服
START → LLM(意图识别) → IF_ELSE → KNOWLEDGE_RETRIEVAL → LLM(生成回答) → END数据分析
START → DOC_EXTRACTOR → LLM(数据提取) → HTTP_REQUEST(数据查询) → LLM(分析报告) → END内容生成
START → WEB_SEARCH_TOOL → LLM(内容生成) → END代码示例
创建工作流
java
// 创建工作流定义
WorkflowDefinition workflow = new WorkflowDefinition();
workflow.setName("智能客服工作流");
// 添加节点
WorkflowNode startNode = new WorkflowNode("START", "开始");
WorkflowNode llmNode = new WorkflowNode("LLM", "意图识别");
WorkflowNode endNode = new WorkflowNode("END", "结束");
// 连接节点
workflow.addEdge(startNode, llmNode);
workflow.addEdge(llmNode, endNode);
// 保存工作流
workflowService.save(workflow);执行工作流
java
// 执行工作流
WorkflowExecution execution = workflowService.execute(
workflowId,
Map.of("userQuery", "如何配置RAG知识库?")
);
// 获取执行结果
String result = execution.getResult();