LangChain 框架允許開發者透過整合外部工具擴充套件大語言模型 (LLM) 的能力,使其能執行更複雜的任務。本文將會介紹如何使用 LangChain 建立自定義工具,並利用 ReAct 和 OpenAI 函式等進階技巧建構自主代理,同時探討不同代理型別的比較與選擇,以及如何透過整合多樣化工具和框架提升代理的效能和靈活性。理解這些核心概念有助於開發者更好地運用 LangChain 構建更強大的 AI 應用。

LangChain 代理工具使用與自定義工具建立

LangChain 提供了一種強大的方式來擴充套件大語言模型(LLM)的功能,透過整合各種工具來執行特定的任務。本文將探討 LangChain 代理工具的使用、自定義工具的建立,以及相關的最佳實踐。

為什麼需要工具?

大語言模型如 GPT-4 主要侷限於生成文字。為了擴充套件其功能,需要提供能夠執行其他操作的工具,例如與資料函式庫互動或讀寫檔案。這些工具使 LLM 能夠執行更複雜的任務。

使用 LangChain 工具

LangChain 提供了三種不同的工具使用方法:

  1. 建立自定義工具:開發者可以根據特定需求建立自己的工具。
  2. 使用現有工具:LangChain 提供了許多預先構建的工具,可以直接使用。
  3. 利用 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)

內容解密:

  1. 匯入必要的模組:首先匯入 LangChain 所需的類別和函式。
  2. 初始化 LLM:使用 ChatOpenAI 初始化一個聊天模型。
  3. 定義函式:建立一個名為 count_characters_in_string 的函式,用於計算字串的長度。
  4. 建立工具:將 count_characters_in_string 函式封裝在 Tool 物件中,提供名稱和描述。
  5. 構建 ReAct 代理:使用 create_react_agent 函式構建一個 ReAct 代理,傳入模型、工具和提示範本。
  6. 執行代理:透過 AgentExecutor 初始化代理,並呼叫它來執行特定的任務。

ReAct 實作流程解析

ReAct(Reasoning and Acting)是一種代理框架,它允許 LLM 根據給定的任務進行推理和執行操作。以下是一個簡單的 ReAct 實作流程:

  1. 觀察原始問題:理解要回答的問題。
  2. 建立觀察結果:根據當前知識狀態進行初步評估。
  3. 根據觀察結果進行思考:決定下一步該怎麼做。
  4. 使用工具執行操作:根據思考結果選擇合適的工具並執行。

程式碼範例:

# 簡單的 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("未找到最終答案。")

內容解密:

  1. 呼叫聊天模型:使用格式化的提示範本呼叫聊天模型。
  2. 列印模型輸出:顯示模型的輸出結果。
  3. 提取最終答案:嘗試從輸出中提取最終答案。
  4. 處理答案:如果找到最終答案,則列印;否則,顯示未找到最終答案。

最佳實踐與建議

  1. 明確工具的功能和描述:確保每個工具都有清晰的名稱和描述,以便代理正確理解和使用它們。
  2. 合理設計代理流程:根據具體任務需求,設計合理的 ReAct 流程,以提高任務完成的效率和準確性。
  3. 測試和驗證工具:在實際佈署前,充分測試自定義工具的功能和效能,確保它們能夠正確地與 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)

內容解密:

  1. 我們首先初始化了一個ChatOpenAI模型,並設定溫度引數為0,以獲得確定性的輸出。
  2. 我們定義了一個名為count_characters的函式,用於計算輸入字串的字元數,並將其包裝成一個Tool物件。
  3. 我們從LangChain Hub下載了一個預先定義的ReAct提示,並使用它來建立ReAct代理。
  4. 我們建立了一個AgentExecutor例項,並將代理和工具列表傳遞給它。
  5. 最後,我們執行了一個查詢,要求代理計算單詞“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)

內容解密:

  1. 我們首先初始化了一個ChatOpenAI模型,並設定溫度引數為0,以獲得確定性的輸出。
  2. 我們建立了一個LLMMathChain例項,用於執行數學計算。
  3. 我們定義了一個名為“Calculator”的工具,用於執行數學查詢。
  4. 我們從LangChain Hub下載了一個預先定義的OpenAI函式呼叫提示,並使用它來建立OpenAI函式呼叫代理。
  5. 我們建立了一個AgentExecutor例項,並將代理和工具列表傳遞給它。
  6. 最後,我們執行了一個查詢,要求代理計算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)

內容解密:

  1. 我們定義了一個名為google_search的函式,用於模擬Google搜尋,並傳回James Phoenix的年齡。
  2. 我們將google_search函式包裝成一個Tool物件,並將其新增到工具列表中。
  3. 我們使用更新後的工具列表建立了一個新的OpenAI函式呼叫代理。
  4. 我們執行了一個查詢,要求代理搜尋James Phoenix的年齡,然後將其平方。

不同型別的自主代理比較

LangChain提供了多種不同型別的自主代理,每種型別都有其特定的適用場景。下面是一些常見的自主代理型別:

代理型別描述
OpenAI Functions與微調模型(如gpt-3.5-turbo-0613和gpt-4-0613)一起使用,用於函式呼叫。智慧輸出JSON物件以進行函式呼叫。
OpenAI ToolsOpenAI 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代理可以透過整合多種工具來提升其解決問題的能力。這些工具包括但不限於:

  1. Google搜尋:使LLM能夠進行網路搜尋,提供及時相關的上下文。
  2. 檔案系統工具:對於檔案的管理至關重要,無論是讀取、寫入還是重新組織檔案。
  3. Requests:使LLM能夠執行HTTP請求,實作建立、讀取、更新和刪除(CRUD)功能。
  4. 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函式的特點

  1. 執行時決策:LLM自主決定是否執行函式。
  2. 單一工具執行:適合需要單一工具執行的任務。
  3. 易於實作:可以輕鬆與對話代理整合。
  4. 平行函式呼叫:支援在同一API請求中呼叫多個函式。

ReAct框架的特點

  1. 迭代思維過程:允許代理為複雜任務生成多個思維迴圈。
  2. 多意圖處理:能夠有效地處理具有多個意圖的查詢。
  3. 順序工具執行:適合需要順序執行多個工具的任務。

選擇合適的框架

根據任務的需求選擇合適的框架至關重要。如果任務涉及明確的操作,如簡單的搜尋或資料提取,OpenAI函式是理想的選擇。如果任務需要多次順序工具使用和對先前操作的深入反思,ReAct是更好的選擇。

代理工具包

代理工具包是LangChain的一種整合,提供多種工具和連結在一起,能夠快速自動化任務。一些流行的代理工具包包括CSV代理、Gmail工具包、OpenAI代理等。

安裝代理工具包

pip install langchain_experimental pandas tabulate langchain-community pymongo --upgrade

透過結合不同的工具和框架,可以顯著提升LLM代理的功能性和靈活性。瞭解OpenAI函式和ReAct框架的特點,有助於為特定的任務選擇最合適的解決方案。同時,合理地分配任務和評估工具的效能,也是確保LLM代理高效運作的關鍵。