LangChain 作為一個開源框架,簡化了大語言模型(LLM)應用程式的開發流程,讓構建複雜任務自動化工作流程變得更為便捷。本文將詳細介紹如何使用 LangChain 構建不同型別的智慧代理,例如 React 代理、自問代理和任務管理代理,並探討它們的實際應用場景。同時,我們也會介紹 LangSmith 這個強大的工具,它能有效輔助代理的開發、測試和生產監控,進一步提升開發效率。文章中會以旅行助手作為應用案例,展示如何利用 LangChain 和相關工具構建一個功能完善的智慧代理,並討論其技術實作、優勢和侷限性,以及未來的發展方向。最後,我們將探討如何結合多種工具,例如 Tavily Search 和本地索引查詢器,打造更強大的智慧代理,以滿足更複雜的應用需求。

ReAct 代理

接下來是 ReAct 代理,它是一種強大的工具,允許您在 AI 應用中實作 ReAct 邏輯。它使代理能夠根據收集到的資訊進行推理和行動。 要開始使用,您需要確保已經安裝了必要的函式庫。在這種情況下,您將使用 LangChain、Tavily Search 和 OpenAI。以下是如何匯入它們:

from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import OpenAI

初始化工具

首先,讓我們為 ReAct 代理載入一些工具。在這個範例中,您將使用 Tavily Search 來允許代理線上搜尋資訊:

tools = [TavilySearchResults(max_results=1)]

建立代理

現在,透過玄貓建立您的 ReAct 代理。您可以根據需要自定義此提示,但目前您將使用預設的:

prompt = hub.pull("hwchase17/react")

接下來,您需要選擇要使用的語言模型(LLM)。在這種情況下,讓我們使用 OpenAI:

llm = OpenAI()

最後,透過傳遞 LLM、工具和提示來構建 ReAct 代理:

agent = create_react_agent(llm, tools, prompt)

執行代理

有了您的 ReAct 代理,您可以建立一個執行器並執行它,傳遞 agenttools,並設定 verbose=True 以檢視代理的思考過程:

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

現在,問您的代理一個問題並觀察它的行動:

agent_executor.invoke({"input": "什麼是 LangChain?"})

觀察代理如何透過一系列的思考和行動來收集有關 LangChain 的資訊:

我應該研究 LangChain 來瞭解更多關於它的資訊。

行動:tavily_search_results_json 行動輸入:“LangChain”

我應該閱讀摘要並檢視 LangChain 的不同功能和整合。

行動:tavily_search_results_json 行動輸入:“LangChain 功能和整合” 我應該記下 LangChain 的發布日期和受歡迎程度。

內容解密:

在這個範例中,我們建立了一個 ReAct 代理,它使用 Tavily Search 來線上搜尋資訊。代理透過一系列的思考和行動來收集有關 LangChain 的資訊,包括研究 LangChain、閱讀摘要和檢視功能和整合。這個過程展示瞭如何使用 ReAct 代理來實作更自然的對話體驗。

圖表翻譯:

此圖表展示了建立和執行 ReAct 代理的過程,包括初始化工具、執行代理、收集資訊、思考和行動,以及輸出結果。

LangChain 自動化框架的應用

LangChain 是一個開源的框架,用於構建大語言模型(LLM)應用程式。它提供了一種簡單的方式來建立複雜的任務自動化工作流程。

自問代理(Self-Ask Agent)

自問代理是一種可以自主詢問和回答問題的代理。它可以使用搜尋工具來找到答案,並根據搜尋結果做出決策。

建立自問代理

要建立自問代理,需要先初始化工具和語言模型。然後,可以使用 create_self_ask_with_search_agent 函式建立代理。

from langchain import hub
from langchain.agents import AgentExecutor, create_self_ask_with_search_agent
from langchain_community.llms import Fireworks
from langchain_community.tools.tavily_search import TavilyAnswer

# 初始化工具
tools = [TavilyAnswer(max_results=1, name="Intermediate Answer")]

# 建立代理
prompt = hub.pull("hwchase17/self-ask-with-search")
llm = Fireworks(model="accounts/fireworks/models/llama-v2-13b-chat", max_tokens=1024, temperature=0.7)
agent = create_self_ask_with_search_agent(llm, tools, prompt)

# 建立代理執行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

執行自問代理

要執行自問代理,可以使用 invoke 方法傳入輸入引數。

agent_executor.invoke({"input": "What is the headquarters location of the company with the largest market capitalization in the tech industry?"})

代理會自動搜尋答案,並根據搜尋結果做出決策。

任務管理代理(Task Manager Agent)

任務管理代理是一種可以理解使用者請求、將其分解為子任務並自主決定使用哪些工具來完成每個子任務的代理。

建立任務管理代理

要建立任務管理代理,需要先安裝必要的函式庫,然後匯入所需的模組。

pip install langchain==0.2.5 openai==1.35.13 google-search-results serpapi

from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain.utilities import GoogleSearchAPIWrapper

初始化語言模型和搜尋工具

然後,可以初始化語言模型和搜尋工具。

llm = OpenAI(temperature=0)

建立代理

最後,可以使用 initialize_agent 函式建立代理。

agent = initialize_agent(llm, tools=[GoogleSearchAPIWrapper()])

角色介紹:旅行助手

旅行助手是一個人工智慧(AI)系統,旨在幫助使用者規劃旅行行程。該系統結合了自然語言處理(NLP)和網際網路搜尋功能,提供使用者個人化的旅行建議。

工具介紹

旅行助手使用以下工具:

  • 搜尋工具:利用 Google Search API 進行網際網路搜尋,尋找相關的旅行資訊。
  • 語言模型:使用 OpenAI 語言模型,理解使用者的需求並生成自然語言回應。

初始化旅行助手

初始化旅行助手時,需要定義其可用的工具和語言模型。以下是初始化的示例:

tools = [
    Tool(
        name="搜尋",
        func=search.run,
        description="用於在網際網路上搜尋資訊。"
    )
]

agent = initialize_agent(
    tools,
    llm,
    agent="zero-shot-react-description",
    verbose=True
)

任務分配

給旅行助手一個任務,例如:

task = "我想計劃去巴黎旅行。巴黎有哪些必訪景點,什麼時間去最好?"
result = agent.run(task)
print(result)

旅行助手會自動分解任務,搜尋相關資訊,並提供一個全面性的回應。

回應示例

當執行上述程式碼時,旅行助手會提供一個類別似以下的回應:

“要規劃您的巴黎之旅,以下是您應該存取的頂級旅遊景點和最佳出行時間: 巴黎頂級旅遊景點:

  1. 艾菲爾鐵塔:具有城市壯麗景色的標誌性地標
  2. 羅浮宮:世界知名的藝術博物館,收藏有蒙娜麗莎和其他傑作
  3. 聖母院大教堂:以哥特式建築風格聞名的歷史悠久的大教堂(目前因 2019 年發生的火災而正在整修)
  4. 凱旋門:為紀念為法國而戰死的英雄們而建的著名紀念碑

根據氣候和旅遊旺季,四月至六月和九月至十一月是存取巴黎的最佳時間。這段時間的天氣溫和宜人,適合觀光和戶外活動。”

技術實作

旅行助手的技術實作涉及以下幾個步驟:

  1. 使用者輸入:使用者輸入任務描述,例如“計劃去巴黎旅行”。
  2. 任務分解:旅行助手自動分解任務,確定需要搜尋的資訊,例如景點和最佳出行時間。
  3. 網際網路搜尋:使用 Google Search API 進行網際網路搜尋,尋找相關的旅遊資訊。
  4. 資訊過濾:過濾搜尋結果,提取相關且準確的資訊。
  5. 回應生成:使用 OpenAI 語言模型,根據蒐集到的資訊生成自然語言回應。
  6. 結果輸出:將生成的回應輸出給使用者。

優勢和侷限性

旅行助手具有以下優勢:

  • 個人化建議:根據使用者的需求提供個人化的旅行建議。
  • 自動搜尋:自動進行網際網路搜尋,節省使用者的時間和精力。

然而,旅行助手也有一些侷限性:

  • 依賴網際網路連線:需要穩定的網際網路連線才能正常運作。
  • 資訊準確性:依賴搜尋結果的準確性,可能會受到搜尋引擎演算法和資訊品質的影響。

未來發展

未來,旅行助手可以進一步發展以提高其功能和使用者經驗。一些潛在的發展方向包括:

  • 多語言支援:增加對多種語言的支援,以滿足更多使用者的需求。
  • 個人化設定:允許使用者自訂設定,例如偏好特定的旅遊型別或預算限制。
  • 與其他服務整合:與其他旅行相關服務整合,例如機票預訂、酒店預訂和活動安排,以提供更全面性的旅行規劃體驗。

探索巴黎的美麗:最佳旅遊時間和景點

巴黎,光之城,擁有豐富的歷史、藝術和文化。無論您是對著名地標、美麗花園還是迷人的街區感興趣,巴黎都能滿足您的期望。在本文中,我們將探討最佳的旅遊時間和必訪景點,以便您充分體驗巴黎的魅力。

最佳旅遊時間

巴黎全年都是個好時機,然而,每個季節都有其獨特的魅力。春季(3 月至 5 月)是個很好的選擇,因為天氣溫和,花開得美麗,遊客也較少。夏季(6 月至 8 月)則是戶外活動和節日的季節,但同時也是遊客最多、價格最高的時期。秋季(9 月至 11 月)帶來了舒適的天氣、較少的遊客和美麗的秋葉。冬季(12 月至 2 月)則是享受室內活動、博物館和聖誕市場的最佳時機。

必訪景點

  1. 凡爾賽宮:這座前皇家居所以其宏偉的建築和令人驚艷的花園而聞名。
  2. 蒙馬特:這個迷人的山頂街區以其藝術史和聖心大教堂而聞名。
  3. 塞納河遊船:沿著塞納河進行的一次風景如畫的船遊,可以欣賞到城市的地標建築。

結合多工具的智慧代理

在這一部分,我們將建立一個智慧代理,它可以使用多個工具來執行任務。這個代理將在網上搜尋資訊並從預先載入的索引中查詢特定資料。

設定 LangSmith

LangSmith 是一個可以使建立和除錯代理變得容易的工具。要設定 LangSmith,您只需要設定幾個環境變數:

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="<你的API金鑰>"

請確保用你的實際 LangSmith API 金鑰替換 <你的API金鑰>

定義工具

我們將為代理提供兩個強大的工具:Tavily 用於線上搜尋和一個查詢器用於查詢本地索引。

工具 1:Tavily

Tavily 是 LangChain 的一個內建工具,允許代理輕鬆地在網上搜尋並存取大量的知識函式庫。要使用 Tavily,您需要一個 API 金鑰。

from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults()

您可以使用查詢輕鬆地呼叫搜尋工具:

search.invoke("舊金山的天氣如何")

這將傳回與舊金山天氣相關的搜尋結果列表。

工具 2:查詢器

除了線上搜尋外,我們還建立了一個查詢器,允許代理從本地索引中查詢資訊。

  1. 使用 WebBaseLoader 載入資料:
from langchain_community.document_loaders import WebBaseLoader
docs = loader.load()
  1. 使用 RecursiveCharacterTextSplitter 將載入的檔案分成塊:
from langchain_text_splitters import RecursiveCharacterTextSplitter
documents = RecursiveCharacterTextSplitter(
    chunk_size=1000, chunk_overlap=200
).split_documents(docs)
  1. 使用 FAISS 和 OpenAIEmbeddings 建立一個向量儲存:
from langchain_community.vectorstores import FAISS

透過這些工具,智慧代理可以高效地搜尋和查詢資訊,為使用者提供更好的體驗。

建立一個根據 LangChain 的智慧代理

步驟 1:安裝 LangChain

首先,您需要安裝 LangChain 這個 Python 套件。您可以使用 pip 來安裝:

pip install langchain

步驟 2:匯入必要的模組

匯入 LangChain 中的必要模組,包括 OpenAIEmbeddingscreate_retriever_toolChatOpenAIcreate_tool_calling_agent

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import create_tool_calling_agent, AgentExecutor

步驟 3:建立檔案索引

建立一個檔案索引,使用 OpenAIEmbeddings 來將檔案轉換為向量:

documents = [...]  # 列表中的檔案內容
vector = OpenAIEmbeddings().from_documents(documents)

步驟 4:建立搜尋工具

建立一個搜尋工具,使用 create_retriever_tool 來包裝索引:

retriever_tool = create_retriever_tool(
    vector.as_retriever(),
    "langsmith_search",
    "搜尋 LangSmith 相關資訊。"
)

步驟 5:建立 LLM 模型

建立一個 LLM 模型,使用 ChatOpenAI 來初始化:

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)

步驟 6:建立代理

建立一個代理,使用 create_tool_calling_agent 來初始化:

prompt = [...]  # 列表中的提示內容
agent = create_tool_calling_agent(llm, [retriever_tool], prompt)

步驟 7:建立代理執行器

建立一個代理執行器,使用 AgentExecutor 來初始化:

agent_executor = AgentExecutor(agent=agent, tools=[retriever_tool], verbose=True)

步驟 8:測試代理

測試代理,使用 agent_executor.invoke 來傳入輸入:

agent_executor.invoke({"input": "你好!"})

代理將會根據輸入生成一個回應。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title LangChain智慧代理構建與應用

package "軟體測試架構" {
    package "測試層級" {
        component [單元測試
Unit Test] as unit
        component [整合測試
Integration Test] as integration
        component [端對端測試
E2E Test] as e2e
    }

    package "測試類型" {
        component [功能測試] as functional
        component [效能測試] as performance
        component [安全測試] as security
    }

    package "工具框架" {
        component [pytest] as pytest
        component [unittest] as unittest
        component [Selenium] as selenium
        component [JMeter] as jmeter
    }
}

unit --> pytest : 撰寫測試
unit --> integration : 組合模組
integration --> e2e : 完整流程
functional --> selenium : UI 自動化
performance --> jmeter : 負載測試

note right of unit
  測試金字塔基礎
  快速回饋
  高覆蓋率
end note

@enduml

內容解密:

上述程式碼展示瞭如何建立一個根據 LangChain 的智慧代理。首先,匯入必要的模組,然後建立一個檔案索引,使用 OpenAIEmbeddings 來將檔案轉換為向量。接下來,建立一個搜尋工具,使用 create_retriever_tool 來包裝索引。然後,建立一個 LLM 模型,使用 ChatOpenAI 來初始化。之後,建立一個代理,使用 create_tool_calling_agent 來初始化。最後,建立一個代理執行器,使用 AgentExecutor 來初始化,並測試代理。

LangSmith 在測試中的應用

LangSmith 是一個用於構建生產級 LLM 應用的平臺,它可以在測試中提供多種幫助。以下是 LangSmith 在測試中的幾種應用:

  1. 追蹤(Tracing):LangSmith 提供了追蹤功能,允許您在測試期間密切監控和評估您的應用程式。您可以記錄追蹤以跟蹤應用程式的行為並找出任何問題。
  2. 評估(Evaluation):LangSmith 提供了評估功能,啟用您在測試期間評估應用程式的效能。這有助於確保您的應用程式按預期執行並符合所需的標準。
  3. 生產監控和自動化(Production Monitoring & Automations):LangSmith 允許您在生產環境中監控您的應用程式並自動化某些過程,這對於測試不同的場景和確保應用程式的穩定性非常有益。
  4. 提示中心(Prompt Hub):LangSmith 包含一個提示中心,一種提示管理工具,可以簡化測試過程。

綜上所述,LangSmith 可以透過追蹤、評估和自動化過程來幫助測試,從而確保您的應用程式在測試階段的可靠性和效能。

從技術架構視角來看,LangChain 作為一個構建大語言模型應用的框架,展現了其在簡化開發流程、整合多種工具和提升開發效率方面的顯著優勢。本文涵蓋了 ReAct 代理、自問代理和任務管理代理等多種應用場景,並深入探討瞭如何結合 Tavily Search、Google Search API 和本地向量索引等工具,構建功能豐富的 AI 應用。透過分析不同代理的運作機制和程式碼範例,我們可以清晰地理解 LangChain 如何賦能開發者快速構建複雜的 LLM 應用。

然而,LangChain 的發展也面臨一些挑戰。例如,如何有效管理和最佳化多個工具的協同工作,如何提升代理在處理複雜任務時的推理能力和準確性,以及如何降低開發和佈署成本等,都是 LangChain 未來需要持續精進的課題。此外,確保資料安全和隱私,以及避免模型偏差和歧視等議題,也需要開發者在應用 LangChain 時予以重視。

展望未來,LangChain 與其他 AI 技術的融合將是重要的發展趨勢。例如,結合知識圖譜技術可以提升代理的知識推理能力,整合強化學習技術可以最佳化代理的決策流程,而引入可解釋 AI 技術則可以增強代理的透明度和可信度。隨著技術的持續演進,我們預見 LangChain 將在更多領域展現其應用價值,並推動 LLM 應用進入一個全新的發展階段。玄貓認為,深入理解 LangChain 的核心架構和應用場景,並積極探索其與其他技術的融合方案,將是開發者在 AI 領域保持競爭力的關鍵。