AI菜鳥向前飛 — LangChain系列之十四 - Agent系列:從現象看機制(上篇)

上一篇介紹了Agent與LangGraph的基礎技能Tool的必知必會

AI菜鳥向前飛 — LangChain系列之十三 - 關于Tool的必知必會

前面已經詳細介紹了Promp、RAG,終于來到Agent系列(別急后面還有LangGraph),大家可以先看下這張圖:? ??看完我這系列就都懂了:)

圖片

牛刀初試

????由于本篇是入門,我們直接邊看程序邊熟悉整個過程吧 先以BaseTool的方式實現一個Tool,代碼如下:

class search_article(BaseTool):name = "search_article"description = "查詢所有的文章來源"def _run(self, topic: str):return chain_rag.invoke({"question": topic})

關于chain_rag的內容,請參考我的這篇公眾號文章

LangChain實戰技巧之二:RunnablePassthrough.assign的兩則妙用

我們看看兩種Agent的“書寫”方式

  • 第一種

agent = (RunnablePassthrough.assign(agent_scratchpad=lambda x: format_to_tool_messages(x["intermediate_steps"]))| hub.pull("hwchase17/openai-tools-agent")| model.bind_tools(tools=[search_article()])| ToolsAgentOutputParser()
)
  • 第二種

agent = create_tool_calling_agent(prompt=hub.pull("hwchase17/openai-tools-agent"), llm=model, tools=[search_article()])

你喜歡哪種呢?

接下來你是不是想執行看看效果,結果會讓你大跌眼鏡、你沒有眼鏡的話配一個 先~

res = agent.invoke({"input": "AI菜鳥向前飛系列文章出自哪里?", "intermediate_steps": []})

這里為什么要加這個"intermediate_steps",不加會報錯,不信你試試,若要知道這個機制請看下篇:)

輸出結果

# 輸出了這樣一坨
[ToolAgentAction(tool='search_article', tool_input={'topic': 'AI菜鳥向前飛'}, log="\nInvoking: `search_article` with `{'topic': 'AI菜鳥向前飛'}`\n\n\n", message_log=[AIMessage(content='', additional_kwargs={'documents': None, 'citations': None, 'search_results': None, 'search_queries': None, 'is_search_required': None, 'generation_id': 'd12bfa56-e394-48a0-bff1-97f76dabe92f', 'tool_calls': [{'id': '5617aa7b3ed74d1789befac4b6a9d573', 'function': {'name': 'search_article', 'arguments': '{"topic": "AI\\u83dc\\u9e1f\\u5411\\u524d\\u98de"}'}, 'type': 'function'}], 'token_count': {'output_tokens': 12}}, response_metadata={'documents': None, 'citations': None, 'search_results': None, 'search_queries': None, 'is_search_required': None, 'generation_id': 'd12bfa56-e394-48a0-bff1-97f76dabe92f', 'tool_calls': [{'id': '5617aa7b3ed74d1789befac4b6a9d573', 'function': {'name': 'search_article', 'arguments': '{"topic": "AI\\u83dc\\u9e1f\\u5411\\u524d\\u98de"}'}, 'type': 'function'}], 'token_count': {'output_tokens': 12}}, id='run-592cded4-3fb7-48d3-99d7-87166d7bb232-0', tool_calls=[{'name': 'search_article', 'args': {'topic': 'AI菜鳥向前飛'}, 'id': '092624d480bd461daacc54fdda64c7b5'}])], tool_call_id='092624d480bd461daacc54fdda64c7b5')]

直截了當看結果

????通常的教法,應該是你需要引入AgentExecutor,而如果我也是這樣跟大家介紹的話,就不是我這個系列的風格了:)

????如果用AgentExecutor的話,代碼如下:

agent_executor = AgentExecutor(agent=agent, tools=[search_article()], verbose=True)
# 然后再invoke就能得到你想要的
agent_executor.invoke("AI菜鳥向前飛系列文章出自哪里?")

????直截了當

{'input': 'AI菜鳥向前飛系列文章出自哪里?', 'output': 'AI菜鳥向前飛系列文章出自Song榆錢兒的公眾號。'}

(換個方式)直奔Agent

????但是跑題了,我們主要講的是Agent,而不是AgentExecutor,也就是說如果僅用Agent呢?

????看到輸出內容

[ToolAgentAction(tool='search_article', tool_input={'topic': 'AI菜鳥向前飛'}, ……

????聰明的小伙伴可以用Python去解決問題,如下:

# 為啥這里要用這個,因為它是列表啊,為啥是列表,以后再介紹
for each in res:result = {"search_article": search_article()}[each.tool].invoke(each.tool_input)print(result)

????最后它確實被執行,結果如下:

content='AI菜鳥向前飛系列文章是出自公眾號"Song榆錢兒"的原創作品。截至目前,該系列已經有20多篇原創文章,并且擁有109名關注者。' additional_kwargs={'documents': None, 'citations': None, 'search_results': None, 'search_queries': None, 'is_search_required': None, 'generation_id': 'f12940a2-38de-4bba-a7b0-254f40c90596', 'token_count': {'input_tokens': 156, 'output_tokens': 44}} response_metadata={'documents': None, 'citations': None, 'search_results': None, 'search_queries': None, 'is_search_required': None, 'generation_id': 'f12940a2-38de-4bba-a7b0-254f40c90596', 'token_count': {'input_tokens': 156, 'output_tokens': 44}} id='run-f7cc290b-34f8-4eca-bcfa-85c3bcf2b74e-0'

也就是都是RAG的“功勞”,上面代碼提到的:

………………
return chain_rag.invoke({"question": topic})

柳暗花明

????各位看官會想,這跟我單獨執行Tool函數有啥區別,繞了一個大圈子,這秘密就存在于"intermediate_steps"當中(賣個關子,后面介紹)先看如下代碼:

intermediate_steps = []
while not isinstance(res := agent.invoke({"input": "AI菜鳥向前飛系列文章出自哪里?", "intermediate_steps": intermediate_steps}), AgentFinish):for each in res:func_ret = {"search_article": search_article()}[each.tool].invoke(each.tool_input)intermediate_steps.append((each, func_ret.content))

????是不是感覺跟用AgentExecutor一樣了:)

簡述ReAct

????最后分享一個聊到Agent 大部分博文都會提到的ReAct (Reason Act),以一個示例來演示下吧,各處重要內容,我都加上了注釋來為大家解釋:)

> Entering new AgentExecutor chain...
# 思考
Thought: I can answer this question by searching for the source of the "AI菜鳥向前飛" series.# 行動
Action: search_article
Action Input: AI菜鳥向前飛# 觀察
Observation content='AI菜鳥向前飛系列文章是出自Song榆錢兒的公眾號。該系列文章目前已經有20多篇原創文章,并且已有109人關注。' additional_kwargs={'documents': None, 'citations': None, 'search_results': None, 'search_queries': None, 'is_search_required': None, 'generation_id': 'e07bf920-967a-4269-bae0-6acd4358a90f', 'token_count': {'input_tokens': 158, 'output_tokens': 38}} response_metadata={'documents': None, 'citations': None, 'search_results': None, 'search_queries': None, 'is_search_required': None, 'generation_id': 'e07bf920-967a-4269-bae0-6acd4358a90f', 'token_count': {'input_tokens': 158, 'output_tokens': 38}} id='run-efd02271-a86f-4dee-bd0e-0e9133efd7b7-0'
# 找到正解
Final Answer: AI菜鳥向前飛系列文章出自Song榆錢兒的公眾號。該系列文章目前已經有20多篇原創文章,并且已有109人關注。> Finished chain.
{'input': 'AI菜鳥向前飛系列文章出自哪里?', 'output': 'AI菜鳥向前飛系列文章出自Song榆錢兒的公眾號。該系列文章目前已經有20多篇原創文章,并且已有109人關注。'}

原理過程圖:關于這張圖,后面若大家有需要我再詳細深入講解

圖片

敬請期待下一篇:)

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

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

相關文章

leetcode328. 奇偶鏈表,附詳細解析和代碼注釋

leetcode328. 奇偶鏈表 給定單鏈表的頭節點 head ,將所有索引為奇數的節點和索引為偶數的節點分別組合在一起,然后返回重新排序的列表。 第一個節點的索引被認為是 奇數 , 第二個節點的索引為 偶數 ,以此類推。 請注意&#xff0…

Java的反射機制詳解:動態操作類和對象

Java反射是一種強大的機制,允許程序在運行時查詢和操作類、方法、接口等。這種能力使得Java應用可以在運行時動態地創建對象、調用方法和訪問屬性,極大地提升了程序的靈活性和可擴展性。本文將深入探討Java反射的原理、核心API和實際應用場景&#xff0c…

Flutter 中的 CupertinoSlidingSegmentedControl 小部件:全面指南

Flutter 中的 CupertinoSlidingSegmentedControl 小部件:全面指南 在Flutter框架中,CupertinoSlidingSegmentedControl是一個用于創建類似iOS風格的滑動分段控制器的小部件。這種控制器通常用于允許用戶在不同的視圖或設置之間切換。本文將為您提供一個…

輕量級 K8S 環境 安裝minikube

文章目錄 操作系統DockerDocker CE 鏡像源站使用官方安裝腳本自動安裝 (僅適用于公網環境)安裝校驗Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard參考資料 操作系統 …

Docker進入容器查看內容并從容器里拷貝文件到宿主機

工作中需要從docker正在運行的鏡像中復制文件到宿主機,于是便將這個過程記錄了下來。 (1)查看正在運行的容器 通過以下命令,可以查看正在運行的容器: docker ps (2)進入某個容器執行腳本 我…

前端人員選擇組件封裝

功能&#xff1a; 人員選擇&#xff0c;返回人員參數&#xff0c;以及人員參數id數組支持單選&#xff0c;多選人員支持重新選擇回顯上次選中人員 <!-- 彈窗 --><a-modal v-model"modalVisible" :footer"null" :bodyStyle"{ padding: 0 }&q…

react中子傳父信息

思路是&#xff1a; 在父組件定義一個函數接受參數&#xff0c;接收的參數用于接收子組件的信息&#xff0c;把函數傳給子組件&#xff0c;子組件調用父親傳來的函數并把要告訴父親的話傳到函數中&#xff0c;就實現了子傳父消息 import { useState } from reactimport { use…

OpenWrt 安裝Quagga 支持ospf Bgp等動態路由協議 軟路由實測 系列四

1 Quagga 是一個路由軟件套件, 提供 OSPFv2,OSPFv3,RIP v1 和 v2,RIPng 和 BGP-4 的實現. 2 web 登錄安裝 #或者ssh登錄安裝 opkg install quagga quagga-zebra quagga-bgpd quagga-watchquagga quagga-vtysh # reboot 3 ssh 登錄 #重啟服務 /etc/init.d/quagga restart #…

使用kubesphere部署微服務的時候,節點的鏡像不是最新的導致部署到舊版本問題

我使用kubesphere部署微服務的時候&#xff0c;發現有很多次&#xff0c;我修改了配置文件&#xff0c;但是部署完才發現部署的是舊版本。 然后我查看了該微服務部署在哪個節點上&#xff1a; kubectl get pods --all-namespaces -o wide例如 gulimall-gateway 這個服務&…

韭菜的自我總結

韭菜的自我總結 股市技術面量價關系左側右側右側技術左側技術洗盤 韭菜的自我修養虛擬貨幣的啟示韭菜的買入時機韭菜的心理壓力成為優秀玩家的關鍵 股市技術面 技術面分析可以作為買賣時機判定的工具&#xff0c;但是投資還是需要基本面的分析作為支撐。也就是基本面選股&…

langchain進階一:特殊的chain,輕松實現對話,與數據庫操作,抽取數據,以及基于本地知識庫的問答

特殊的chain langchain中的Chain有很多,能夠輕松實現部分需求,極致簡化代碼,但是實現效果與模型智慧程度有關 會話鏈 效果與LLMChain大致相同 javascript 復制代碼 from langchain.chains import ConversationChain from langchain_community.llms import OpenAI conversat…

Spring Boot中如何實現定時任務?

在項目開發中&#xff0c;經常需要編寫定時任務來實現一些功能&#xff1a; 定時備份數據庫、定時發送郵件、定時清理數據、定時提醒或通知、信用卡每月還款提醒 未支付的訂單15分鐘之后自動取消、未確認收貨的訂單7天之后自動確認收貨 定時任務的實現&#xff1a; Spring T…

Redis 實戰 - 緩存異常及解決方案

文章目錄 概述一、緩存穿透1.1 緩存穿透是什么1.2 解決方案 二、緩存擊穿2.1 緩存擊穿是什么2.2 解決方案 三、緩存雪崩3.1 緩存雪崩是什么3.2 解決方案 四、拓展4.1 緩存預熱4.2 緩存降級 五、結語 把今天最好的表現當作明天最新的起點……&#xff0e;&#xff5e; 概述 在實…

YoloV8改進策略:Neck層改進、注意力改進|HCANet全局與局部的注意力模塊CAFM|二次創新|即插即用

yolov9-c summary: 620 layers, 52330674 parameters, 0 gradients, 245.5 GFLOPsClass Images Instances P R mAP50 mAP50-95: 100%|██████████| 15/15 00:06all 230 1412 0.917 0.985 0.99 0.735…

實現自動化巡檢多臺交換機并將輸出信息保存到文本文件中

為了實現自動化巡檢多臺交換機并將輸出信息保存到文本文件中,可以擴展之前的 SSHInspectionTool 類,使其能夠處理多臺交換機的連接和命令執行。我們可以使用多線程來并行處理多個 SSH 連接,以提高效率。 目錄 一、導入依賴包 二、編寫Java類 (1)SSH.java (2)SSHIns…

LeetCode 第131場雙周賽個人題解

100309. 求出出現兩次數字的 XOR 值 原題鏈接 求出出現兩次數字的 XOR 值 - 力扣 (LeetCode) 競賽 思路分析 簽到題&#xff0c;一次遍歷 AC代碼 class Solution:def duplicateNumbersXOR(self, nums: List[int]) -> int:cnt Counter(nums)res 0st set(nums)for x …

Python基礎學習筆記(七)——元組

目錄 一、一維元組的介紹、創建與修改二、組合的基本操作1. 遍歷2. 取長度3. 取最值4. 打包5. 批處理5.1 map()函數5.2 lambda 表達式5.3 lambda 表達式 map()函數 一、一維元組的介紹、創建與修改 元組&#xff08;tuple&#xff09;&#xff0c;一種不可變、有序、可重復的數…

SpringBoot如何開啟注解的形式,使用Redis Cache

Spring Cache 是一個框架&#xff0c;實現了基于注解的緩存功能&#xff0c;只需要簡單的添加注解&#xff0c;就能實現緩存功能。 Spring Cache 提供了一層抽象&#xff0c;底層可以切換不同的緩存實現&#xff0c;例如&#xff1a;Redis、EHCache、Caffeine等 步驟&#xf…

【大模型】Spring AI對接ChatGpt使用詳解

目錄 一、前言 二、spring ai介紹 2.1 什么是Spring AI 2.2 Spring AI 特點 2.3 Spring AI 為開發帶來的便利 2.4 Spring AI應用領域 2.4.1 聊天模型 2.4.2 文本到圖像模型 2.4.3 音頻轉文本 2.4.4 嵌入大模型使用 2.4.5 矢量數據庫支持 2.4.6 用于數據工程ETL框架 …

2024-05-22 VS2022使用modules

點擊 <C 語言編程核心突破> 快速C語言入門 VS2022使用modules 前言一、準備二、使用其一, 用VS installer 安裝模塊:第二個選項就是, 與你的代碼一同編譯std模塊, 這個非常簡單, 但是也有坑. 總結 前言 要解決問題: 使用VS2022開啟modules. 想到的思路: 跟著官方文檔整…