Agent工作原理詳解
本節會結合AutoGPT的案例,講解LangChain代理(Agent)為核心的内容。我們前面已經談了代理本身的很多内容,也看了絕大部分的源代碼,例如:ReAct的源代碼,還有mrkl的源代碼,如圖12-1所示。
圖12- 1 LangChain的代理實作代碼
本節會從LangChain 代理的一個基礎案例開始,然後會結合AutoGPT的案例,在這兩個案例的基礎上,轉過來去看源碼,這樣大家既有案例的代碼,又有LangChain的架構源碼,大家對LangChain 的代理以及典型的實作,會有更進一步的掌握。本節談到AutoGPT,是從應用或者使用它的角度去談的,它内部會幫你處理掉很多關于提示詞的一些内容,它的名字很有意思,叫AutoGPT。 使用AutoGPT的時候,例如,我們可以問AutoGPT:“write a weather report for Sdyney today”(“寫一份關于今天悉尼的天氣報告”),或者可以問:“Recommend 5 best books to read in Python”(“推薦5本最好的Python書籍”)。從案例的角度,問天氣報告的時候,在weather_report_sydney.txt檔案中給出了非常詳細的報告資訊(2023年6月21日舊金山天氣預報:溫度:最高68°F,最低55°F,降水量:0,濕度:78%,風速:每小時10英裡,總的來說,今天的舊金山天氣很好,氣溫很低,沒有降水。)
Gavin大咖微信:NLP_Matrix_Space
weather_report_sydney.txt的日志檔案:
Weather Report for San Francisco on June 21, 2023:
Temperature: High 68°F, Law 55°F
Precipitation: 0 in.
Hunidity: 78%
Wind: 10 nph
0verall, it will be a pleasant day in San Francisco with fild temperatures and no precipitation.
這樣一種總體的描述以及産出的資訊,顯然是通過大語言模型的自然語言處理的,具體的資訊肯定是代理調用工具來産生的,隻是初步讓大家看一下結果,讓大家感受一下AutoGPT的能力,它會自動的幫你處理掉内部的很多東西。
在“推薦5本最好的Python書籍”的案例中,在recommended_books.txt檔案中給出了推薦圖書的内容。
recommended_books.txt的檔案内容:
Speech and Language Processing
Natural Language Understanding
Handbook af Natural Language Processing
Foundations of Statistical Natural Language Processing
Neural Network Methods for Natural Language Processing
AutoGPT是NLP業界或者大模型領域一個最火爆的網紅項目,LangChain實作了AutoGPT,這是AutoGPT問代理的時候,它給我們的回複,我們現在先不進入内部,因為這個是在代理的基礎上進一步實作的,我們先從一種最原生、最簡單的角度,來看一下代理的一些基本代碼。LangChain一個很核心的理念,就是它掌握了三個次元的内容,第一個是模型(Model)、第二個是資料(Data),第三個是工具(Tools),其中資料和工具可以籠統的認為是環境(Environment)層面的東西,由代理控制這三者。Gavin大咖微信:NLP_Matrix_Space
以下是一個“統計Shopify商店中的訂單數量”的案例,Shopify作為一個全球知名的電子商務平台,它擁有成千上萬的商家和數量龐大的商品資訊。首先,導入shopify等相關的庫。如果你對shopify感興趣,可以去看一下相關内容,也可以使用其他任意的工具,這裡的重點是如何具體使用代理,從應用的角度講,我們是談AutoGPT。
- import os
- import shopify
- import pandas as pd
- from dotenv import load_dotenv,find_dotenv
- load_dotenv(find_dotenv())
以下代碼定義一個get_data函數,通過調用Shopify API,根據指定的對象名稱擷取資料。首先建立一個與Shopify API的會話,并激活該會話。然後,初始化一個空清單以存儲擷取到的資料。函數使用Python内置函數"getattr()"來擷取由"object_name"參數指定的Shopify對象的屬性。接着,使用"find()"方法檢索第一批資料,該方法使用"since_id"參數為0和"limit"參數為250。檢索到的資料被添加到"all_data"清單中,然後使用"has_next_page()"方法檢查是否還有更多的資料頁面需要檢索。如果有更多的頁面,函數使用"next_page()"方法檢索下一頁資料,并将檢索到的資料添加到"all_data"清單中。這個過程一直持續,直到沒有更多的資料頁面需要檢索。然後,函數傳回完整的檢索到的資料清單。這都是基本資訊的提取,本身也不會有什麼特殊的地方。
- #從Shopify的REST API中提取資料的函數
- def get_data(object_name):
- api_session = shopify.Session(os.getenv('MERCHANT'),'2023-04',os.getenv('SHOPIFY_TOKEN'))
- shopify.ShopifyResource.activate_session(api_session)
- all_data=[]
- attribute=getattr(shopify,object_name)
- data=attribute.find(since_id=0, limit=250)
- for d in data:
- all_data.append(d)
- while data.has_next_page():
- data=data.next_page()
- for d in data:
- all_data.append(d)
- return all_data
- # Example: getting order data with the function
- order_data=get_data('Order')
關鍵是看LangChain的部分,這邊有StructuredTool,也有ChatOpenAI,我們使用GPT-4模型,設定溫度(temperature)參數是0.2,有一定的随機性,但随機性并不高。Gavin大咖微信:NLP_Matrix_Space
- # 導入基于GPT-4建立代理所需的StructuredTool和ChatOpenAI
- from langchain.tools.base import StructuredTool
- from langchain.chat_models import ChatOpenAI
- chat = ChatOpenAI(model_name="gpt-4",temperature=0.2)
然後,定義一個get_shopify_insight函數,可以簡單的認為它是一個跟商品或者購物相關的API,用于擷取Shopify資料對象中的資料數量,并傳回該數量的字元串形式。該函數接受一個可選的字元串參數"shopify_object",指定要檢索的Shopify資料對象的名稱,例如"Customer"、"Order"、"Product"和"Webhook"。如果未指定該參數,則預設為"Order"。函數使用一個名為"get_data()"的子函數來檢索指定資料對象的資料。随後,傳回資料清單的長度,以字元串形式表示。然後我們會把這個内容交給LangChain 提供的StructuredTool.from_function。
- # 将get_data函數轉換為一個接收文本并傳回文本的新函數,
- # 并從新函數中建立一個工具
- from typing import Optional
- def get_shopify_insight(
- shopify_object: Optional[str] = None
- ) -> str:
- """統計給定Shopify資料對象的項目數的工具。有效的shopify_objects包括“Customer”、“Order”、“Product”和“Webhook”."""
- object_name=(shopify_object or "Order")
- data= get_data(object_name)
- return str(len(data))
- shopify_insights_tool = StructuredTool.from_function(get_shopify_insight)
有了shopify_insights_tool工具之後,傳入參數“Customer”,目的是調用該工具并計算作為字元串傳回的項。
- #現在可以調用該工具并計算作為字元串傳回的項
- shopify_insights_tool('Customer')
以下代碼使用了一個initialize_agent()函數,用于初始化一個代理鍊。代理鍊将一系列工具和一個聊天接口打包在一起,以便與使用者進行互動。第一個參數是工具,包含一個shopify_insights_tool,用于擷取Shopify資料對象中的資料數量。 第二個參數是模型,第三個參數是AgentType,這裡面有很多類型,這邊是STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,第四個參數是verbose,指定為True,以便在控制台列印更多詳細資訊。
- # 基于工具和聊天模型建立代理
- from langchain.agents import initialize_agent, AgentType
- tools = [shopify_insights_tool]
- agent_chain = initialize_agent(tools,
- chat, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
- verbose=True)
- # 運作代理
- agent_chain("Count the number of orders in the Shopify store")
這是一個非常好的例子,既能讓我們感受到代理的具體工作,從應用的角度講,又可以感受到 ReAct的内容。ReAct核心強調的是推理過程和行為過程之間的互動作用,Mrkl強調的是如何通過環境與環境的互動,帶來對模型性能的一種影響,這是一個非常好的架構。“統計Shopify商店中的訂單數量”的案例代碼,雖然它看上去是一個非常簡潔的代碼,跟shopify進行互動,但在這裡面已經使用了ReAct的方式,同時也使用了第三方工具,以及模型本身,這是我們看見對它的基本使用。