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 架構圖

  graph LR;
    A[LangChain] --> B[CSV 代理];
    A --> C[SQL 資料函式庫代理];
    A --> D[自定義代理];
    B --> E[資料分析];
    C --> F[資料函式庫操作];
    D --> G[靈活擴充套件];

圖表翻譯: 此圖示展示了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技術的發展,為各行各業帶來更多的創新機會。