ReAct Agent(LangGraph實現)

文章目錄

  • 參考資料
  • 一 AI Agent
  • 二 ReAct
  • 三 LangGraph實現ReAct代理
    • 3.1 SerperAPI實時聯網搜索
    • 3.2 ReAct實現

參考資料

  • entic RAG 架構的基本原理與應用入門

一 AI Agent

  • AI Agent 整個過程是一個動態循環。Agent不斷從環境中學習,通過其行動影響環境,然后根據環境的反饋繼續調整其行動和策略。這種模式特別適用于那些需要理解和生成自然語言的應用場景,如聊天機器人、自動翻譯系統或其他形式的自動化客戶支持。
    在這里插入圖片描述
    在這里插入圖片描述
    一個人工智能代理的基本架構,包括它與環境的互動、感知輸入、大腦處理及其決策過程。具體來說:
  1. 環境(Environment): AI代理接收來自其周圍環境的信息。環境可以是一個網站、數據庫或任何其他類型的系統。
  2. 感知(Perception): 即輸入。AI代理通過多種方式感知環境,如視覺(圖像)、聽覺(聲音)、文本(文字信息)和其他傳感器輸入(如位置、溫度等)。這些輸入幫助代理理解當前的環境狀態。
  3. 大腦(Brain)
  • 存儲(Storage)
    • 記憶(Memory):存儲先前的經驗和數據,類似于人類的記憶。
    • 知識(Knowledge):包括事實、信息和代理用于決策的程序。
  • 決策制定(Decision Making):總結(Summary)、回憶(Recall)、學習(Learn)、檢索(Retrieve):這些功能幫助AI在需要時回顧和利用存儲的知識。
    • 規劃/推理(Planning/Reasoning):基于當前輸入和存儲的知識,制定行動計劃。
  1. 行動(Action):代理基于其感知和決策過程產生響應或行動。這可以是物理動作、發送API請求、生成文本或其他形式的輸出。

二 ReAct

  • ReAct 代理可以處理順序的多部分查詢,同時通過將路由、查詢規劃和工具使用組合到單個實體中來維護狀態(在內存中)。通過交叉推理和行動,ReAct 使智能體能夠動態地在產生想法和特定于任務的行動之間交替。
  • ReAct:Synergizing Reasoning and Acting in Language Models
  • ReAct 框架有兩個過程,由 Reason 和 Act 結合而來。從本質上講,這種方法的靈感來自于人類如何通過和諧地結合思維和行動來執行任務。
  • Reason基于一種推理技術——思想鏈(CoT)。 CoT是一種提示工程,通過將輸入分解為多個邏輯思維步驟,幫助大語言模型執行推理并解決復雜問題。這使得大模型能夠按順序規劃和解決任務的每個部分,從而更準確地獲得最終結果。
    • 分解問題:當面對復雜的任務時,CoT 方法不是通過單個步驟解決它,而是將任務分解為更小的步驟,每個步驟解決不同方面的問題。
    • 順序思維:思維鏈中的每一步都建立在上一步的結果之上。這樣,模型就能從頭到尾構造出一條邏輯推理鏈。
      在這里插入圖片描述
  • 在 CoT 提示工程的限定下,大模型仍然會產生幻覺。因為經過長期的使用,大家發現在推理的中間階段會產生不正確的答案或上下游的傳播錯誤,所以,Google DeepMind 團隊開發了ReAct的技術來彌補這一點。
  • ReAct 采用的是 思想-行動-觀察循環的思路,其中代理根據先前的觀察進行推理以決定行動。這個迭代過程使其能夠根據其行動的結果來調整和完善其方法。
    在這里插入圖片描述
  • Question指的是用戶請求的任務或需要解決的問題。
  • Thought用來確定要采取的行動并向大模型展示如何創建/維護/調整行動計劃。
  • Action Input是用來讓大模型與外部環境(例如搜索引擎、維基百科)的實時交互,包括具有預定義范圍的API。
  • Observation是會觀察執行操作結果的輸出,重復此過程直至任務完成。

三 LangGraph實現ReAct代理

3.1 SerperAPI實時聯網搜索

  • Serper一個高性能的Google搜索APl,提供快速且成本效益高的方式訪問Google搜索結果。在目前的應用落地產品中廣泛被用于增強聊天機器人、進行搜索引擎優化(SEO)分析和簡化金融科技項目等多種場景。該API具備:執行實時搜索、自定義查詢位置、快速訪問Google的搜索引擎結果等優勢。
  • 新用戶注冊具有2500次免費搜索額度,可以在Playground中自定義搜索配置。
    在這里插入圖片描述
  • 簡單測試用例
import http.client
import jsonconn = http.client.HTTPSConnection("google.serper.dev")
payload = json.dumps({"q": "通義千問最新模型","gl": "cn","hl": "ny"
})
headers = {'X-API-KEY': 'xxx','Content-Type': 'application/json'
}
conn.request("POST", "/search", payload, headers)
res = conn.getresponse()
data = res.read()
#print(data.decode("utf-8"))
data=json.loads(data.decode("utf-8"))# 將返回的JSON字符串轉換為字典

3.2 ReAct實現

  • OpenAI 中轉API key平臺
  • LLM Model使用gpt-4o
from typing import (Annotated,Sequence,TypedDict)
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
from langchain_core.tools import tool
from typing import Union, Optional
from pydantic import BaseModel, Field
import json
import http.clientclass AgentState(TypedDict):"""代理狀態"""messages: Annotated[Sequence[BaseMessage], add_messages]class SearchQuery(BaseModel):"""SearchQuery 數據模型"""query: str = Field(description="Questions for networking queries")# 參數 args_schema=SearchQuery 表示使用 SearchQuery 模型來驗證函數的輸入參數
@tool(args_schema = SearchQuery)
def fetch_real_time_info(query):"""獲取互聯網實時信息工具函數"""conn = http.client.HTTPSConnection("google.serper.dev")payload = json.dumps({"q": query,"gl": "cn","hl": "ny"})headers = {'X-API-KEY': 'xxx','Content-Type': 'application/json'}conn.request("POST", "/search", payload, headers)res = conn.getresponse()data = res.read()#print(data.decode("utf-8"))data=json.loads(data.decode("utf-8"))# 將返回的JSON字符串轉換為字典 if 'organic' in data:return json.dumps(data['organic'],  ensure_ascii=False)  # 返回'organic'部分的JSON字符串else:return json.dumps({"error": "No organic results found"},  ensure_ascii=False)  # 如果沒有'organic'鍵,返回錯誤信息#fetch_real_time_info.invoke({"query":  "通義千問最新模型"})#----------------------------
import os
from langchain_openai import ChatOpenAI
api_key="hk-xxx"
base_url="https://api.openai-hk.com/v1"# 臨時設置環境變量
os.environ["OPENAI_API_KEY"] = api_key
os.environ["OPENAI_BASE_URL"] = base_url
# 實例化模型
llm = ChatOpenAI(api_key=api_key,base_url=base_url,model="gpt-4o"
)# 綁定工具
tools = [fetch_real_time_info]
model = llm.bind_tools(tools) # ----------------------------
import json
from langchain_core.messages import ToolMessage, SystemMessage, HumanMessage
from langchain_core.runnables import RunnableConfigtools_by_name = {tool.name: tool for tool in tools}# 定義工具節點
def tool_node(state: AgentState):outputs = []for tool_call in state["messages"][-1].tool_calls:tool_result = tools_by_name[tool_call["name"]].invoke(tool_call["args"])outputs.append(ToolMessage(content=json.dumps(tool_result),name=tool_call["name"],tool_call_id=tool_call["id"],))return {"messages": outputs}# 定義問答模型
def call_model(state: AgentState,):system_prompt = SystemMessage("你是一個智能助手,請盡全力回答用戶的問題")response = model.invoke([system_prompt] + state["messages"])return {"messages": [response]}# 定義路由節點
def should_continue(state: AgentState):messages = state["messages"]last_message = messages[-1]if not last_message.tool_calls:return "end"else:return "continue"# -----------------------------------
from langgraph.graph import StateGraph, END
from IPython.display import Image, display
# 定義一個圖結構
workflow = StateGraph(AgentState)# 在圖結構中添加節點
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)# 設置啟動點是 agent
workflow.set_entry_point("agent")# 添加路由邊
workflow.add_conditional_edges("agent",should_continue,{"continue": "tools","end": END,},
)
# 添加返回邊
workflow.add_edge("tools", "agent")
# 編譯圖
graph = workflow.compile()
display(Image(graph.get_graph().draw_mermaid_png()))# 打印問答的流 
def print_stream(stream):"""打印消息流的工具函數,支持兩種消息格式:1. 元組(tuple)形式的原始消息 2. 具有 pretty_print() 方法的對象 參數:stream: 可迭代的消息流,每個元素應包含 "messages" 列表 """for s in stream:  # 遍歷消息流中的每個元素message = s["messages"][-1]  # 獲取當前元素中 messages 列表的最后一個消息 if isinstance(message, tuple):  # 如果消息是元組類型print(message)  # 直接打印原始元組 else:  # 其他情況message.pretty_print()   # 調用對象的格式化打印方法 inputs = {"messages": [("user", "如何看待通義千問最新模型?")]}
print_stream(graph.stream(inputs, stream_mode="values"))

在這里插入圖片描述

================================ Human Message =================================

如何看待通義千問最新模型?
================================== Ai Message ==================================
Tool Calls:
fetch_real_time_info (call_b85QNErx5VwN3KXtaDTQQbbe)
Call ID: call_b85QNErx5VwN3KXtaDTQQbbe
Args:
query: 通義千問最新模型 發布
================================= Tool Message =================================
Name: fetch_real_time_info

“[{xxx}]”
================================== Ai Message ==================================

對于阿里巴巴云最新發布的通義千問模型(Qwen3),這次更新帶來了許多重要的變化和提升。以下是一些關鍵點:

  1. 版本升級: 通義千問的Qwen3版本及其子系列已經得到了顯著提升。最新的Qwen3-Coder系列具有卓越的代碼生成能力,被認為在開源模型中達到SOTA(State Of The Art)效果。

  2. 強化的核心: Qwen3系列核心的235B旗艦版本進行了同步重磅升級,其模型的通用能力顯著領先于之前的版本。這表明模型在處理復雜任務時能夠更高效地應對并提供更精確的結果。

  3. 多模態支持: 在不同應用場合的適應能力上,Qwen3還推出了加強互動環境的能力,使其在工具調優和環境交互中表現優異,使用戶能夠實現更加自主的任務操作。

更多詳細信息可以訪問阿里云官網。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93034.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何從0到1的建立組織級項目管理體系【現狀診斷】

今天我想給大家分享是“如何在企業中從0到1的去建立PMO的組織級項目管理體系。”的系列文章,這是我近幾年來一直在努力的嘗試去探索和實踐的過程,從0到1的過程。當我最開始去接手這樣一個場景的時候所需要做的第一件事情是診斷和差距分析。這是多年以來做…

網絡通信協議詳解:TCP協議 vs HTTP協議

在計算機網絡中,TCP(傳輸控制協議)和HTTP(超文本傳輸協議)是兩個核心協議,但它們的職責和層級完全不同。TCP是底層傳輸協議,負責數據的可靠傳輸;HTTP是應用層協議,定義了…

[Qt]QString隱式拷貝

引言在Qt框架中,QString 作為字符串處理的核心類,其高效的內存管理機制一直是開發者津津樂道的特性。這背后的關鍵便是 隱式共享(Implicit Sharing),也稱為 寫時復制(Copy-On-Write, COW)。本文…

命令行創建 UV 環境及本地化實戰演示—— 基于《Python 多版本與開發環境治理架構設計》的最佳實踐

命令行創建 UV 環境及本地化實戰:基于架構設計的最佳實踐 Python 多版本環境治理理念驅動的系統架構設計:三維治理、四級隔離、五項自治 原則-CSDN博客 使用 Conda 工具鏈創建 UV 本地虛擬環境全記錄——基于《Python 多版本與開發環境治理架構設計》-CS…

跨域問題全解:從原理到實戰

在計算機網絡中,跨域(Cross-Origin) 指的是瀏覽器出于安全考慮,限制網頁腳本(如 JavaScript)向與當前頁面不同源(Origin) 的服務器發起請求的行為。這是由瀏覽器的同源策略&#xff…

(46)elasticsearch-華為云CCE無狀態負載部署

一、準備好elasticsearch鏡像并提前上傳到鏡像倉庫 此次準備的是elasticsearch:v7.10.2 二、開始部署 負載名稱:es-deployment 注意:內部配額太低會造成多次重啟 環境變量: #單節點啟動(實例pod可以多增加幾個) discovery.type single-node 三、添加svc 四、注意:…

HCLP--MGER綜合實驗

一、拓撲圖二、需求1、R5為ISP,只能進行IP地址配置,其所有地址均配為公有I地址; 2、R1和R5間使用PPP的PAP認證,R5為主認證方, R2與R5之間使用ppp的CHAP認證,R5為主認證方; R3與R5之間使用HDLc封裝; 3、R1、R2、R3構建一…

idea中無法刪除模塊,只能remove?

1.先對module右鍵想要刪除的module,選擇remove module(這是idea為了避免誤操作) 2.在remove module后,模塊并未從項目結構中刪除(磁盤中也依舊存在),但再次右擊你會發現,出現了del…

青藤天睿RASP再次發威!捕獲E簽寶RCE 0day漏洞

在2025年HVV關鍵攻防節點上,攻擊隊對E簽寶電子合同服務發起的0day攻擊被青藤天睿RASP截獲。該漏洞可使攻擊者在未授權情況下實現服務器遠程代碼執行(RCE),進而控制服務器,構成橫向滲透的關鍵跳板。>>>>漏洞…

Lua(字符串)

Lua字符串基礎Lua中的字符串是不可變序列,可以包含任意字節數據(包括嵌入的\0)。字符串可以用單引號、雙引號或長括號([[ ]])定義:str1 "Hello" str2 World str3 [[Multi-line string]]字符串…

大模型蒸餾(distillation)---從DeepseekR1-1.5B到Qwen-2.5-1.5B蒸餾

目錄 1.1 蒸餾目標 2 環境準備 2.1依賴庫安裝 2.2 硬件要求 2.3 模型與數據集下載 2.3.1 教師模型下載 2.3.2 學生模型下載 2.3.3 數據集準備或下載 3.過程日志 4. 模型加載與配置 4.1 加載教師模型 4.2 加載學生模型 4.3 數據預處理函數 4.4 數據收集器 4.5 定義…

通過redis_exporter監控redis cluster

環境說明: 現在有一套redis cluster,部署是3主機6實例架構部署。需要采集對應的指標,滿足異常監控告警,性能分析所需。 環境準備 以下環境需要提前部署完成。 redis cluser prometheus alertmanager grafna redis_exporter部署 我…

第二十天(正則表達式與功能實際運用)

在程序員一生的工作中,遇到的最多的數據就是字符串字符串里面很有可能有很多的不需要的信息我們需要從中間挑選出我們需要的如果循環去寫,比較簡單的時候問題不大規則多了,你的工作量會成倍上升的為了解決這個問題 ---- 正則表達式正則表達式…

0基礎法考隨手筆記 03(刑訴05 刑事證據與證明+06 強制措施)

1.如何區分書證和電子數據 書面材料是否為書證?→ 看內容是否直接源于案件事實(不是 “記錄別人陳述” 的載體)。 證據清單是否為證據?→ 看誰做的清單(偵查人員做的勘查筆錄是證據,當事人做的目錄不是&…

資產負債表及其數據獲取

文章目錄資產負債表及其數據獲取資產負債表資產負債表在股票投資中的意義AKShare中的資產負債表數據接口(深滬為例)接口描述調用示例總結資產負債表及其數據獲取 資產負債表 資產負債表(Balance Sheet)是反映企業在某一特定日期財…

數據倉庫深度探索系列 | 開篇:開啟數倉建設新征程

數據倉庫深度探索系列 | 開篇:開啟數倉建設新征程 在當今信息技術飛速發展的背景下,企業面臨著數據量的爆炸式增長。企業不僅要高效管理海量數據,還需從中提取關鍵信息以支持復雜決策。數據倉庫已從單純的數據存儲工具,演變為支持…

Linux如何執行系統調用及高效執行系統調用:深入淺出的解析

文章目錄如何執行系統調用及高效執行系統調用:深入淺出的解析一、什么是系統調用?1.1 系統調用的作用1.2 系統調用的分類二、如何執行系統調用?2.1 系統調用的觸發2.2 庫函數與系統調用的關系2.3 系統調用的示例2.4 錯誤處理三、如何高效執行…

基于 XGBoost 與 SHAP 的醫療自動化辦公與可視化系統(上)

摘要 隨著信息技術的飛速發展和醫療健康數據的爆炸式增長,現代醫療機構面臨著日益復雜的數據處理挑戰。醫生和行政人員常常需要花費大量時間在數據提取、整理、分析和報告生成等重復性、事務性的工作上,這不僅降低了工作效率,也限制了醫護人員將更多精力投入到直接的患者護…

基于Kafka實現簡單的延時隊列

生命無罪,健康萬歲,我是laity。 我曾七次鄙視自己的靈魂: 第一次,當它本可進取時,卻故作謙卑; 第二次,當它在空虛時,用愛欲來填充; 第三次,在困難和容易之間&…

OceanBase 4.3.5 解析:DDL性能診斷

背景DDL操作通常耗時較長,特別是涉及補數據流程的DDL語句。在執行過程中,用戶面臨兩個主要痛點:一是無法實時獲取DDL執行進度,難以區分長時間運行是正常現象還是由內部異常導致的停滯;二是執行效率經常低于預期&#x…