基于Langchain框架的Agent智能體實(shí)現(xiàn)之工具集成 原創(chuàng)
“ 工具調(diào)用是大模型智能體的核心理念,沒(méi)有工具就沒(méi)有智能體的存在。”
智能體開(kāi)發(fā)是大模型應(yīng)用中一個(gè)重要的概念,也是大模型應(yīng)用的未來(lái);而關(guān)于智能體的開(kāi)發(fā)有各種各樣的概念,但核心無(wú)非有兩個(gè)一個(gè)是函數(shù)調(diào)用,另一個(gè)就是工具的實(shí)現(xiàn)。
關(guān)于函數(shù)調(diào)用有兩種方式,其一是之前的function call,其二是現(xiàn)在比較火的MCP協(xié)議;不管是fc還是MCP目的都是讓大模型能夠調(diào)用外部的工具來(lái)實(shí)現(xiàn)具體的功能。而今天我們主要介紹的就是基于Langchain框架來(lái)實(shí)現(xiàn)各種工具。
基于Langchain的工具開(kāi)發(fā)
在智能體開(kāi)發(fā)中,工具是一個(gè)很重要的概念,操作數(shù)據(jù)庫(kù)需要數(shù)據(jù)庫(kù)工具,訪問(wèn)搜索引擎需要搜索工具等等;可以說(shuō)在智能體中所有的外部調(diào)用都是以工具的形式來(lái)體現(xiàn)的。
而在實(shí)際的開(kāi)發(fā)過(guò)程中,工具主要是以函數(shù)和服務(wù)的形式出現(xiàn);比如說(shuō)定義一個(gè)訪問(wèn)搜索引擎的工具,只需要封裝一個(gè)函數(shù);讓大模型自己去生成函數(shù)需要的參數(shù),最后再交給python引擎執(zhí)行,然后獲取結(jié)果。
而在Langchain中提供了大量的封裝好的工具給我們使用,如下圖所示:
Langchain中集成和封裝了大量的工具供大家使用,可以滿足不同的業(yè)務(wù)場(chǎng)景,比如說(shuō)有搜索,代碼解釋器,數(shù)據(jù)庫(kù)訪問(wèn)等多種類型。
下面以基于pandas的智能數(shù)據(jù)分析為例,演示怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)單的excel數(shù)據(jù)分析。
首先需要安裝langchain相關(guān)的包
# 安裝包
pip install --upgrade langchain_openai pip install --upgrade langchain
langchain提供的操作pandas的函數(shù)主要是
create_pandas_dataframe_agent實(shí)例化pandas Agent
agent = create_pandas_dataframe_agent(self.llm, df_list, allow_dangerous_code=True, verbose=True)
完整代碼如下,當(dāng)然用戶也可以直接查看官方文檔自己手動(dòng)實(shí)現(xiàn)
文檔地址如下:
??https://python.langchain.ac.cn/docs/integrations/tools/pandas/??
import os
import logging
import pandas as pd
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent
from langchain_openai import ChatOpenAI,OpenAI
# 需要換成你自己的參數(shù)
openai_api_key = "api_key"
openai_api_base = "openai_url"
model = "model"
# Adjust logging levels for specific libraries to reduce noise
logging.getLogger("openai").setLevel(logging.DEBUG)
logging.getLogger("langchain").setLevel(logging.DEBUG)
logging.getLogger("httpx").setLevel(logging.DEBUG)
logging.getLogger("httpcore").setLevel(logging.DEBUG)
logger = logging.getLogger(__name__)
logging.basicConfig(
level=logging.INFO, # 設(shè)置日志級(jí)別為DEBUG
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 定義日志格式
datefmt='%Y-%m-%d %H:%M:%S' # 定義時(shí)間格式
)
class LangChainPandas:
def __init__(self, model, temperature=0.8):
os.environ['OPENAI_API_KEY'] = openai_api_key
os.environ['OPENAI_API_BASE'] = openai_api_base
# self.llm = ChatOpenAI(model_name=model, verbose=True, temperature=temperature)
self.llm = OpenAI(model_name=model, openai_api_base=openai_api_base, openai_api_key=openai_api_key, temperature=temperature)
def create_agent(self, path_list):
df_list = [pd.read_excel(path) for path in path_list]
agent = create_pandas_dataframe_agent(self.llm, df_list, allow_dangerous_code=True, verbose=True)
# agent = create_pandas_dataframe_agent(
# self.llm,
# df,
# verbose=True,
# allow_dangerous_code=True,
# agent_type=AgentType.OPENAI_FUNCTIONS,
# )
return agent
def chat(self, query, path_list):
agent = self.create_agent(path_list)
result = agent.invoke(query)
return result.get('output', "")
if __name__ == "__main__":
agent = LangChainPandas(model)
# excel文件路徑
path_list = ["path1", "path2"]
while True:
query = input("請(qǐng)輸入您的問(wèn)題: ")
result = agent.chat(query, path_list)
print(f"result: {result}")
?
本文轉(zhuǎn)載自??AI探索時(shí)代??? 作者:DFires
