天天看點

LangChain Agents深入剖析及源碼解密上

作者:矽谷ChatGPT和LLM中心

Agent工作原理詳解

本節會結合AutoGPT的案例,講解LangChain代理(Agent)為核心的内容。我們前面已經談了代理本身的很多内容,也看了絕大部分的源代碼,例如:ReAct的源代碼,還有mrkl的源代碼,如圖12-1所示。

LangChain Agents深入剖析及源碼解密上

圖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。

  1. import os
  2. import shopify
  3. import pandas as pd
  4. from dotenv import load_dotenv,find_dotenv
  5. 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"清單中。這個過程一直持續,直到沒有更多的資料頁面需要檢索。然後,函數傳回完整的檢索到的資料清單。這都是基本資訊的提取,本身也不會有什麼特殊的地方。

  1. #從Shopify的REST API中提取資料的函數
  2. def get_data(object_name):
  3. api_session = shopify.Session(os.getenv('MERCHANT'),'2023-04',os.getenv('SHOPIFY_TOKEN'))
  4. shopify.ShopifyResource.activate_session(api_session)
  5. all_data=[]
  6. attribute=getattr(shopify,object_name)
  7. data=attribute.find(since_id=0, limit=250)
  8. for d in data:
  9. all_data.append(d)
  10. while data.has_next_page():
  11. data=data.next_page()
  12. for d in data:
  13. all_data.append(d)
  14. return all_data
  15. # Example: getting order data with the function
  16. order_data=get_data('Order')

關鍵是看LangChain的部分,這邊有StructuredTool,也有ChatOpenAI,我們使用GPT-4模型,設定溫度(temperature)參數是0.2,有一定的随機性,但随機性并不高。Gavin大咖微信:NLP_Matrix_Space

  1. # 導入基于GPT-4建立代理所需的StructuredTool和ChatOpenAI
  2. from langchain.tools.base import StructuredTool
  3. from langchain.chat_models import ChatOpenAI
  4. 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。

  1. # 将get_data函數轉換為一個接收文本并傳回文本的新函數,
  2. # 并從新函數中建立一個工具
  3. from typing import Optional
  4. def get_shopify_insight(
  5. shopify_object: Optional[str] = None
  6. ) -> str:
  7. """統計給定Shopify資料對象的項目數的工具。有效的shopify_objects包括“Customer”、“Order”、“Product”和“Webhook”."""
  8. object_name=(shopify_object or "Order")
  9. data= get_data(object_name)
  10. return str(len(data))
  11. shopify_insights_tool = StructuredTool.from_function(get_shopify_insight)

有了shopify_insights_tool工具之後,傳入參數“Customer”,目的是調用該工具并計算作為字元串傳回的項。

  1. #現在可以調用該工具并計算作為字元串傳回的項
  2. shopify_insights_tool('Customer')

以下代碼使用了一個initialize_agent()函數,用于初始化一個代理鍊。代理鍊将一系列工具和一個聊天接口打包在一起,以便與使用者進行互動。第一個參數是工具,包含一個shopify_insights_tool,用于擷取Shopify資料對象中的資料數量。 第二個參數是模型,第三個參數是AgentType,這裡面有很多類型,這邊是STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,第四個參數是verbose,指定為True,以便在控制台列印更多詳細資訊。

  1. # 基于工具和聊天模型建立代理
  2. from langchain.agents import initialize_agent, AgentType
  3. tools = [shopify_insights_tool]
  4. agent_chain = initialize_agent(tools,
  5. chat, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
  6. verbose=True)
  7. # 運作代理
  8. agent_chain("Count the number of orders in the Shopify store")

這是一個非常好的例子,既能讓我們感受到代理的具體工作,從應用的角度講,又可以感受到 ReAct的内容。ReAct核心強調的是推理過程和行為過程之間的互動作用,Mrkl強調的是如何通過環境與環境的互動,帶來對模型性能的一種影響,這是一個非常好的架構。“統計Shopify商店中的訂單數量”的案例代碼,雖然它看上去是一個非常簡潔的代碼,跟shopify進行互動,但在這裡面已經使用了ReAct的方式,同時也使用了第三方工具,以及模型本身,這是我們看見對它的基本使用。

繼續閱讀