一、什么是langgraph的ReAct
LangGraph 中的 ReAct(Reasoning + Acting)代理是一種結合推理與行動能力的 AI 代理架構,通過動態決策鏈實現復雜任務處理。以下是其核心要點及實踐指南。
1、ReAct 代理的核心原理
1.1工作流程:
ReAct 代理通過循環迭代完成任務:
推理(Reason):模型分析輸入和歷史上下文,生成思考步驟。
行動(Act):選擇工具并調用,或直接響應用戶。
觀察(Observe):工具返回結果作為新輸入,循環直至輸出最終響應
1.2技術優勢
動態決策:基于狀態圖(State Graph)管理節點和邊,支持循環和條件分支。
透明可控:開發者可干預執行流程(如中斷節點),調試更便捷。
多輪對話支持:通過檢查點(Checkpointer)持久化狀態,實現長上下文記憶
2、典型應用場景
2.1 RAG 增強檢索
結合路由機制,動態選擇向量庫檢索或網絡搜索(如 Tavily API),并通過評分器過濾無關結果。
2.2 多工具協作
例如:用戶查詢 → 搜索工具 → 數學計算工具 → 生成綜合響應。
2.3實時交互系統
客服機器人中處理多輪對話,保留歷史上下文。
二、langgraph的ReAct應用示例
在本節中,我們將創建一個簡單的 ReAct 代理應用程序,該應用程序可以檢查天氣。該應用程序由一個代理(LLM)和工具組成。當我們與應用程序交互時,我們將首先調用代理(LLM)來決定是否應該使用工具。然后我們將運行一個循環
1.如果代理說要采取行動(即調用工具),我們將運行工具并將結果傳遞回代理
2.如果代理沒有要求運行工具,我們將結束(應用戶)
預構建的代理:
請注意,這里我們將使用預構建的代理。LangGraph 的一大優勢是你可以輕松創建自己的代理架構。因此,雖然從這里開始快速構建代理是不錯的選擇,但我們強烈建議你學習如何構建自己的代理,這樣你就可以充分利用LanqGraph。
下面是代碼示例:
# 首先我們初始化我們想要使用的模型。
from langchain_openai import ChatOpenAI
import osapiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(api_key=apiKey, # 請替換成您的ModelScope SDK Tokenbase_url="https://api-inference.modelscope.cn/v1/",model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool# 定義一個工具函數 get_weather,它根據城市名稱返回預定義的天氣信息
@tool
def get_weather(city: Literal["武漢", "長沙"]):"""Use this to get weather information."""if city == "武漢":return "很熱"elif city == "長沙":return "不想告訴你"else:raise AssertionError("未知的城市名")# 將工具放入一個列表中
tools = [get_weather]# 導入 create_react_agent 函數,用于創建 REACT 代理
from langgraph.prebuilt import create_react_agent# 使用指定的模型和工具創建 REACT 代理
graph = create_react_agent(model, tools=tools)# 將生成的圖片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent.png", "wb") as f:f.write(graph_png)# 定義一個函數用于打印流數據
def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()# 使用需要工具調用的輸入運行應用程序
inputs = {"messages": [("user", "長沙的天氣怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values"))# 嘗試一個不需要工具的問題
inputs = {"messages": [("user", "如何學AI")]}
print_stream(graph.stream(inputs, stream_mode="values"))inputs = {"messages": [("user", "深圳的天氣怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values"))inputs = {"messages": [("user", "武漢的天氣怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values"))
上面代碼生成的流程圖如下:
上面代碼我們分別問了四個問題,對應的輸出如下:
================================ Human Message =================================
長沙的天氣怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_2db5e20f75474d5489225b)
?Call ID: call_2db5e20f75474d5489225b
??Args:
????city: 長沙
================================= Tool Message =================================
Name: get_weather
不想告訴你
================================== Ai Message ==================================
很抱歉,無法獲取當前長沙的天氣信息。請稍后再試。
================================ Human Message =================================
如何學AI
================================== Ai Message ==================================
學習人工智能(AI)是一個多步驟的過程,涉及理論知識的學習和實踐技能的培養。以下是一些基本的建議,幫助你開始你的AI學習之旅:
1. **數學基礎**:AI依賴于大量的數學概念,包括線性代數、微積分、概率論和統計學。這些數學知識對于理解機器學習算法的工作原理至關重要。
2. **編程技能**:Python是目前最常用的AI編程語言,因為它有許多強大的庫和框架支持,如TensorFlow、PyTorch、Scikit-learn等。熟悉Python編程語言及其相關庫對于AI開發非常重要。
3. **機器學習基礎**:機器學習是AI的一個重要分支,它使計算機能夠從數據中自動學習和改進。了解監督學習、無監督學習、強化學習等概念以及相關的算法,如線性回歸、決策樹、神經網絡等。
4. **深度學習**:深度學習是機器學習的一個子領域,它使用人工神經網絡來模擬人腦處理信息的方式。學習深度學習可以幫助你理解如何構建和訓練復雜的模型來解決更復雜的問題。
5. **數據處理與分析**:學會如何清洗、轉換和分析數據,因為這在AI項目中是非常重要的步驟。掌握數據可視化技術也很有幫助,它可以幫助你更好地理解和展示數據。
6. **項目實踐**:理論學習固然重要,但實際操作經驗同樣不可或缺。嘗試參與一些AI項目,比如圖像識別、自然語言處理等,通過實踐來鞏固所學知識。
7. **持續學習**:AI領域發展迅速,新的技術和方法不斷涌現。保持對新技術的關注,并持續學習,對于在AI領域取得成功至關重要。
8. **加入社區**:加入AI相關的論壇、小組或者參加線下活動,與其他學習者和專業人士交流,可以讓你獲得更多的資源和支持。
9. **閱讀文獻**:閱讀最新的研究論文和技術文章,可以幫助你了解行業趨勢和前沿技術。
10. **動手實驗**:利用在線平臺(如Kaggle、Google Colab等)進行實驗和練習,可以快速驗證你的想法,并提高解決問題的能力。
通過以上步驟,你可以逐步建立起扎實的AI知識體系,并具備一定的實踐能力。記住,學習AI是一個長期且持續的過程,保持好奇心和耐心是非常重要的。
================================ Human Message =================================
深圳的天氣怎么樣
================================== Ai Message ==================================
目前`get_weather`工具僅支持查詢武漢和長沙的天氣信息。如果您需要查詢深圳的天氣,建議使用其他天氣預報服務。
================================ Human Message =================================
武漢的天氣怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_6cf152a8605f46d6a74cc5)
?Call ID: call_6cf152a8605f46d6a74cc5
??Args:
????city: 武漢
================================= Tool Message =================================
Name: get_weather
很熱
================================== Ai Message ==================================
武漢今天的天氣很熱。
向 ReAct 代理添加記憶
我們可以簡單的 將記憶存儲到內存中,當然也可以存儲到其他中間件中,比如redis、mongo等其他介質。要啟用內存,我們只需要將 checkpointer 傳遞給create react agents。
代碼示例如下:
# 首先我們初始化我們想要使用的模型。
from langchain_openai import ChatOpenAI
import osapiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(api_key=apiKey, # 請替換成您的ModelScope SDK Tokenbase_url="https://api-inference.modelscope.cn/v1/",model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool# 定義一個工具函數 get_weather,它根據城市名稱返回預定義的天氣信息
@tool
def get_weather(city: Literal["武漢", "長沙"]):"""Use this to get weather information."""if city == "武漢":return "很熱"elif city == "長沙":return "不想告訴你"else:raise AssertionError("未知的城市名")# 將工具放入一個列表中
tools = [get_weather]# 導入 create_react_agent 函數,用于創建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySavermemory =MemorySaver()# 使用指定的模型和工具創建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory)# 將生成的圖片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent.png", "wb") as f:f.write(graph_png)# 定義一個函數用于打印流數據
def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()# 使用需要工具調用的輸入運行應用程序config = {"configurable": {"thread_id": "1"}}inputs = {"messages": [("user", "武漢的天氣怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))inputs = {"messages": [("user", "怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
打印內容如下:
================================ Human Message =================================
武漢的天氣怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_21d7ec337ddb4a3382b9c1)
?Call ID: call_21d7ec337ddb4a3382b9c1
??Args:
????city: 武漢
================================= Tool Message =================================
Name: get_weather
很熱
================================== Ai Message ==================================
武漢今天的天氣非常熱。
================================ Human Message =================================
怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_dd70f99943ef40acbe2ce4)
?Call ID: call_dd70f99943ef40acbe2ce4
??Args:
????city: 武漢
================================= Tool Message =================================
Name: get_weather
很熱
================================== Ai Message ==================================
武漢今天的天氣非常熱。
由上面打印我們可以知道,第二個問題沒有指明具體的問題,但是模型還是回答了,說明他具備了記憶功能。
向 ReAct 代理添加系統提示
本教程將展示如何向預構建的 ReAct 代理添加自定義系統提示。
代碼示例如下:
# 首先我們初始化我們想要使用的模型。
from langchain_openai import ChatOpenAI
import osapiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(api_key=apiKey, # 請替換成您的ModelScope SDK Tokenbase_url="https://api-inference.modelscope.cn/v1/",model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool# 定義一個工具函數 get_weather,它根據城市名稱返回預定義的天氣信息
@tool
def get_weather(city: Literal["武漢", "長沙"]):"""Use this to get weather information."""if city == "武漢":return "很熱"elif city == "長沙":return "不想告訴你"else:raise AssertionError("未知的城市名")# 將工具放入一個列表中
tools = [get_weather]# 導入 create_react_agent 函數,用于創建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver#添加內存存儲
memory =MemorySaver()# 我們可以在這里添加系統提示
prompt = "請用繁體字回答"# 使用指定的模型和工具創建 REACT 代理
# 使用指定的模型、工具和狀態修改器(系統提示)創建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory,prompt=prompt)# 將生成的圖片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent-prompt.png", "wb") as f:f.write(graph_png)# 定義一個函數用于打印流數據
def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()# 使用需要工具調用的輸入運行應用程序config = {"configurable": {"thread_id": "1"}}inputs = {"messages": [("user", "武漢的天氣怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))inputs = {"messages": [("user", "怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
打印結果如下:
================================ Human Message =================================
武漢的天氣怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_044f77360fa14deca3390e)
?Call ID: call_044f77360fa14deca3390e
??Args:
????city: 武漢
================================= Tool Message =================================
Name: get_weather
很熱
================================== Ai Message ==================================
武漢的天氣很熱。
================================ Human Message =================================
怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_c3752beac3e34751a980d4)
?Call ID: call_c3752beac3e34751a980d4
??Args:
????city: 武漢
================================= Tool Message =================================
Name: get_weather
Error: 1 validation error for get_weather
city
??Input should be '武漢' or '長沙' [type=literal_error, input_value='武漢', input_type=str]
????For further information visit https://errors.pydantic.dev/2.11/v/literal_error
?Please fix your mistakes.
================================== Ai Message ==================================
輸入的城市名稱有誤,請輸入「武漢」或「長沙」。
從上面的打印,我們知道提示詞已生效。
向 ReAct 代理添加人機交互
本教程將演示如何向預構建的 ReAct 代理添加人機交互環過程,主要是在工具執行前進行中斷,interrupt_before=["tools"]。
代碼示例如下:
# 首先我們初始化我們想要使用的模型。
from langchain_openai import ChatOpenAI
import osapiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(api_key=apiKey, # 請替換成您的ModelScope SDK Tokenbase_url="https://api-inference.modelscope.cn/v1/",model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool# 定義一個工具函數 get_weather,它根據城市名稱返回預定義的天氣信息
@tool
def get_weather(city: Literal["武漢", "長沙"]):"""Use this to get weather information."""if city == "武漢":return "很熱"elif city == "長沙":return "不想告訴你"else:raise AssertionError("未知的城市名")# 將工具放入一個列表中
tools = [get_weather]# 導入 create_react_agent 函數,用于創建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySavermemory =MemorySaver()# 使用指定的模型和工具創建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory, interrupt_before=["tools"])# 將生成的圖片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent-hl.png", "wb") as f:f.write(graph_png)# 定義一個函數用于打印流數據
def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()# 使用需要工具調用的輸入運行應用程序config = {"configurable": {"thread_id": "1"}}inputs = {"messages": [("user", "武漢的天氣怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))# # 獲取圖的狀態快照
snapshot = graph.get_state(config)
# 打印下一步信息
print("Next step: ", snapshot.next)# 打印后續流輸出
print_stream(graph.stream(None, config, stream_mode="values"))
上面代碼打印結果如下:
================================ Human Message =================================
武漢的天氣怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_40adb899316d45e2bf14a0)
?Call ID: call_40adb899316d45e2bf14a0
??Args:
????city: 武漢
Next step: ?('tools',)
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_40adb899316d45e2bf14a0)
?Call ID: call_40adb899316d45e2bf14a0
??Args:
????city: 武漢
================================= Tool Message =================================
Name: get_weather
很熱
================================== Ai Message ==================================
武漢今天的天氣非常熱。
將最后幾行代碼注釋掉后:
# 首先我們初始化我們想要使用的模型。
from langchain_openai import ChatOpenAI
import osapiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(api_key=apiKey, # 請替換成您的ModelScope SDK Tokenbase_url="https://api-inference.modelscope.cn/v1/",model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool# 定義一個工具函數 get_weather,它根據城市名稱返回預定義的天氣信息
@tool
def get_weather(city: Literal["武漢", "長沙"]):"""Use this to get weather information."""if city == "武漢":return "很熱"elif city == "長沙":return "不想告訴你"else:raise AssertionError("未知的城市名")# 將工具放入一個列表中
tools = [get_weather]# 導入 create_react_agent 函數,用于創建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySavermemory =MemorySaver()# 使用指定的模型和工具創建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory, interrupt_before=["tools"])# 將生成的圖片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent-hl.png", "wb") as f:f.write(graph_png)# 定義一個函數用于打印流數據
def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()# 使用需要工具調用的輸入運行應用程序config = {"configurable": {"thread_id": "1"}}inputs = {"messages": [("user", "武漢的天氣怎么樣")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))# # 獲取圖的狀態快照
# snapshot = graph.get_state(config)
# # 打印下一步信息
# print("Next step: ", snapshot.next)
#
# # 打印后續流輸出
# print_stream(graph.stream(None, config, stream_mode="values"))
當我們把后面幾行代碼注釋掉后,執行結果如下:
================================ Human Message =================================
武漢的天氣怎么樣
================================== Ai Message ==================================
Tool Calls:
??get_weather (call_f9aaf3002f664cd5b05157)
?Call ID: call_f9aaf3002f664cd5b05157
??Args:
????city: 武漢
Process finished with exit code 0
由上面對比,可知人機交互效果已實現。