LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在構建智能 AI 助手時,我們希望模型能夠智能地調用工具,以便提供準確的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION,它結合了 ReAct(Reasoning + Acting)策略,使得 LLM 可以基于工具的描述智能選擇合適的工具進行推理和執行。本文將介紹該類型 Agent 的核心原理,并通過示例展示其應用。

1. ZERO_SHOT_REACT_DESCRIPTION 簡介

AgentType.ZERO_SHOT_REACT_DESCRIPTION 采用了 ReAct 框架,主要特點包括:

  • 零樣本學習(Zero-Shot):無需提供示例,LLM 通過工具的描述來決定如何使用它們。
  • 自適應推理(ReAct):LLM 通過思考和行動循環決定調用哪個工具。
  • 工具可擴展:可以動態地向 Agent 添加新的工具。

這種方式特別適用于開放域問答場景,例如查詢天氣、獲取時間、計算數值等。

2. 代碼示例

下面是一個完整的 ZERO_SHOT_REACT_DESCRIPTION 示例,我們定義了兩個工具:

  • get_weather(location: str): 獲取指定城市的天氣信息。
  • get_time(location: str): 獲取指定城市的當前時間。

然后,我們使用 LangChain 的 initialize_agent 方法初始化一個智能 Agent,并使用 Ollama LLM 作為后端大模型。

代碼實現

from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
from langchain_ollama import OllamaLLM# 定義工具
def get_weather(location: str):return f"{location} 的天氣是晴天,溫度 25°C"def get_time(location: str):return f"{location} 的當前時間是 12:00 PM"weather_tool = Tool(name="get_weather",func=get_weather,description="獲取城市天氣信息,輸入城市名稱"
)time_tool = Tool(name="get_time",func=get_time,description="獲取城市當前時間,輸入城市名稱"
)# 初始化 Agent
llm = OllamaLLM(model="llama3:8b", temperature=0)agent = initialize_agent(tools=[weather_tool, time_tool],llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True
)# 讓 LLM 選擇合適的工具
response = agent.run("告訴我上海當前時間")
print(response)

代碼解析

  1. 定義工具

    • get_weather(location: str): 返回固定天氣信息。
    • get_time(location: str): 返回固定時間信息。
    • Tool 結構體用于封裝工具,包括名稱、調用函數和描述。
  2. 初始化 LLM 和 Agent

    • 使用 OllamaLLM(model="llama3:8b", temperature=0) 作為 LLM。
    • 使用 initialize_agent 方法創建 Agent,并指定 AgentType.ZERO_SHOT_REACT_DESCRIPTION
    • Agent 通過工具的 description 選擇合適的工具。
  3. 運行 Agent

    • Agent 接受用戶輸入 告訴我上海當前時間,然后決定調用 get_time
    • 最終輸出 上海的當前時間是 12:00 PM

3. AgentType.ZERO_SHOT_REACT_DESCRIPTION 的核心機制

該 Agent 類型基于 ReAct 框架工作,流程如下:

  1. 模型解析用戶輸入

    • LLM 讀取用戶的請求,如 告訴我上海當前時間
  2. Agent 選擇合適的工具

    • LLM 根據工具的 description 確定使用 get_time
    • 生成相應的函數調用。
  3. 執行工具調用并返回結果

    • Agent 執行 get_time("上海")
    • 返回 上海的當前時間是 12:00 PM
  4. 響應用戶

    • Agent 將結果輸出給用戶。

4. ZERO_SHOT_REACT_DESCRIPTION 的應用場景

AgentType.ZERO_SHOT_REACT_DESCRIPTION 適用于以下場景:

  • 問答系統:基于多種工具提供智能問答,如天氣查詢、匯率轉換、時間查詢等。
  • 企業客服:可以根據客戶的輸入選擇合適的 API 調用,自動化處理查詢。
  • 自動化任務執行:如調用不同的數據庫查詢接口、自動化執行不同任務等。

5. 結論

本文詳細介紹了 AgentType.ZERO_SHOT_REACT_DESCRIPTION,并通過示例展示了如何在 LangChain 中使用它來創建智能 Agent。其主要優勢包括零樣本學習、自動推理與工具調用,適用于智能問答和自動化任務執行。希望本文能幫助你更好地理解和應用 LangChain 的 Agent 機制!

參考
LangChain教程 - Agent - 支持 9 種 ReAct 交互
J-LangChain - Agent - 0~1 編排一個 ReAct 反應鏈

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

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

相關文章

移動Android和IOS自動化中常見問題

APP測試邏輯 在app編寫自動化測試用例時,通常會出現只是簡單的點點點過程,然而卻忽略了在實際的自動化實現過程中,軟件是對app元素的判斷來執行測試腳本。所以會出現在后期已經寫好自動化腳本之后還會對測試用例的更新。 App在測試時&#…

python高效試用17---兩個字符串組成一個新的字符串和兩個字符串組成元組作為key哪個更高效

在 Python 中,使用字符串連接 (str1 str2) 作為 key 和使用元組 ((str1, str2)) 作為 key 的效率差異,主要受以下因素影響: 哈希計算速度: 字符串連接 (str1 str2):會創建一個新的字符串對象,并計算哈希…

深入淺出Java try-with-resources:告別資源泄漏的煩惱

一、為什么需要try-with-resources? 在Java開發中,我們經常需要處理各種資源:文件流、數據庫連接、網絡套接字等。這些資源都有一個共同特點——必須在使用后正確關閉。傳統的資源管理方式存在三大痛點: 代碼臃腫:每…

Python+DeepSeek:開啟AI編程新次元——從自動化到智能創造的實戰指南

文章核心價值 技術熱點:結合全球最流行的編程語言與國產頂尖AI模型實用場景:覆蓋代碼開發/數據分析/辦公自動化等高頻需求流量密碼:揭秘大模型在編程中的創造性應用目錄結構 環境搭建:5分鐘快速接入DeepSeek場景一:AI輔助代碼開發(智能補全+調試)場景二:數據分析超級助…

Linux tcpdump -any抓的包轉換成標準的pcap

在 Linux 中使用 tcpdump -any 抓包并轉換為標準 pcap 文件時出現額外字段,通常與 鏈路層協議頭部的差異 以及 pcap 文件格式的兼容性 有關。以下是詳細原因和解決方案: 一、問題原因分析 -any 選項的局限性 tcpdump -any 會自動猜測鏈路層協議類型(如 Ethernet、IEEE 802…

【SpringMVC】深入解析使用 Postman 在請求中傳遞對象類型、數組類型、參數類型的參數方法和后端參數重命名、及非必傳參數設置的方法

SpringMVC—請求傳參 1. 傳遞對象 如果參數比較多時,方法聲明就需要有很多形參;并且后續每次新增一個參數,也需要修改方法聲明. 我們不妨把這些參數封裝為一個對象; Spring MVC 也可以自動實現對象參數的賦值,比如 Us…

一個差勁的軟件設計

項目概況: 之前自己設計并開發了一個用C#開發的上位機軟件,整個軟件只有一個Form,一個TabControl,3個TabControlPanel,總共100多個lable、textbox、ListBox等控件都放在這3個TabControlPanel里。 問題: 1.…

Linux練級寶典->進程控制詳解(進程替換,fork函數)

目錄 進程創建 fork函數 寫時拷貝 進程終止 進程退出碼 exit函數 _exit函數 return,exit _exit之間的區別和聯系 進程等待 進程等待的必要性 獲取子進程status 進程等待的方法 wait waipid 多子進程創建理解 非阻塞輪詢檢測子進程 進程程序替換 替…

RabbitMq--消息可靠性

12.消息可靠性 1.消息丟失的情況 生產者向消息代理傳遞消息的過程中,消息丟失了消息代理( RabbitMQ )把消息弄丟了消費者把消息弄丟了 那怎么保證消息的可靠性呢,我們可以從消息丟失的情況入手——從生產者、消息代理&#xff0…

Windows中在VSCode/Cursor上通過CMake或launch文件配置CUDA編程環境

前置步驟 安裝符合GPU型號的CUDA Toolkit 配置好 nvcc 環境變量 安裝 Visual Studio 參考https://blog.csdn.net/Cony_14/article/details/137510909 VSCode 安裝插件 Nsight Visual Studio Code Edition 注意:不是vscode-cudacpp。若兩個插件同時安裝,…

Spark(8)配置Hadoop集群環境-使用腳本命令實現集群文件同步

一.hadoop的運行模式 二.scp命令————基本使用 三.scp命令———拓展使用 四.rsync遠程同步 五.xsync腳本集群之間的同步 一.hadoop的運行模式 hadoop一共有如下三種運行方式: 1. 本地運行。數據存儲在linux本地,測試偶爾用一下。我們上一節課使用…

聚焦兩會:科技與發展并進,賽逸展2025成創新新舞臺

在十四屆全國人大三次會議和全國政協十四屆三次會議期間,代表委員們圍繞多個關鍵議題展開深入討論,為國家未來發展謀篇布局。其中,技術競爭加劇與經濟轉型需求成為兩會焦點,將在首都北京舉辦的2025第七屆亞洲消費電子技術貿易展&a…

【音視頻】ffmpeg命令提取像素格式

1、提取YUV數據 提取yuv數據,并保持分辨率與原視頻一致 使用-pix_fmt或-pixel_format指定yuv格式提取數據,并保持原來的分辨率 ffmpeg -i music.mp4 -t "01:00" -pixel_format yuv420p music.yuv提取成功后,可以使用ffplay指定y…

【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP)

【從零開始學習計算機科學】【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP) ILP流水線(pipeline)流水線調度循環展開和循環流水循環展開。循環展開的具體步驟可以描述為,軟件流水(循環流水)。我們可以通過流水線的思想處理循環的執行,即不需要這一次的…

android edittext 防止輸入多個小數點或負號

有些英文系統的輸入法,或者定制輸入法。使用xml限制不了輸入多個小數點和多個負號。所以代碼來控制。 一、通過XML設置限制 <EditTextandroid:id="@+id/editTextNumber"android:layout_width="wrap_content"android:layout_height="wrap_conten…

2019年藍橋杯第十屆CC++大學B組真題及代碼

目錄 1A&#xff1a;組隊&#xff08;填空5分_手算&#xff09; 2B&#xff1a;年號字符&#xff08;填空5分_進制&#xff09; 3C&#xff1a;數列求值&#xff08;填空10分_枚舉&#xff09; 4D&#xff1a;數的分解&#xff08;填空10分&#xff09; 5E&#xff1a;迷宮…

從C#中的MemberwiseClone()淺拷貝說起

MemberwiseClone() 是 C# 中的一個方法&#xff0c;用于創建當前對象的淺拷貝&#xff08;shallow copy&#xff09;。它屬于 System.Object 類&#xff0c;因此所有 C# 對象都可以調用該方法。 1. MemberwiseClone() 的含義 淺拷貝&#xff1a;MemberwiseClone() 會創建一個新…

筆記六:單鏈表鏈表介紹與模擬實現

在他一生中&#xff0c;從來沒有人能夠像你們這樣&#xff0c;以他的視角看待這個世界。 ---------《尋找天堂》 目錄 文章目錄 一、什么是鏈表&#xff1f; 二、為什么要使用鏈表&#xff1f; 三、 單鏈表介紹與使用 3.1 單鏈表 3.1.1 創建單鏈表節點 3.1.2 單鏈表的頭插、…

尚硅谷爬蟲note15n

1. 多條管道 多條管道開啟&#xff08;2步&#xff09;&#xff1a; (1)定義管道類 &#xff08;2&#xff09;在settings中開啟管道 在pipelines中&#xff1a; import urllib.request # 多條管道開啟 #(1)定義管道類 #&#xff08;2&#xff09;在setti…

oracle檢查字段為空

在Oracle數據庫中&#xff0c;檢查字段是否為空通常涉及到使用IS NULL條件。如果你想查詢某個表中的字段是否為空&#xff0c;你可以使用SELECT語句結合WHERE子句來實現。這里有一些基本示例來展示如何進行這樣的查詢。 示例1: 檢查單個字段是否為空 假設你有一個表employees…