Pandas-ai + Fastapi-mcp,自己動(dòng)手搭建AI數(shù)據(jù)分析服務(wù),效果不比大廠差 原創(chuàng)
大家好,我是九歌。今天我們聊一聊使用大模型進(jìn)行數(shù)據(jù)分析。
AI數(shù)據(jù)分析作為大模型應(yīng)用的剛需,在各大平臺(tái)上的表現(xiàn)卻大相徑庭。阿里百煉的析言、ChatGPT、商湯的小浣熊、豆包,用了一圈,發(fā)現(xiàn)能打的只有豆包。但是豆包只提供大模型接口,AI數(shù)據(jù)分析卻沒(méi)有對(duì)應(yīng)的接口。
首先定義一下“AI數(shù)據(jù)分析”,本文所說(shuō)的AI數(shù)據(jù)分析,專(zhuān)指大模型對(duì)數(shù)據(jù)表格的處理能力,默認(rèn)數(shù)據(jù)超過(guò)2000行!
2000行的表格直接喂給大模型讓其分析,可想而知,這是多么不現(xiàn)實(shí)的一件事情,更不要說(shuō)是讓大模型對(duì)表格中的某行或某列進(jìn)行精準(zhǔn)的函數(shù)計(jì)算了。
目前各大平臺(tái)使用的解決方案,基本一致,主要是下面幾個(gè)步驟:
1.命令大模型對(duì)上傳的Excel文件,生成Python代碼,讀取表頭和表格前幾行數(shù)據(jù)
2.將讀取后的數(shù)據(jù)與用戶的需求再重新提交給大模型
3.大模型根據(jù)需求生成Pandas或者SQL代碼,對(duì)數(shù)據(jù)進(jìn)行操作
4.在沙箱中執(zhí)行數(shù)據(jù)處理代碼,判斷是否處理成功
5.若處理成功,將處理后的表格路徑返回
6.若處理失敗,將錯(cuò)誤信息一并交給大模型,重新生成
按理說(shuō)上面的過(guò)程看起來(lái)好像一點(diǎn)不麻煩,于是我自信滿滿的想要智能體工作流實(shí)現(xiàn)一個(gè),但是很快被打臉了。遇到稍微復(fù)雜點(diǎn)的數(shù)據(jù)分析需求,工作流陷入死循環(huán),一直報(bào)錯(cuò)!
本著不能重復(fù)造輪子的心態(tài),我開(kāi)始在Github上找AI數(shù)據(jù)分析相關(guān)的開(kāi)源項(xiàng)目。功夫不負(fù)想偷懶的人,終于發(fā)現(xiàn)了一個(gè)將近2萬(wàn)star的項(xiàng)目——Pandas-ai!
Pandas是Python中數(shù)據(jù)分析必用的庫(kù)!然后給ai賦能了!還這么多人星標(biāo)了!
激動(dòng)的心怦怦跳,顫抖的小手搓起來(lái),讓我們一塊體驗(yàn)一下吧!
安裝篇
Pandas-ai 已經(jīng)做成了Python庫(kù),所以我們直接安裝使用就行,簡(jiǎn)直不要太方便。我們通過(guò)以下命令即可完成Python環(huán)境搭建和Pandas-ai庫(kù)的安裝。
#創(chuàng)建虛擬環(huán)境
python -m venv .venv
#激活環(huán)境
.\.venv\Scripts\activate
#安裝Pandas-ai
pip install pandasai -i https://pypi.tuna.tsinghua.edu.cn/simple
配置篇
將Pandas-ai的github庫(kù),下載到本地,在項(xiàng)目文件夾中找到pandas-ai\examples\use_openai_llm.ipynb 這個(gè)文件,并打開(kāi)。
https://github.com/sinaptik-ai/pandas-ai.git
這個(gè)文件中,告訴我們,如何配置OpenAI大模型的api_token,從而用Pandas-ai的 df.chat方法。我們只需要學(xué)會(huì)這一種使用方法就可以了。我們需要使用以下命令,額外安裝 pandasai-openai庫(kù)。
pip install pandasai-openai -i https://pypi.tuna.tsinghua.edu.cn/simple
然后再下方的命令中填入OpenAI的api_token。Pandas-ai目前支持的大模型有限,首選OpenAI
import pandasai as pai
from pandasai_openai import OpenAI
#我修改成了opentourer的token
llm = OpenAI(api_token="your_api_token")
問(wèn)題來(lái)了,我沒(méi)有OpenAI的api_token,但是我有OpenRouter的token,可以調(diào)用GPT-4o等模型。于是我找到pandasai-openai庫(kù)的源文件base.py和openai.py,修改OpenAI的URL為OpenRouter的URL,并將默認(rèn)模型設(shè)置為GPT-4o
# .venv\Lib\site-packages\pandasai_openai\base.py
api_base: str = "https://openrouter.ai/api/v1"
#.venv\Lib\site-packages\pandasai_openai\openai.py
model: str = "gpt-4o"
在use_openai_llm.ipynb中,將api_token設(shè)置為openrouter的token,然后執(zhí)行每一個(gè)單元格,查看是否輸出為下方的正確信息。此處我直接使用Trae編輯器,配置了Jupyter的內(nèi)核環(huán)境,按照提示安裝相應(yīng)的包之后,就可以直接執(zhí)行ipynb文件。
如果你最后能夠順利執(zhí)行 df.chat()函數(shù),能夠?qū)esponse打印出值來(lái),恭喜你配置成功了!
進(jìn)階篇
我們來(lái)看一下Pandas-ai的工作原理,非常簡(jiǎn)單!
第一步,引入Pandas-ai庫(kù),更換別名為pai,并初始化大模型!
import pandasai as pai
from pandasai_openai import OpenAI
#填寫(xiě)token
llm = OpenAI(api_token="your token")
第二步,指定需要處理的文件路徑,然后輸入數(shù)據(jù)分析需求就可以了!返回信息都存儲(chǔ)在response變量中,你只需要將其直接打印或者保存成其他文件就可以了!
#文件路徑
df = pai.read_csv("./data/heart.csv")
#發(fā)送需求
response = df.chat("What is the correlation between age and cholesterol?")
你可以在Jupyter的變量面板查看當(dāng)前所有變量屬性!偷偷告訴你,如果response 的Type屬性是DataFrameResponse,你直接可以使用pandas的函數(shù)操作,把response再保存成各種你想要的格式!
import pandas as pd
df2 = pd.DataFrame(response.value)
df2.to_csv("./data/result3.csv",index=False)
如果你再細(xì)心點(diǎn),你會(huì)發(fā)現(xiàn)當(dāng)前文件夾根路徑下面多了個(gè)pandasai.log文件。恭喜你,發(fā)現(xiàn)了新大陸,pandas-ai在和大模型交流過(guò)程的請(qǐng)求和生成代碼執(zhí)行情況以及錯(cuò)誤情況,你都可以在這個(gè)文件看見(jiàn)了!
對(duì)了,為了降低bug次數(shù),請(qǐng)將所有的數(shù)據(jù)文件,全部轉(zhuǎn)成UTF-8格式的CSV文件后,再使用pandas-ai進(jìn)行處理!
接口篇
Pandas-ai 在我們自己的電腦上已經(jīng)成功跑起來(lái)了!如果我們想把這個(gè)服務(wù)分享出去,就需要開(kāi)發(fā)接口了。我們已經(jīng)有了基礎(chǔ)功能,直接使用FastAPI編寫(xiě)接口就可以了。因?yàn)槲恼缕邢?,全部接口代碼請(qǐng)?jiān)谖哪┱f(shuō)明中獲取。
接口我主要加了一個(gè)判斷處理,如果response數(shù)據(jù)長(zhǎng)度超過(guò)1000,直接保存為csv文件,并返回在線下載地址;如果未超過(guò)1000,則將response內(nèi)容直接通過(guò)接口返回。
我們來(lái)測(cè)試一下接口是否能正常工作!這里依然使用Pandas-ai提供的測(cè)試表格 ./data/heart.csv。
pandas-ai很快給出了正確結(jié)果,Age列的平均年齡為53.5108。我們用WPS打開(kāi)heart.csv看一下結(jié)果,發(fā)現(xiàn)完全正確!
MCP篇
現(xiàn)在接口有了,當(dāng)然接口也不是很完善,讀取的依然是本地文件路徑或者在線URL路徑。這段時(shí)間MCP非?;?,我們?cè)侔焉厦娴慕涌谟肕CP協(xié)議封裝一層,看看能不能放在MCP客戶端里面直接調(diào)用!
萬(wàn)幸Github上有個(gè)項(xiàng)目FastAPI-MCP,可以很容易就能將fastapi接口轉(zhuǎn)成支持MCP協(xié)議的服務(wù)。我們安裝項(xiàng)目文檔,直接上手使用!只需要將fastapi對(duì)象,再用FastApiMCP封裝一下就可以了!接口中,一定帶上operation_id,不然客戶端找不到工具名。
#安裝
pip install fastapi-mcp -i https://pypi.tuna.tsinghua.edu.cn/simple
#使用
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
##原有接口
@app.post("/process-attendance/",operation_id="data_analysis")
#省略代碼
##
app = FastAPI()
mcp = FastApiMCP(app)
# Mount the MCP server directly to your FastAPI appmcp.mount()
mcp.mount()
我們重新啟動(dòng)接口文件,訪問(wèn)localhost:8989/mcp,發(fā)現(xiàn)如下信息,說(shuō)明服務(wù)啟動(dòng)成功!
打開(kāi)AI編輯器 Trae,手動(dòng)添加MCP Server ,配置文件如下(使用時(shí)請(qǐng)換成自己的路徑):
我們創(chuàng)建一個(gè)智能體:數(shù)據(jù)分析師,然后調(diào)用這個(gè)智能體,看一下數(shù)據(jù)分析MCP的效果吧。
#智能體輸入問(wèn)題
D:\JiugeCode\Projects2025\pandasai\pandas-ai-2\pandas-ai\examples\data\heart.csv
表格Age列的平均值是多少
大功告成了!
本文轉(zhuǎn)載自??九歌AI大模型?? 作者:九歌AI
