spring-ai-alibaba 学习(十八)——graph进阶

内容概述

前一篇(spring-ai-alibaba 1.0.0.2 学习(十七)——初识graph-CSDN博客)初步介绍了graph:

概念:图、边、节点、状态等,及其核心类和衍生类

使用流程

1)定义流程图:添加节点,添加边

2)使用流程图:编译图,执行图

但是在定义流程图时,省略了图初始化的过程;

在使用流程图时,省略了参数设置的过程

本篇会补充对应的内容

简单样例

图初始化

        KeyStrategyFactory keyStrategyFactory = () -> {HashMap<String, KeyStrategy> keyStrategyHashMap = new HashMap<>();// 用户输入keyStrategyHashMap.put("query", new ReplaceStrategy());keyStrategyHashMap.put("documents", new AppendStrategy());return keyStrategyHashMap;};StateGraph stateGraph = new StateGraph(keyStrategyFactory)...

在新版本1.0.0.3中,状态图StateGraph的初始化不再建议使用OverAllStateFactory,而是改用KeyStrategyFactory

KeyStrategyFactory实际就是一个 Supplier<Map<String, KeyStrategy>>,一个Map<String, KeyStrategy>的提供者

而其提供的Map<String, KeyStrategy>,key是参数名,value是该参数的更新策略,用来指定全局状态类OverAllState的某个参数的更新策略

提到KeyStrategy,就需要先了解OverAllState,全局状态类OverAllState,内部维护了一个Map<String, Object> data 用来保存各种状态参数,如果将该类提炼为一个接口,那对外提供的最主要的方法其实就是一个:

OverAllState updateState(Map<String, Object> nodeOutput);

也就是用节点的输出来更新全局状态的data,并返回一个新的全局状态

而 KeyStrategy 就是在这个环节中生效,用来指定 OverAllState 中某个参数,是如何与节点输出进行合并的

比如常见的ReplaceStrategy,就是直接用nodeOutput中的值替换掉data中的值,例如样例中的query参数

另一个 KeyStrategy 的子类 AppendStrategy,主要用于参数的类型是List的时候,是将nodeOutput和data的某个参数的元素进行去重生成新 List,例如样例中的documents参数

子类MergeStrategy,主要用于参数的类型是Map的时候,用节点输出结果nodeOutput覆盖全局状态中data的值(如果存在的话)

所以KeyStrategyFactory最终就是负责提供状态参数的更新策略

在并行节点中,若某个结果的key不设置更新策略,那即使节点输出中包含该key,也不会被更新进入全局状态OverAllState中(普通节点不存在这个问题,会默认使用覆盖策略,不知道是不是bug)

ps:graph默认会为“input”添加一个ReplaceStrategy的更新策略

参数设置(可选参数)

编译图的参数
SaverConfig saverConfig = SaverConfig.builder().register(SaverConstant.MEMORY, new MemorySaver()).build();
CompileConfig complieConfig = CompileConfig.builder().saverConfig(saverConfig).interruptBefore("humanfeedback").build();  //CompileConfig 参数可省略
//CompiledGraph compiledGraph = stateGraph.compile();
CompiledGraph compiledGraph = stateGraph.compile(compileConfig);
...

编译图时,有一个可选参数 CompileConfig,编译参数,主要是用来生成 CompiledGraph,内部包含如下属性:

SaverConfig:保存各种类型的检查点保存器,缺省状态下,CompileConfig会创建一个MemorySaver放到SaverConfig中

        Map<String, BaseCheckpointSaver>:key 为保存器的类型,如Memory

        String type:默认类型,调用无参的 get 方法时,从Map中获取该默认类型对应的BaseCheckpointSaver

lifecycleListeners:图生命周期监听器的队列,处理时先进后出,目前支持开始节点、结束节点、报错、节点前、节点后等几种触发情景。

interruptsBefore:Set<String> 类型,值为nodeId,表示在该 node 之前加入中断

interruptsAfter:Set<String> 类型,值为nodeId,表示在该 node 之后加入中断

ps:除了这些,CompiledGraph 还有个设置,即最大执行步骤数,代表图中节点总共的可执行次数,每执行一个节点算一次,需要调用 CompiledGraph.setMaxIterations 方法设置,不在 CompileConfig 中

执行图的参数
        RunnableConfig runnableConfig = RunnableConfig.builder().threadId(threadId).build();Map<String, Object> objectMap = new HashMap<>();objectMap.put("query", query);objectMap.put("documents", List.of(document));//RunnableConfig 参数可以省略//AsyncGenerator<NodeOutput> resultFuture = compiledGraph.invoke(objectMap);AsyncGenerator<NodeOutput> resultFuture = compiledGraph.invoke(objectMap, runnableConfig);...

CompiledGraph执行时,需要两个参数

Map<String, Object>:对应全局状态中的data,是执行图时传入的初始参数

该Map的 key 需要对应前面的 KeyStrategyFactory 中 返回Map的 key,否则该参数无法更新

RunnableConfig:运行时配置,是一个可选参数,主要存放线程id threadId、检查点id checkPointId,下一节点id nextNode,metaData 等信息。

        threadId: 主要是用来区分会话的,在前端另开一个会话,就会新建一个 threadId,不同会话之间状态(OverAllState)不共享

        checkPointId:猜测是用于时间旅行,即重新回到某个节点,错误恢复和人工介入目前不需要传递该参数,会自动获取最新存档

        metaData:运行时的其他配置,比如llm中实际使用的大模型型号,不想污染OverAllState时可以在这里设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92069.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频学习(四十七):模数转换

模数转换&#xff08;Analog-to-Digital Conversion&#xff0c;简称ADC&#xff09;是将连续的模拟信号转换为离散的数字信号的过程&#xff0c;是现代电子系统中的核心技术之一。模数转换广泛应用于通信、信号处理、传感器数据采集、音频处理、图像处理等领域。 基本原理 模数…

8.高斯混合模型

高斯混合模型&#xff0c;简称GMM&#xff0c;对数据可以进行聚类或拟合&#xff0c;多用于传统语音识别。他会将每个数据看做多个高斯分布混合生成的。对于无标签的数据进行聚类&#xff0c;一般采用高斯混合模型处理。算法过程 1.首先进行初始猜测&#xff0c;假设有n个簇&am…

Calcite自定义扩展SQL案例详细流程篇

文章目录前言本章节源码一、基于 Calcite 实现一个自定义 SQL 解析器1.1、认识Calcite解析器二、实战案例2.1、快速构建一个可扩展sql语法的模板工程&#xff08;当前暂无自定义扩展sql示例&#xff09;步骤1&#xff1a;拉取calcite源码&#xff0c;复制codegen代码步骤2&…

【生活篇】Ubuntu22.04安装网易云客户端

前文啰嗦&#xff0c;直接跳转 命令行汇总 网易云linux版早已停止维护&#xff0c;自己一直在使用web版本&#xff0c;今天想下载个音乐&#xff0c;结果需要客户端。。。 安装命令很简单&#xff1a; wget https://d1.music.126.net/dmusic/netease-cloud-music_1.2.1_amd64…

FT8441S/FT8441A 5V非隔离方案电路原理图(型号解析及管脚定义)

在当今电子设备日益普及的背景下&#xff0c;高效、稳定且低成本的电源解决方案成为了众多工程师的追求目标。Fremont Micro Devices 推出的 FT8441S 和 FT8441A 正是这样两款满足需求的芯片&#xff0c;它们凭借高精度恒压输出、快速启动以及完善的保护功能&#xff0c;成为了…

Python 面向对象编程核心知识点深度解析

面向对象编程&#xff08;OOP&#xff09;是 Python 中最重要的编程范式之一&#xff0c;它将数据和操作数据的方法封装在一起&#xff0c;提高了代码的复用性和可维护性。本文将结合实际代码示例&#xff0c;详细讲解 Python 面向对象编程的核心概念和常用技巧。一、类与对象的…

Java学习第一百部分——Kafka

目录 一、前言提要 二、核心价值 三、核心架构 四、基本用途 五、优势总结 六、相关技术 七、详细用途 八、高级用法 九、最佳实践 十、总结定位 一、前言提要 Apache Kafka 是一个强大的开源分布式流处理平台&#xff0c;专为处理高吞吐量、低延迟的实时数据流而设计…

[spring-cloud: 负载均衡]-源码分析

获取服务列表 ServiceInstanceListSupplier ServiceInstanceListSupplier 接口是一个提供 ServiceInstance 列表的供应者&#xff0c;返回一个响应式流 Flux<List<ServiceInstance>>&#xff0c;用于服务发现。 public interface ServiceInstanceListSupplier e…

Oracle 在线重定义

Oracle 在线重定义&#xff08;Online Redefinition&#xff09; 是一种功能&#xff0c;通过DBMS_REDEFINITION 包提供&#xff0c;允许DBA在不需要停止或显著影响数据库正常操作的情况下&#xff0c;对数据库表进行结构化修改。可以实现的功能将表移动到其它表空间增加、修改…

Web 开发 12

1 网址里的 “搜索请求” 结构 这张图是在教你怎么看懂 网址里的 “搜索请求” 结构&#xff0c;特别基础但超重要&#xff0c;对你学前端帮别人做搜索功能超有用&#xff0c;用大白话拆成 3 步讲&#xff1a; 1. 先看「协议&#xff08;Protocol&#xff09;」 HTTPS 就是浏…

网络安全 | 如何构建一个有效的企业安全响应团队

网络安全 | 如何构建一个有效的企业安全响应团队 一、前言 二、团队组建的基础要素 2.1 人员选拔 2.2 角色定位 三、团队应具备的核心能力 3.1 技术专长 3.2 应急处置能力 3.3 沟通协作能力 四、团队的运作机制 4.1 威胁监测与预警流程 4.2 事件响应流程 4.3 事后复盘与改进机制…

HTTP、WebSocket、TCP、Kafka等通讯渠道对比详解

在当今互联的数字世界中&#xff0c;通信渠道是系统、应用程序和设备之间数据交换的支柱。从传统的HTTP和TCP协议到专为特定场景设计的Kafka和MQTT等平台&#xff0c;这些通信方式满足了从实时消息传递到大规模数据流处理的多样化需求。本文将深入探讨主要的通信协议和平台。一…

臭氧、颗粒物和雾霾天气过程的大气污染物计算 CAMx模型

随着我国经济快速发展&#xff0c;我国面临着日益严重的大气污染问题。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的&#xff0c;也是区域的&#xff0c;甚至是全球…

数据结构(13)堆

目录 1、堆的概念与结构 2、堆的实现 2.1 向上调整算法&#xff08;堆的插入&#xff09; 2.2 向下调整算法&#xff08;堆的删除&#xff09; 2.3 完整代码 3、堆的应用 3.1 堆排序 3.2 Top-K问题 1、堆的概念与结构 堆是一种特殊的二叉树&#xff0c;根结点最大的堆称…

C++模板知识点3『std::initializer_list初始化时逗号表达式的执行顺序』

std::initializer_list初始化时逗号表达式的执行顺序 在使用Qt Creator4.12.2&#xff0c;Qt5.12.9 MinGW开发的过程中发现了一个奇怪的现象&#xff0c;std::initializer_list<int>在初始化构造时的执行顺序反了&#xff0c;经过一番测试发现&#xff0c;其执行顺序可正…

【Unity3D】Shader圆形弧度裁剪

片元着色器&#xff1a; float3 _Center float3(0, 0, 0); float3 modelPos i.modelPos;// float angle atan2(modelPos.y - _Center.y, modelPos.x - _Center.x); // 计算角度&#xff0c;范围-π到π float angle atan2(modelPos.y - _Center.y, modelPos.z - _Center.z)…

curl发送文件bodyParser无法获取请求体的问题分析

问题及现象 开发过程使用curlPUT方式发送少量数据, 后端使用NodeJSexpress框架bodyParser,但测试发现无法获取到请求体内容,现象表现为req.body 为空对象 {} 代码如下: const bodyParser require(body-parser); router.use(/api/1, bodyParser.raw({limit: 10mb, type: */*}))…

Vue3 学习教程,从入门到精通,Vue 3 内置属性语法知识点及案例代码(25)

Vue 3 内置属性语法知识点及案例代码 Vue 3 提供了丰富的内置属性&#xff0c;帮助开发者高效地构建用户界面。以下将详细介绍 Vue 3 的主要内置属性&#xff0c;并结合详细的案例代码进行说明。每个案例代码都包含详细的注释&#xff0c;帮助初学者更好地理解其用法。1. data …

机器学习基石:深入解析线性回归

线性回归是机器学习中最基础、最核心的算法之一&#xff0c;它为我们理解更复杂的模型奠定了基础。本文将带你全面解析线性回归的方方面面。1. 什么是回归&#xff1f; 回归分析用于预测连续型数值。它研究自变量&#xff08;特征&#xff09;与因变量&#xff08;目标&#xf…

OneCodeServer 架构深度解析:从组件设计到运行时机制

一、架构概览与设计哲学1.1 系统定位与核心价值OneCodeServer 作为 OneCode 平台的核心服务端组件&#xff0c;是连接前端设计器与后端业务逻辑的桥梁&#xff0c;提供了从元数据定义到应用程序执行的完整解决方案。它不仅是一个代码生成引擎&#xff0c;更是一个全生命周期管理…