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_agent
、ChatOpenAI
和AgentType
。
# 匯入相關套件:
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'."
內容解密:
- 匯入必要的模組:首先,我們需要匯入建立CSV代理所需的模組,包括
create_csv_agent
、ChatOpenAI
和AgentType
。 - 建立CSV代理:使用
create_csv_agent
函式建立一個CSV代理,指定使用的LLM、資料集檔案路徑和代理型別。 - 與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.'''
)
內容解密:
- 匯入必要的模組:匯入建立SQL資料函式庫代理所需的模組。
- 建立SQL資料函式庫代理:使用
create_sql_agent
函式建立一個SQL資料函式庫代理,指定使用的LLM、工具包和代理型別。 - 與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,
)
內容解密:
- 自定義字首:透過修改
SQL_PREFIX
變數,可以自定義SQL資料函式庫代理的字首提示範本。 - 應用自定義字首:在建立SQL資料函式庫代理時,傳入自定義的
SQL_PREFIX
。
在LCEL中建立自定義代理
使用LCEL可以輕鬆建立自定義代理。
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 建立聊天模型與工具
內容解密:
- 匯入必要的模組:匯入建立自定義代理所需的模組。
- 建立聊天模型與工具:使用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技術的不斷進步,我們可以預見以下幾個發展方向:
- 更強大的工具整合能力
- 更精準的上下文理解
- 更高效的記憶管理機制
- 更廣泛的行業應用場景
這些進展將進一步推動AI技術的發展,為各行各業帶來更多的創新機會。