Back to skills
extension
Category: AI Agent CapabilitiesNo API key required

article_smart_data_analyst

基于 OpenVINO 优化的本地 LLM 实现自然语言到 SQL 的转换,使用 DuckDB 在本地执行查询并自动生成可视化图表。适用于 CSV/Excel 数据分析、自然语言查询、NL 转 SQL、数据可视化、销售分析、日志分析等需要保护数据隐私的生产力场景。

personAuthor: jeffkyhubModelScope

Skill:本地智能数据分析助手

将自然语言问题转换为可执行的 SQL 查询,在本地完成数据分析与可视化,数据全程不出本机。

适用场景

  • 分析本地 CSV/Excel 数据,无需上传到云端
  • 用自然语言查询数据,降低 SQL 使用门槛
  • 自动生成柱状图、折线图、饼图等可视化结果
  • 销售数据、运营数据、日志数据的快速洞察
  • 需要确保数据隐私安全的企业/个人分析场景

触发条件

当用户说出以下任意指令时,触发本技能:

  • 数据分析 / 分析数据
  • 自然语言查询数据
  • CSV分析 / Excel分析
  • NL转SQL
  • 智能数据分析 / smart data analyst
  • 数据可视化 / 生成图表
  • 数据洞察 / 分析一下这个数据

输入参数

| 参数名 | 类型 | 是否必填 | 说明 | |--------|------|----------|------| | data_file | 字符串 | 必填 | 数据文件路径(.csv/.xlsx/.xls) | | question | 字符串 | 必填 | 自然语言查询问题 | | output | 字符串 | 选填 | 图表输出路径,默认自动生成 | | chart_type | 字符串 | 选填 | 图表类型(bar/line/pie/scatter),默认自动选择 |

执行步骤

  1. 接收用户传入的数据文件路径和自然语言问题
  2. 检查文件是否存在且格式合法(仅支持 .csv / .xlsx / .xls)
  3. 检查本地 NL 转 SQL 服务是否运行,不可用时自动降级为模板化方案
  4. 提取数据文件表结构信息
  5. 使用 LLM 将自然语言问题转换为 SQL(DuckDB 兼容语法)
  6. 在本地 DuckDB 中执行 SQL 查询(仅允许 SELECT)
  7. 自动根据查询结果选择最佳图表类型并生成可视化
  8. 整理结果:展示自然语言问题、生成的 SQL、查询结果摘要、图表路径

端到端推荐入口:

python scripts/analyze.py --data_file <文件> --question "<问题>" --output <输出>

分步替代方案:

  • 仅 NL 转 SQL:scripts/nl_to_sql.py --question "问题" --data_file data.csv
  • 仅执行 SQL:scripts/data_query.py --data_file data.csv --sql "SELECT ..."
  • 仅生成图表:scripts/visualize.py --data_file data.csv --sql "SELECT ..." --output chart.html

首次使用需启动 LLM 服务:

python scripts/start_server.py --model_path <模型路径> --port 8901 --device CPU

输出格式

以结构化文本展示结果,包含:

  • 自然语言问题原文
  • 生成的 SQL 语句
  • 查询结果表格
  • 图表文件路径(HTML/PNG/SVG)

错误处理

  • 文件不存在:提示用户提供正确文件路径
  • 格式不支持:提示用户转换为 CSV 或 Excel
  • LLM 服务不可用:自动降级为模板化方案,告知用户覆盖范围降低
  • 查询结果为空:建议用户调整问题或检查数据
  • 破坏性 SQL(DROP/DELETE 等):拒绝执行,仅允许 SELECT 查询
  • 脚本执行失败:返回简洁友好提示,不暴露底层报错

使用示例

示例1:端到端分析

用户输入:帮我分析一下 sales.csv,看看哪个区域销售额最高

执行:

python scripts/analyze.py --data_file sales.csv --question "哪个区域销售额最高" --output region_sales.html

AI 输出:

数据分析结果
问题:哪个区域销售额最高
SQL:SELECT region, SUM(total_amount) AS total_sales FROM sales_data GROUP BY region ORDER BY total_sales DESC LIMIT 1
结果:
| region | total_sales |
|--------|-------------|
| 华东   | 158000      |
图表:region_sales.html

示例2:仅 NL 转 SQL

用户输入:把这个自然语言问题转成 SQL - "每月订单数量统计"

AI 输出:生成的 SQL 语句及表结构信息

示例3:仅执行 SQL

用户输入:在 sales.csv 里执行 SELECT * FROM sales_data WHERE total_amount > 5000

AI 输出:JSON 格式查询结果