在利用大语言模型(LLM)自动生成分析代码时,我们经常面临一个问题:无法将完整的数据库数据作为提示词提供给模型,因为数据量太大、隐私敏感或成本高。

本文将介绍一种高效、结构化的数据摘要方法,帮助将数据库数据导出并转换为结构描述 + 示例数据,以便 LLM 快速理解上下文,从而生成正确的数据处理代码。


场景背景

开发过程中可能正处于如下场景中:

  • 从数据库中查询了大量数据(百万行以上)
  • 想让大模型帮你写分析代码
  • 无法把全部数据放进提示词(Token 受限)
  • 我们只想告诉模型:“这个文件包含哪些字段?每列什么类型?长什么样?”

于是,我们需要一种方法来:

快速保存查询数据,并提取 schema 和部分示例,生成简洁的上下文描述供 LLM 使用。


为什么不用 CSV?

虽然 CSV 是最常见的数据导出格式,但它存在很多局限:

问题 说明
无数据类型信息 所有内容都是字符串,模型不知道哪些是数字、时间等
文件大 无压缩,占空间大,加载慢
不支持嵌套结构 如果有 JSON 列、数组列,几乎无法兼容
不利于筛选 无列式存储,不方便快速读取前几行

解决方案:使用 Parquet 格式

Parquet 是一种高性能、列式存储格式,广泛用于大数据与分析场景。

优势:

  • 自动保存 schema(列名 + 数据类型)
  • 支持压缩,文件更小
  • 可快速读取前几行做数据预览
  • 与 Pandas、DuckDB、Polars、PyArrow 等工具无缝配合
  • 易于写脚本提取结构摘要

从数据库导出为 Parquet 文件

你可以使用 Pandas + SQLAlchemy 查询数据库,并分批写入 Parquet 文件,避免内存爆炸:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://user:pwd@host/dbname")
chunks = pd.read_sql("SELECT * FROM your_table", engine, chunksize=100_000)

for i, chunk in enumerate(chunks):
chunk.to_parquet(f"your_table_part{i}.parquet", index=False)

如何提取结构信息供 LLM 使用

使用 pyarrowpandas,你可以快速提取:

  • 文件名
  • schema(字段名 + 数据类型)
  • 前几行数据样例

示例代码如下:

import pyarrow.parquet as pq
import os

def summarize_parquet(filepath, n_preview=5):
parquet_file = pq.ParquetFile(filepath)
schema = parquet_file.schema.to_arrow_schema()
preview_df = parquet_file.read_row_groups([0]).to_pandas().head(n_preview)

return {
"file": os.path.basename(filepath),
"schema": str(schema),
"preview_rows": preview_df.to_dict(orient="records")
}

输出结构如下(可直接用于提示词):

{
"file": "user_events.parquet",
"schema": "user_id: int64, event_time: timestamp[us], action: string, success: bool",
"preview_rows": [
{"user_id": 1, "event_time": "2023-01-01T00:00:00", "action": "login", "success": true},
{"user_id": 2, "event_time": "2023-01-01T00:05:00", "action": "logout", "success": false}
]
}

批量处理多个 Parquet 文件

可以扩展上面的函数批量提取一个目录下所有 Parquet 文件的摘要:

import glob
summaries = []
for path in glob.glob("data/*.parquet"):
summaries.append(summarize_parquet(path))

# 输出为 JSON / Markdown 供提示词使用
import json
print(json.dumps(summaries, indent=2))

如果使用 DuckDB 也可以这么做

DuckDB 支持 SQL 操作 Parquet,也可以将查询结果直接存入自己的 .duckdb 文件:

import duckdb
con = duckdb.connect("data.duckdb")
con.execute("CREATE TABLE my_table AS SELECT * FROM 'data.parquet'")

然后也可以从中提取 schema 和前几行:

schema = con.execute("DESCRIBE my_table").fetchall()
preview = con.execute("SELECT * FROM my_table LIMIT 5").fetchdf()

推荐的 LLM Prompt 模板

你正在分析以下数据文件:users.parquet

字段如下:
user_id: int64, created_at: timestamp, country: string

示例数据:
[
{"user_id": 1, "created_at": "2023-01-01T00:00:00", "country": "US"},
{"user_id": 2, "created_at": "2023-01-02T12:00:00", "country": "FR"}
]

请生成用于计算每个国家活跃用户数的 Python 代码。

附加对比:CSV vs Parquet 性能简表(10 万行示例)

操作 CSV(10 万行) Parquet(10 万行)
文件大小 25MB 3MB
读取耗时(Pandas) 1.5 秒 0.3 秒
获取 schema 是否方便 手动推断 自动获取
是否支持部分列读取 支持
是否支持压缩 内建

实际表现视数据列数与类型不同而略有差异,但 Parquet 通常在 IO 和内存方面明显优于 CSV。


推荐工作流

[数据库查询]

[保存为 Parquet 文件]

[自动提取 schema + 示例数据]

[生成提示词上下文(JSON / Markdown)]

[喂给大模型进行代码生成 / 分析]

写在最后

借助 Parquet 文件的结构化能力和 Python 脚本的自动化,可以轻松实现:

  • 从海量数据库数据中提取关键摘要
  • 为大模型提供最小上下文
  • 触发高质量、上下文感知的数据分析代码生成

未来甚至可以将这套流程封装为命令行工具或 Web 服务,实现一键摘要生成和提示上下文注入。


参考内容: