AI 接入应用中的报表查询:表模板 · 命令集 · 问数框

如果你在软件公司或企业的开发中心做行业应用——ERP、财务、供应链、CRM、政务系统——报表和查询是绕不开的功能。AI编程这么热,一个很自然的问题就是:这些事能不能用 AI 提效,让开发人员从无止境的排期里松一口气?

答案是能,但前提是先分清任务。业务方随口一句“做个报表查个数据”,在工程上大概可以分成三种任务:固定报表、自助报表、通用查询。它们的交付物不同、代码重心不同,AI 该接在哪一段也完全不同。

本文按这三种任务分开讲:痛点在哪里、方案结构长什么样、AI 接在哪一步、在自己的应用里落地时要注意什么。

先把结论放在前面:这三种任务都能用 AI 显著提效,但没有一种是“把数据和需求一起丢给大模型”。三类方案的共同结构是:AI 只做它擅长的语义理解与步骤规划,真正的执行交给确定性引擎。位置选对了,AI 是产能;位置选错了,AI 是负债。

1 任务分解:三种功能,三种交付物

1.1 固定报表开发:交付的是一份模板

中国式复杂报表是最讲究形式的一类:多级表头、合并单元格、斜线格、跨页小计、打印边距,乃至某个数字的字体和对齐。这类报表是开发者做给系统用的,产物通常是一份报表模板,加上背后的数据准备。

对程序员来说,这类任务之所以最先能被 AI 改造,是因为它的产物本身就是“给人看、给人改”的东西——模板可以被打开、被拖动、被逐格核对,而不是一段只有机器才懂的渲染代码。

1.2 自助报表:交付的是一个工具

自助报表的最终用户是业务人员:他想按省份看、再按年份拆、顺手算个占比,希望自己拖字段或者提一句需求就能出表。

所以要做的不是替客户完成一次分析,而是交付一个能力:一个能嵌进系统、业务人员能反复使用的工具。这类功能一旦做成黑盒,支持成本会迅速失控——用户说不清哪一步错了,也无法复现,最后只能“重做一遍再看看”。

1.3 通用查询:交付的是一个框和一套元数据

企业应用里到处是查询界面:订单、客户、库存、财务各做各的筛选面板,每个模块单独开发。加一个筛选条件就要改前端、调接口、发版本,业务响应速度被拖得很慢。

通用查询想解决的就是这件事:把这些分散的查询收敛成一个输入框,用户用自然语言提问,系统给结果;开发侧维护的不再是一页页界面,而是元数据、词典和一套查询服务。

表1 三类功能的工程视角对比

项目

固定报表

自助报表

通用查询

交付产物

报表模板

可嵌入的自助分析页面

查询页面 + 元数据与词典

工作重心

模板布局、取数逻辑

命令集与执行引擎对接

元数据/词典/权限及接口

AI 介入点

生成调用 API 的 Java 程序

把口语拆成汉语命令

把口语转成规范问句

验收方式

IDE 里可视化审模板

分步执行、看中间结果

用户确认规范问句

失败模式

模板幻觉、渲染代码不可读

黑盒、算力与数据出域

关联与口径猜错且不报

三种任务的差别不只是难度,而是“错在哪里、谁能发现、怎么改”。这决定了 AI 在每一类任务里应该站在什么位置。

2 固定报表:把 AI 接在“生成 API 调用程序”这一段

2.1 两条看起来可行的路,为什么都不通

第一条路,是让 AI 直接生成报表模板。这条路很快会撞墙:报表模板是私有格式,公开语料几乎为零;而一张报表里的多源混算、嵌套逻辑、像素级排版和打印设置交织在一起,不是一段线性文本能描述清楚的。硬让模型上,结果就是幻觉频发。

第二条路,是让 AI 直接写报表渲染程序。这看起来更“工程”:产出代码,编译运行,报表就出来了。但它过不了上线这一关:生成的渲染代码层层嵌套,报表稍复杂些就可能上万行,人读不懂就无法确认;报表需求又大多是临时性的,做完就改,指望测试集守住不现实。出了问题不知道错在哪一段,团队自然不敢用。

两条路的共同问题,是让 AI 直接产出“最终形态”。而最终形态恰恰是最难审、最难改的那一层。

2.2 可行方案:AI 写程序,引擎出模板,人在 IDE 里审

润乾报表的做法是把 AI 往后撤一步:不让它画报表,让它写一段调用API 的 Java 程序,由引擎按 rpx 模板生成报表。如图1所示,链路是“描述需求 → 生成调用 API 的 Java 程序 → 输出 rpx 模板 → 可视化查看与微调”。

imagepng

图1 固定报表的 AI 闭环:自然语言需求、API 代码生成、报表输出与审核迭代

关键在中间这一层,但要先说清楚一件事:那段 Java 代码往往很长、结构复杂,你不需要读懂它,它的职责是调用 API 把模板造出来。程序员真正要看、要改的,是它生成出来的 rpx 模板——在报表 IDE 里按可视化方式检查行列结构、分组层级、公式引用和数据源绑定,直接在格子上改。

也就是说,AI 产出的程序是“生成模板的手段”,模板才是“可评审的产物”。评审发生在模板层,修改也发生在模板层;哪一格不对,在 IDE 里就能定位,不必回头读那段代码,也不必把整个生成过程重跑一遍。对开发团队来说,这才是这类方案能进项目的原因——交付物是看得见的模板,而不是只能整体接受或丢弃的黑盒。

2.3 一条真实指令,能细到什么程度

中国式复杂报表的难点,往往不在取数,而在排版:分栏、横向流动、合并、跨页。这些需求过去要靠经验和反复调试。现在可以先用自然语言把布局讲清楚,让 Agent 生成骨架。

imagepng

图2 Agent 指令示例:一句话描述“一页三组、横向流动”的复杂布局

图2 的指令是这样写的:连接 demo 数据源,用销售额数据生成数据集并按销售额排序;一页排三组相同的列,序号、产品名称、产品销售额三列为一组,同一行并排显示 3 条记录(第 1 行是记录 1、2、3,第 2 行是 4、5、6);数据按记录顺序“横向流动”,不是传统的一行一条往下扩展,而是从左到右、从上到下依次填充;最后生成指定的 rpx 文件。

这段话把“横向流动”这种说不清、画不出的布局讲明白了——它本质上是把纵向报表切成三栏并排。生成结果如图3所示,三组并列、记录按顺序横向填充,与描述一致。

imagepng

图3 生成结果:三组并列、按记录顺序横向流动的报表

2.4 Copilot:最后一公里,用汉语改模板

Agent 生成的模板通常还差一点:某个单元格要做组内排名、单价要分段显示、颜色要按阈值变化。

这些事情继续交给 Agent 并不划算。它可能改好了这一处,又在别处搞出新问题,你还得再核对一遍,一来一回反而更慢。更合适的做法是直接在 IDE 上改:位置、布局、合并这类事情,GUI 拖一拖最快;但公式调整、条件格式这类操作,靠菜单一层层点并不方便。Copilot 提供的正是这一段——在 IDE 里选中单元格,用汉语把需求说清楚。

imagepng

图4 在报表 IDE 中选中单元格,用汉语完成局部修改

如图4所示,在 IDE 里选中 G5,输入“G5 组内降序排名”,工具直接落到模板上。同类指令还有“把单价按 500 以下、500 到 1000、1000 到 1500 分三段显示”“小于 1000 暗红加粗,大于 10000 浅蓝下划线”。

这就是常说的从 GUI 到 LUI:不用记菜单路径,说一句话就改。但它和纯对话式产品有个重要区别——改动的结果仍然落在可视化模板上,改完立刻看得见,不存在“说完了不知道它改到哪儿去了”的问题。

2.5 给开发团队的几条建议

先审结构,再看结果。AI 生成的模板,先看行列结构、分组层级、公式引用对不对,再跑数据。结构对了,结果大概率对;结构错了,跑出来再漂亮也是错的。

Agent 当骨架生成器,Copilot 做精修。复杂布局、批量相似的模板适合 Agent 一次成型;一次性小改动用 Copilot 更快。两者配合,才是完整的工作流。

把需求写成“布局规格”。“横向流动”“一页三组”这类词对模型是有效约束;“好看一点”“紧凑一些”没有信息量。描述越接近结构,返工越少——这条对固定报表和自助报表都成立。

效率上,复杂报表开发从小时级压到分钟级,开发效率提升 50% 以上。但对程序员来说,真正省下来的往往不是“第一次做”,而是“改”——需求变一次的成本降下来,才是长期的收益。

3 自助报表:为什么不能把数据和需求直接丢给 AI

3.1 先问一句:AI 都能直接生成报表页面了,还要再做吗

现在把数据和需求一起交给 AI,它也能直接生成报表页面,那还有必要专门做一个自助报表功能吗?

乍一看,这样确实能出东西;但放进产品里用起来,通常会遇到三个问题。

第一是黑盒。AI 直接给出报表,中间过程不透明。结果不对时,业务用户既定位不到是哪一步错了,也无法只改一处,只能换个说法重来,结果可能本来对的地方又改错了。几次之后,人就失去耐心了。

第二是算力。让模型直接吃数据、做推理、出结果,开销是跟数据量走的:数据越大,token 和算力消耗越高。而不少企业本身就没有多少算力余量,很难为一个查询功能长期兜这笔账。

第三是安全。这条路要求频繁把业务数据送进大模型,如果模型在公网,就会把数据出域的风险直接摆上桌面,很多行业根本不会讨论这种方案。

3.2 方案结构:口语进,汉语命令出,规则引擎执行

润乾报表的做法是把用户需求让 AI 拆成一串可执行的汉语命令,再由规则引擎逐步执行。如图5所示,左侧是命令序列,右侧是 LLM 规划面板:一句“订单金额超过 5000、按省份和年份分组汇总、再算省内金额比例环比、金额按货币格式”的需求,被拆成 7 步,并标注了每步的类型——数据过滤操作、聚合计算、组内跨行计算、明细字段显示控制、外观格式与样式设置。

imagepng

图5 自助报表:左侧汉语命令序列,右侧 LLM 规划出的分步指令

imagepng

图 6 规划执行结果:左侧报表随规划命令逐步生成,右侧为待执行的新命令

这张图里最值得程序员注意的,不是界面,而是命令是有限集合、参数是结构化的。AI 的输出被约束在这套指令集里,而不是自由发挥成一段脚本。指令集越稳定,模型能“飘”的空间越小,你也越敢把它放进产品。

表2 部分典型汉语命令族

命令类别

典型写法

作用

表头与维度

左表头 客户省 签单年

设定行、列维度的分组字段

数据过滤

过滤 订单金额 大于 5000

按条件筛选记录

聚合计算

订单金额 求和

生成指标值

组内跨行计算

在客户省 范围内 计算 订单金额 比例环比 命名为 省内金额比例环比

分区内的占比、环比、排名、累计

明细控制

隐藏全部明细

控制明细行是否展示

排序

排序 订购年 升序

结果排序

外观与格式

位置 订单金额 显示为 "#,##0.00"

数字格式、条件样式

回看 上小节 的三个问题,这套结构正好一一对应。过程不再是黑盒:每一步命令都看得见、改得动,错了只改那一条,还能单独执行看中间结果。算力不再随数据量膨胀:AI 只做翻译和规划,不碰数据,消耗跟需求的复杂度走,而不是跟数据规模走。数据不出私域:进模型的只有表样、字段和需求,业务数据始终留在自己的库里。

3.3 两种用法:单步执行与整体规划

单步执行是一步一步输入、一步一步执行、一步一步完善,适合调试和精细控制;整体规划是把一段宏观需求整体交给 AI 拆解,再决定整体执行还是逐步执行。

对用户的价值在于排障粒度。拆错了,改的是某一条命令,不是推翻重来;某一步结果不对,单独执行那一步就能看到中间结果。这相当于给“自然语言做表”装了一个单步调试器,问题定位到步骤,而不是在一整段生成物里试错。

3.4 落地时要注意的工程点

指令集是你的契约。它连着提示词、连着历史数据、也连着用户的肌肉记忆。改指令集要像改 API 一样谨慎,最好有版本号。

数据不进模型。只把表样、字段和需求交给 AI,数据留在你自己的库里。这样 token 消耗比“让模型算数”低两个数量级,也自然绕开了数据出域。

每一步都要能单独执行。这是给业务用户的“退一步改一步”,也是给你自己的排障能力。没有这一步,白盒就只是口号。

4 通用查询:一个问数框,替代一堆查询界面

4.1 开发侧的真实成本,不在界面本身

做查询最贵的从来不是那个筛选框,而是重复:每个模块一套面板、一套接口、一套权限判断;需求一改就要改前端、联调、发版。界面长得都差不多,代码却要写很多遍。

市面上做智能问数的 ChatBI 产品不少,看起来正好能解决这个问题,但这些方案大多“太重”,落到应用系统里并不好用。

一是形态重。它们多是独立的数据分析产品,自带登录、看板、管理后台。要嵌进业务系统,得打通账号、权限、数据、界面风格,工作量不亚于自研一套查询模块;用户查个数据还要跳转系统,体验像外挂。

二是栈太重。主流方案是“大模型 + 向量库 + RAG 知识库”三件套,需要 GPU 服务器、专人做数据标注和提示词调优,还要持续维护知识库。为一个查询功能搭一整套 AI 基建,很难算得过账。

三是黑箱化,这一点更关键。纯大模型生成 SQL 本质是概率猜测:简单查询看着准,一到多表关联、复杂口径就容易翻车;更麻烦的是错了也不报,照样返回一个看似合理的结果,而业务用户根本识别不出来。

4.2 为什么纯 AI生成 SQL 不能直接用

简单查询它确实做得不错:单表、条件明确、字段名直白。但真实业务查询大多是分组聚合、多表关联、条件组合,一旦涉及口径和关联关系,模型的猜测就开始翻车。更麻烦的是它的失败方式——不报错,返回一个看起来很正常的结果。

对业务用户来说,90% 的准确率没有意义。他不知道这一次是不是撞上了那 10%,看不懂 SQL,就没有能力核对。于是功能上线了,却没人敢用。

4.3 方案:规范问句 + 规则编译

润乾 NLQ 的链路是:业务口语 → AI 转译成一句语义规范问句 → 用户确认 → 规则引擎确定性地编译成 SQL → 执行返回。如图7所示。

imagepng

图7 通用查询:规范问句、查询项与来源条件、编译出的 SQL 与结果

图7 里,“去年谁没开单”被转成规范问句“2025年,没有订单,员工”;下面用一张表列出了选项目、来源和条件——员工取姓名、职务、出生日期、性别、年龄,订单取签单日期 2025 年、订单“没有”;再往下是编译出的 SQL 和查询结果。

这张图同时解决了三件事。业务用户能确认:他看不懂 SQL,但看得懂“去年没有订单的员工”是不是自己想问的。关联与口径不靠猜:主表子表的存在性判断、JOIN 关系由元数据与规则层决定,不交给模型自由发挥。结果可复现:确认之后是确定性编译,同一句规范问句永远编译成同样的 SQL。

AI在这里的边界被划得很清楚:不懂表结构、不猜外键、不写 SQL、不做口径决策,只做语义转译。它只需要一个通用大模型的 API Key,不需要微调、不需要训练——这对开发团队意味着,模型可以换,链路不用动。

4.4 对开发工作的改变:从“每页做查询”到“一个组件 + 一套元数据”

表3 传统查询界面与问数框的工作量对比

工作项

传统做法:每页一套查询界面

NLQ 方案:一个通用问数框

前端

每页一套筛选面板,条件变了改页面

一个标准输入框组件

后端

每页一个查询接口,逐个联调

统一查询服务,JDBC 调用

口径与关联

散落在各接口的 SQL 里

元数据与词典集中定义

权限

各接口分别实现,容易漏

继承系统原有权限体系

新增需求

改前端、调接口、发版本

加一条词典配置

接入方式也按组件的标准来:标准 JDBC 驱动,加载 JAR 包、配置数据源、在代码里调用;前端就是一个输入框。核心是规则引擎,不需要 GPU、不需要向量库,普通 CPU 服务器就能跑。

权限不用另做一套:它直接对接系统现有的元数据、表结构和字段映射,并继承原有权限体系。不同岗位的人问同一句话,返回各自权限范围内的数据。

4.5 覆盖范围:不能只查“北京的订单”

只能处理简单条件筛选的问数,是玩具。润乾NLQ能有四类范式,以及取数之后的中行运算,覆盖绝大多数常用的查询需求。

表4 通用查询需要覆盖的四类查询范式

查询范式

典型问题

技术要点

单表明细筛选

上周发往华北地区的订单有哪些

条件过滤与明细返回

单表聚合排名

各省订单金额排名

分组、聚合、排名

主子实体关联过滤

上个月没有开单的员工

主表与子表的存在性判断

多维对齐汇总

按省份、年份汇总并计算

多维交叉统计

跨行运算

占比环比排名

针对结果集做跨行计算

多表 JOIN 不交给 AI 猜,由规则引擎按元数据自动计算。这既是准确率的来源,也是你能向客户解释“为什么这次和上次一样”的依据。

4.6 元数据可以交给智能体生成

做问数最重的一块其实不是查询本身,而是元数据:表结构、字段映射、汉语词典、口径定义、提示词。过去这一步靠熟手一点点配,一个主题域动辄一两天。

现在可以把这条流水线交给智能体:连库读表结构、生成 DQL 元数据、构建汉语词典、编写提示词、配置数据源、Web 上线、JDBC 真连真查,人只在每一步做确认。原本数周甚至上周的配置工期,现在一两天就能跑通。

形态上是 MCP 一体化服务:既能被智能体当工具调用,也能配 SKILL 端到端搭建。维护也轻——新增业务加一条词典配置,普通开发就能做,不用训练模型,也不用维护知识库。

4.7 落地边界:不是所有查询界面都该删

从实践看,最优组合是“问数框为主、高级筛选为辅”。

可以替代:临时多变的条件筛选、各类分组汇总排名、突发的非标准化查询。这类需求等开发排期最不划算,直接问就出结果。

建议保留:极高频的固定操作(比如“我的待办订单”,点按钮比打字快)、强引导型的新手场景、极复杂的多步深度分析——这几类还是走原来的功能入口更顺手。

5 三条路线的共同原则

把三种方案放在一起看,会发现结构是同一个:AI 做语义与规划,引擎做执行,只是中间物不同——固定报表是 rpx 模板,自助报表是汉语命令序列,通用查询是规范问句。

中间物必须是人能看懂、能改的东西。这不是为了某个理念,而是为了两件很实际的事:出了问题你能定位,上线之后你能维护。凡是 AI 直接产出最终形态的方案,都会在这两件事上付出代价。

成本要算全。算力、token、数据出域、支持人力,四项里任何一项失控,功能都活不长。把模型当翻译器而不是计算器,成本差两个数量级。

形态要组件化。开发商交付的是系统的一部分,用户不该为此跳转到另一个产品;能不能嵌、能不能连、能不能管、能不能养,比功能列表更重要。

6 结语

报表行业过去解决过两个问题:能不能做出中国式复杂报表,数据准备能不能从报表里解耦。现在多了新问题:如何利用 AI 提效?AI 生成的东西,怎么才能放心地放进生产?

润乾报表的路线一直没变:把 AI 的输出落到一个确定的、人能改的中间物上。对开发商来说,这意味着三件事可以分开做、按需做——固定报表用 Agent 加 Copilot,自助报表用汉语命令加规则引擎,通用查询用规范问句加一个问数框。

不必等一个“万能方案”。把 AI 放对位置,三类功能都能在自己的应用里先跑起来。