Java AI(智能体)编排开发就用 Solon Flow
笔记哥 /
04-25 /
44点赞 /
0评论 /
708阅读
本例参考 dify 的 chatFlow 的效果,模拟实现视频内容:
- https://www.toutiao.com/video/7455114080131482152/
Solon Flow 是一个通用流编排引擎。可用于计算(或任务)的编排场景; 可用于业务规则和决策处理型的编排场景; 可用于办公审批型(有状态、可中断,人员参与)的编排场景; 可用于长时间流程(结合自动前进,等待介入)的编排场景。同时支持:java8,java11,java17,java21,java24。
```xml
org.noear
solon-flow
最新版本
```
主要特点有:
- 使用 yaml 格式做编排
- 表达式与脚本自由
- 元信息配置,为扩展提供了无限空间(每个流程,相当于自带了元数据库)
- 事件广播与回调支持
- 支持“无状态”、“有状态”两种需求分类
- 驱动定制(是像 JDBC 有 MySql, PostgreSQL,还可能有 Elasticsearch)
下面提供两种处编排风格以可供参考
### 1、使用 “元信息” + 任务组件“ 风格 (更利于可视界面配置)
```yaml
id: demo1
layout:
- title: "开始"
type: start
- title: "文件提取"
meta.input: "file" # 可视界面的配置(通过元信息表示)
meta.output: "fileTxt"
task: @FileLoaderCom
- title: "LLM"
meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
meta.input: "fileTxt"
meta.messages:
- role: system
content: "#角色\n你是一个数据专家,删除数据的格式整理和转换\n\n#上下文\n${fileTxt}\n\n#任务\n提取csv格式的字符串"
task: @ChatModelCom
- title: "参数提取器"
meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
meta.output: "csvData"
task: @ParamExtractionCom
- title: "执行代码"
meta.input: "csvData"
task: |
import com.demo.DataUtils;
String json = DataUtils.csvToJson(node.meta().get("meta.input")); //转为 json 数据
String echatCode = DataUtils.jsonAsEchatCode(json); //转为 echat 图表代码
context.result = echatCode; //做为结果返回
- title: "结束"
type: end
```
这种风格,更适合可视界面的编译。设计是,可以预选设计好很多组件,经过管理配置后,可提供界面选择。
```java
@Component("FileLoaderCom")
public class FileLoaderCom implements TaskComponent {
@Override
public void run(FlowContext context, Node node) throws Throwable {
...
}
}
@Component("ChatModelCom")
public class ChatModelCom implements TaskComponent {
@Override
public void run(FlowContext context, Node node) throws Throwable {
...
}
}
@Component("ParamExtractionCom")
public class ParamExtractionCom implements TaskComponent {
@Override
public void run(FlowContext context, Node node) throws Throwable {
...
}
}
@Controller
public class DemoController {
@Mapping("demo")
public Object input(UploadedFile attachment, String message) throws Throwable {
FlowEngine flowEngine = FlowEngine.newInstance();
flowEngine.load("classpath:flow/demo1.chain.yml");
FlowContext ctx = new FlowContext();
ctx.put("file", attachment);
flowEngine.eval("demo1");
return context.result;
}
}
```
### 2、比较原始的风格(能表达内在的大概过程):
```yaml
id: demo1
layout:
- title: "开始"
type: start
- title: "文件提取"
meta.input: "file" # 可视界面的配置(通过元信息表示)
meta.output: "fileTxt"
task: |
import org.noear.solon.ai.loader.*;
var loader = FileLoader.of(file);
var fileTxt = loader.load();
context.put(node.meta().get("meta.output"), fileTxt); //推入上下文(后续节点可用)
- title: "LLM"
meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
meta.input: "fileTxt"
meta.messages:
- role: system
content: "#角色\n你是一个数据专家,删除数据的格式整理和转换\n\n#上下文\n${fileTxt}\n\n#任务\n提取csv格式的字符串"
task: |
import com.demo.ModelUtils; //根据业务封装,可快速获取配置的模型
import com.demo.MessageUtils; //根据业务封装,可快速构建消息
var chatModel = ModelUtils.get(node.meta().get("model"));
var chatMessages = MessageUtils.get(node.meta().get("messages"), context);
var resp = chatModel.prompt(chatMessages).call();
context.put("resp", resp);
- title: "参数提取器"
meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
meta.output: "csvData"
task: |
context.put(node.meta().get("meta.output"), resp.getMessage().getContent());
- title: "执行代码"
meta.input: "csvData"
task: |
import com.demo.DataUtils;
String json = DataUtils.csvToJson(node.meta().get("meta.input")); //转为 json 数据
String echatCode = DataUtils.jsonAsEchatCode(json); //转为 echat 图表代码
context.result = echatCode; //做为结果返回
- title: "结束"
type: end
```
这个风格比较原始,不过不需要 java 组件参与。可以像低代码一样(或可执行程序一样),直接运行配置文件。
```java
@Controller
public class DemoController {
@Mapping("demo")
public Object input(UploadedFile attachment, String message) throws Throwable {
FlowEngine flowEngine = FlowEngine.newInstance();
flowEngine.load("classpath:flow/demo1.chain.yml");
FlowContext ctx = new FlowContext();
ctx.put("file", attachment);
flowEngine.eval("demo1");
return context.result;
}
}
```
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2695
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利
- 相关联分享
- [设计模式/Java] 设计模式之工厂方法模式
- 【对称加密】DES与AES算法详解及Java实现
- 历数Java虚拟机垃圾回收GC收集器的缺点剖析
- Java虚拟机代码是如何一步一步变复杂且难以理解的?
- 产品中不同客户端请求下的 IP 归属地分析方法
- 在java中为什么重写equals一定也要重写hashCode方法?
- 设计模式之门面模式(外观模式)的原理、组成
- Java中如何优雅的处理日期
- 启用 Java AOT 编译打包 Solon 项目(Solon AOT)
- YtyMark-java 富文本编辑器分享(以开源)
- Java 21新特性有哪些?
- Excel 高性能导出方案推荐(JAVA)
- Java AI(智能体)编排开发就用 Solon Flow
- Spring 中@Autowired,@Resource,@Inject 注解实现原理
- JAVA 24 环境安装与配置教程
- File与IO流之字节流