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

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

浏览报表时经常需要变更条件查看不同数据,通常可以借助参数模板实现。但参数较复杂时,传统参数模板操作繁琐、灵活性不足,而且也不太适应当前的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规范功能将口语化的命令转化为规范语句,继而被识别处理。

LLM规范的配置方法

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

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

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

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

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

LLM规范的效果

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

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

输入

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

..LLM规范

点击LLM规范按钮

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

..

此截图日期为2026.4.17

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

上周发货到华北的订单【过滤 发货日期 大于等于 2026-04-07 且 发货日期 小于等于 2026-04-13 且 城市 属于["北京","天津","张家口","石家庄","秦皇岛"]

执行

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

..

规范提示词

我们知道LLM模型工作中存在发散和创造的可能,要想让它返回的语句尽可能规范,就需要提示词来约束,让严格遵守明确的纪律。LLM规范执行时,会附带提示词,其中规定了AI应该怎么理解输入、处理,又怎么输出我们需要的汉语命令语句。

LLM规范分为两步:功能识别和规范化。

1,功能识别

定义在类路径根目录下的nlr-prompt-main.md文档中。AI阅读此文档后,理解输入并转换为功能名称。这部分提示词会被经常复用,不会附带数据项,以减少token消耗。

2,规范化命令

定义在类路径根目录下的nlr-prompt-func-paramform-filter.md(数据过滤)、nlr-prompt-func-paramform-order.md(字段排序)等文档中。根据第一步AI识别的功能,选中对应的md文档,AI阅读此文档后,理解输入并转换为规范化语句。

..


功能识别提示词nlr-prompt-main.md

内容概括:

1,输入定义:用户输入内容

2,功能识别规则:定义了AI的角色、工作清单和约束

3,输出定义:输出识别的功能名称

4,功能示例:识别功能举例

..

..

数据过滤提示词nlr-prompt-func-paramform-filter.md

内容概括:

1,输入定义:用户输入内容

2,功能识别:定义了AI的角色、工作清单和约束

3,规范转换规则:包括字段数据项、词典的构成、工作细则。

4,示例集附录:各种输入情况举例。

..

字段排序提示词nlr-prompt-func-paramform-order.md

与上述过滤功能提示词相同。

..

不同的大模型,对提示词的利用可能不同。如果遇到LLM执行结果不理想的情况,可以根据情况和LLM特征对这些提示词进行适当改动,帮助模型在目标场景下更好地理解怎样处理能输出用户想要的结果。