一个注册表文件管理40+种图表:解读Data-Analysis-Agent Registry驱动架构的设计思想
【免费下载链接】Data-Analysis-Agent🚀你的私人数据分析助手。通过对话式交互,自动生成可视化报表与商业洞察,让数据决策变得像聊天一样简单。 🚀 Your personal data analysis assistant. Say goodbye to complex SQL and Excel formulas. An LLM-powered data analysis agent. Chat with your data to instantly generate visualizations and business insights. Making>项目地址: https://gitcode.com/gh_mirrors/vi/Data-Analysis-Agent
Data-Analysis-Agent 是一个对话式智能图表推荐与生成系统,上传数据即可自动推荐并生成交互式可视化图表。它的核心设计亮点是:用单个注册表文件 charts/registry.py 统一管理 40+ 种图表,这种"Registry 驱动架构"让前后端、LLM 推荐与图表生成三端自动同步,新增图表几乎零成本。本文带你读懂这套架构的设计思想。
为什么需要"注册表"?
想象一下:如果系统里每增加一种图表,都要同时修改前端列表、推荐逻辑、生成入口三个地方——40 种图表意味着 40 份重复维护的代码,稍有不慎就会出现"前端能选、后端不支持"的错位。
Data-Analysis-Agent 给出的答案是:所有图表的"户口"只登记在一个地方。就像小区物业只维护一本住户总册,门禁、快递、水电都查这一本,谁也不用再各自记一份。
注册表内部:一份"图表户口本"
打开 charts/registry.py,你会看到它由两部分组成:
1. ChartMetadata:每张图表的"名片"
每种图表用一个数据类ChartMetadata描述(charts/registry.py#L12-L33),核心字段包括:
| 字段 | 含义 | 举例(柱状图) |
|---|---|---|
chart_id | 图表唯一标识,全局"身份证" | Bar_Chart |
category | 所属分类 | 对比类 COMPARING |
required_roles | 必需的数据字段角色 | x(类别)、y(数值) |
min_fields | 最少需要几列 | 2 |
data_format | 数据格式说明 | x列(类别) + y列(数值) |
constraints | 使用约束 | 数值列≥0,y轴从零开始 |
priority | 推荐优先级 | 5 |
options | 图表专属可配置项 | 如平行坐标图的"标准化"开关 |
一份真实注册条目长这样(摘自 charts/registry.py#L47-L49):
ChartMetadata(chart_id="Bar_Chart", name="柱状图", category="对比类 COMPARING", min_fields=2, required_roles=["x", "y"], desc="通过矩形高度编码数值,最常用的比较图表")2. 六大分类,40+ 图表尽收其中
全局列表REGISTRY(charts/registry.py#L37)按分类组织了全部图表:
- 📊对比类:柱状图、分组/堆叠柱状图、马里美科、桑基图、热力图、瀑布图
- 📈时间趋势类:折线图、面积图、斜率图、迷你图、凹凸图、地平线图
- 📦分布类:箱线图、小提琴图、山脊线图、直方图与帕累托图
- 🗺️地理类:点密度地图、面量图
- 🔗关系类:散点图、气泡图、弦图、平行坐标图、网络图
- 🥧占比图:饼图、矩形树图、旭日图、南丁格尔玫瑰图
文件末尾还内置了便捷查询接口:get_chart()按 ID 精确查找(并做了字典索引加速),list_charts()按分类过滤(charts/registry.py#L345-L359)。
一份注册表,三处消费
这正是 Registry 驱动架构最妙的地方——同一份元数据被三端复用:
前端列表:图表网格自动同步
Flask 后端通过/api/charts接口把注册表转成 JSON 吐给前端(app.py#L65-L90)。图表网格上显示的名称、分类、描述、数据格式,全部来自注册表字段,前端不需要为每张图表写任何硬编码。
LLM 推荐:白名单即注册表
LLM 推荐引擎启动时会把注册表渲染成"可用图表清单"喂给大模型(LLM/llm_recommender.py#L29-L54),并在解析结果时做二次校验:只有chart_id存在于注册表白名单中的推荐才会被采纳(LLM/llm_recommender.py#L118-L146)。这就杜绝了"大模型幻觉"推荐出不存在的图表。
动态生成:按 ID 即插即用
点击生成时,chart_generate.py 根据chart_id动态导入对应模块并调用其统一的generate()接口(chart_generate.py#L57-L83)。所有图表模块都遵循 charts/base.py 定义的统一协议:输入df + mapping + options,输出统一的ChartResult结构(HTML + 警告 + 元信息)。以柱状图为例,其实现与文档分别位于 charts/Bar_Chart/chart.py 和 charts/Bar_Chart/README.md。
此外,规则推荐引擎 core/recommender_rules.py 也基于注册表中的角色(roles)与数据结构做确定性匹配,形成"规则兜底 + LLM 增强"的双轨推荐。
三步新增一种图表
架构红利在这里集中兑现,新增图表只需三步(见 README.md 开发指南):
- 建目录:在
charts/下新建<chart_name>/,放入chart.py(实现统一generate()接口)、README.md(说明文档)、result.html(示例效果) - 登记户口:在 charts/registry.py 中加一条
ChartMetadata - 重启服务:新图表自动出现在前端列表、LLM 推荐白名单与生成链路中
全程不需要改动前端模板、推荐逻辑或生成入口——这就是"单一事实源(single source of truth)"的威力。
这套设计思想的价值
- ✅单一事实源:注册表是唯一准源,文档与实现永不"打架"
- ✅三端自动同步:前端列表、LLM 白名单、动态生成共享同一份元数据
- ✅扩展成本趋近于零:新增图表 = 一个目录 + 一行注册
- ✅防幻觉护栏:LLM 推荐被注册表白名单约束,结果必然可执行
- ✅元数据即文档:
data_format与constraints既是机器可读的规则,也是人可读的说明
总结:Data-Analysis-Agent 用 charts/registry.py 这一个文件,把"图表是什么、需要什么数据、怎么用"这三件事沉淀为结构化元数据,再让前端、LLM 与生成引擎都从这一处取数。这种 Registry 驱动架构并非炫技,而是用一份"图表户口本"换来了整系统的低耦合与高可扩展——这正是它管理 40+ 种图表依然井井有条的底层秘密。
【免费下载链接】Data-Analysis-Agent🚀你的私人数据分析助手。通过对话式交互,自动生成可视化报表与商业洞察,让数据决策变得像聊天一样简单。 🚀 Your personal data analysis assistant. Say goodbye to complex SQL and Excel formulas. An LLM-powered data analysis agent. Chat with your data to instantly generate visualizations and business insights. Making>项目地址: https://gitcode.com/gh_mirrors/vi/Data-Analysis-Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考