数据模型问答的最佳实践
1.概述
对于已在有数BI中创建完成的数据模型,如需将其应用于知数问答,需由项目管理员或模型编辑者开启该模型的知数配置。
数据模型可用性判断:一个数据模型要能被知数使用,需同时满足「已应用于知数」与「用户对该模型有查看权限」两个条件。
配置分为四个层次,其中「开启配置」和模型检索配置为必做项,后两层为提升问答效果的推荐配置:
| 配置层次 | 配置项 | 作用 | 是否必做 |
|---|---|---|---|
| 开启配置 | 知数开关、角色权限 | 使模型可用于知数问答 | 必做 |
| 模型检索配置 | 模型名称/描述、字段元信息、训练语料 | 使知数能召回到正确的数据模型 | 必做 |
| 提示词 | 别名管理、提示词管理 | 使大模型理解模型内的业务口径 | 建议 |
| 工程化配置 | 字段设置、结果配置 | 使输出结果稳定可控 | 建议 |
开启后可先进行提问取数测试。大模型本身具备一定的理解能力,如在测试中发现其对特定业务及概念的理解不足,可再逐项补充配置。
2. 开启配置:使数据模型可用于知数问答
第一步:将数据模型打开「知数设置」
项目管理员或模型编辑者进入数据模型的列表页面,在【知数开关】列开启即可。


第二步: 在角色管理中配置好角色并赋予用户
项目管理员在【项目中心】的【角色管理】或【资源权限管理】中,配置数据模型的查看权限。具体的权限配置详见权限管理
3. 数据模型检索配置:使知数能召回到正确的数据模型
模型名称/描述、字段元信息、训练语料是知数在问答前期检索、召回数据模型的重要依据。这些信息缺失或不准确时,知数不易召回到该数据模型,或召回到错误的数据模型,导致取错数据。
3.1 数据模型名称/描述
数据模型名称与数据模型描述共同用于说明该数据模型的作用,帮助大模型理解数据模型中的数据范围与适用场景。
设置一个业务可理解的数据模型名称:数据模型的名称要能准确描述该模型中的数据,不建议采用无业务含义的模型名称,如"未命名模型"等。
数据模型描述用于说明该模型包含哪些数据、可回答哪类问题。
3.2 字段元信息
- 隐藏不必要的字段:比如「ID」「修改时间」等对数据分析无用的字段。
- 对字段进行重命名:字段命名要让业务人员容易理解这个字段是什么,要通俗易懂,不要使用模凌两可的词语,也不要出现两个字段名称雷同。且字段名称不要使用特殊符号,比如:
!、#、/、\、~等。 - 维度字段的成员定义:将维度字段的成员枚举值设置为更易理解的值,比如将性别字段中的"1"和"0"修改为"男"和"女"(可使用数据字典或计算字段功能)。
- 合理设置字段类型:比如将「订单日期」这种数据库中存储为字符串类型、但实际业务含义为日期的字段,转换为日期类型。
- 合理分类维度和度量:比如将「客户ID」等数字型字段转成维度。
3.3 训练语料
为了让 AI 能更好地回答您的问题,您可以选择维度字段,提前设置训练语料。我们将自动缓存您所设置的维度成员值,AI 将基于这些缓存数据进行预学习,以此提高问答准确率。若模型字段信息会持续更新,您可以通过设置定时更新来更新语料,防止语料丢失导致无法检索到数据模型。以"超市销售数据"这个表为例:
- 对于可枚举的维度字段,如「类别」,可直接配置指定值,减少查询开销,提升性能;
- 对于不可枚举的字段,如「产品_*ID」,可设置需要缓存的数据条数。

4. 提示词:使大模型理解模型内的业务口径
在实际使用的过程中,用户提问时会带入一些场景黑话和自己的提问习惯,而这些非通用的内容无法被大模型识别。但因大模型本身具备一定的理解能力,建议在数据模型配置完成后,先直接进行提问取数测试效果。如果感觉大模型对于特定业务及概念的理解不足,可再进行助手的业务知识或数据模型的提示词配置。
用于配置规则类知识,即某一表述对应一组查询条件,或对应多个取值的并集。

- 选择触发条件(什么情况下该提示词生效):目前支持「问题包含关键词」和「所有问题」两类触发条件;
- 设置规则(提示词生效时,希望 AI 做什么):目前支持「自定义规则」和「选择字段」。
注意:填写提示词时,对数据模型中的字段值和字段名都用引号包裹,表示区分。
5.工程化配置:使输出结果稳定可控
5.1 配置知数问答的字段顺序与排序
宽表查询时,问答涉及多字段(如:查询员工绩效、入职时间、A业务积分、B业务积分、C业务积分、总指标完成率等)。当您需要以指定字段(如:姓名)为首列展示、或按照一定顺序展示字段可以通过「置顶展示」与「相对优先级」进行设置。同时可以在设置按照指定字段,如「总指标完成率」降序展示。

- 设置前

- 设置后

5.2 结果配置
结果配置用于约束最终返回的取数结果,包含四类配置。
5.2.1 分组是 / 分组包含 / 分组存在
三者均用于判断「问答查询的分组字段命中了配置字段」时,对结果执行排除空值操作。唯一区别在于触发严格程度。以所选字段为「政治面貌、性别」为例:
| 类型 | 触发条件 | 示例 |
|---|---|---|
| 分组是 | 分组字段恰好只有所选字段 | 分组为 [政治面貌, 性别] 时触发;[政治面貌, 性别, 学历] 时不触发 |
| 分组包含 | 所选字段全部出现在分组字段中,查询中可包含额外分组字段 | 分组为 [政治面貌, 性别, 学历] 时触发;[政治面貌] 时不触发 |
| 分组存在 | 所选字段中至少有一个出现在分组字段中,不要求全部出现 | 分组为 [政治面貌] 或 [性别, 学历] 时均触发;[学历] 时不触发 |
三者触发范围由窄到宽依次为:分组是 → 分组包含 → 分组存在。
触发后,可对结果选择以下空值排除方式:
- 排除字段中存在空值的结果:所选字段中任意一个为空,该行即不输出
- 排除字段全部为空的结果:所选字段全部为空时该行才被剔除,部分为空的行保留
示例:类型选择「分组是」,字段选择「政治面貌、性别」,动作选择「排除字段全部为空的结果」。当查询恰好按这两项分组时,两项均为空的结果行不会出现在回答中。

5.2.2 筛选条件
把某个字段的筛选值,同时传递给另一个字段或自定义 SQL 中的全局参数。
1. 目标为字段时
| 配置项 | 说明 |
|---|---|
| 源字段 | 筛选来源字段 |
| 源筛选方式 | 等于 / 不等于 / 包含 / 不包含 等(按字段类型) |
| 目标字段 | 接收筛选值的字段 |
| 目标筛选方式 | 值在目标字段上的应用方式 |

传递规则:仅当源字段筛选方式为「等于」或「包含」时才传递,按目标字段的运算符筛选相同值。
例子:当"集团"="A集团",同时对"公司" like "%A集团%",两者取并集。筛选为"集团"="A集团" or "公司" like "%A集团%"。
2.目标为全局参数时
适用场景:模型使用了自定义 SQL 表时,问答里生成的SQL的筛选条件默认作用不到数据模型里自定义SQL表的部分——底层会先全量查出明细,筛选只能在上层进行,数据量大时查询很慢。
通过配置全局参数和字段的映射关系后,把字段筛选传给全局参数后,问答里的筛选条件整段下推到自定义 SQL,先过滤再计算,避免全量明细参与上层运算,查询性能随之提升。

示例:
原始自定义 SQL:
-- 原始自定义SQL
select t1.`订单ID`, t1.`地区`, t1.`销售额`, t2.`客户名称`, t2.`客户等级`
from (select * from test.`订单` where {{{#地区筛选}}}) t1
left join test.`客户` t2 on t1.`客户ID` = t2.`客户ID`
模型的自定义 SQL t1 中引用了布尔值的全局参数地区筛选,未设置字段和全局参数的映射关系。数据查询SQL:
-- 未配置参数和字段映射关系的数据查询SQL
select `地区`, sum(`销售额`) as "销售额"
from (
select t1.`订单ID`, t1.`地区`, t1.`销售额`, t2.`客户名称`, t2.`客户等级`
from (select * from test.`订单` where {{{#地区筛选}}}) t1
left join test.`客户` t2 on t1.`客户ID` = t2.`客户ID`)
where `地区` in ("华东","华北")
where 地区 in ("华东","华北") 是作用在自定义SQL外的筛选。未配置映射时,该条件不会传入自定义 SQL t1——订单与客户仍会全量关联后再返回结果,筛选只能在其外层进行。
配置字段「地区」映射到全局参数「地区筛选」后,该条件整段下推到自定义 SQL,t1 先按 地区 in ("华东","华北") 过滤再返回结果,避免全量明细参与运算,影响查询性能。
-- 自定义 SQL(配置字段和全局参数映射后,查询筛选下推)
select `地区`, sum(`销售额`) as "销售额"
from (
select t1.`订单ID`, t1.`地区`, t1.`销售额`, t2.`客户名称`, t2.`客户等级`
from (select * from test.`订单` where `地区` in ("华东","华北")) t1
left join test.`客户` t2 on t1.`客户ID` = t2.`客户ID`)
where `地区` in ("华东","华北")
传递规则:
- 只要逻辑 SQL 中该字段存在筛选,就把该字段的所有筛选条件传给全局参数。
- 字段与全局参数一一对应:一个字段只能对应一个全局参数,一个全局参数也只能对应一个字段。
前提:仅当模型的自定义 SQL 表中用到了布尔值类型的全局参数时,才能选择将字段映射到全局参数中。
以上内容对您是否有帮助?