返回文章列表

LangChain打造自訂代理與應用

本文深入探討如何使用 LangChain 構建自訂代理,涵蓋載入語言模型、定義工具、建立提示以及實際應用案例,例如客戶支援自動化、個人化推薦和實時資料分析與決策。文章以 Python 程式碼示例和流程圖,逐步講解如何建立具有記憶能力的對話機器人,並應用於客戶支援自動化場景,提升客戶體驗。

Web 開發 機器學習

LangChain 提供了靈活的框架,讓開發者能輕鬆打造自訂代理,整合語言模型和各種工具。首先,載入 OpenAI 的 ChatOpenAI 模型作為語言模型核心。接著,定義 Python 函式作為代理的工具,例如計算單詞長度。透過 initialize_agent 函式,將語言模型和工具繫結,建立代理例項。利用提示範本引導代理行為,並使用 agent.run 執行代理任務。為了構建更進階的代理,可以加入記憶機制,記錄過往互動,使對話更自然流暢。實務上,可以運用 LangChain 代理構建客戶支援自動化系統,提升客戶體驗。透過分析客戶資料,識別常見問題,並建立結構化的知識函式庫,代理就能有效處理客戶諮詢。結合 LangChain 的工具和記憶體機制,打造更智慧的客戶支援代理。

建立自訂代理

在本章中,我們將探索如何使用 LangChain 建立自訂代理。透過實踐,你將掌握如何載入語言模型、定義工具、建立提示,並將所有元素繫結在一起以構建一個功能性的代理。我們還將涵蓋實際應用案例,例如客戶支援自動化、個人化推薦和實時資料分析與決策。

載入語言模型

第一步是載入語言模型。在這個例子中,你將使用 OpenAI 的 ChatOpenAI 模型,但你也可以嘗試使用其他模型:

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

定義工具

接下來,你需要為你的代理提供工具。讓我們從一個簡單的 Python 函式開始,該函式計算給定單詞的長度:

from langchain.agents import tool
@tool
def get_word_length(word: str) -> int:
    """傳回單詞的長度。"""
    return len(word)

內容解密:

在上述程式碼中,我們定義了一個名為 get_word_length 的工具,該工具接受一個字串作為輸入並傳回其長度。這個工具將被用於我們的代理中,以便它可以執行特定的任務。

建立代理

現在,我們可以建立一個代理,該代理可以使用我們定義的工具。讓我們建立一個簡單的代理,該代理可以回答問題並提供資訊:

from langchain.agents import ToolNames, initialize_agent
agent = initialize_agent(llm, [get_word_length], ToolNames)

內容解密:

在這裡,我們初始化了一個代理,該代理使用我們之前載入的語言模型和定義的工具。代理現在可以執行任務並回答問題。

執行代理

最後,我們可以執行代理並檢視其在行動中的效果:

input = "計算單詞 'hello' 的長度。"
output = agent.run(input)
print(output)

充分圖示:

圖表翻譯:

此流程圖描述了建立和執行自訂代理的步驟。首先,我們載入語言模型,然後定義工具,接下來建立代理,最後執行代理以獲得輸出結果。

透過這個例子,你可以看到如何使用 LangChain 建立自訂代理,以滿足你的具體需求和應用案例。這個過程涉及載入語言模型、定義工具、建立代理和執行代理。

建立智慧代理

首先,我們需要定義工具列表,讓代理知道它可以使用哪些工具。這裡,我們定義了一個名為 get_word_length 的工具,該工具計算輸入字串的長度。

tools = [get_word_length]

建立提示

接下來,我們需要建立一個提示,該提示將指導代理的行為。這個提示包括系統訊息、使用者輸入和代理的 scratchpad(一個儲存中間步驟和工具輸出的空間)。

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "您是一個非常強大的助手,但不知道當前事件"),
        ("user", "{input}"),
        MessagesPlaceholder(variable_name="agent_scratchpad"),
    ]
)

將工具繫結到語言模型

然後,我們需要將工具繫結到語言模型,這樣代理就知道它有哪些能力。

llm_with_tools = llm.bind_tools(tools)

建立代理

接下來,我們需要建立代理。為此,我們需要匯入一些工具函式來格式化代理的中間步驟和解析其輸出。

from langchain.agents.format_scratchpad.openai_tools import format_to_openai_tool_messages
from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser

agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]),
    }
    | prompt
    | llm_with_tools
    | OpenAIToolsAgentOutputParser()
)

測試代理

最後,我們可以測試代理了。為此,我們需要建立一個 AgentExecutor 來與代理互動。

from langchain.agents import AgentExecutor

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

list(agent_executor.stream({"input": "單詞 'first' 有多少個字母"}))

這將輸出類別似於以下的結果:

進入新的 AgentExecutor 鏈… 呼叫:get_word_length with {'word': 'first'} 5 單詞 “first” 有 5 個字母。 鏈結完成。

內容解密:

上述程式碼展示瞭如何建立一個智慧代理,該代理可以使用工具來回答使用者的問題。代理首先定義工具列表,然後建立提示和語言模型。接下來,代理建立一個 AgentExecutor 來與使用者互動。當使用者輸入問題時,代理使用工具來計算答案,並將結果輸出給使用者。

圖表翻譯:

以下是代理工作流程的 Plantuml 圖表:

這個圖表展示了代理如何接收使用者輸入,呼叫工具計算答案,並將結果輸出給使用者。

建立記憶力強大的對話機器人

要讓你的機器人記住之前的互動並進行更自然的對話,你需要在提示中新增一個聊天記錄的佔位符。

首先,定義一個聊天記錄的鍵:

MEMORY_KEY = "chat_history"

然後,建立一個提示範本,包含聊天記錄的佔位符:

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一個非常強大的助手,但不擅長計算單詞的長度。"),
        MessagesPlaceholder(variable_name=MEMORY_KEY),
        ("user", "{input}"),
        MessagesPlaceholder(variable_name="agent_scratchpad"),
    ]
)

接下來,建立一個列表來跟蹤聊天記錄:

chat_history = []

更新你的機器人和 AgentExecutor,以包含聊天記錄:

agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]),
        "chat_history": lambda x: x["chat_history"],
    }
    | prompt
    | llm_with_tools
    | OpenAIToolsAgentOutputParser()
)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

現在,當你與你的機器人互動時,跟蹤輸入和輸出作為聊天記錄:

input1 = "第一個單詞有多少個字母?"
result = agent_executor.invoke({"input": input1, "chat_history": chat_history})
chat_history.extend(
    [
        HumanMessage(content=input1),
        AIMessage(content=result["output"]),
    ]
)
agent_executor.invoke({"input": "那是真的嗎?", "chat_history": chat_history})

你的機器人現在可以進行回合對話,記住之前的互動並提供有關聯的回應。

實際應用案例:客戶支援自動化

在這個部分,我們將探討如何使用機器人來自動化和簡化你的客戶支援流程。如果你有一個業務,客戶基數不斷增長,你想提供頂級的支援而不會讓你的團隊不堪重負,這個案例可以幫助你。建立一個自助支援系統,可以高效地處理常見的客戶詢問。

以下是流程中的步驟:

  1. 識別常見客戶詢問:分析你的客戶支援資料,以識別最常見的問題和詢問。
  2. 分類別詢問:將這些詢問分類別為不同的主題或類別,例如產品資訊、故障排除、計費等。

內容解密:

上述程式碼使用了 LangChain 的 ChatPromptTemplate 來建立一個提示範本,包含聊天記錄的佔位符。MessagesPlaceholder 函式用於建立佔位符,variable_name 引數指定了佔位符的名稱。在更新機器人和 AgentExecutor 時,我們使用了 lambda 函式來定義輸入、代理記錄和聊天記錄的處理邏輯。

圖表翻譯:

此圖表展示了建立記憶力強大的對話機器人的流程,從建立聊天記錄佔位符到跟蹤輸入和輸出作為聊天記錄。

建立知識函式庫

為了提供高效的客戶支援,首先需要建立一個全面且有組織的知識函式庫。這個知識函式庫應該涵蓋所有已經確定的主題,並提供清晰、簡潔的答案給常見的問題。知識函式庫可以以 FAQ 頁面、產品檔案或故障排除等結構化格式來組織。

設定代理

使用 LangChain 代理框架來建立客戶支援自動化系統。首先,需要安裝和匯入必要的函式庫:

%pip install --upgrade --quiet langchain-openai tavily-python langchain_community langchain_openai

然後,從 LangChain 函式庫中匯入必要的模組:

from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

定義工具和記憶

建立工具,允許代理存取和檢索知識函式庫中的資訊:

def search_knowledge_base(query):
    # 實作邏輯來搜尋知識函式庫根據查詢
    # 傳回最相關的答案或資訊
    pass

tools = [
    Tool(
        name="知識函式庫搜尋",
        func=search_knowledge_base,
        description="用於搜尋知識函式庫以回答客戶詢問。"
    )
]

設定一個記憶體物件來儲存對話歷史:

memory = ConversationBufferMemory(memory_key="chat_history")

初始化代理

初始化代理,傳入工具和記憶體:

agent = initialize_agent(
    tools,
    OpenAI(temperature=0),
    agent="conversational-react-description",
    verbose=True,
    memory=memory
)

整合代理到客戶支援通路

實作一個使用者介面,例如聊天機器人或網頁表單,讓客戶可以與代理互動。使用代理來處理來自客戶的詢問:

def handle_inquiry(inquiry):
    response = agent.run(inquiry)
    return response

# 示例用法
customer_inquiry = "如何重置我的帳戶密碼?"

內容解密:

在上述程式碼中,我們定義了一個search_knowledge_base函式,用於搜尋知識函式庫以回答客戶詢問。然後,我們建立了一個Tool物件,將這個函式包裝成一個工具,供代理使用。代理透過這個工具可以存取知識函式庫中的資訊。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title LangChain打造自訂代理與應用

package "LangChain 代理架構" {
    package "核心元件" {
        component [ChatOpenAI LLM] as llm
        component [自訂工具 Tools] as tools
        component [提示範本 Prompt] as prompt
    }

    package "代理機制" {
        component [Agent 初始化] as init
        component [記憶機制 Memory] as mem
        component [推理引擎] as reason
    }

    package "應用場景" {
        component [客戶支援自動化] as support
        component [個人化推薦] as rec
        component [實時資料分析] as realtime
    }
}

llm --> init : 語言模型
tools --> init : 工具繫結
prompt --> init : 行為引導
init --> reason : 代理實例
mem --> reason : 對話歷史
reason --> support : 問答處理
reason --> rec : 智能推薦
reason --> realtime : 決策支援

note right of mem : 記錄過往互動\n自然對話流程
note right of support : 知識庫整合\n常見問題處理

@enduml

此圖表展示了客戶支援自動化系統的工作流程。客戶提出詢問,代理接收並搜尋知識函式庫以找到答案,然後傳回答案給客戶。

從技術架構視角來看,本章深入探討瞭如何利用 LangChain 框架構建自訂代理,涵蓋了從載入語言模型、定義工具、設計提示到整合記憶體等關鍵環節。文章清晰地展示了代理的工作流程,並透過實際案例闡述了其在客戶支援自動化等領域的應用價值。然而,目前提供的知識函式庫搜尋功能僅為示意性程式碼,缺乏具體的實作細節。在實際應用中,需要根據具體的知識函式庫格式和查詢需求,選擇合適的搜尋策略和演算法,例如向量資料函式庫搜尋或根據關鍵字的全文檢索,才能確保代理有效地從知識函式庫中提取所需資訊。此外,文章雖提及了個人化推薦和實時資料分析等應用場景,但並未提供具體的實作範例,這限制了讀者對代理功能的全面理解。展望未來,隨著大語言模型和工具生態的持續發展,預計 LangChain 代理將在更廣泛的領域發揮作用,例如自動化工作流程、知識問答系統以及智慧型個人助理等。對於開發者而言,深入理解 LangChain 框架的運作機制,並掌握如何根據特定需求設計和最佳化代理,將成為釋放其巨大潛力的關鍵。玄貓認為,LangChain 代理代表了未來人機互動的重要發展方向,值得技術團隊投入更多資源進行研究和探索。