如何用自然语言筛选报表数据
如何用自然语言筛选报表数据
浏览报表时经常需要变更条件查看不同数据,通常可以借助参数模板实现。但参数较复杂时,传统参数模板操作繁琐、灵活性不足,而且也不太适应当前的AI时代。
润乾报表推出汉语命令查询功能,将参数模板升级为智能对话接口,用户只需用自然语言描述条件即可精准查询,无需反复操作控件,实现更加灵活高效的数据探索。
目前参数模板的汉语命令提供过滤和排序两种功能。实现过滤有两种做法,一是将汉语转换为参数传入报表实现过滤;二是将汉语翻译成表达式,作为宏传入报表。面对口语化的查询描述,它还可以和公共LLM配合规范化。让我们来看看怎么用起来。
一,汉语转换成参数
1. 设计报表
像平时做报表参数模板一样,我们需要先设计一个参数模板。例子中会对雇员ID、客户ID、发货日期进行汉语命令查询。这个模板需要包含web变量雇员ID,客户名称,发货日期。然后为他们生成对应的控件。

参数模板数据集展示


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

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

发货日期的日历控件

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

浏览报表设计

这里分组排序是为了展示内容方便说明,以及后续我们会用到排序,这里先不用关注。
浏览报表的数据集:


这个报表需要参数客户名称,发货日期和雇员ID
发货日期注意设置为日期类型

准备完毕,现在可以预览带有参数模板的报表了。
2. 预览查询
完成制作后,使用汉语查询就非常简单,只要用showNLRFormReport.jsp预览报表,并在url中增加nlrQueryFields参数来设置筛选字段即可。
URL:

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

3. 输入框的便利特性
生成的候选值有几个特点:
根据参数模板设计的控件映射显示值。
我们的参数模板有控件雇员ID,显示值是姓名列,这里在过滤雇员ID时,显示的是姓名,实际查询时程序将为我们解析为雇员ID真实值。

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

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

4. 查询演示
雇员ID等于张颖且客户名称等于兰格英语
.
添加条件,查询日期。“添加”命令把新的条件拼接到之前查询的宏上,而不是替换
添加条件发货日期是2025-02-28

清除条件

这样可以回到访问报表初始的条件,相当于重置。重置参数为参数模板设置的初始参数。参数模板我们没有设置参数,这里就相当于全部置空了。
5. 优点和不足
我们可以看出来,这样设计报表和参数模板和原来的设计方法没有任何差别,只要配合nlrQueryFields参数开启功能即可。语句中的参数被正确解析到报表参数中。但这种查询就像控件选择一样,所有条件都类似“等于”的比较,条件之间都是“与”的关系。要变化查询条件,往往需要改变数据集的设置。
而下面汉语表达式转化为宏能极大丰富查询的条件。
二,汉语翻译成宏
宏可以直接用到报表SQL语句中,这样的用法我们可以实现更加灵活的、更复杂的查询。同时,前述输入框的便利特性,在这个用法中同样有效。
1. 设计报表,更少的配置,更灵活的查询
修改数据集,去掉数据集参数,将SQL写成子查询方便宏里使用中文别名,并在SQL增加where ${nlrMacro}。如下图。这个宏名称“nlrMacro”是固定的,不要修改。



2. 预览查询
类似地,还是在URL增加参数就可以了
URL:

3. 查询演示
常规
发货日期等于2025年3月

添加条件订单金额 1000到2000

多条命令可以点击全部执行,串联执行所有命令,上面两个命令串联执行效果和逐个执行效果一致。
配合NLR得强大功能,我们还可以这样写命令:
日期处理
发货日期是去年本月

复杂条件
发货日期是今年2月且城市是广东

范围、多选
发货日期上周 城市属于北京 上海 广东

模糊查询
客户名称包含三

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

三,使用宏排序
1. 设计报表
报表的group、select函数是可排序的,动态切换的排序状态,需要动态的排序参数。
汉语命令给报表列排序,需要先给报表设置排序参数,并用于group、select可排序的函数。

修改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),将对应服务的密钥存入该文件即可。

上图中我们配置了deepseek的API接口地址,配置了模型为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 且 城市 属于 大连 沈阳 北京 天津 张家口 石家庄 秦皇岛 】
执行
点击执行按钮,汉语命令引擎接收此结构化条件,完成查询

