LangChain 框架允許開發者透過整合外部工具擴充套件大語言模型 (LLM) 的能力,使其能執行更複雜的任務。本文將會介紹如何使用 LangChain 建立自定義工具,並利用 ReAct 和 OpenAI 函式等進階技巧建構自主代理,同時探討不同代理型別的比較與選擇,以及如何透過整合多樣化工具和框架提升代理的效能和靈活性。理解這些核心概念有助於開發者更好地運用 LangChain 構建更強大的 AI 應用。
LangChain 代理工具使用與自定義工具建立
LangChain 提供了一種強大的方式來擴充套件大語言模型(LLM)的功能,透過整合各種工具來執行特定的任務。本文將探討 LangChain 代理工具的使用、自定義工具的建立,以及相關的最佳實踐。
為什麼需要工具?
大語言模型如 GPT-4 主要侷限於生成文字。為了擴充套件其功能,需要提供能夠執行其他操作的工具,例如與資料函式庫互動或讀寫檔案。這些工具使 LLM 能夠執行更複雜的任務。
使用 LangChain 工具
LangChain 提供了三種不同的工具使用方法:
- 建立自定義工具:開發者可以根據特定需求建立自己的工具。
- 使用現有工具:LangChain 提供了許多預先構建的工具,可以直接使用。
- 利用 AgentToolkits:將多個工具捆綁在一起,以完成特定的任務。
建立自定義工具範例
以下是一個建立自定義工具的例子,該工具用於計算給定字串的長度:
# 匯入必要的類別和函式
from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
# 定義要使用的 LLM
model = ChatOpenAI()
# 定義計算字串長度的函式
def count_characters_in_string(string):
return len(string)
# 建立工具列表
tools = [
Tool.from_function(
func=count_characters_in_string,
name="計算字串中的字元數",
description="計算文字字串中的字元數量",
)
]
# 下載 React 提示範本
prompt = hub.pull("hwchase17/react")
# 構建 ReAct 代理
agent = create_react_agent(model, tools, prompt)
# 初始化代理執行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 呼叫代理來計算給定單詞的字元數
result = agent_executor.invoke({"input": '''"supercalifragilisticexpialidocious"這個單詞有多少個字元?'''})
print(result)
內容解密:
- 匯入必要的模組:首先匯入 LangChain 所需的類別和函式。
- 初始化 LLM:使用
ChatOpenAI
初始化一個聊天模型。 - 定義函式:建立一個名為
count_characters_in_string
的函式,用於計算字串的長度。 - 建立工具:將
count_characters_in_string
函式封裝在Tool
物件中,提供名稱和描述。 - 構建 ReAct 代理:使用
create_react_agent
函式構建一個 ReAct 代理,傳入模型、工具和提示範本。 - 執行代理:透過
AgentExecutor
初始化代理,並呼叫它來執行特定的任務。
ReAct 實作流程解析
ReAct(Reasoning and Acting)是一種代理框架,它允許 LLM 根據給定的任務進行推理和執行操作。以下是一個簡單的 ReAct 實作流程:
- 觀察原始問題:理解要回答的問題。
- 建立觀察結果:根據當前知識狀態進行初步評估。
- 根據觀察結果進行思考:決定下一步該怎麼做。
- 使用工具執行操作:根據思考結果選擇合適的工具並執行。
程式碼範例:
# 簡單的 ReAct 實作範例
output = chat.invoke(SystemMessagePromptTemplate.from_template(template=current_prompt).format_messages(tool_result=tool_result))
print("模型輸出:", output.content)
final_answer = extract_final_answer(output.content)
if final_answer:
print(f"答案:{final_answer}")
else:
print("未找到最終答案。")
內容解密:
- 呼叫聊天模型:使用格式化的提示範本呼叫聊天模型。
- 列印模型輸出:顯示模型的輸出結果。
- 提取最終答案:嘗試從輸出中提取最終答案。
- 處理答案:如果找到最終答案,則列印;否則,顯示未找到最終答案。
最佳實踐與建議
- 明確工具的功能和描述:確保每個工具都有清晰的名稱和描述,以便代理正確理解和使用它們。
- 合理設計代理流程:根據具體任務需求,設計合理的 ReAct 流程,以提高任務完成的效率和準確性。
- 測試和驗證工具:在實際佈署前,充分測試自定義工具的功能和效能,確保它們能夠正確地與 LLM 整合並發揮作用。
隨著 LLM 和相關技術的不斷進步,LangChain 和其相關生態系統將繼續演化,提供更多創新功能和應用場景。未來,我們可以期待看到更多根據 LangChain 的智慧應用出現,並在各個領域發揮重要作用。
graph LR; A[開始] --> B[定義任務]; B --> C[選擇合適的LLM]; C --> D[建立或選擇工具]; D --> E[構建ReAct代理]; E --> F[執行任務]; F --> G[評估結果]; G --> H[最佳化與改進]; H --> I[佈署應用];
圖表翻譯: 此圖示展示了使用 LangChain 和 ReAct 框架開發 AI 應用的基本流程。首先定義任務,接著選擇合適的 LLM,然後建立或選擇適當的工具。隨後,構建 ReAct 代理並執行任務。完成後,評估結果並根據需要進行最佳化和改進。最後,將最佳化後的應用佈署到生產環境中。整個過程體現了從任務定義到應用佈署的完整開發流程。
使用LangChain建立自主代理的進階應用
在前面的章節中,我們已經瞭解瞭如何使用LangChain建立基本的代理(Agent)。現在,我們將探討如何使用LangChain的進階功能來建立更複雜的自主代理。
使用ReAct模式建立自主代理
ReAct模式是一種常見的代理實作方式,它允許代理根據輸入的查詢選擇適當的工具來完成任務。下面是一個使用ReAct模式建立自主代理的例子:
from langchain import hub
from langchain.agents import create_react_agent, Tool, AgentExecutor
from langchain_openai.chat_models import ChatOpenAI
# 初始化ChatOpenAI模型
model = ChatOpenAI(temperature=0)
# 定義一個用於計算字元數的工具
def count_characters(text: str) -> int:
return len(text)
# 建立工具列表
tools = [
Tool(
name="Count Characters in a text string",
func=count_characters,
description="useful for when you need to count the number of characters in a text string",
),
]
# 從LangChain Hub下載提示
prompt = hub.pull("hwchase17/react")
# 建立ReAct代理
agent = create_react_agent(llm=model, tools=tools, prompt=prompt)
# 建立AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 執行查詢
result = agent_executor.invoke({"input": "What is the character count in 'supercalifragilisticexpialidocious'?"})
print(result)
內容解密:
- 我們首先初始化了一個
ChatOpenAI
模型,並設定溫度引數為0,以獲得確定性的輸出。 - 我們定義了一個名為
count_characters
的函式,用於計算輸入字串的字元數,並將其包裝成一個Tool
物件。 - 我們從LangChain Hub下載了一個預先定義的ReAct提示,並使用它來建立ReAct代理。
- 我們建立了一個
AgentExecutor
例項,並將代理和工具列表傳遞給它。 - 最後,我們執行了一個查詢,要求代理計算單詞“supercalifragilisticexpialidocious”的字元數。
使用OpenAI函式呼叫建立自主代理
OpenAI函式呼叫是一種替代ReAct模式的方法,它允許LLM直接轉換使用者輸入為函式呼叫。下面是一個使用OpenAI函式呼叫建立自主代理的例子:
from langchain.chains import LLMMathChain
from langchain import hub
from langchain.agents import create_openai_functions_agent, Tool, AgentExecutor
from langchain_openai.chat_models import ChatOpenAI
# 初始化ChatOpenAI模型
model = ChatOpenAI(temperature=0)
# 建立LLMMathChain例項
llm_math_chain = LLMMathChain.from_llm(llm=model, verbose=True)
# 定義工具列表
tools = [
Tool(
name="Calculator",
func=llm_math_chain.run,
description="useful for when you need to answer questions about math",
return_direct=True,
),
]
# 從LangChain Hub下載提示
prompt = hub.pull("hwchase17/openai-functions-agent")
# 建立OpenAI函式呼叫代理
agent = create_openai_functions_agent(llm=model, tools=tools, prompt=prompt)
# 建立AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 執行查詢
result = agent_executor.invoke({"input": "What is 5 + 5?"})
print(result)
內容解密:
- 我們首先初始化了一個
ChatOpenAI
模型,並設定溫度引數為0,以獲得確定性的輸出。 - 我們建立了一個
LLMMathChain
例項,用於執行數學計算。 - 我們定義了一個名為“Calculator”的工具,用於執行數學查詢。
- 我們從LangChain Hub下載了一個預先定義的OpenAI函式呼叫提示,並使用它來建立OpenAI函式呼叫代理。
- 我們建立了一個
AgentExecutor
例項,並將代理和工具列表傳遞給它。 - 最後,我們執行了一個查詢,要求代理計算5 + 5的結果。
為自主代理新增多個工具
為了增強自主代理的能力,我們可以為它新增多個工具。下面是一個例子,展示瞭如何為代理新增一個假的Google搜尋工具:
def google_search(query: str) -> str:
return "James Phoenix is 31 years old."
# 定義工具列表
tools = [
Tool(
name="Calculator",
func=llm_math_chain.run,
description="useful for when you need to answer questions about math",
),
Tool(
name="google_search",
func=google_search,
description="useful for when you need to find out about someone's age.",
),
]
# 建立OpenAI函式呼叫代理
agent = create_openai_functions_agent(llm=model, tools=tools, prompt=prompt)
# 建立AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 執行查詢
result = agent_executor.invoke({"input": "Task: Google search for James Phoenix's age. Then square it."})
print(result)
內容解密:
- 我們定義了一個名為
google_search
的函式,用於模擬Google搜尋,並傳回James Phoenix的年齡。 - 我們將
google_search
函式包裝成一個Tool
物件,並將其新增到工具列表中。 - 我們使用更新後的工具列表建立了一個新的OpenAI函式呼叫代理。
- 我們執行了一個查詢,要求代理搜尋James Phoenix的年齡,然後將其平方。
不同型別的自主代理比較
LangChain提供了多種不同型別的自主代理,每種型別都有其特定的適用場景。下面是一些常見的自主代理型別:
代理型別 | 描述 |
---|---|
OpenAI Functions | 與微調模型(如gpt-3.5-turbo-0613和gpt-4-0613)一起使用,用於函式呼叫。智慧輸出JSON物件以進行函式呼叫。 |
OpenAI Tools | OpenAI Functions的增強版本,能夠呼叫一個或多個函式。最佳化了回應效率並減少了某些架構中的回應時間。 |
XML Agent | 適合像Anthropic的Claude這樣的語言模型,擅長XML推理/寫作。最好與常規LLM(非聊天模型)和接受單個字串輸入的非結構化工具一起使用。 |
JSON Chat Agent | 為擅長JSON格式化的語言模型量身定做。使用JSON格式化輸出,支援需要JSON輸出的聊天模型場景。 |
Structured Chat | 能夠使用多輸入工具,設計用於需要結構化輸入和輸出的複雜任務。 |
ReAct | 實作ReAct邏輯,使用像Tavily’s Search這樣的工具與檔案儲存或搜尋工具進行互動。 |
Self-Ask with Search | 利用中間答案工具進行事實問題解析,遵循自問自答的搜尋方法。最適合需要快速和準確事實答案的場景。 |
強化大語言模型(LLM)代理的工具與框架
在開發人工智慧(AI)代理時,工具的選擇和框架的設計對於提升代理的功能性和靈活性至關重要。本文將探討如何利用不同的工具和框架來增強LLM代理的能力,並對比OpenAI函式和ReAct框架的特點和適用場景。
工具的多樣性與靈活性
LLM代理可以透過整合多種工具來提升其解決問題的能力。這些工具包括但不限於:
- Google搜尋:使LLM能夠進行網路搜尋,提供及時相關的上下文。
- 檔案系統工具:對於檔案的管理至關重要,無論是讀取、寫入還是重新組織檔案。
- Requests:使LLM能夠執行HTTP請求,實作建立、讀取、更新和刪除(CRUD)功能。
- Twilio:增強LLM的功能,使其能夠透過Twilio傳送簡訊或WhatsApp訊息。
程式碼範例:使用Requests工具執行HTTP請求
import requests
def fetch_data(url):
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
return None
# 使用範例
url = "https://api.example.com/data"
data = fetch_data(url)
print(data)
內容解密:
此程式碼範例展示瞭如何使用requests
函式庫來執行HTTP GET請求。首先定義了一個fetch_data
函式,該函式接受一個URL作為引數,並傳回請求的JSON回應。透過檢查HTTP狀態碼,可以確定請求是否成功。
任務分配與品質評估
在使用多種工具時,適當地分配任務至關重要。例如,將通訊服務委託給Twilio,而將HTTP相關任務分配給Requests。同時,持續評估每個工具所執行任務的效能和品質也是非常重要的。
Mermaid任務分配流程
graph LR A[開始] --> B{任務型別} B -->|通訊服務|> C[Twilio] B -->|HTTP請求|> D[Requests] C --> E[執行任務] D --> E E --> F[評估任務品質]
圖表翻譯: 此圖表展示了任務分配的流程。首先根據任務型別進行判斷,如果是通訊服務,則交由Twilio處理;如果是HTTP請求,則使用Requests。完成任務後,對任務品質進行評估。
OpenAI函式與ReAct框架的比較
OpenAI函式和ReAct框架都為執行任務提供了獨特的能力。瞭解兩者之間的差異有助於確定哪一個更適合特定的使用場景。
OpenAI函式的特點
- 執行時決策:LLM自主決定是否執行函式。
- 單一工具執行:適合需要單一工具執行的任務。
- 易於實作:可以輕鬆與對話代理整合。
- 平行函式呼叫:支援在同一API請求中呼叫多個函式。
ReAct框架的特點
- 迭代思維過程:允許代理為複雜任務生成多個思維迴圈。
- 多意圖處理:能夠有效地處理具有多個意圖的查詢。
- 順序工具執行:適合需要順序執行多個工具的任務。
選擇合適的框架
根據任務的需求選擇合適的框架至關重要。如果任務涉及明確的操作,如簡單的搜尋或資料提取,OpenAI函式是理想的選擇。如果任務需要多次順序工具使用和對先前操作的深入反思,ReAct是更好的選擇。
代理工具包
代理工具包是LangChain的一種整合,提供多種工具和連結在一起,能夠快速自動化任務。一些流行的代理工具包包括CSV代理、Gmail工具包、OpenAI代理等。
安裝代理工具包
pip install langchain_experimental pandas tabulate langchain-community pymongo --upgrade
透過結合不同的工具和框架,可以顯著提升LLM代理的功能性和靈活性。瞭解OpenAI函式和ReAct框架的特點,有助於為特定的任務選擇最合適的解決方案。同時,合理地分配任務和評估工具的效能,也是確保LLM代理高效運作的關鍵。