开发者

PandasAI连接LLM进行智能数据分析的示例详解

开发者 https://www.devze.com 2025-08-05 09:27 出处:网络 作者: 人生海海
目录1. 引言2. 详述3.连接语言大模型(LLM)服务进行对话 openai模块LangChain其他1. 引言
目录
  • 1. 引言
  • 2. 详述
  • 3.连接语言大模型(LLM)服务进行对话 
    • openai模块
    • LangChain
    • 其他

1. 引言

Pandas是一个数据分析开源组件库,提供了高性能、易用的数据结构和数据分析工具。它的核心的功能是其DataFrame对象,这是一个带有行和列标签的二维表格数据结构,支持缺失数据处理、时间序列功能、灵活的数据输入输出方法、数据对齐和分组操作等特性。

PandasAI则通过结合Pandas和生成式AI技术,使用户能够以自然语言与数据进行交互,从而简化数据分析流程。它的核心目标是让数据分析变得更直观、高效,甚至无需编写复杂代码即可完成数据查询、清洗、可视化等任务。

2. 详述

Pandas进行数据分析的流程笔者不是很熟练,这里重点关注一个问题就是PandasAI如何连接现有的大模型比如DeepSeek来进行智能数据分析。

由于经验不足,笔者在测试PandasAI的时候,将相关的组件都安装在默认全局的python环境中了,导致版本有点低,使用的是v2版本。现在普通推荐使用Anaconda这样的工具安装虚拟环境来进行Python的依赖管理。不过根据PandasAI官网文档[1]提示,PandasAI 3.0仍然是b编程客栈eta版本,并且推荐使用Poetry管理Python依赖。所以这里笔者也就没有想升级到3.0,暂时先用稳定一定的2.X版本。

解决掉PandasAI 2.X的版本依赖问题之后,通过PandasAI连接DeepSeek进行智能数据分析的案例代码实现如下:

import pandas as pd
from pandasai import SmartDataframe
from pandasai.llm.base import LLM
import requests

# 自定义DeepSeek大模型
class DeepSeekLLM(LLM):
    def _javascript_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 用来向 LLM 模型发起请求的接口入口。

        Args:
            instruction (str): PandasAI 传入的 prompt,可能是 string 或自定义对象,表示用户的问题。
            context (dict, optional): 包含上下文信息(例如 DataFrame 元数据等),在部分 LLM 中可用。
            **kwargs: 保留接口向前兼容(比如未来增加其他参数时也能传入)。

        Returns:
            str: 执行指令后的结果输出。
        """

        # 把复杂的 Prompt 对象变成字符串
        if not isinstance(instruction, str):
            instruction = str(instruction)

        # 请求头
        headers = {
            "Authorization": f"Bearer {self.api_key}",   # DeepSeek身份验证
            "Content-Type": "application/json"
        }

        # 兼容 OpenAI 的 Chat Completion API的对话消息格式
        messages = [
            {
                "role": "system", # 设定 LLM 的行为
                "content": "You are a helpful AI assistant for data analysis."
            },
            {
                "role": "user",  # 是实际的问题
                "content": instruction
            }
        ]

        # 请求体
        payload = {
            "model": self.model,
            "messages": messages,
            "temperature": 0.0 # 值越低,回答的效果越稳定
        }

        # 发送post请求
        response = requests.post(self.api_url, headers=headers, json=payload)

        # 检查返回状态码,如果不是 200 则报错。
        if response.status_code != 200:
            raise Exception(f"DeepSeek API Error: {response.status_code}, {response.text}")

        # 解析返回结果
        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('列出销售额最高的3个国家。')

print(result)

如代码所示,关键的所在是需要自定义一个继承自LLM的能够连接DeepSeek的类DeepSeekLLM。其实PandasAI 2.X是可以使用提供了支持使用OpenAI的接口的,而连接DeepSeek的接口一般会兼容OpenAI。但是笔者尝试了之后不行,不能传入自定义的LLM地址。没办法只能自己自定义一个继承自LLMDeepSeekLLM类。

DeepSeekLLM类的关键就是call函数的实现,这是PandasAI用来向LLM模型发起请求的接口的入口。在这个函数实现中的关键就是通过兼容OpenAI的Chat API向自定义的DeepSeek服务发起post请求,具体的细节笔者已经在代码中进行注释,另外也可以查阅OpenAI API的相关文档。这里的实现并没有像文末连接语言大模型(LLM)服务进行对话中一样使用openai模块或者LangChain框架,而是直接使用requests来发送HTTP请求,显得更加底层一点,不过原理都差不多。

最终运行的结果如下所示:

country  sales

0          China   7000

0          China   7000

1  United Staphptes   5000

2          Japan   4500

3.连接语言大模型(LLM)服务进行对话 

最近开始接触AI大模型方向的工作,第一个实例就尝试一下连接大模型进行对话的实现。

openai模块

要实现这个功能很简单,直接翻各大模型平台的给的API案例一般都可以实现,例如笔者这里使用的阿里云的百炼平台给出的API:

from openai import OpenAI

client = OpenAI(
    # 使用大模型对应的Key
    api_key = "sk-xxx",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

completion = client.chat.completions.create(
    model="deepseek-r1",  # 此处以 deepseek-r1 为例,可按需更换模型名称。
    messages=[
        {'role': 'user', 'content': '想快速入门AI大模型,给我推荐一下具体的学习方案。'}
    ]
)

# 通过reasoning_content字段打印思考过程
print("思考过程:")
print(completion.choices[0].message.reasoning_content)

# 通过content字段打印最终答案
print("最终答案:")
print(completion.choices[0].message.content)

我这里使用的大模型是deepseek,但是使用的是openai模块。这是因为现在的大模型服务基本都兼容OpenAI API标准的接口,因此可以通过设置不同的base_url和api_key来使用相同的openai Python客户端库进行访问。这也是为啥现在大模型平台都可以选择接入不同的大模型来实现AI应用。

除了Python接口,阿里云百炼平台还提供了Node.js和HTTP的接入方式,理论上可以编程前端、后端、移动端以及桌面端都可以连入大模型来实现自己的AI应用。messages=[{'role': 'user', 'content': '想快速入门AI大模型,给我推荐一下具体的学习方案。'}]就是大模型的提示词,通过更改提示词,可以与大模型对话来得到自己想要的结果。

LangChain

除了使用openai模块,使用LangChain是个更好的选择。LangChain是一个构建于大型语言模型(LLMs)之上的框架,提供了一系列的工具和接口来简化与这些模型交互的过程。如下所示:

# 初始化模型
chat = ChatOpenAI(
    model_name="deepseek-r1",
    temperature=0,
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", #服务地址
    api_key="sk-xxx"  #API密钥
)

# 发送请求
response = chat.invoke([HumanMessage(content="请用中文介绍你自己。")])

# 输出结果
print(response.content)

为什么说LangChain更好用一点呢,比如说你要执行批量任务,对一些文本进行多标签分类,那么可能需要进行批量提问以提升效率。在这方面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"
)

# 假设你的多标签集合如下:
total_class = {"正面", "负面", "价格问题", "物流问题", "推荐", "外观设计", "用户体验"}

# 系统提示词
system_prompt = """你是一个多标签分类助手,请从以下标签中选出适用于文本的所有标签(可以多选):
正面, 负面, 价格问题, 物流问题, 推荐, 外观设计, 用户体验

只输出标签,多个标签之间用英文逗号分隔。如果无法判断,则返回空字符串。
"""

def llm_labeling(texts: list[str]) -> list[list[str]]:
    """
    对输入文本列表进行多标签打标,返回每条文本对应的标签列表。
    """
    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
        # 解析逗号分隔标签,清洗一下
        tags = [t.strip() for t in content.split(',')]
        # 只保留在 total_class 中的合法标签
        tags = [t for t in tags if t in total_class]
        results.append(tags)
    return results

texts = [
    "这个产品非常好用,值得推荐",
    "物流速度太慢了,体验不好",
    "外观漂亮,使用方便,就是价格稍贵"
]

result = llm_labeling(texts)
for i, tags in enumerate(result):
    print(f"第{i+1}条: 标签 = 
  • PandasAI
  • LLM
  • 数据分析
  • ")

    运行结果如下:

    第1条: 标签 = ['正面', '推荐', '用户体验']

    第2条: 标签 = ['负面', '物流问题', '用户体验']

    第3条: 标签 = ['正面', '外观设计', '用户体验', '价格问题']

    其实deepseek不一定真的支持批量提问的接口,即使真的不支持,LangChain为我们提供了抽象层,在内部进行并发处理。当然,如果有的大模型提供batch接口,LangChain就会直接调用它。

    其他

    在阿里的百炼平台上还提供了“多轮对话”和“流式输出”的使用方式。这两种方式是构建AI Chat应用必须的。“多轮对话”就是需要让大模型记住之前的对话内容,也就是上下文,以便得到更好的输出;“流式输出”则是让大模型的回答逐步渐进的输出,一个字一个字的呈现,以便让AI Chat应用的交互性更好。不过笔者暂时不关心这个,以后有机会再试用一下。

    到此这篇关于PandasAI连接LLM进行智能数据分析的示例详解的文章就介绍到这了,更多相关PandasAI LLM进行数据分析内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号