PandasAI连接大语言模型对MySQL数据库进行跨表数据分析

Ada
Ada
发布时间:2026-10-10| 2人浏览过
原创

PandasAI 3.0已全面支持直接读取数据库多表数据,并结合大语言模型实现自然的业务问答功能。本指南介绍如何利用 LiteLLM 接口接入 DeepSeek 模型,快速搭建基于 MySQL 的多表智能分析环境,同时梳理官方文档与实际使用中容易踩坑的参数配置项。

实现目标与准备条件

本次实战的目标是在本地 Python 环境中,通过 PandasAI 3.0 将 MySQL 中的客户主表与订单从表加载至内存,利用大语言模型的语义理解能力,直接用中文回答复杂的跨表统计需求。开始前需满足以下条件:

  1. 依赖安装:推荐使用 Poetry 管理环境,确保安装的是 PandasAI 3.0 及以上版本。
  2. 数据库准备:提前在 MySQL 中创建好包含关联外键的业务表,用于模拟真实的电商零售场景。
  3. 模型凭证:获取支持 OpenAI 兼容协议的云端 API Key 及 Base URL(如阿里云百炼平台)。

1. 数据库初始化SQL语句

首先创建测试库 chinese_retail_data,包含会员信息主表 customers 和交易流水从表 orders,并通过 customer_id 建立关联关系:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS chinese_retail_data;
USE chinese_retail_data;

-- 创建客户表 (主表)
CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_name VARCHAR(100) NOT NULL,
    gender VARCHAR(10) NOT NULL,
    age_group VARCHAR(20) NOT NULL,
    city VARCHAR(50) NOT NULL,
    membership_level VARCHAR(20) DEFAULT '普通会员',
    registration_date DATE NOT NULL
);

-- 创建订单表 (从表,通过customer_id关联)
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    product_name VARCHAR(100) NOT NULL,
    category VARCHAR(50) NOT NULL,
    quantity INT NOT NULL,
    unit_price DECIMAL(10,2) NOT NULL,
    order_date DATE NOT NULL,
    payment_method VARCHAR(20) NOT NULL,
    delivery_status VARCHAR(20) NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- 插入客户数据(字段值使用中文)
INSERT INTO customers (customer_name, gender, age_group, city, membership_level, registration_date) VALUES
('张伟', '男', '25-34岁', '北京', '黄金会员', '2023-01-15'),
('李娜', '女', '35-44岁', '上海', '铂金会员', '2022-03-20'),
('王强', '男', '18-24岁', '广州', '普通会员', '2024-01-05'),
('陈静', '女', '45-54岁', '深圳', '黄金会员', '2023-06-12'),
('刘洋', '男', '25-34岁', '杭州', '普通会员', '2024-02-18'),
('赵敏', '女', '35-44岁', '成都', '铂金会员', '2022-11-30'),
('孙浩', '男', '18-24岁', '南京', '普通会员', '2024-03-08'),
('周芳', '女', '45-54岁', '武汉', '黄金会员', '2023-09-25');

-- 插入订单数据(字段值使用中文,关联customer_id)
INSERT INTO orders (customer_id, product_name, category, quantity, unit_price, order_date, payment_method, delivery_status) VALUES
(1, '华为手机', '电子产品', 1, 5999.00, '2024-04-01', '支付宝', '已送达'),
(2, '美的空调', '家用电器', 1, 3200.00, '2024-04-03', '微信支付', '已送达'),
(3, '李宁运动鞋', '服饰鞋帽', 2, 499.00, '2024-04-05', '信用卡', '运输中'),
(1, '小米手环', '电子产品', 1, 299.00, '2024-04-08', '支付宝', '已送达'),
(4, '格力冰箱', '家用电器', 1, 4800.00, '2024-04-10', '微信支付', '已送达'),
(5, '耐克T恤', '服饰鞋帽', 3, 199.00, '2024-04-12', '支付宝', '已送达'),
(2, '苹果平板', '电子产品', 1, 3899.00, '2024-04-15', '微信支付', '已送达'),
(6, '海尔洗衣机', '家用电器', 1, 2800.00, '2024-04-18', '信用卡', '已送达'),
(7, '阿迪达斯运动裤', '服饰鞋帽', 1, 599.00, '2024-04-20', '支付宝', '运输中'),
(1, '戴尔笔记本', '电子产品', 1, 7999.00, '2024-04-25', '微信支付', '已送达'),
(8, '西门子烤箱', '家用电器', 1, 2200.00, '2024-04-28', '信用卡', '已送达'),
(3, '优衣库衬衫', '服饰鞋帽', 4, 199.00, '2024-05-01', '支付宝', '已送达'),
(4, 'OPPO手机', '电子产品', 1, 2999.00, '2024-05-05', '微信支付', '已送达'),
(5, '彪马运动鞋', '服饰鞋帽', 1, 699.00, '2024-05-08', '信用卡', '运输中'),
(2, '索尼耳机', '电子产品', 2, 899.00, '2024-05-12', '支付宝', '已送达');

配置步骤与代码实现

第1步:配置大模型连接参数

PandasAI 3.0 不再需要手动继承封装自定义 LLM 类。直接使用内置的 LiteLLM 即可无缝对接第三方推理服务。注意设置合理的 temperature 保证查询结果稳定。

import pandasai
from pandasai_litellm import LiteLLM

llm_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
llm_key = "sk-xxxxx"
llm_model_name = "deepseek-r1"

mysql_host = "127.0.0.1"
mysql_port = 3306
mysql_user = "root"
mysql_password = "test"

第2步:定义数据集注册函数

调用 pandasai.create() 将 MySQL 表映射为框架可识别的数据源。此处必须显式传入完整的 columns 列表,否则大语言模型将无法理解业务字段的实际含义,直接导致查询准确率大幅下降。

def init_dataset(table_names):
    pandasai.create(
        path=table_names[0],
        description="电商系统客户的基本信息,包括个人属性、地理位置和会员等级等静态特征。",
        source={
            "type": "mysql",
            "connection": {
                "host": mysql_host,
                "port": mysql_port,
                "user": mysql_user,           
                "password": mysql_password,
                "database": "chinese_retail_data"
            },
            "table": "customers",            
        },
        columns=[
            {"name": "customer_id", "type": "integer", "description": "客户的唯一标识符,用于关联订单数据。"},
            {"name": "customer_name", "type": "string", "description": "客户的姓名,用于识别和沟通。"},
            {"name": "gender", "type": "string", "description": "客户的性别,用于人口统计分析。"},
            {"name": "age_group", "type": "string", "description": "客户所属的年龄段,用于年龄相关的市场细分。"},
            {"name": "city", "type": "string", "description": "户所在的城市,用于地域性销售分析。"},
            {"name": "membership_level", "type": "string", "description": "客户的会员等级,反映客户价值和忠诚度。"},
            {"name": "registration_date", "type": "datetime", "description": "客户的注册日期,用于计算客户生命周期。"},
        ]
    )

    pandasai.create(
        path=table_names[1],
        description="电商系统客户的订单交易详情,包括购买的商品、数量、价格、时间和状态等动态行为。",
        source={
            "type": "mysql",
            "connection": {
                "host": mysql_host,
                "port": mysql_port,
                "user": mysql_user,
                "password": mysql_password,
                "database": "chinese_retail_data"
            },
            "table": "orders",
        },
        columns=[
            {"name": "order_id", "type": "integer", "description": "订单的唯一标识符,用于追踪和管理订单。"},
            {"name": "customer_id", "type": "integer", "description": "关联到客户的外键,建立与客户表的联系。"},
            {"name": "product_name", "type": "string", "description": "所购商品的名称,用于产品销售分析。"},
            {"name": "category", "type": "string", "description": "商品所属的类别,用于分类统计和趋势分析。"},
            {"name": "quantity", "type": "integer", "description": "购买的商品数量,影响总销售额和库存。"},
            {"name": "unit_price", "type": "float", "description": "商品的单价,用于计算订单金额和利润。"},
            {"name": "order_date", "type": "datetime", "description": "订单创建的日期,用于时间序列和趋势分析。"},
            {"name": "payment_method", "type": "string", "description": "客户使用的支付方式,反映支付偏好。"},
            {"name": "delivery_status", "type": "string", "description": "订单的配送状态,用于监控物流和客户满意度。"},
        ]
    )

第3步:执行自然语言查询

完成环境配置后,实例化 Chat 客户端,加载已注册的表名,直接传入自然语言指令即可获得结构化结果。

def ai_chat(table_names):
    llm = LiteLLM(model=llm_model_name, api_base=llm_url, api_key=llm_key, custom_llm_provider="openai", temperature=0.0, seed=10080)

    pandasai.config.set({"llm": llm, "save_logs": True, "verbose": False, "max_retries": 3})

    # 加载所有相关的表   
    tables = [pandasai.load(name) for name in table_names]

    chat_content = "统计一下目前电商系统中会员类型的占比,以及每种会员类型购买商品的数额在销售额总量的占比。请使用中文回答。"

    result = pandasai.chat(chat_content, *tables)

    print(result)

if __name__ == "__main__":    
    table_names = ["example/ecommerce-customers", "example/ecommerce-orders"]
    # init_dataset(table_names)  # 注意:初始化仅能执行一次,多次运行会报错,实际部署应加入缓存判断
    ai_chat(table_names)

关键注意事项与排错指南

  • 字段描述位置至关重要:官网部分旧版教程将 columns 放在 source 外层或混合排版,这在 3.0 实际运行时会导致元数据丢失。务必将其作为顶层参数传递给 pandasai.create,并在运行成功后检查同级目录下的 datasets 文件夹,确认生成的 .yaml 文件内包含清晰的字段描述。
  • 路径命名规范:数据集虚拟路径(path)内的多单词建议使用中划线 - 连接,框架底层校验较严格。
  • 单次创建限制:pandasai.create 当前设计为一次性注册操作,若在相同脚本中重复调用同名路径会抛出异常。建议在业务代码中加入 pandasai.is_registered() 判断或采用环境变量注入方式规避。

运行结果验证

成功执行后,终端将输出跨表聚合分析结果。框架自动生成了对应会员等级的用户比例与营收贡献度:

membership_level 会员占比(%) 销售额占比(%)
0 普通会员 37.5 9.30
1 铂金会员 25.0 29.48
2 黄金会员 37.5 61.23

上述结果表明,系统已成功解析了主从表之间的关联逻辑,完成了跨实体的复杂指标计算。随着语音识别准确率的提升,这种基于自然语言的交互模式正逐步具备替代传统报表后台的潜力。

总结

以上就是 PandasAI 连接大语言模型对 MySQL 数据库进行跨表数据分析的详细内容,更多关于 PandasAI 配置技巧与大模型集成实践的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。