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
英文地址,請注明出處:http://en.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;更是一個全生命周期管理…