關于Langgraph開發框架工具綁定和工具節點的說明 原創
“ 如果說大模型是智能體的大腦,那么工具就是大模型的手和腳?!?/strong>
在Langgraph智能體開發框架中有幾個核心概念,分別是狀態圖,節點和邊;但在此之外還有其它的一些概念如工具,工具在智能體開發中的重要性就不言而喻了。
雖然這些概念說起來很簡單,但在實際操作過程中卻面臨著各種各樣的問題。
今天我們就主要介紹一下關于Langgraph中的工具的使用和注意事項。
Langgraph中的工具
工具是智能體開發過程中的核心,雖然大模型也很重要,但如果沒有好的工具以及工具管理方式;在強大的大模型也是巧婦難為無米之炊,英雄無用武之地。
工具在智能體開發過程中主要扮演著大模型的手和腳的作用;而在Langgraph中工具是怎么管理的呢?
在前面的文章中介紹過,狀態圖是Langgraph中數據流轉的載體,任何節點的操作結果都將被保存在狀態圖中;而邊表示著節點之間的流轉關系,某個節點執行完成之后就會順著邊流轉到下一個節點或多個節點中。
如上圖所示,就是一個簡單的Langgraph流程圖,圖中存在start和end兩個必須節點;以及chatbot機器人節點和tools工具節點。
@tool
def human_assistance(query: str) -> str:
"""Request assistance from a human."""
human_response = interrupt({"query": query})
return human_response["data"]
tool = TavilySearch(max_results=2)
tools = [tool, human_assistance]
llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")
# 模型綁定節點
llm_with_tools = llm.bind_tools(tools)
如官網代碼所示,聲明了兩個工具human_assistance和TavilySearch;在最后一行代碼中,需要使用bind_tools對工具列表進行綁定;這個綁定的作用是什么?
剛開始看到這段代碼以為其就類似于智能體開發過程中,工具函數的聲明和實現,然后大模型就可以根據這些工具進行功能調用。
但在后面的代碼中又出現了一個工具節點ToolNode,看到這里就覺得有點奇怪了,明明前面已經把工具綁定到了大模型上,為什么現在在這里還需要一個工具節點;那么它的作用是什么?
tool_node = ToolNode(tools=tools)
graph_builder.add_node("tools", tool_node)
事實上,在上面bind_tools的方法中,其作用類似于傳統fc開發中的函數聲明,即告訴大模型有哪些函數可以使用;但具體的調用工具并不是由大模型實現。
這里也是如此,在bind_tools綁定工具列表之后,在ToolNode節點負責工具的調用。
大模型會根據綁定的工具列表,然后根據自己的理解和判斷去選擇合適的工具函數。
工具的聲明
在Langgraph中,工具函數聲明使用@tool注解實現,其會根據函數名稱和參數自動判斷工具的作用并生成調用參數;如下代碼所示:
而在函數的第一行有一個三引號注釋符,其作用就類似于fc中的desc,用來描述函數的功能。通過這種方式就可以聲明一個工具類。
@tool
def get_weather(location: str):
"""Call to get the current weather."""
if location.lower() in ["sf", "san francisco"]:
return "It's 60 degrees and foggy."
else:
return "It's 90 degrees and sunny."
當然,這只是簡單的工具函數的使用;如果在Langgraph中的節點中需要實現多個智能體應該怎么辦?其工具應該怎么管理,是分開管理還是集中管理?
比如說有的智能體節點需要調用地圖和天氣工具用來確定旅行計劃和路線;而有的智能體需要訂票訂酒店,這樣需要多個工具進行協作的情況下,應該怎么處理。
本文轉載自??AI探索時代?? 作者:DFires
