LangChain 代理技術賦予大語言模型 (LLM) 使用外部工具的能力,如同專案經理般協調不同工具完成複雜任務。這項技術能有效提升 LLM 應用價值,實作更廣泛的應用場景。本文將深入探討 LangChain 代理的運作機制,包含 LangGraph 的圖形結構、代理目標設定、核心元件 AgentActionAgentFinish 和中間步驟等概念。同時,文章也將探討如何選擇合適的代理型別、整合內建與自定義工具,並運用記憶機制和 AgentExecutor 提升代理效能。最後,透過智慧餐廳推薦系統的實務案例,展現 LangChain 代理技術在實際應用中的優勢與潛力。

解密 LangChain 代理技術:AI 應用的進階實踐

身為臺灣技術工作者玄貓,我深入研究了 LangChain 代理在建構生成式 AI 應用中的強大潛力。LangChain 代理就像一位經驗豐富的專案經理,能協調各種工具完成複雜任務。本文將分享我在任務自動化、內容生成和智慧搜尋方面的進階應用心得,並提供實務案例和程式碼片段,協助開發者快速開發智慧應用。

LangChain 代理核心概念解析

LangChain 代理賦予大語言模型(LLM)使用工具的能力,使其能像熟練的工匠一樣,精準地運用各種工具創造出令人驚豔的作品。LangChain 代理的核心在於讓 LLM 不僅能理解指令,還能判斷何時及如何使用特定工具達成目標。

LangGraph:結構化思維的根本

LangGraph 是 LangChain 代理的根本,它以圖形結構定義了 AI 互動流程,使代理的思維更清晰、更有條理。每個節點代表一個動作,邊則表示節點間的轉換關係。

  flowchart TD
 A[起始] --> B{使用者提問}
 B -->|問題有效| C[代理思考]
 B -->|問題無效| D[回報錯誤]
 C --> E{使用工具}
 E -->|工具選擇成功| F[執行工具]
 E -->|工具選擇失敗| G[輸出錯誤訊息]
 F --> H[輸出結果]
 G --> H
 D --> H

圖表翻譯:

此圖示展示了 LangChain 代理的運作流程。首先,系統接收使用者的提問並進行有效性檢查。若提問有效,代理會進行思考並選擇適當的工具。若工具選擇成功,系統會執行該工具並輸出結果;若失敗,則輸出錯誤訊息。整個流程清晰地呈現了代理如何處理使用者輸入並給出相應的輸出。

from langchain.graphs import LangGraph

# 建立 LangGraph
graph = LangGraph()

# 新增節點和邊
graph.add_node("起始")
graph.add_node("使用者提問")
graph.add_node("代理思考")
graph.add_node("使用工具")
graph.add_node("輸出結果")

graph.add_edge("起始", "使用者提問")
graph.add_edge("使用者提問", "代理思考")
graph.add_edge("代理思考", "使用工具")
graph.add_edge("使用工具", "輸出結果")

精準導航:設定代理目標

建構代理的第一步是設定明確的目標。目標設定的越精準,代理的執行效率就越高。以「智慧餐廳推薦系統」為例,目標設定如下:

目標: 根據使用者提供的菜系、預算和所在城市,推薦最符合需求的餐廳,並提供餐廳評分、評論和聯絡方式。

LangChain 代理核心元件剖析

深入理解 LangChain 代理的運作機制,必須掌握 AgentActionAgentFinish 和中間步驟這三個核心概念。AgentAction 定義代理要執行的動作,包含 tool(工具名稱)和 tool_input(輸入引數)。AgentFinish 表示代理完成任務,並傳回最終結果。中間步驟記錄代理執行過程中的每個動作和對應的輸出。

from langchain.agents import AgentAction, AgentFinish

# 建立 AgentAction
action = AgentAction(tool="搜尋餐廳", tool_input={"菜系": "川菜", "城市": "臺北", "預算": "800元以下"})

# 建立 AgentFinish
finish = AgentFinish(return_values={"output": "推薦您試試老罈香和川妹子"})

# 中間步驟範例
intermediate_steps = [(action, "找到5家符合條件的餐廳")]

內容解密:

此程式碼示範了 AgentActionAgentFinish 和中間步驟的用法。AgentAction 定義了代理要執行的動作,例如搜尋餐廳,並提供詳細的搜尋條件。AgentFinish 則表示代理完成任務,並傳回推薦結果。中間步驟記錄了搜尋過程中找到的餐廳數量。

選擇合適的代理型別與工具整合

LangChain 提供多種代理型別,如 Zero-Shot-React 代理、結構化聊天代理和 ReAct 代理等。選擇合適的代理型別能有效提升開發效率。同時,LangChain 允許整合內建工具和自定義工具,使代理能處理更多工。

from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.llms import OpenAI

# 初始化語言模型
llm = OpenAI(temperature=0)

# 載入工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 初始化代理
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# 執行代理
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
response = agent_executor.invoke({"input": "臺北市的著名景點有哪些?"})
print(response)

內容解密:

此程式碼示範瞭如何使用 LangChain 載入工具、初始化代理,並透過 AgentExecutor 執行代理來回答問題。它首先載入了 serpapillm-math 兩個工具,然後初始化了一個 Zero-Shot-React 代理,最後執行代理來回答關於臺北市著名景點的問題。

代理強化:記憶機制與執行器

為代理增加記憶機制,能使其記住先前的互動,並在多個對話回合中保持上下文一致性。AgentExecutor 是代理的執行引擎,負責協調代理和工具之間的互動。

from langchain_core.messages import AIMessage, HumanMessage

agent_executor.invoke(
 {
 "input": "我先前詢問的內容是什麼?",
 "chat_history": [
 HumanMessage(content="如何提升軟體開發團隊的效率?"),
 AIMessage(content="提升軟體開發團隊效率的方法包含匯入敏捷開發、最佳化程式碼審查流程、匯入自動化工具等。"),
 ],
 }
)

內容解密:

此程式碼示範瞭如何運用 LangChain 建立並執行一個具備對話歷史記憶功能的代理。透過傳入 chat_history,代理能理解當前問題的上下文,並給出更精確的回應。

透過本文的介紹和實務案例,我們可以看到 LangChain 代理在 AI 應用開發中的強大潛力。未來,我們可以期待更多根據 LangChain 的創新應用出現。