找回密码
 立即注册
首页 业界区 业界 Java AI(智能体)编排开发就用 Solon Flow

Java AI(智能体)编排开发就用 Solon Flow

僚娥 前天 22:09
本例参考 dify 的 chatFlow 的效果,模拟实现视频内容:

  • https://www.toutiao.com/video/7455114080131482152/
Solon Flow 是一个通用流编排引擎。可用于计算(或任务)的编排场景; 可用于业务规则和决策处理型的编排场景; 可用于办公审批型(有状态、可中断,人员参与)的编排场景; 可用于长时间流程(结合自动前进,等待介入)的编排场景。同时支持:java8,java11,java17,java21,java24。
  1. <dependency>
  2.     <groupId>org.noear</groupId>
  3.     solon-flow</artifactId>
  4.     <version>最新版本</version>
  5. </dependency>
复制代码
主要特点有:

  • 使用 yaml 格式做编排
  • 表达式与脚本自由
  • 元信息配置,为扩展提供了无限空间(每个流程,相当于自带了元数据库)
  • 事件广播与回调支持
  • 支持“无状态”、“有状态”两种需求分类
  • 驱动定制(是像 JDBC 有 MySql, PostgreSQL,还可能有 Elasticsearch)
下面提供两种处编排风格以可供参考
1、使用 “元信息” + 任务组件“ 风格 (更利于可视界面配置)
  1. id: demo1
  2. layout:
  3.   - title: "开始"
  4.     type: start
  5.   - title: "文件提取"
  6.     meta.input: "file" # 可视界面的配置(通过元信息表示)
  7.     meta.output: "fileTxt"
  8.     task: @FileLoaderCom
  9.   - title: "LLM"
  10.     meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
  11.     meta.input: "fileTxt"
  12.     meta.messages:
  13.       - role: system
  14.         content: "#角色\n你是一个数据专家,删除数据的格式整理和转换\n\n#上下文\n${fileTxt}\n\n#任务\n提取csv格式的字符串"
  15.     task: @ChatModelCom
  16.   - title: "参数提取器"
  17.     meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
  18.     meta.output: "csvData"
  19.     task: @ParamExtractionCom
  20.   - title: "执行代码"
  21.     meta.input: "csvData"
  22.     task: |
  23.       import com.demo.DataUtils;
  24.       
  25.       String json = DataUtils.csvToJson(node.meta().get("meta.input"));  //转为 json 数据
  26.       String echatCode = DataUtils.jsonAsEchatCode(json); //转为 echat 图表代码
  27.       context.result = echatCode; //做为结果返回
  28.   - title: "结束"
  29.     type: end
复制代码
这种风格,更适合可视界面的编译。设计是,可以预选设计好很多组件,经过管理配置后,可提供界面选择。
  1. @Component("FileLoaderCom")
  2. public class FileLoaderCom implements TaskComponent {
  3.     @Override
  4.     public void run(FlowContext context, Node node) throws Throwable {
  5.         ...
  6.     }
  7. }
  8. @Component("ChatModelCom")
  9. public class ChatModelCom implements TaskComponent {
  10.     @Override
  11.     public void run(FlowContext context, Node node) throws Throwable {
  12.         ...
  13.     }
  14. }
  15. @Component("ParamExtractionCom")
  16. public class ParamExtractionCom implements TaskComponent {
  17.     @Override
  18.     public void run(FlowContext context, Node node) throws Throwable {
  19.         ...
  20.     }
  21. }
  22. @Controller
  23. public class DemoController {
  24.     @Mapping("demo")
  25.     public Object input(UploadedFile attachment, String message) throws Throwable {
  26.         FlowEngine flowEngine = FlowEngine.newInstance();
  27.         flowEngine.load("classpath:flow/demo1.chain.yml");
  28.         FlowContext ctx  = new FlowContext();
  29.         ctx.put("file", attachment);
  30.         flowEngine.eval("demo1");
  31.         return context.result;
  32.     }
  33. }
复制代码
2、比较原始的风格(能表达内在的大概过程):
  1. id: demo1
  2. layout:
  3.   - title: "开始"
  4.     type: start
  5.   - title: "文件提取"
  6.     meta.input: "file" # 可视界面的配置(通过元信息表示)
  7.     meta.output: "fileTxt"
  8.     task: |
  9.       import org.noear.solon.ai.loader.*;
  10.       
  11.       var loader = FileLoader.of(file);
  12.       var fileTxt = loader.load();
  13.       context.put(node.meta().get("meta.output"), fileTxt); //推入上下文(后续节点可用)
  14.   - title: "LLM"
  15.     meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
  16.     meta.input: "fileTxt"
  17.     meta.messages:
  18.       - role: system
  19.         content: "#角色\n你是一个数据专家,删除数据的格式整理和转换\n\n#上下文\n${fileTxt}\n\n#任务\n提取csv格式的字符串"
  20.     task: |
  21.       import com.demo.ModelUtils; //根据业务封装,可快速获取配置的模型
  22.       import com.demo.MessageUtils; //根据业务封装,可快速构建消息
  23.             
  24.       var chatModel = ModelUtils.get(node.meta().get("model"));
  25.       var chatMessages = MessageUtils.get(node.meta().get("messages"), context);
  26.       var resp = chatModel.prompt(chatMessages).call();
  27.       context.put("resp", resp);
  28.   - title: "参数提取器"
  29.     meta.model: "Qwen/Qwen2.5-72B-Instruct" # 可视界面的配置(通过元信息表示)
  30.     meta.output: "csvData"
  31.     task: |
  32.       context.put(node.meta().get("meta.output"), resp.getMessage().getContent());
  33.   - title: "执行代码"
  34.     meta.input: "csvData"
  35.     task: |
  36.       import com.demo.DataUtils;
  37.       
  38.       String json = DataUtils.csvToJson(node.meta().get("meta.input"));  //转为 json 数据
  39.       String echatCode = DataUtils.jsonAsEchatCode(json); //转为 echat 图表代码
  40.       context.result = echatCode; //做为结果返回
  41.   - title: "结束"
  42.     type: end
复制代码
这个风格比较原始,不过不需要 java 组件参与。可以像低代码一样(或可执行程序一样),直接运行配置文件。
  1. @Controller
  2. public class DemoController {
  3.     @Mapping("demo")
  4.     public Object input(UploadedFile attachment, String message) throws Throwable {
  5.         FlowEngine flowEngine = FlowEngine.newInstance();
  6.         flowEngine.load("classpath:flow/demo1.chain.yml");
  7.         FlowContext ctx  = new FlowContext();
  8.         ctx.put("file", attachment);
  9.         flowEngine.eval("demo1");
  10.         return context.result;
  11.     }
  12. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册