如何用自然语言筛选报表数据

如何用自然语言筛选报表数据

浏览报表时经常需要变更条件查看不同数据,通常可以借助参数模板实现。但参数较复杂时,传统参数模板操作繁琐、灵活性不足,而且也不太适应当前的AI时代。

润乾报表推出汉语命令查询功能,将参数模板升级为智能对话接口,用户只需用自然语言描述条件即可精准查询,无需反复操作控件,实现更加灵活高效的数据探索。

目前参数模板的汉语命令提供过滤和排序两种功能。实现过滤有两种做法,一是将汉语转换为参数传入报表实现过滤;二是将汉语翻译成表达式,作为宏传入报表。面对口语化的查询描述,它还可以和公共LLM配合规范化。让我们来看看怎么用起来。


一,汉语转换成参数

1. 设计报表

像平时做报表参数模板一样,我们需要先设计一个参数模板。例子中会对雇员ID、客户ID、发货日期进行汉语命令查询。这个模板需要包含web变量雇员ID,客户名称,发货日期。然后为他们生成对应的控件。

..

参数模板数据集展示

..

..


控件设计

雇员下拉数据集

这里注意雇员ID这个控件我们显示列用了姓名,数据列用了雇员ID。这个控件会为汉语命令提供姓名-雇员ID的值映射。

..

客户名称下拉数据集。ds2包含了雇员ID字段,因此使用汉语命令时候可以看到关联过滤的效果,下面会说到。

..


发货日期的日历控件

..

添加默认参数雇员ID,值为1

..

浏览报表设计

..

这里分组排序是为了展示内容方便说明,以及后续我们会用到排序,这里先不用关注。

浏览报表的数据集:

..

..

这个报表需要参数客户名称,发货日期和雇员ID

发货日期注意设置为日期类型

..

准备完毕,现在可以预览带有参数模板的报表了。


2. 预览查询

完成制作后,使用汉语查询就非常简单,只要用showNLRFormReport.jsp预览报表,并在url中增加nlrQueryFields参数来设置筛选字段即可。

URL:

localhost:8081/demo/reportJsp/showNLRFormReport.jsp?rpx=%2Fdocument3.rpx&nlrQueryFields=雇员ID,客户名称,发货日期

..

点击汉语,弹出输入框,可以开始输入了。

输入“筛选”,下面的帮助栏会显示可用的“数据项”,敲入数据项比如雇员ID,进而显示雇员ID的候选值。实际使用语句时参数名“筛选”可以省略。

..

3. 输入框的便利特性

生成的候选值有几个特点:

根据参数模板设计的控件映射显示值。

我们的参数模板有控件雇员ID,显示值是姓名列,这里在过滤雇员ID时,显示的是姓名,实际查询时程序将为我们解析为雇员ID真实值。

..

自带关联过滤。

输入过滤客户姓名时,根据当前查询参数雇员ID关联过滤的结果集。

..

模糊查询

最多显示十个候选值,进一步输入时会模糊查询,更新帮助数据项

..

4. 查询演示

雇员ID等于张颖且客户名称等于兰格英语

...

添加条件,查询日期。“添加”命令把新的条件拼接到之前查询的宏上,而不是替换

添加条件发货日期是2025-02-28

..

清除条件

..

这样可以回到访问报表初始的条件,相当于重置。重置参数为参数模板设置的初始参数。参数模板我们没有设置参数,这里就相当于全部置空了。


5. 优点和不足

我们可以看出来,这样设计报表和参数模板和原来的设计方法没有任何差别,只要配合nlrQueryFields参数开启功能即可。语句中的参数被正确解析到报表参数中。但这种查询就像控件选择一样,所有条件都类似“等于”的比较,条件之间都是“与”的关系。要变化查询条件,往往需要改变数据集的设置。

而下面汉语表达式转化为宏能极大丰富查询的条件。

二,汉语翻译成宏

宏可以直接用到报表SQL语句中,这样的用法我们可以实现更加灵活的、更复杂的查询。同时,前述输入框的便利特性,在这个用法中同样有效。

1. 设计报表,更少的配置,更灵活的查询

修改数据集,去掉数据集参数,将SQL写成子查询方便宏里使用中文别名,并在SQL增加where ${nlrMacro}。如下图。这个宏名称“nlrMacro”是固定的,不要修改。

..

..

..

2. 预览查询

类似地,还是在URL增加参数就可以了

URL:

localhost:8081/demo/reportJsp/showNLRFormReport.jsp?rpx=%2Fdocument3.rpx&nlrQueryFields=雇员ID,客户名称,订单ID,城市,发货日期,订单金额

..

3. 查询演示

常规

发货日期等于20253

..

添加条件订单金额 10002000

..

多条命令可以点击全部执行,串联执行所有命令,上面两个命令串联执行效果和逐个执行效果一致。

配合NLR得强大功能,我们还可以这样写命令:


日期处理

发货日期是去年本月

..

复杂条件

发货日期是今年2月且城市是广东

..

范围、多选

发货日期上周 城市属于北京 上海 广东

..

模糊查询

客户名称包含三

..

执行清除条件最后仍然是可以来重置

..

三,使用宏排序

1. 设计报表

报表的groupselect函数是可排序的,动态切换的排序状态,需要动态的排序参数。

汉语命令给报表列排序,需要先给报表设置排序参数,并用于groupselect可排序的函数。

..

修改A2 B2 C2,给报表函数增加排序,用宏填充

..

..

..

2. 预览报表

浏览时,把报表排序可能用到的字段作为nlrOrderFields作为参数拼入url中,他们将在数据项中显示。

URL

http://localhost:8081/demo/reportJsp/showNLRFormReport.jsp?rpx=%2Fdocument3.rpx&nlrOrderFields=雇员ID,客户名称,订单ID,订单金额,发货日期

..


3. 排序演示

这个例子是一个分组报表,有雇员ID层、客户名称层和明细层。

订单ID、城市、发货日期、订单金额同属于明细字段,他们在客户名称层下,在客户名称组内排序。

排序订单ID降序

..

同一层的排序互斥,下面对订单金额排序,订单ID的排序失效

排序订单金额从小到大

..


雇员ID降序

..

此时明细层关于订单金额的排序状态保持。订单金额和雇员ID位于不同层,可以分别排序,图中点击全部执行和分别执行这两条效果是相同的。

客户名称降序

..


取消排序

..

回到了初始的默认排序状态。

四,用LLM规范口语命令

目前汉语查询功能采用了小型的规则引擎,还不能识别非常灵活的口语命令,比如当我们使用“查询上周发货到华北的订单”等口语化描述查询数据时,规则引擎无法理解就会报错。这时候可以借助AI的能力,用LLM规范功能将口语化的命令转化为规范语句,继而被识别处理。

1.LLM规范的配置方法

只需在reportJsp/js/funcs.js文件中修改三个核心参数即可启用此功能:

llmUrl:填写所选大模型的API接口地址。

requestJSON:配置LLM的调用参数,如模型名称等。

keyFile:指定存储API密钥的本地文本文件名(如deepseek.txt),将对应服务的密钥存入该文件即可。

..

上图中我们配置了deepseekAPI接口地址,配置了模型为deepseek-chat模型,以及最大token量等参数,并将自己的APIKey填入deepseek.txt文档,放在WEB-INF目录下。

2.LLM规范的效果演示

配置此功能后,访问例子:

http://localhost:8081/demo/reportJsp/showNLRFormReport.jsp?rpx=document3.rpx&nlrQueryFields=城市,发货日期

输入

“查询上周发货到华北的订单”。

..

LLM规范

点击LLM规范按钮

..

将查询描述、字段和提示词发送给配置好的LLM

..

LLM自动将转换为上图规范后的命令:

查询上周发货到华北的订单, 规范后【过滤 发货日期 大于等于 2026-03-30 且 发货日期 小于等于 2026-04-05 且 城市 属于 大连 沈阳 北京 天津 张家口 石家庄 秦皇岛 】

执行

点击执行按钮,汉语命令引擎接收此结构化条件,完成查询

..