返回文章列表

LangChain代理構建與技術深度解析

本文探討 LangChain 代理的構建與應用,包含 CSV 代理、SQL 資料函式庫代理以及自定義代理的建立方法,並解析 LLM 的記憶機制及其在 Agent 技術中的應用。透過實際案例與程式碼,展示如何利用 LangChain 構建自主代理,提升資料處理和分析效率,並探討未來發展方向。

Web 開發 機器學習

LangChain 提供了便捷的工具和框架,讓開發者能輕鬆構建自主代理,處理複雜的資料任務。CSV 代理能有效地分析 CSV 檔案,進行資料量化、識別列名和建立相關矩陣等操作。SQL 資料函式庫代理則允許與 SQL 資料函式庫互動,執行查詢和操作資料函式庫。更進一步地,LangChain 支援自定義代理的建立,允許開發者根據自身需求調整代理行為,例如修改提示範本或限制 API 呼叫次數。這為構建更靈活、更具針對性的代理提供了可能性。透過整合 LLM 和各種工具,LangChain 代理能自動化執行多種任務,從而提升效率。

使用LangChain代理與工具建立自主代理

CSV代理的使用

CSV代理利用Pandas DataFrame代理和python_repl_ast工具來調查.csv檔案。您可以要求它量化資料、識別列名或建立相關矩陣。

建立CSV代理

首先,您需要在分享儲存函式庫的content/chapter_6中建立一個新的Jupyter Notebook或Python檔案。然後,您需要匯入create_csv_agentChatOpenAIAgentType

# 匯入相關套件:
from langchain.agents.agent_types import AgentType
from langchain_experimental.agents.agent_toolkits import create_csv_agent
from langchain_openai.chat_models import ChatOpenAI

# 建立CSV代理:
agent = create_csv_agent(
    ChatOpenAI(temperature=0),
    "data/heart_disease_uci.csv",
    verbose=True,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)

使用CSV代理

您可以透過呼叫agent.invoke()方法來與CSV代理互動,例如:

# 詢問資料行數
agent.invoke("How many rows of data are in the file?")
# '920'

# 詢問資料集中的列名
agent.invoke("What are the columns within the dataset?")
# "'id', 'age', 'sex', 'dataset', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalch', 'exang', 'oldpeak', 'slope', 'ca', 'thal', 'num'"

# 建立相關矩陣並儲存到檔案
agent.invoke("Create a correlation matrix for the data and save it to a file.")
# "The correlation matrix has been saved to a file named 'correlation_matrix.csv'."

內容解密:

  1. 匯入必要的模組:首先,我們需要匯入建立CSV代理所需的模組,包括create_csv_agentChatOpenAIAgentType
  2. 建立CSV代理:使用create_csv_agent函式建立一個CSV代理,指定使用的LLM、資料集檔案路徑和代理型別。
  3. 與CSV代理互動:透過呼叫agent.invoke()方法,可以詢問資料行數、列名,或要求建立相關矩陣。

SQL資料函式庫代理的使用

您也可以透過SQLDatabase代理與SQL資料函式庫互動。

建立SQL資料函式庫代理

from langchain.agents import create_sql_agent
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.agents.agent_types import AgentType
from langchain_openai.chat_models import ChatOpenAI

db = SQLDatabase.from_uri("sqlite:///./data/demo.db")
toolkit = SQLDatabaseToolkit(db=db, llm=ChatOpenAI(temperature=0))

# 建立代理執行器:
agent_executor = create_sql_agent(
    llm=ChatOpenAI(temperature=0),
    toolkit=toolkit,
    verbose=True,
    agent_type=AgentType.OPENAI_FUNCTIONS,
)

使用SQL資料函式庫代理

# 識別所有表格:
agent_executor.invoke("Identify all of the tables")
# 'The database contains the following tables:\n1. Orders\n2. Products\n3. Users'

# 新增新使用者到資料函式庫
user_sql = agent_executor.invoke(
    '''Add 5 new users to the database. Their names are: John, Mary, Peter, Paul, and Jane.'''
)

內容解密:

  1. 匯入必要的模組:匯入建立SQL資料函式庫代理所需的模組。
  2. 建立SQL資料函式庫代理:使用create_sql_agent函式建立一個SQL資料函式庫代理,指定使用的LLM、工具包和代理型別。
  3. 與SQL資料函式庫代理互動:透過呼叫agent_executor.invoke()方法,可以識別資料函式庫中的表格或執行SQL操作。

自定義標準代理

您可以透過修改create_sql_agent函式的引數來自定義LangChain代理,例如修改字首和字尾的提示範本,或限制API呼叫次數和計算成本。

SQL_PREFIX = """You are an agent designed to interact with a SQL database.
Given an input question, create a syntactically correct {dialect} query to run, 
then look at the results of the query and return the answer."""

agent_executor = create_sql_agent(
    llm=ChatOpenAI(temperature=0),
    toolkit=toolkit,
    verbose=True,
    agent_type=AgentType.OPENAI_FUNCTIONS,
    prefix=SQL_PREFIX,
)

內容解密:

  1. 自定義字首:透過修改SQL_PREFIX變數,可以自定義SQL資料函式庫代理的字首提示範本。
  2. 應用自定義字首:在建立SQL資料函式庫代理時,傳入自定義的SQL_PREFIX

在LCEL中建立自定義代理

使用LCEL可以輕鬆建立自定義代理。

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

# 建立聊天模型與工具

內容解密:

  1. 匯入必要的模組:匯入建立自定義代理所需的模組。
  2. 建立聊天模型與工具:使用LangChain提供的工具和聊天模型來建立自定義代理。
  • 探索更多LangChain的功能和工具,以實作更複雜的資料處理和分析任務。
  • 研究如何將LangChain的自主代理應用於實際業務場景中,提高工作效率和決策品質。
  • 開發更為先進的自定義代理,以滿足特定行業或領域的需求。

LangChain 架構圖

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title LangChain代理構建與技術深度解析

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

圖表翻譯: 此圖示展示了LangChain的主要組成部分,包括CSV代理、SQL資料函式庫代理和自定義代理。這些元件使得LangChain能夠支援多樣化的資料處理和分析任務,並且具有很高的靈活性。

LLM與Agent技術深度解析:從工具繫結到記憶機制

在人工智慧領域中,大語言模型(LLM)與Agent技術的結合正在革新多個行業的應用方式。本文將探討如何使用LangChain建立自定義Agent,並詳細解析其背後的技術原理與實作細節。

建立自定義Agent的技術流程

1. 模型建立與工具定義

首先,我們需要建立一個LLM例項並定義所需的工具函式。以下是一個計算單詞長度的工具範例:

from langchain_openai import ChatOpenAI

# 建立LLM例項
llm = ChatOpenAI(temperature=0)

@tool
def get_word_length(word: str) -> int:
    """傳回單詞的長度"""
    return len(word)

# 定義工具列表
tools = [get_word_length]

內容解密:

此段程式碼建立了一個ChatOpenAI例項,並定義了一個名為get_word_length的工具函式。該函式接受一個字串引數並傳回其長度。tools列表包含了所有可用的工具函式,供後續的Agent使用。

2. 提示詞範本設定

接下來,我們需要設定提示詞範本以引導Agent的行為:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# 建立提示詞範本
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一個強大的助手,但不擅長計算單詞長度。"),
    ("user", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
])

內容解密:

此範本包含了系統訊息、使用者輸入和一個用於存放Agent中間步驟的MessagesPlaceholder。系統訊息定義了Agent的基本角色和限制,而使用者輸入則是待處理的任務。

3. 工具繫結與Agent設定

為了使LLM能夠呼叫定義的工具,我們需要進行工具繫結:

from langchain_core.utils.function_calling import convert_to_openai_tool
from langchain.agents.format_scratchpad.openai_tools import format_to_openai_tool_messages

# 將工具轉換為OpenAI相容的格式並繫結到LLM
llm_with_tools = llm.bind_tools([convert_to_openai_tool(t) for t in tools])

內容解密:

這段程式碼將Python函式工具轉換為JSON Schema格式,使其相容於OpenAI的LLM。透過bind_tools方法,這些工具被繫結到LLM例項上,擴充套件了其功能。

4. Agent鏈設定

最後,我們需要設定Agent鏈來定義處理流程:

from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser

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

內容解密:

Agent鏈定義了從使用者輸入到最終輸出的整個處理流程。它首先處理使用者輸入並格式化中間步驟,然後透過提示詞範本引導LLM生成回應,最後使用輸出解析器處理結果。

Agent執行器與實際應用

建立Agent例項後,我們需要使用AgentExecutor來執行具體任務:

from langchain.agents import AgentExecutor

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

# 執行任務
result = agent_executor.invoke({"input": "單詞'Software'有多少個字母?"})

# 輸出結果
print(result)

內容解密:

AgentExecutor負責協調Agent和工具的使用,執行特定的任務並傳回結果。在這個例子中,它正確地計算出了"Software"這個單詞的字母數量。

LLM記憶機制解析

LLM的記憶機制是其能夠有效處理複雜任務的關鍵。主要分為長期記憶(LTM)和短期記憶(STM)兩種:

長期記憶(LTM)

長期記憶類別似於一個龐大的知識函式庫,儲存著大量的文字資料和概念框架。主要應用包括:

  • 向量資料函式庫:用於儲存非結構化文字資料,支援相似度搜尋。
  • 自我反思:允許LLM記錄和儲存其思考過程和洞察。
  • 自定義檢索器:透過特定的檢索函式提高LLM的效率。

短期記憶(STM)

短期記憶則類別似於一個臨時工作空間,用於儲存最近的互動資訊和正在進行的任務。主要應用包括:

  • 對話歷史:對於聊天機器人來說,跟蹤對話歷史至關重要。
  • 任務上下文:保持對當前任務的理解和上下文。

隨著LLM和Agent技術的不斷進步,我們可以預見以下幾個發展方向:

  1. 更強大的工具整合能力
  2. 更精準的上下文理解
  3. 更高效的記憶管理機制
  4. 更廣泛的行業應用場景

這些進展將進一步推動AI技術的發展,為各行各業帶來更多的創新機會。