關(guān)于langgraph中的數(shù)據(jù)傳遞——使用State和config傳遞數(shù)據(jù) 原創(chuàng)
“ 數(shù)據(jù)通訊是系統(tǒng)開發(fā)中的重要環(huán)節(jié),而Langgraph有其特有的設(shè)計哲學(xué)?!?/strong>
在項目開發(fā)中,數(shù)據(jù)傳遞一直是一個很重要的環(huán)節(jié),畢竟任何系統(tǒng)的開發(fā)邏輯最終的目的都是實現(xiàn)數(shù)據(jù)的有效操作,包括查詢,修改,新增等。
而在大模型應(yīng)用場景中,數(shù)據(jù)的傳遞又是什么樣的呢?怎么解決?
langgraph中的數(shù)據(jù)傳遞
在Langgraph中State是貫穿整個生命周期的數(shù)據(jù)結(jié)構(gòu),其作用就是用來保存智能體執(zhí)行過程中的數(shù)據(jù);因此,在Langgraph中的幾個重要組件中都會使用到State中的數(shù)據(jù),除了邊之外。
在Langgraph的節(jié)點中,可以接收一個State參數(shù),其中保存有用戶的輸入,模型執(zhí)行的結(jié)果,工具調(diào)用的結(jié)構(gòu)等等多種數(shù)據(jù)。然后在節(jié)點中就可以通過state獲取執(zhí)行過程中的數(shù)據(jù)進行下一步處理。

然后節(jié)點執(zhí)行完成之后,把執(zhí)行結(jié)果再次保存到State中,之后傳遞到下一個節(jié)點。

當(dāng)然,在節(jié)點中操作State是一個很正常的操作,那怎么在工具中獲取到這些參數(shù)呢?
這里的工具指的不是工具節(jié)點,因為工具節(jié)點的本質(zhì)還是節(jié)點,因此可以正常對State進行操作;但在@tool注解實現(xiàn)的具體工具方法里,能獲取到Sta te中的參數(shù)嗎?
舉例來說,你的業(yè)務(wù)場景中需要在上一個節(jié)點先對請求參數(shù)進行處理,然后再工具節(jié)點中使用這個參數(shù);那么怎么把上一個節(jié)點中的數(shù)據(jù)傳入到具體的工具中?
這個就要用到Langgraph提供的,InjectedState參數(shù),可以在具體的工具中通過InjectedState獲取參數(shù)。
params: Annotated[list, InjectedState("params")
解決了節(jié)點和工具中的通訊問題,那么再把我們指定的值傳入到智能體中呢?畢竟類似于user_id等參數(shù)我們希望的是能夠根據(jù)不同的用戶進行區(qū)分,而不是由模型來生成用戶參數(shù);所以,面對這種參數(shù),怎么進行通訊?
在Langgraph中也提供了固定參數(shù)的傳參,使用的是RunnableConfig,在調(diào)用智能體時,只需要傳入config參數(shù),即可在智能體中的任何地方獲取此參數(shù)。
如下所示:

如下,在節(jié)點中通過config: RunnableConfig即可獲取到用戶傳入的數(shù)據(jù)。

有了這些數(shù)據(jù)通訊之后,就可以根據(jù)不同的執(zhí)行結(jié)果進行相應(yīng)的處理。
但在Langgraph中使用State進行數(shù)據(jù)通訊還一個需要注意的點是,State有多種處理方式,比如說追加,覆蓋等;這些不同的處理方式會獲得不一樣的結(jié)果。
如在messages中一般情況下會使用追加的方式,也就是把每個節(jié)點的執(zhí)行結(jié)果追加到messages列表中,這樣就可以保存整個智能體的整個生命周期的執(zhí)行過程。
當(dāng)然,可能存在一些公共參數(shù),不同的節(jié)點執(zhí)行過后需要覆蓋掉之前的值,而這個就可以使用覆蓋的方式進行處理;而在Langgraph中負責(zé)處理這部分功能的是Reducers函數(shù)。
Reducers 是理解節(jié)點更新如何應(yīng)用于 ???State??? 的關(guān)鍵。???State??? 中的每個鍵都有其自己的獨立 reducer 函數(shù)。如果未明確指定 reducer 函數(shù),則假定對該鍵的所有更新都應(yīng)覆蓋它。
本文轉(zhuǎn)載自???AI探索時代??? 作者:DFires


















