WorkBuddy 自动化实施润乾 NLQ 向导 - 以保险主题为例

在各类智能问数技术中,润乾NLQ的实施成本相对来讲已经很低,但仍需要人工完成元数据、词典、大模型转换提示词等工作。使用WorkBuddy 可以自动化完成这些工作,大幅度提升效率。

本文以保险数据为例,引导用户从材料准备开始,在一个全新的环境下,利用 WorkBuddy 自动化部署 NLQ 系统,最终实现用自然语言查业务数据

简化的保险主题数据包括4个表,包含主子关系、多层外键关系,比较有代表性,表间关系如下图:

..

一、输入和输出

输入清单:

d:\attachments目录下有4个文件

01_表结构说明.csv

02_中文术语同义词说明.csv

03_枚举值说明.csv

04_动词和指标说明.csv

输出清单:

C:\Program Files\raqsoft\report\services\insurance\conf\insurance.lmd

C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\files\dql\insurance.nlq

C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes\insurance.md

C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes\action\*.md

点这里下载输入输出物

下面对输入输出逐一说明。

1.1 01_表结构说明.csv

需要明确:表、字段(不一定所有表、字段都要进 NLQ,只挑要问数的)、逻辑主键、逻辑外键。

采用csv格式可以方便编辑,而且文件比Excel小,也容易给WorkBuddy

..

1.2 02_中文术语同义词说明.csv

两种情况,按实际情况选:

情况1:数据库表、字段本身有中文注释 → 直接用。

情况2:整理一份"表名/字段名 → 标准中文名 → 同义词"对照文档,交给 WorkBuddy

..

1.3 03_枚举值说明.csv

情况1:数据库直接存枚举值名称 WorkBuddy 会自动 SELECT DISTINCT查出所有不重复值。

例:保单表的"付款方式"字段,枚举值直接是"网上支付、银行转账、银行代扣、银行代收、第三方支付"WorkBuddy 会自动查出来写入词典。

情况2:数据库存的是代码、又没有对应维表 → 整理一份枚举值说明文档。

..

1.4 04_动词和指标说明.csv

WorkBuddy 能自动生成动词和指标。用户可指定部分业务上重要的动词和指标,其他让WorkBuddy 自动生成。

..

1.5 输出物说明

元数据:

C:\Program Files\raqsoft\report\services\insurance\conf\insurance.lmd

说明:在数据库基础上封装而成,主要用于简化多表关联计算

打开方式:直接双击打开,在元数据IDE中编辑。

词典:

C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\files\dql\insurance.nlq

说明:用于存储实体词、字段词、维词等。

打开方式:直接双击打开,在词典IDE中编辑。

大模型转换提示词:

C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes\insurance.md

C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes\action\*.md

说明:提交给大模型,用于把随意的自然语言转换成规范文本。insurance.md用于对话式页面、*.md用于查询式页面。

二、实操步骤

2.1 环境准备

安装润乾报表、BI,配置好授权。

准备数据库连接参数。

确认 JDBC 驱动 jar 已就位。

编辑 C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\llm.properties,写入大模型的秘钥。

示例:

内容

格式

库类型

PostgreSQL

名称

url

jdbc:postgresql://192.168.1.5:5432/postgres

JDBC 连接串

driver

org.postgresql.Driver

驱动全类名

user

postgres

用户名

password

postgres

明文

schema

public

模式名

同时确认 JDBC 驱动 jar 已放到安装目录的 common\jdbc\下(如 postgresql-42.7.3.jar)。

2.2 WorkBuddy 写工作要求

把准备好的材料,组织成一份四段式提示词,交给 WorkBuddy 自动完成。下面逐段说明每段内容,解释和示例。

第一段:# 工作目标(一句话说清要做什么)

内容:一句话交代"基于什么数据、要上线什么、是什么场景"

解释:让 WorkBuddy 一开始就明确这是"多表关联的 NLQ 问数部署"

示例:帮我基于润乾 NLQ 上线一个智能问数 DEMO,数据集用保险数据集(postgres),是多表关联场景。

第二段:# 环境信息(列出所有客观事实)

内容:安装根目录、数据库连接串、表清单、实例命名等,全部用明确的键值/列表列出。

解释:这些是 WorkBuddy 无法自己猜到的客观信息,必须原样给出,否则会连错库、写错路径。

示例:安装根目录、url/driver/user/password、表名、实例命名 insurancelmd/nlq/jsp 统一用这个名)。

第三段:# 任务(按顺序全部完成,逐条列产出)

内容:把要产出的和部署步骤拆成编号任务,每条写清"产出什么 + 关键规则 + 输出路径"

1、生成元数据insurance.lmd

2、生成汉语词典insurance.nlq

3、配置数据源

4、真连真查验证

5、生成提示词*.md,这里要注意修改自带的样例提示词中的表结构和例句

6、Web 上线

解释:明确每步的产出物和硬性规则(如"日期字段建外键""同类型词不重复"),能显著减少返工。规则宁可写细,也不要省略。WorkBuddy 在工作时会自动搜索官网中DQLNLQ的相关文档,不需要专门给它提供文档。

示例:任务 1 生成元数据 insurance.lmd(物理表 type:0、日期字段建日期外键、枚举字段建假表、desc 用中文);任务 2 生成词典 insurance.nlq(全局词表复用 insurance、金额字段加 unitName、配实体/动词/指标)……以此类推。

第四段:# 约束(写明格式与检查要求)

内容:输出语言、报错处理方式、访问方式等硬性约定。

解释:约束段让 WorkBuddy 在出错时按正确方向排查(先查命令/classpath/URL),而不是乱猜,同时保证交付物可直接访问。

示例:中文输出;报错先查编译/运行命令、classpathURL 是否写对;要求这样访问:

http://localhost:6868/demo/raqsoft/dql/jsp/insurance.jsp

2.3 检查 、修改WorkBuddy 的工作结果

WorkBuddy 的工作完成后,需要人工检查所有的输出物,发现问题通知WorkBuddy 改正。

这时也可以根据业务的需要,对各个输出物提出修改。

每个产出物的检查方法:

步骤

产出物

如何检查

生成元数据

insurance.lmd

日期字段都有日期外键;枚举字段都建了假表;desc 是中文

生成词典

insurance.nlq

动词/指标/量纲齐全;同类型词不重复;金额字段有 unitName

生成提示词

insurance.md

action/*.md

词典部分和例子与 .nlq 一致,其他部分不变;含查询范式和不支持清单

配置数据源

raqsoftConfig.xml+ nlqConfig.xml

JDBC 真连连通

Web 上线

insurance.jsp

chat.jsp

浏览器可访问、能点查询

真连真查

验证结果

自然语言问句返回真实数据

改正举例:

检查发现词典文件insurance.nlq有多个字段词重复,对WorkBuddy 提出下面的要求:

#词典中的词险种状态重复了,要改正

#其他词也要检查一下,有重复也要改正

#检查后续步骤,相应修改、调整

WorkBuddy 会自动改正,也会自动调整后续的提示词等内容。

修改举例:

假设希望WorkBuddy 在完成的工作基础上,为词典增加一个指标:某年某月的保费,可以这样提要求:

#词典中为保单表增加指标

名称:某年某月的保费;同义词某年某月度的保费

(1)计算方法:先从保单表中,按"签单日期"筛选出某年月(年月由查询时指定,例如 202612)的所有保单;

(2)再对这些保单的"保费"字段做求和;

(3)求得的保费总和,就是"某年某月的保费"

#检查后续步骤,相应修改、调整

多轮检查、改正:

WorkBuddy 修改、调整后,需要人工再复查。有问题继续要求WorkBuddy 修改、再复查,直到完全正确为止。

三、效果和总结

访问查询页面:

http://localhost:6868/demo/raqsoft/dql/jsp/insurance.jsp

..

访问对话页面:

http://localhost:6868/demo/raqsoft/chatbi/jsp/chat.jsp

..

工作量估计:

准备工作加上WorkBuddy 的工作,大约需要11.5天。

检查、修正工作大于需要0.5天。

总共需要约2天即可完成。

四、附录:WorkBuddy 工作要求

下面是给 WorkBuddy 的完整工作要求原文,其中斜体的部分是针对保险数据的,可以把这部分替换成实际项目中的信息,复制给WorkBuddy

# 工作要求

帮我基于润乾NLQ 上线一个智能问数 DEMO,数据集用保险数据集postgres,是多表关联场景。

# 环境信息

- 安装根目录:`C:\Program Files\raqsoft\report`(运行实例),文件名 / 服务名统一。

- 数据库:postgres`url=jdbc:postgresql://192.168.1.5:5432/postgres`,`driver=org.postgresql.Driver`,`user=postgres`,`password=`postgres`

- 授权文件:`D:\ 授权 \润乾报表研发人员内部专用授权20261231 含 nlr.xml`。

- 实例命名:`insurance`(lmd/nlq/jsp 统一用这个名)。

## 任务(按顺序全部完成)

1.** 生成元数据 `insurance.lmd`**:d:\attachments 目录中有我准备好的附件,要求根据这些附件,并连接数据库读数据表的真实结构,生成 DQL 元数据(JSON,UTF-8,顶层 `{tableList, namedDimList}`)。物理表 `type:0`,含主键与 `fkList`。日期型字段建「日期」虚拟维(`type:2`, dimType 5,levelList 含年 / 季度 / 月 / 日 / 年月 / 月日 / 年季度 / 星期 / 周 / 年周),日期字段都要建立外键。字符串枚举字段建枚举虚拟维(比如性别、省等,根据需要自己定义假表)。字段 desc 用中文。输出到 `WEB-INF/files/dql/insurance.lmd`。

注意:附件内容与数据库真实结构/ 取值比对,不一致处写入 d:\attachments\ 不一致.csv。

** 启动 web 服务:C:\Program Files\raqsoft\report\bin\startreportcenter.bat**

(其中包含了DQL 服务)。

2. ** 生成汉语词典 `insurance.nlq`**:基于上面的 lmd,生成 NLQ 词典(JSON)。要点(务必遵守,否则查不出):

- 全局词表(无效词 / 量纲 / 存在词 / 非法词 / 宏词 / 聚合词 / 连词 / 比较词)参考 demo 自带 nlq 直接复用。

- ** 注意:同类型的词不能重复,比如不能定义两个实体词都是“险种”,不能定义两个字段词都是“险种类别”等等。**

- `dimConfigList` 里 `dimName` 必须等于 lmd 中维表名(实体维 = 物理表名如 insurance/customer,日期/ 枚举维 = 虚拟表名如 日期 /保单状态)。

- `tableViewList` 的 `expStr` 规则:` 表名. 字段名 ` 或 `fkN. 字段名. 字段名…`;** 路径必须终止于外键引用字段(FK key)**,例如国家名称 =`fk1.N_NATIONKEY`(不是 `fk1.N_NAME`)、客户地区 =`fk1.C_NATIONKEY.N_REGIONKEY`。原生主键字段不要加 `isFKCluster:true`。

- 字段簇 `fieldCluster` 只放字符串维度字段,** 数值字段不进簇 **;簇词不指向含数值的簇。

- `dataType`:数值 =1、字符串 =11、日期 =8(与 lmd 不同)。金额字段加 `unitName:"元"`。

- 每张表配 `entityList` 实体(例如:保单、客户、险种、保单产品),多表外键字段用中文命名(如「客户国家」「客户地区」)。

- 参照 tpch2.nlq,生成动词和指标

- 输出到 `WEB-INF/files/dql/insurance.nlq`。

3. ** 配置数据源(xml)**:

- `WEB-INF/raqsoftConfig.xml` 的 `DBList` 参照TPCH2 和 NLQ4TPCH加两个 DB:

`DQL4insurance``NLQ4insurance`

- `WEB-INF/classes/nlqConfig.xml` 参照TPCH2insurance:

`<NLQname="insurance">

<DB>DQL4insurance</DB>

<MetaData><insurance.nlq 绝对路径 ></MetaData>

<RaqsoftConfig></RaqsoftConfig>

</NLQ>`

4. ** 真连真查验证 **:写一个 JDBC 测试程序,用 DQL 驱动验证多表深路径聚合,例如基本保额大于10000 的个人险种详情,用 NLQ 驱动验证汉语查询(如按年汇总个人保单数和保费求和」「某月新增保单」「签单日期是去年的个人保单),返回真实结果,确认全链路可用。

5.** 生成 LLM 提示词 **:基于 nlq 的词典,依据`WEB-INF/classes/Chat_NLQ_NLC.md` ,** 要求:只改字典部分和例句,其他保持不变 **,生成「自然语言→规范文本 (nlq)」的提示词 `insurance.md`,词典部分与 nlq 完全一致(表 / 字段 / 维词 / 常数词 / 聚合词)。

基于nlq 的词典,把`WEB-INF/classes/action/`中的所有md 文件都改成 insurance 对应的内容,包括词典内容和所有例句都按照词典修改。

6.**Web 上线 **:

复制 `raqsoft/dql/jsp/dqlSearch.jsp` → `raqsoft/dql/jsp/insurance.jsp`,改 `dataSource="NLQ4insurance"` 。

修改`raqsoft/chatbi/jsp/chat.jsp` `dataSource="NLQ4insurance"`

## 约束

- 中文输出;报错先查编译 / 运行命令、classpath、URL 是否写对。

- 要求这样访问

http://localhost:6868/demo/raqsoft/dql/jsp/insurance.jsp

http://localhost:6868/demo/raqsoft/chatbi/jsp/chat.jsp