润乾 NLQ 课程 - 8 应用集成
8. 应用集成
8.1. NLQ 集成方式
NLQ 对前端应用提供 NLQ JDBC 驱动,目前仅支持嵌入前端应用的方式集成:

注意:NLQ 服务基于 DQL 服务,请参考《分析教程》DQL 服务器部署集成。
8.2. NLQ 嵌入式集成
第一步,加载用到的 JAR 包
润乾报表 [安装根目录]\report\web\webapps\demo\WEB-INF\lib 下:
nlq-***.jar NLQ 服务引擎及 JDBC 驱动包
esproc-bin-***.jar 集算器基础包
json-20240303.jar 解析 json 格式串
report-***.jar 润乾报表核心包
要使用嵌入式报表版 DQL,还要将报表版 DQL 的 JDBC 驱动包 datalogic-***.jar 和数据库驱动包,以 hsql 为例:hsqldb-2.7.3-jdk8.jar 一并放到加载目录下。
第二步,配置文件 raqsoftConfig.xml
<DB name="DQL4Orders">
<property name="url" value="jdbc:datalogic://?lmd=E:\files\dql\orders.lmd&dct=&vsb=&db.url=jdbc:hsqldb:hsql://127.0.0.1/orders&db.driver=org.hsqldb.jdbcDriver&db.user=sa&db.password=&db.type=13" />
<property name="driver" value="com.datalogic.jdbc.LogicDriver" />
</DB>
……
<Report>
<license>E:\licenses\defaultlicensetrial_zh.xml</license>
……
</Report>
这里使用安装包自带的元数据文件 orders.lmd,获取路径为报表 [安装目录]\report\services\orders\conf
如果需要更具体的了解 DQL JDBC 的参数配置,可参考嵌入式DQL部署集成。
第三步,配置文件 nlqConfig.xml
<NLQ name ="nlq1">
<DB>DQL4Orders</DB>
<MetaData>dql\orders.nlq</MetaData>
<RaqsoftConfig>raqsoftConfig.xml</RaqsoftConfig>
</NLQ>
<DefaultRaqsoftConfig>D:\raqsoft\report\config\raqsoftConfig.xml</DefaultRaqsoftConfig>
第四步,应用调用
public static void main(String[] args)throws Exception () {
Class.forName("com.nlq.datalogic.jdbc.NLQDriver");
con = DriverManager.getConnection("jdbc:datalogic:nlq://?nlq=nlq1");
ResultSet rs = nlqCon.createStatement().executeQuery("query 人口 8 万至 1000 万的城市");
//rs 里得到多个结果, 每个 JSON 格式的结果都包含一个 MQL 语句。要拆解 JSON 串,获取 MQL 语句
String mql = "select 人口 as 人口, 城市编码, 城市名称, 省份 from CITY where ((人口 >=8*10000) AND (人口 <=1000*10000))";
ResultSet rs2 = nlqCon.createStatement().executeQuery(mql);
// 关闭 NLQ JDBC 连接
nlqCon.close();
}
8.3. NLQ 返回结果中,JSON 格式说明
查询:人口 8 万至 1000 万的城市
JSON:
{words:[{name:"人口",position:0,type:"字段词",field:""},
{name:"8 万",position:2,type:"数值",field:""},
{name:“至”,…},{name:"1000 万",…},{name:"的“,…},{name:" 城市 ",…],
displayStatement:"人口 8 万 至 1000 万之间,城市",
mql:"select 人口 as 人口, 城市编码, 城市名称, 省份 from CITY where ((人口 >=8*10000) AND (人口 <=1000*10000))",
on:null,from:[{table:"城市", field:[{name:"人口", dim:null,select:true,sum:null,where:"人口 8 万 至 1000 万之间"},
{name:"城市编码", dim:"CITY",select:true,sum:null,where:null},{name:"城市名称", …},{name:“省份”, …}],
error:""}
说明:
words列出各个词的分析结果。
displayStatement列出了查询语句中与显示字段相关的各个词。
mql: select 人口 as 人口, 城市编码, 城市名称, 省份 from CITY where ((人口 >=8*10000) AND (人口 <=1000*10000))"
from列出了查询中涉及的各个子句表。其中table为表名,field为表中各个字段的信息,by为表需要分组统计时的维或者字段。
field 中,name为字段名,dim为字段关联的维,select为字段是否选出,sum为计算时字段的聚合处理方式,where为字段相关的过滤条件。
unkown被忽略的字符串,不认识的词。
error为没有结果时的错误信息。
8.4. 前端页面
润乾 NLQ 提供样例页面,可以作为大家定制开发页面的参考:

http://query.raqsoft.com.cn:6999/nlq.html
8.5. NLQ和大模型的调用接口
润乾 NLQ 调用大模型 API,包含三个关键参数:
1、自由文本转规范文本的转换规则
2、自由文本
3、对大模型返回结果的要求
注意:NLQ 提供了转换规则的参考样例:润乾 NLQ 大模型提示词 -Deepseek,大家可以参考写出符合自己项目要求的转换规则。

8.6. 大模型返回结果
LLM 建议返回格式要求:
如果查询不支持的报错,第一行输出“不支持”,下方说明原因。
如果能正常转换的转换出来,第一行输出转换结果;如果语句本身符合规则,保持不变,作为转换结果在第一行输出。

在转换结果后面,根据用户的查询意图提供规则中类似的例句作为参考,列出参考例句即可,不用说明是哪条规则。

最后总结说明修改建议。

