ChartSpec:连接LLM与图表的缺失语言
DataHot 速览
ThoughtSpot官方博客介绍了其自然语言图表服务Charts AI核心的ChartSpec规范。ChartSpec是一种类型化的Grammar-of-Graphics规范,足够小以便模型流畅生成,又能表达几乎所有图表,且与渲染后端无关。文章对比了三种常见方案,并说明声明式语法相比枚举类型和生成代码更可靠:可组合、可验证,并从结构上限制幻觉。该设计用于回答“哪些产品在亏损?”等自然语言问题并直接返回图表。
为什么值得关注:数据从业者应关注该架构选择,因为它展示了BI产品中LLM生成图表的关键中间表示设计,对构建ChatBI或可视化Agent有直接借鉴意义。
本文目录 16 节
译文
AI 逐段翻译ChartSpec 是 Charts AI 核心的、类型化的图形语法规范:它足够小,模型可以流畅使用;表达力足以组合出几乎任何图表;并且与渲染它的任何环境无关。
向现代商业智能产品提问——“哪些产品在亏损?”——你期望得到一张图表,而不是一个需要填写的表单。用大型语言模型实现这一点看似直接,直到你遇到隐藏在下面的架构问题:模型究竟应该生成什么?
它的答案几乎决定了下游的一切:你能验证什么、能在什么上渲染、用户能优化什么,以及当数据明天变化时什么会出错。Charts AI 是 ThoughtSpot 的自然语言图表服务,它围绕这个问题的答案而构建,本篇文章将介绍其核心的构件。
要达到这个目标,需要排除三个诱人的答案,然后讨论三个属性,使最终选择发挥作用的答案得以成立:能被模型可靠生成、独立于任何渲染后端、并能同时充当对话自身的记忆。

三个显而易见的答案,三条死胡同
业界主要尝试了三件事。
第三个方向值得深入探讨,因为它的路子几乎正确。图形语法传统的声明式可视化语法(从 Wilkinson 经由 ggplot2 直 Vega-Lite 的脉络)将图表描述为标记、编码、比例尺和分面的组合,而不是命名类型的分类体系。
这正是适合作为模型目标的形态,原因有三,我们只在生产环境中才充分体会到:
1. 组合性与用户意图的到达方式匹配
用户不会要求图表类型;他们要求带强调的比较:“按地区显示销售额,但要标记滞后项。”语法将这种强调作为一个规则附加到某个通道上。而枚举则会造成有损的投影。
2. 语法是可验证的约定
规范可以进行结构验证、在审查中进行差异比较、在测试中重放,并确定性地编译。生成的代码则不具备这些特性。
3. 语法天然限定幻觉产生
生成闭合的标记和通道词汇表的模型无法凭空创造 API 表面。失败从“任意的错误程序”缩小为“已知代数中的错误术语”,即可以检测、并通常能修复的错误类别。
经典语法所没有提供的是这样一种语言,其作者是依据表元数据、在对话中途、针对它从未见过的数据进行写作的模型。
这种作者身份改变了设计。ChartSpec 由此诞生。
规范是连接点
ChartSpec 是一种基于图形语法方言的、类型化的可视化语法,并且故意做得小:十六个顶层字段、八个标记、十五个编码通道、六种排序类型、一个小小的条件代数。
这种小正是关键,而非局限:词汇足够窄,语言模型可以可靠生成,而这些构造组合出的表达范围远超表面所示。Charts AI 中的一切都符合这一点。

它由三个属性定义,本文的其余部分将逐一展开:它能被模型可靠生成,它独立于任何渲染后端,并且它兼具对话状态之职。
规范之前:分解用户请求
规范编写是如何开始的?在任何规范存在之前,话语被分解为一小组分析判断:人类分析师在最初三秒内所做的判断。
用户试图做什么:比较、追踪变化、检查分布、发现关系、还是突出某个对象?哪种结构类型适合该目标?
每个字段扮演什么角色:位置轴、系列叠加、分面拆分?所有数据都需要,还是只要顶部的一部分?
如果有,什么值得强调?

有两个因素使这种分解至关重要:
- 第一,每个判断都是从分析情境的封闭词汇中选择的;这正是枚举所在之处,位于构件之上的一层。
- 第二,这些判断与构造相分离:一旦做出判断,将它们转换为结构就是机械操作,因此由代码根据表的实际情况(字段基数、单位、元数据)进行验证,而不是由模型随意构造结构。
单独分解并不能完成规范(呈现和强调的处理完全在后续的流程中进行),但这种分离在每个阶段都存在:模型做判断,代码做构造。
这种分离,比任何提示工程更能保证规范生成的可靠性。
没有图表类型字段
搜索整个语言,你不会找到一个命名图表类型的字段。“堆叠条形图”是带有颜色编码和堆叠变换的条标记。
“环形图”是内半径非零的弧标记。“直方图”是置于分箱派生字段上的条标记。图表身份是读者计算出来的属性,绝不是作者断言的数值。

这是正宗的图形语法,但在模型作者之下,它带来了三种新价值:
- 表达能力成倍增长:每个新标记或通道与所有现有的元素组合,这就是为什么我们无法预见到的用户请求不断落在言语之内。
- 一个完整的失败类消失了:断言的类型永远不会与实际结构相矛盾,因为只有结构存在。
- 而且修订保持局部性:“改成堆叠”是对变换的一个字段的更改,而不是重新分类,从而不会让模型重建(并微妙地改变)所有其他内容。
枚举是决策词汇,不是构件词汇。系统真正需要离散选择的地方,它们存在于路由中,绝不在图表中。
组合是全部关键
语言表达力的核心是一个用于布局坐标轴的小型代数。图表的每一侧(行、列)是由三个原语构建的条目列表——单个字段、合并一组共享同一刻度的同单位字段,以及一个位置占位符——一侧可以分裂成两个,以表达对立的双轴。

在一个轴上,维度在度量之前列出时会成为分面——列表中的位置就是分面运算符。而一个第一等的熔化(逆透视)构造完善了多度量组合:将N个同单位度量折叠成一个分类的"度量"列,度量身份变成普通数据,所有通道和变换都已知道如何处理。按度量着色的线、按度量堆叠的条、每个度量一个标记的组合——全部自然得出,无需特例。
分层是第二个组合轴:条形层加规则层是带参考线的图表;条形层和线层绑定到对立的双轴是组合图。在多变量、合并、双轴和熔化之间,同一组度量有四种不同的分析解读——每种之间只需一次结构编辑。
强调是数据,而非代码
图表类型系统忽略的用户意图部分是强调:"标记落后项" "对照我们的目标展示它" 在ChartSpec中,任何颜色、不透明度或大小通道都可以携带有序的条件到值的规则列表,其中条件在八个比较运算符上形成递归布尔代数——而参考线只是另一个图层,一个携带值的规则标记。
绝不让模型看到它能计算的数字
让LLM生成"平均值的参考线"它会愉快地写出值:4211.37——一个从样本值、列统计或凭空综合出的数字。对我们来说这不是假设;这是一整类生产事故。
我们称这个约定为数据值纪律,其结果是该语言的隐秘超能力:规范是数据稳定的。同一个ChartSpec在明天的数据、下个季度的数据、具有相同模式的其他租户数据上都是正确的。保存的图表永远不会将过时的平均值固化在其定义中。在BI环境中,这一单一属性将演示与产品区分开来。
一个规范,多个后端
ChartSpec承诺图表是什么——从不涉及库如何绘制它。语言中没有构造命名渲染器概念;每个构造都以图表语义陈述。这不是为了自身整洁。正是这一点让同一个规范今天编译成三种截然不同的产物:一个自包含的Muze图表程序在沙箱中运行,Muze Studio SDK代码作为起点放入我们的创作界面,以及——完全没有代码的——一个原生图表设置负载直接配置ThoughtSpot的内置图表类型。

自动路由器选择能表达给定规范的最便宜后端,且选择是每个请求晚绑定的——因为规范与渲染器无关,哪个渲染器的问题不再是架构承诺。未来的后端——另一个图表库、服务器端渲染器、另一个BI工具的原生格式——只是一个新的编译器模块。语法、模型契约和会话语义不变。
代码后端值得附带说明:它是一个确定性编译器,将输出程序构建为真正的抽象语法树——因此格式错误的程序无法表示,而且因为它是纯函数,我们的测试套件在大量固定数据语料库上逐字节锁定其输出。当规范超出确定性覆盖时,模型参与仅限于填充明确类型的间隙,并在任何交付前进行解析验证。编译器是代码生成器;生成是有限的例外。
图表是对话
第一次发声很少是最后一次。ChartSpec的第三个职责是成为对话式图表生成的媒介,设计让之前的几个决定立即得到回报。
图表AI不保留会话状态。后续请求携带新的话语和先前的规范;响应是一个完整的新规范。规范不是对话的副产品——它就是对话的记忆,可被调用者检查,可存储在任何地方,可针对任何未来轮次重放。
完整重述消除了困扰基于增量的细化的两种失败模式——模型忘记向前携带设置,以及模型无法弄清楚如何移除它不理解的东西。丰富性得以向前传递:用户可以一次一个话语构建带有条件强调和公式值参考线的双轴熔化组合,因为每个中间状态都是一个完整、第一等的规范。上述目标线强调在从条形图切换到面积图时保持不变——其位置无关。
每个规范还带有解释:对理解内容的通俗语言说明,包括所做的任何近似。规范记录同时是解释的记录。
语言的下一步走向
该语言旨在成长,三个扩展已在路线图上——每个都是架构的自然下一步,而非重写。
新的坐标系
布局代数今天组合笛卡尔和径向结构;地理和网络布局是接下来要加入的坐标系。吸收模式已经证明:进入语法的每个构造都与已有的每个通道和变换组合,因此每次添加都成倍扩大表达范围,而不是增加一个图表类型。
交互
刷选、交叉过滤和钻取将进入词汇表,它们将以与其他一切相同的方式进入——声明式。我们最兴奋的设计工作是承认有状态、事件驱动的行为,同时保持完整重述的对话模型完整,以便交互可以像今天的颜色和排序一样通过后续话语进行细化。
更丰富的值语法
公式DSL正朝着窗口化和按组计算发展——"过去四个季度的平均值","每个区域内的份额"——遵循同样的数据值纪律:模型命名关系,运行时根据实时数据解析它。我们坚持的设计线是一种价值语法,它不断获得表现力,但不会变成查询语言。
语法一直是对的。LLM时代改变的是语法为谁而设计——一旦你认真对待新的作者,语言、编译器和对话模型都会随之而来。
Charts AI现在已在ThoughtSpot中上线。用简单英语向Spotter提问,观看它借助Charts AI的强大功能为您构建图表。
这篇内容对你有用吗?
反馈只用于改善内容筛选,不等同于收藏