LangChain 框架提供了一套靈活的工具和代理人機制,讓開發者能更有效地運用大語言模型 (LLM)。理解工具的抽象概念、如何自訂工具設定、以及如何選擇合適的代理人型別是構建高效應用程式的關鍵。本文除了介紹 LangChain 的核心概念,也提供實用的程式碼範例,例如使用 WikipediaQueryRun 工具查詢資訊,以及如何自訂工具設定以符合特定需求。此外,文章也詳細比較了不同代理人型別,例如 Zero-Shot-React 代理人、對話代理人、結構化工具代理人和 MRKL 代理人,並說明如何根據任務需求選擇最合適的代理人。透過理解這些核心概念和實務操作,開發者可以更有效率地運用 LangChain 框架構建更強大的應用程式。
工具和工具包
現在,讓我們快速地看一下工具和工具包。
工具
工具是代理、鏈條或大語言模型(LLM)用於與世界互動的介面。它們結合了幾個基本元素:
- 工具名稱:一個簡潔、描述性的標籤,告訴您工具的功能。
- 描述:一個簡短的工具目的和功能的解釋。
- JSON 結構:一個對工具輸入的結構化定義。可以把它當作使用工具的藍圖。
- 要呼叫的函式:實際執行工具動作的程式碼。
- 旗標:一個旗標,決定工具的輸出是否應該立即可見或進一步處理。
工具的名稱、描述和 JSON 結構幫助 LLM 瞭解如何指定所需的動作,而要呼叫的函式則是實際採取該動作的等價物。
工具抽象
在 LangChain 中,工具抽象由兩個關鍵元件組成:
- 工具的輸入結構:這是一個告訴 LLM 需要哪些引數來呼叫工具的藍圖。為了確保 LLM 知道要提供哪些輸入來呼叫工具,提供合理命名和描述良好的引數是至關重要的。
- 要執行的函式:這是實際在呼叫工具時執行的 Python 函式。它是根據提供的輸入執行所需動作的程式碼。
一件重要的事情需要記住的是,工具的輸入越簡單,LLM 越容易使用它。我建議您使用具有單個字串輸入的工具,因為代理與之配合良好。LangChain 檔案中有關於哪些代理型別可以處理更複雜輸入的檔案。請參閱「進一步閱讀」部分以取得檔案連結。
WikipediaQueryRun 工具
現在,讓我們使用 WikipediaQueryRun 工具,這是一個方便的 Wikipedia 包裝器:
!pip install langchain==0.2.5 langchain_openai==0.2.5 wikipedia
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
# 初始化工具以自定義組態
api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100)
tool = WikipediaQueryRun(api_wrapper=api_wrapper)
讓我們探索一些工具的屬性:
# 檢查預設名稱
print(tool.name) # 輸出:'Wikipedia'
# 檢查預設描述
print(tool.description) # 輸出:'Wikipedia 的包裝器。當您需要回答關於人、地點、公司、事實、歷史事件或其他主題的一般問題時很有用。輸入應該是一個搜尋查詢。'
# 檢查預設 JSON 結構
print(tool.args) # 輸出:{'query': {'title': '查詢', 'type': 'string'}}
# 檢查工具是否應直接傳回給使用者
print(tool.return_direct) # 輸出:False
讓我們嘗試搜尋有關 LangChain 本身的資訊:
# 使用字典輸入呼叫工具
print(tool.run({"query": "langchain"}))
內容解密:
在這個例子中,我們使用 WikipediaQueryRun 工具來搜尋有關 LangChain 的資訊。首先,我們初始化工具以自定義組態,然後檢查工具的屬性,包括預設名稱、描述、JSON 結構和是否直接傳回給使用者。最後,我們使用字典輸入呼叫工具,並列印預出結果。
圖表翻譯:
此圖示為 LangChain 工具的流程圖,展示了代理如何與工具互動。圖中包括代理選擇工具、工具執行和代理接收結果等步驟。
圖表翻譯:
此圖示為 LangChain 工具的序列圖,展示了代理與工具之間的互動過程。圖中包括代理傳送請求、工具執行和代理接收結果等步驟。
LangChain 框架簡介
LangChain 是一個設計用於簡化應用程式建立的框架。它提供了一系列工具和功能,讓開發者可以輕鬆地建立和定製自己的應用程式。
自訂工具設定
如果我們想要自訂工具的名稱、描述或 JSON 結構,可以建立一個自訂的 schema。例如,建立一個自訂的 Wikipedia 工具:
from langchain_core.pydantic_v1 import BaseModel, Field
class WikiInputs(BaseModel):
"""Wikipedia 工具的輸入引數"""
query: str = Field(description="Wikipedia 查詢字串,應該是 3 個或以下的單詞")
然後,建立一個新的工具例項,並傳入自訂的設定:
tool = WikipediaQueryRun(
name="wiki-tool",
description="在 Wikipedia 中查詢東西",
args_schema=WikiInputs,
api_wrapper=api_wrapper,
return_direct=True,
)
工具設定更新
更新工具設定後,可以檢查工具的屬性:
print(tool.name) # Output: 'wiki-tool'
print(tool.description) # Output: '在 Wikipedia 中查詢東西'
print(tool.args) # Output: {'query': {'title': '查詢字串', 'description': 'Wikipedia 查詢字串,應該是 3 個或以下的單詞', 'type': 'string'}}
print(tool.return_direct) # Output: True
工具使用
使用更新的工具設定,可以執行查詢:
print(tool.run("langchain"))
# Output: 'Page: LangChain\nSummary: LangChain 是一個設計用於簡化應用程式建立的框架'
LangChain 資源
LangChain 提供了豐富的資源來幫助您完成您的旅程:
- 內建工具:檢視官方檔案以獲得所有內建工具的全面列表。
- 自訂工具:雖然內建工具很方便,但您可能需要為您的特定使用案例定義自己的工具。LangChain 提供了一個,教您如何建立自訂工具。
- 工具包:工具包是設計用於共同工作的工具集合。檔案提供了對工具包的深入描述和所有內建工具包的列表。
- 工具作為 OpenAI 函式:LangChain 中的工具與 OpenAI 函式類別似,您可以輕鬆地將其轉換為該格式。檢視官方筆記本以瞭解如何執行此操作。
工具包
工具包是精心企劃的工具集合,旨在無縫地共同工作以完成特定任務。有時,完成任務需要一組相關工具共同工作,這就是工具包派上用場的地方。它們附帶了方便的載入方法,使您更容易開始使用所需的工具。例如,GitHub 工具包包含了搜尋 GitHub 問題、閱讀檔案、對問題進行評論等工具。LangChain 提供了一個全面性的預製工具包列表,您可以在檔案的「Integrations」部分找到它們。
首先,您需要初始化要使用的工具包。假設您正在使用 ExampleToolkit(目前只是一個佔位符):
toolkit = ExampleToolkit(...)
每個工具包都暴露了一個 get_tools 方法,傳回工具包中包含的工具列表。以下是您可以存取它們的方法:
tools = toolkit.get_tools()
這樣,您就可以使用工具包中的工具了。
建立智慧代理:LangChain 和 LangGraph 入門
在人工智慧和自然語言處理的領域中,建立智慧代理是一項具有挑戰性的工作。然而,LangChain 和 LangGraph 等工具使得這個過程變得更加容易。這篇文章將引導您瞭解如何使用 LangChain 和 LangGraph 建立智慧代理,並探討其應用和優點。
LangChain 介紹
LangChain 是一個強大的工具,允許您建立智慧代理並將其與各種工具和模型整合。它提供了一個簡單的 API,讓您可以輕鬆地建立和管理智慧代理。LangChain 的核心功能包括:
- 工具整合:LangChain 支援與多種工具和模型的整合,例如自然語言處理、資料處理和網頁抓取等。
- 代理建立:LangChain 提供了一個簡單的 API,讓您可以建立和管理智慧代理。
- 工作流程管理:LangChain 允許您建立和管理複雜的工作流程,讓您的智慧代理可以自動執行任務。
LangGraph 介紹
LangGraph 是 LangChain 的一個重要組成部分,它允許您建立圖形化的工作流程和代理。LangGraph 的核心功能包括:
- 圖形化工作流程:LangGraph 支援建立圖形化的工作流程,讓您可以輕鬆地管理複雜的任務和流程。
- 代理管理:LangGraph 提供了一個簡單的 API,讓您可以建立和管理智慧代理。
- 資料處理:LangGraph 支援與多種資料來源的整合,例如資料函式庫和檔案等。
建立智慧代理
要建立智慧代理,您需要先安裝 LangChain 和 LangGraph。然後,您可以使用 LangChain 的 API 建立智慧代理,並將其與 LangGraph 整合。以下是建立智慧代理的步驟:
- 安裝 LangChain 和 LangGraph:您可以使用 pip 安裝 LangChain 和 LangGraph。
pip install langchain==0.2.5 langchain_openai==0.1.8 langgraph==0.1.8
2. **匯入必要的模組**:您需要匯入 LangChain 和 LangGraph 的模組。
```python
from langchain_openai import OpenAI
from langchain.agents import Agent
from langchain.graph import LangGraph, Node
- 初始化語言模型:您需要初始化語言模型,並將其與 LangChain 整合。
llm = OpenAI(api_key="your_openai_api_key")
4. **建立 LangGraph**:您可以建立一個 LangGraph 來管理工作流程和代理。
```python
travel_graph = LangGraph()
- 定義節點:您需要定義節點來代表任務和資料。
node1 = Node(name="GreetUser", action=lambda: "Hello! How can I assist you with your travel plans today?") node2 = Node(name="GetDestination", action=lambda user_input: f"Great choice! {user_input} sounds like a fantastic destination.") node3 = Node(name="SuggestActivities", action=lambda: "Here are some activities you might enjoy: visiting museums, trying local cuisine, and exploring nature trails.")
6. **建立圖形**:您可以將節點連線起來,形成一個圖形化的工作流程。
```python
travel_graph.add_node(node1)
travel_graph.add_node(node2)
travel_graph.add_node(node3)
travel_graph.add_edge("GreetUser", "GetDestination")
travel_graph.add_edge("GetDestination", "SuggestActivities")
- 定義代理:您可以定義一個代理來使用圖形化的工作流程。
class TravelAgent(Agent): def **init**(self, llm, graph): super().**init**(llm, graph)
##### 內容解密:
以上步驟展示瞭如何使用 LangChain 和 LangGraph 建立智慧代理。首先,您需要安裝 LangChain 和 LangGraph,然後匯入必要的模組。接下來,您需要初始化語言模型,並將其與 LangChain 整合。然後,您可以建立一個 LangGraph 來管理工作流程和代理。定義節點和建立圖形是接下來的步驟。最後,您可以定義一個代理來使用圖形化的工作流程。
#### 圖表翻譯:
以下是使用 Plantuml 語法繪製的圖表,展示瞭如何使用 LangChain 和 LangGraph 建立智慧代理:
`
這個圖表展示了建立智慧代理的步驟,從安裝 LangChain 和 LangGraph 到定義代理。每個步驟都對應到上述的程式碼片段,展示瞭如何使用 LangChain 和 LangGraph 建立智慧代理。
## 瞭解 LangChain Agent 的世界
LangChain Agent 是一種強大的工具,能夠幫助您管理複雜的任務和工作流程。它們透過使用圖表結構來組織步驟,確保您的代理按照邏輯順序執行任務。
### Agent 的運作方式
讓我們來看一個簡單的例子。假設我們有一個旅行代理,需要根據使用者的輸入提供建議。
```python
class TravelAgent:
def __init__(self, llm, graph):
super().__init__(llm=llm)
self.graph = graph
def run(self, user_input):
# 從第一個節點開始處理圖表
current_node = self.graph.get_node("GreetUser")
response = current_node.action()
print(response)
current_node = self.graph.get_node("GetDestination")
response = current_node.action(user_input)
print(response)
current_node = self.graph.get_node("SuggestActivities")
response = current_node.action()
print(response)
# 建立代理
agent = TravelAgent(llm=llm, graph=travel_graph)
# 測試代理
agent.run("Hawaii")
```
在這個例子中,代理首先問候使用者,然後詢問目的地,最後根據目的地提供建議。
### Agent 的型別
LangChain 提供了多種代理型別,每種型別都有其自己的特點和能力。您可以根據您的具體需求和所使用的模型來選擇合適的代理型別。
#### 選擇代理型別的標準
選擇代理型別時,需要考慮以下幾個因素:
- **模型型別**:有些代理是為聊天模型設計的,而其他代理則是為語言模型(LLM)設計的。聊天模型通常需要維護對話歷史,而語言模型則不需要。
- **聊天歷史支援**:有些代理可以處理聊天歷史,這使得它們非常適合聊天機器人應用。其他代理則不支援聊天歷史,適合於單次任務或一次性互動。
- **多輸入工具**:有些代理可以處理需要多個輸入的工具,而其他代理則只能處理單輸入工具。如果您正在使用需要多個引數的複雜工具,請確保選擇支援多輸入工具的代理型別。
- **平行函式呼叫**:平行函式呼叫是一個強大的功能,允許代理同時呼叫多個工具以加速某些任務的執行。然而,這個功能對於 LLM 來說可能更具挑戰性,因此並非所有代理型別都支援它。
- **模型引數**:有些代理型別需要特定的模型引數。例如,某些代理使用 OpenAI 的函式呼叫功能,這需要額外的模型引數。如果代理型別不需要任何模型引數,那麼一切都透過提示來處理。
#### LangChain 代理型別
LangChain 提供了多種代理型別,每種型別都有其自己的優缺點。瞭解每種型別的特點可以幫助您選擇最適合您的需求的代理型別。
```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title LangChain 工具與代理人實戰
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml
```
#### 圖表翻譯:
此圖表展示了選擇 LangChain 代理型別的流程。首先,需要考慮模型型別,然後是聊天歷史支援、多輸入工具、平行函式呼叫和模型引數等因素。根據這些因素,可以選擇最適合您的需求的代理型別。
## LangChain 代理人簡介
LangChain 提供多種代理人(Agent)以滿足不同應用需求。這些代理人可以根據特定任務或工具動態生成回應。以下是 LangChain 中可用的代理人型別:
1. **Zero-Shot-React 代理人**:此代理人能夠在沒有任何先前訓練或微調的情況下處理廣泛的任務。它可以根據給定的查詢動態生成回應,並能夠適應任何情況。
2. **對話代理人**:此代理人適用於對話式 AI 應用,例如聊天機器人或虛擬助手。它可以進行回合式對話,維護上下文,並根據對話歷史提供相關回應。
3. **結構化工具代理人**:當您有一套特定的工具或操作需要以結構化的方式使用時,可以使用此代理人。它可以定義一系列預先確定的操作和工具,以指導代理人的行為。
4. **MRKL 代理人**:MRKL 代理人是一種強大的代理人,使用搜尋演算法和邏輯迴歸來排名和選擇最相關的工具以回應給定的查詢。
### Zero-Shot-React 代理人示例
Zero-Shot-React 代理人是一種靈活且適應性強的代理人,使用大語言模型(LLM)根據工具的描述和使用者輸入動態決定使用哪個工具。以下是使用此代理人的示例:
```python
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI
# 載入必要的工具
tools = load_tools(["serpapi", "llm-math"], llm=OpenAI(temperature=0))
# 初始化 Zero-Shot-React 代理人
agent = initialize_agent(tools, OpenAI(temperature=0), agent="zero-shot-react-description", verbose=True)
# 執行代理人以查詢
query = "法國的首都是什麼?該城市的人口是多少?"
response = agent.run(query)
print(response)
```
在此示例中,我們載入必要的工具(serpapi 和 llm-math),初始化 Zero-Shot-React 代理人,並提供一個查詢給代理人。代理人然後根據查詢生成一個回應。
### 結構化工具代理人的優點
結構化工具代理人的主要優點在於它可以定義一系列預先確定的操作和工具,以指導代理人的行為。這使得代理人可以在複雜任務中更有效地工作。
### MRKL 代理人的優點
MRKL 代理人的主要優點在於它使用搜尋演算法和邏輯迴歸來排名和選擇最相關的工具以回應給定的查詢。這使得代理人可以更好地適應不同情況,並提供更準確的回應。
### 玄貓的建議
玄貓建議使用 Zero-Shot-React 代理人或 MRKL 代理人,根據具體需求選擇最合適的代理人。同時,需要注意代理人的限制和優點,以便更好地使用 LangChain 代理人。
從技術架構視角來看,LangChain 的工具和代理機制為開發者提供了一個構建複雜應用程式的強大框架。本文深入剖析了工具的組成、工具抽象的關鍵元件、`WikipediaQueryRun` 工具的例項應用,以及如何自定義工具設定。透過對 LangGraph 的介紹,更進一步闡述瞭如何建立圖形化工作流程和代理,並以旅行代理為例,展示了代理的運作方式和不同代理型別的選擇標準。分析不同代理型別的特性,例如 Zero-Shot-React、對話代理人、結構化工具代理人和 MRKL 代理人,可以幫助開發者根據實際應用場景做出最佳選擇。LangChain 的工具包機制則提供了預先組態好的工具組合,簡化了特定任務的開發流程。然而,代理的效能高度依賴於底層 LLM 的理解能力和工具本身的功能,這也限制了其在某些特定領域的應用。展望未來,隨著 LLM 技術的持續發展和更多功能強大工具的加入,LangChain 代理的應用範圍將會進一步擴充套件,並在更複雜的任務中發揮更大的作用。玄貓認為,掌握 LangChain 的核心概念和使用方法,將有助於開發者構建更具智慧和效率的應用程式,並在快速發展的 AI 領域保持競爭力。