PandasAI連接LLM進(jìn)行智能數(shù)據(jù)分析的示例詳解
1. 引言
Pandas是一個(gè)數(shù)據(jù)分析開(kāi)源組件庫(kù),提供了高性能、易用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具。它的核心的功能是其DataFrame對(duì)象,這是一個(gè)帶有行和列標(biāo)簽的二維表格數(shù)據(jù)結(jié)構(gòu),支持缺失數(shù)據(jù)處理、時(shí)間序列功能、靈活的數(shù)據(jù)輸入輸出方法、數(shù)據(jù)對(duì)齊和分組操作等特性。
PandasAI則通過(guò)結(jié)合Pandas和生成式AI技術(shù),使用戶能夠以自然語(yǔ)言與數(shù)據(jù)進(jìn)行交互,從而簡(jiǎn)化數(shù)據(jù)分析流程。它的核心目標(biāo)是讓數(shù)據(jù)分析變得更直觀、高效,甚至無(wú)需編寫(xiě)復(fù)雜代碼即可完成數(shù)據(jù)查詢(xún)、清洗、可視化等任務(wù)。
2. 詳述
Pandas進(jìn)行數(shù)據(jù)分析的流程筆者不是很熟練,這里重點(diǎn)關(guān)注一個(gè)問(wèn)題就是PandasAI如何連接現(xiàn)有的大模型比如DeepSeek來(lái)進(jìn)行智能數(shù)據(jù)分析。
由于經(jīng)驗(yàn)不足,筆者在測(cè)試PandasAI的時(shí)候,將相關(guān)的組件都安裝在默認(rèn)全局的Python環(huán)境中了,導(dǎo)致版本有點(diǎn)低,使用的是v2版本?,F(xiàn)在普通推薦使用Anaconda這樣的工具安裝虛擬環(huán)境來(lái)進(jìn)行Python的依賴(lài)管理。不過(guò)根據(jù)PandasAI官網(wǎng)文檔[1]提示,PandasAI 3.0仍然是beta版本,并且推薦使用Poetry管理Python依賴(lài)。所以這里筆者也就沒(méi)有想升級(jí)到3.0,暫時(shí)先用穩(wěn)定一定的2.X版本。
解決掉PandasAI 2.X的版本依賴(lài)問(wèn)題之后,通過(guò)PandasAI連接DeepSeek進(jìn)行智能數(shù)據(jù)分析的案例代碼實(shí)現(xiàn)如下:
import pandas as pd
from pandasai import SmartDataframe
from pandasai.llm.base import LLM
import requests
# 自定義DeepSeek大模型
class DeepSeekLLM(LLM):
def __init__(self, api_url:str, api_key: str, model: str):
super().__init__()
self.api_url = api_url
self.api_key = api_key
self.model = model
def call(self, instruction, context: dict = None, **kwargs) -> str:
"""
PandasAI 用來(lái)向 LLM 模型發(fā)起請(qǐng)求的接口入口。
Args:
instruction (str): PandasAI 傳入的 prompt,可能是 string 或自定義對(duì)象,表示用戶的問(wèn)題。
context (dict, optional): 包含上下文信息(例如 DataFrame 元數(shù)據(jù)等),在部分 LLM 中可用。
**kwargs: 保留接口向前兼容(比如未來(lái)增加其他參數(shù)時(shí)也能傳入)。
Returns:
str: 執(zhí)行指令后的結(jié)果輸出。
"""
# 把復(fù)雜的 Prompt 對(duì)象變成字符串
if not isinstance(instruction, str):
instruction = str(instruction)
# 請(qǐng)求頭
headers = {
"Authorization": f"Bearer {self.api_key}", # DeepSeek身份驗(yàn)證
"Content-Type": "application/json"
}
# 兼容 OpenAI 的 Chat Completion API的對(duì)話消息格式
messages = [
{
"role": "system", # 設(shè)定 LLM 的行為
"content": "You are a helpful AI assistant for data analysis."
},
{
"role": "user", # 是實(shí)際的問(wèn)題
"content": instruction
}
]
# 請(qǐng)求體
payload = {
"model": self.model,
"messages": messages,
"temperature": 0.0 # 值越低,回答的效果越穩(wěn)定
}
# 發(fā)送post請(qǐng)求
response = requests.post(self.api_url, headers=headers, json=payload)
# 檢查返回狀態(tài)碼,如果不是 200 則報(bào)錯(cuò)。
if response.status_code != 200:
raise Exception(f"DeepSeek API Error: {response.status_code}, {response.text}")
# 解析返回結(jié)果
result = response.json()
return result["choices"][0]["message"]["content"]
@property
def type(self):
return "deepseek-custom"
# Sample DataFrame
sales_by_country = pd.DataFrame({
"country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
"sales": [5000, 3200, 2900, 4100, 2300, 2100, 2500, 2600, 4500, 7000]
})
# 用自定義的 DeepSeek LLM
llm = DeepSeekLLM(
api_url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
api_key="sk-xxx",
model="deepseek-r1")
df = SmartDataframe(sales_by_country, config={"llm": llm})
result = df.chat('列出銷(xiāo)售額最高的3個(gè)國(guó)家。')
print(result)
如代碼所示,關(guān)鍵的所在是需要自定義一個(gè)繼承自LLM的能夠連接DeepSeek的類(lèi)DeepSeekLLM。其實(shí)PandasAI 2.X是可以使用提供了支持使用OpenAI的接口的,而連接DeepSeek的接口一般會(huì)兼容OpenAI。但是筆者嘗試了之后不行,不能傳入自定義的LLM地址。沒(méi)辦法只能自己自定義一個(gè)繼承自LLM的DeepSeekLLM類(lèi)。
DeepSeekLLM類(lèi)的關(guān)鍵就是call函數(shù)的實(shí)現(xiàn),這是PandasAI用來(lái)向LLM模型發(fā)起請(qǐng)求的接口的入口。在這個(gè)函數(shù)實(shí)現(xiàn)中的關(guān)鍵就是通過(guò)兼容OpenAI的Chat API向自定義的DeepSeek服務(wù)發(fā)起post請(qǐng)求,具體的細(xì)節(jié)筆者已經(jīng)在代碼中進(jìn)行注釋?zhuān)硗庖部梢圆殚哋penAI API的相關(guān)文檔。這里的實(shí)現(xiàn)并沒(méi)有像文末連接語(yǔ)言大模型(LLM)服務(wù)進(jìn)行對(duì)話中一樣使用openai模塊或者LangChain框架,而是直接使用requests來(lái)發(fā)送HTTP請(qǐng)求,顯得更加底層一點(diǎn),不過(guò)原理都差不多。
最終運(yùn)行的結(jié)果如下所示:
country sales
0 China 7000
0 China 7000
1 United States 5000
2 Japan 4500
3.連接語(yǔ)言大模型(LLM)服務(wù)進(jìn)行對(duì)話
最近開(kāi)始接觸AI大模型方向的工作,第一個(gè)實(shí)例就嘗試一下連接大模型進(jìn)行對(duì)話的實(shí)現(xiàn)。
openai模塊
要實(shí)現(xiàn)這個(gè)功能很簡(jiǎn)單,直接翻各大模型平臺(tái)的給的API案例一般都可以實(shí)現(xiàn),例如筆者這里使用的阿里云的百煉平臺(tái)給出的API:
from openai import OpenAI
client = OpenAI(
# 使用大模型對(duì)應(yīng)的Key
api_key = "sk-xxx",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
completion = client.chat.completions.create(
model="deepseek-r1", # 此處以 deepseek-r1 為例,可按需更換模型名稱(chēng)。
messages=[
{'role': 'user', 'content': '想快速入門(mén)AI大模型,給我推薦一下具體的學(xué)習(xí)方案。'}
]
)
# 通過(guò)reasoning_content字段打印思考過(guò)程
print("思考過(guò)程:")
print(completion.choices[0].message.reasoning_content)
# 通過(guò)content字段打印最終答案
print("最終答案:")
print(completion.choices[0].message.content)
我這里使用的大模型是deepseek,但是使用的是openai模塊。這是因?yàn)楝F(xiàn)在的大模型服務(wù)基本都兼容OpenAI API標(biāo)準(zhǔn)的接口,因此可以通過(guò)設(shè)置不同的base_url和api_key來(lái)使用相同的openai Python客戶端庫(kù)進(jìn)行訪問(wèn)。這也是為啥現(xiàn)在大模型平臺(tái)都可以選擇接入不同的大模型來(lái)實(shí)現(xiàn)AI應(yīng)用。
除了Python接口,阿里云百煉平臺(tái)還提供了Node.js和HTTP的接入方式,理論上可以前端、后端、移動(dòng)端以及桌面端都可以連入大模型來(lái)實(shí)現(xiàn)自己的AI應(yīng)用。messages=[{'role': 'user', 'content': '想快速入門(mén)AI大模型,給我推薦一下具體的學(xué)習(xí)方案。'}]就是大模型的提示詞,通過(guò)更改提示詞,可以與大模型對(duì)話來(lái)得到自己想要的結(jié)果。
LangChain
除了使用openai模塊,使用LangChain是個(gè)更好的選擇。LangChain是一個(gè)構(gòu)建于大型語(yǔ)言模型(LLMs)之上的框架,提供了一系列的工具和接口來(lái)簡(jiǎn)化與這些模型交互的過(guò)程。如下所示:
# 初始化模型
chat = ChatOpenAI(
model_name="deepseek-r1",
temperature=0,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", #服務(wù)地址
api_key="sk-xxx" #API密鑰
)
# 發(fā)送請(qǐng)求
response = chat.invoke([HumanMessage(content="請(qǐng)用中文介紹你自己。")])
# 輸出結(jié)果
print(response.content)
為什么說(shuō)LangChain更好用一點(diǎn)呢,比如說(shuō)你要執(zhí)行批量任務(wù),對(duì)一些文本進(jìn)行多標(biāo)簽分類(lèi),那么可能需要進(jìn)行批量提問(wèn)以提升效率。在這方面LangChain提供了batch接口:
from langchain_openai import ChatOpenAI
llm_client = ChatOpenAI(
temperature=0.0,
model_name="deepseek-r1",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-852da921b11545c99de697e584210fc7"
)
# 假設(shè)你的多標(biāo)簽集合如下:
total_class = {"正面", "負(fù)面", "價(jià)格問(wèn)題", "物流問(wèn)題", "推薦", "外觀設(shè)計(jì)", "用戶體驗(yàn)"}
# 系統(tǒng)提示詞
system_prompt = """你是一個(gè)多標(biāo)簽分類(lèi)助手,請(qǐng)從以下標(biāo)簽中選出適用于文本的所有標(biāo)簽(可以多選):
正面, 負(fù)面, 價(jià)格問(wèn)題, 物流問(wèn)題, 推薦, 外觀設(shè)計(jì), 用戶體驗(yàn)
只輸出標(biāo)簽,多個(gè)標(biāo)簽之間用英文逗號(hào)分隔。如果無(wú)法判斷,則返回空字符串。
"""
def llm_labeling(texts: list[str]) -> list[list[str]]:
"""
對(duì)輸入文本列表進(jìn)行多標(biāo)簽打標(biāo),返回每條文本對(duì)應(yīng)的標(biāo)簽列表。
"""
results = []
batch_inputs = [system_prompt + '\n' + t for t in texts]
res = llm_client.batch(batch_inputs)
for item in res:
content = item.content.strip()
if not content:
results.append([])
continue
# 解析逗號(hào)分隔標(biāo)簽,清洗一下
tags = [t.strip() for t in content.split(',')]
# 只保留在 total_class 中的合法標(biāo)簽
tags = [t for t in tags if t in total_class]
results.append(tags)
return results
texts = [
"這個(gè)產(chǎn)品非常好用,值得推薦",
"物流速度太慢了,體驗(yàn)不好",
"外觀漂亮,使用方便,就是價(jià)格稍貴"
]
result = llm_labeling(texts)
for i, tags in enumerate(result):
print(f"第{i+1}條: 標(biāo)簽 = 運(yùn)行結(jié)果如下:
第1條: 標(biāo)簽 = ['正面', '推薦', '用戶體驗(yàn)']
第2條: 標(biāo)簽 = ['負(fù)面', '物流問(wèn)題', '用戶體驗(yàn)']
第3條: 標(biāo)簽 = ['正面', '外觀設(shè)計(jì)', '用戶體驗(yàn)', '價(jià)格問(wèn)題']
其實(shí)deepseek不一定真的支持批量提問(wèn)的接口,即使真的不支持,LangChain為我們提供了抽象層,在內(nèi)部進(jìn)行并發(fā)處理。當(dāng)然,如果有的大模型提供batch接口,LangChain就會(huì)直接調(diào)用它。
其他
在阿里的百煉平臺(tái)上還提供了“多輪對(duì)話”和“流式輸出”的使用方式。這兩種方式是構(gòu)建AI Chat應(yīng)用必須的。“多輪對(duì)話”就是需要讓大模型記住之前的對(duì)話內(nèi)容,也就是上下文,以便得到更好的輸出;“流式輸出”則是讓大模型的回答逐步漸進(jìn)的輸出,一個(gè)字一個(gè)字的呈現(xiàn),以便讓AI Chat應(yīng)用的交互性更好。不過(guò)筆者暫時(shí)不關(guān)心這個(gè),以后有機(jī)會(huì)再試用一下。
到此這篇關(guān)于PandasAI連接LLM進(jìn)行智能數(shù)據(jù)分析的示例詳解的文章就介紹到這了,更多相關(guān)PandasAI LLM進(jìn)行數(shù)據(jù)分析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解numpy.ndarray.reshape()函數(shù)的參數(shù)問(wèn)題
這篇文章主要介紹了詳解numpy.ndarray.reshape()函數(shù)的參數(shù)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Django項(xiàng)目如何配置Memcached和Redis緩存?選擇哪個(gè)更有優(yōu)勢(shì)?
這篇文章主要介紹了Django項(xiàng)目如何配置Memcached和Redis緩存,幫助大家更好的理解和學(xué)習(xí)使用django框架,感興趣的朋友可以了解下2021-04-04
如何使用 Python 讀取 Excel 數(shù)據(jù)
這篇文章主要介紹了使用 Python 讀取 Excel 數(shù)據(jù)的詳細(xì)教程,通過(guò) pandas 和 openpyxl,你可以輕松讀取 Excel 文件,并進(jìn)行各種數(shù)據(jù)處理操作,pandas 更適合快速、簡(jiǎn)單的數(shù)據(jù)分析,而 openpyxl 則適合需要對(duì) Excel 文件進(jìn)行更深入控制的場(chǎng)景,需要的朋友可以參考下2025-04-04
request基本使用及各種請(qǐng)求方式參數(shù)的示例
這篇文章主要為大家介紹了request的基本使用及各種請(qǐng)求方式參數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Python http接口自動(dòng)化測(cè)試框架實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python http接口自動(dòng)化測(cè)試框架實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python針對(duì)http接口測(cè)試的相關(guān)實(shí)現(xiàn)與使用操作技巧,需要的朋友可以參考下2018-12-12

