答案构建器最佳实践
答案构建器用于把复杂 SQL 口径封装成可被自然语言问答复用的分析模板。它不是简单的 SQL 保存工具,而是让系统在回答问题时能够动态选择维度、过滤条件和输出指标的可执行语义资产。
当一个分析问题涉及多指标组合、复杂过滤、跨字段计算、明细查询或多表关联时,答案构建器通常比普通指标更合适。
适用场景
答案构建器的核心价值,是把“模型容易临时推错的复杂分析逻辑”变成“可配置、可验证、可复用的 SQL 模板”。下面这些场景都适合优先考虑答案构建器。
| 使用场景 | 答案构建器的价值 | 示例 |
|---|---|---|
| 固化复杂业务口径 | 把 CASE WHEN、有效数据过滤、状态判断等逻辑写死,避免每次问答临时推断。 | 活跃账户统一按 统计。 |
| 一次输出多个相关指标 | 一段 SQL 同时返回一组指标,便于系统统一解释和生成图表。 | 账户数、活跃账户数、活跃率、总席位、活跃席位。 |
| 支持动态维度分析 | 通过 让用户自然指定分组方式。 | “按 plan 展示账户健康概览”“按国家查看活跃率”。 |
| 支持动态过滤 | 通过 让用户自然追加筛选条件。 | “只看 Google 来源”“只看 Basic Plan”“最近 30 天”。 |
| 精确控制输出列 | 问答时可只返回用户需要的输出字段。 | 用户只问“活跃率和活跃席位”时,不必展示全部指标。 |
| 避免多表 JOIN 出错 | 将正确 JOIN 路径固化在模板中,减少模型临时拼 JOIN 的风险。 | 订单、客户、商品、支付表组合分析。 |
| 支持明细查询 | 返回行级明细,而不是只返回聚合指标。 | 交易明细、客户清单、异常订单列表。 |
| 封装派生指标 | 将复杂公式或多字段计算封装成可复用输出。 | 转化率、席位活跃率、留存率、客单价。 |
| 提升问答解释质量 | 多个相关指标一起返回,系统更容易生成结构化分析和业务洞察。 | 同时比较账户数、活跃率和活跃席位,判断哪个 Plan 质量最好。 |
| 降低用户 SQL 门槛 | 用户不需要知道表名、JOIN 条件、字段公式,只需要用业务语言提问。 | “按渠道看转化率和订单金额”。 |
实际验证中,“账户健康概览”就是一个典型答案构建器场景。它把账户数、活跃账户数、活跃率、总席位和活跃席位放在同一个 SQL 模板中,用户可以继续通过自然语言指定:
- 按
分组。plan - 只看
。source = Google - 只返回活跃率和活跃席位。
系统会把这些自然语言要求转成
dims、filters 和 outputColumns 参数,调用同一个答案构建器完成分析。这是普通单指标难以覆盖的能力。
核心概念
答案构建器的 SQL 模板中最重要的是两个占位符:
| 占位符 | 作用 | 问答中的表现 |
|---|---|---|
| 动态过滤条件 | 用户说“只看 Google 来源”“最近 30 天”“Basic Plan”时,系统会尝试转成过滤表达式。 |
| 动态分组维度 | 用户说“按 plan 展示”“按国家分组”“按渠道对比”时,系统会尝试转成 GROUP BY 维度。 |
实际测试中,未选择过滤条件时,
${filters} 会被替换为 1=1;未选择维度时,${dims} 会被替换为 1,因此预览默认会返回整体结果。
页面流程总览
新建答案构建器不是一个“填完 SQL 就保存”的单步表单。页面实际会按以下流程推进:
| 步骤 | 页面操作 | 你需要理解的点 |
|---|---|---|
| 1. 编写代码 | 输入 SQL 模板,点击 运行校验 | SQL 必须符合底层数据源语法;使用 、 时要写在正确位置。 |
| 2. 配置过滤和维度 | 通过 添加过滤、添加维度 选择表和字段 | 这里决定问答时哪些字段可以被用作筛选条件,哪些字段可以被用作分组维度。 |
| 3. 匹配输出字段 | 系统识别 SQL 输出列,并按输出列创建指标 | 每个输出列都会成为可被问答调用的指标,应补充业务化名称、别名和描述。 |
| 4. 预览 | 运行预览,检查结果 | 预览用于验证 SQL 和字段配置是否可执行,不等同于最终自然语言问题的完整效果。 |
| 5. 创建 | 填写答案构建器名称、别名、描述并保存 | 保存后答案构建器会出现在当前分析域,并默认启用。 |
因此,答案构建器保存后在问答记录中经常表现为“执行指标计算”。这是因为系统会把答案构建器的输出字段注册成可执行的 SQL 指标实例。你不需要因此困惑:这里的”指标”并不等同于手工创建的普通聚合指标,而是答案构建器生成的可执行输出。
推荐设计方法
1. 一个构建器封装一组强相关指标
答案构建器最有价值的用法,是围绕一个业务主题封装一组相关指标,而不是只保存一个简单计数。
例如“账户健康概览”可以同时输出:
| 输出字段 | 业务含义 |
|---|---|
| 账户数 |
| 活跃账户数 |
| 活跃率 |
| 总席位 |
| 活跃席位 |
这样用户可以直接问:
系统会选择该答案构建器,传入
dims = plan,并返回按 Plan 分组的多指标表格和图表。
2. 把稳定口径写死,把变化条件留给占位符
SQL 中应固化不会随问题变化的业务规则,把会变化的部分留给
${filters} 和 ${dims}。
示例:
这里,活跃账户的业务口径固定为
active_subscription = TRUE,而用户可以在问答中动态指定:
| 用户问题 | 系统应动态传入 |
|---|---|
| 按 plan 展示账户健康概览 | |
| 只看 source 为 Google 的账户健康概览 | |
| 按国家查看活跃率 | |
3. 对过滤字段和维度字段做显式绑定
运行校验成功后,页面会进入“配置过滤和维度”步骤。
如果 SQL 中包含
${filters},需要点击 添加过滤,选择可用于过滤的表和字段。
如果 SQL 中包含
${dims},需要点击 添加维度,选择可用于分组的表和字段。
实际测试中,过滤字段列表会包含更多字段,例如
account_name、id、email、plan、source、seats、created_at 等;维度字段列表会过滤掉部分更适合度量的字段,例如 seats、latitude、longitude 不会优先作为维度出现。
这一步会直接影响问答能否正确理解“按 plan”“只看 Google 来源”“按国家”等表达。
4. 理解页面上可选的 ${filters}
和 ${dims}
字段
${filters}${dims}在”配置过滤和维度”步骤中,页面不会让你手写
${filters} 或 ${dims} 的字段,而是通过 添加过滤、添加维度 来选择字段范围。
字段来源于 SQL 模板中使用到的表。实际操作时,点击 添加过滤 或 添加维度 后,系统会让你先选择表;选择表后,再展示该表中可用于过滤或分组的字段。
| 配置入口 | 页面字段来源 | 字段特点 | 典型用途 |
|---|---|---|---|
| 添加过滤 | SQL 涉及表中可作为条件的字段 | 范围更宽,字符串、数值、日期、布尔字段都可能出现。 | “只看 Google 来源”“Basic Plan”“最近 30 天”“活跃账户”。 |
| 添加维度 | SQL 涉及表中适合分组的字段 | 更偏分类、枚举、日期、布尔等维度字段;部分连续数值字段不会优先出现。 | “按 plan”“按国家”“按来源渠道”“按创建时间”。 |
实操中,
v_gpt_accounts 表在过滤字段里出现了:
account_nameidemailfirst_namelast_nameplansourceseatscreated_attrial_ends_atcanceled_attrial_convertedactive_subscriptionlegacy_planlatitudelongitudecountry
而在维度字段里,页面主要展示了:
idemailfirst_namelast_nameplansourcecreated_attrial_ends_atcanceled_attrial_convertedactive_subscriptionlegacy_plancountry
可以看到,过滤字段范围通常更宽;维度字段会更偏向“可分组”的字段。像
seats、latitude、longitude 这类连续数值或地理坐标字段,更适合作为度量值、计算字段或过滤条件,不一定适合作为默认分组维度。
如果希望某个字段更容易出现在维度或过滤配置中,应先在表字段配置里补充字段信息:
| 字段配置 | 对答案构建器的影响 |
|---|---|
| 字段类型 | 帮助系统判断字段适合做分类、连续值、时间字段还是其他类型。 |
| 字段用途 | 帮助系统判断字段更适合做维度、过滤条件还是度量值。 |
| 字段别名 | 帮助系统把用户自然语言中的叫法映射到字段,例如“套餐”映射到 。 |
| 字段描述 | 帮助系统理解字段业务含义,减少误用字段。 |
| 隐藏字段 | 被隐藏的字段不应作为问答和构建器优先使用字段。 |
建议在配置答案构建器前,先检查参与 SQL 的表字段:
- 用于
的字段,应适合表达用户常见筛选条件。${filters} - 用于
的字段,应适合分组展示,且基数不要过高。${dims} - 数值型度量字段不要随意配置为维度,否则可能产生大量无意义分组。
- ID、邮箱、姓名等高基数字段虽然可能出现在维度列表中,但通常不适合默认推荐给业务用户做分组分析。
- 日期字段如果用于维度,最好明确用户希望按日、周、月还是年分析,避免分组粒度过细。
5. 为输出字段补充业务化名称、别名和描述
答案构建器会根据 SQL 输出字段分别创建指标。如果只保留技术字段名,问答仍能使用,但结果和记录中可能出现
active_account_rate_metric、active_seats_metric 这类技术名称。
建议在保存前补充:
| 配置项 | 建议 |
|---|---|
| 指标名 | 使用稳定、可读的中文业务名,如“活跃账户数”“账户活跃率”。 |
| 指标别名 | 补充用户常用叫法,如“活跃率”“账户活跃占比”。 |
| 指标描述 | 写清计算口径、适用范围和注意事项。 |
| POP 表达式 | 根据指标类型选择同环比算法,比例类指标不要直接套用绝对值增长率。 |
字段名可以保持 SQL 可读,但展示给用户的名称应尽量业务化。
6. 必须使用预览验证
答案构建器保存前应先点击 运行校验 和 预览。
实际测试中发现:
| 操作 | 结果 |
|---|---|
SQL 缺少 | 校验报错:。 |
SQL 包含 并绑定过滤字段 | 可以进入下一步并预览运行。 |
SQL 包含 并绑定维度字段 | 预览区会出现 Dims,可用于动态分组。 |
| 多输出字段 SQL | 系统会识别每个输出字段,并分别创建指标。 |
预览默认不带过滤和维度时,会返回整体结果。用户问题触发时,系统会根据自然语言传入具体维度、过滤条件和输出列。
需要特别注意:预览结果和问答结果可能不同,这通常不是错误。
| 现象 | 原因 |
|---|---|
| 预览只返回一行总数 | 没有在预览中选择具体维度, 默认替换为 。 |
| 问答能按 plan 分组,但预览没有分组 | 问答时模型根据“按 plan”传入了 。 |
| 问答只返回部分输出列 | 用户只问了部分指标,记录中可能看到系统通过 只选择需要的输出。 |
| 问答先查询字段取值再执行构建器 | 系统需要确认枚举值大小写或真实取值,例如先确认 。 |
7. 用 SQL 和记录确认是否真正生效
答案构建器是否被问答使用,不建议只看最终文字答案,应同时查看 SQL语句 和 记录。
在实际验证中,一个命中答案构建器的问题会在记录中出现类似信息:
- 找到匹配的答案构建器或指标。
- 执行指标计算,
为metricType
。SQL - 参数中包含
、dims
或filters
。outputColumns - SQL 中会看到
、${filters}
已被替换成实际字段和条件。${dims}
例如用户问“只看 source 为 google 的账户健康概览,按 plan 展示活跃率和活跃席位”时,记录中可以看到:
| 参数 | 含义 |
|---|---|
| 按 Plan 分组。 |
| 只看 Google 来源。 |
| 只返回用户要求的活跃率和活跃席位。 |
如果记录中没有命中答案构建器,而是临时查看表结构并生成 SQL,说明构建器名称、别名、描述或输出指标信息可能不够清晰,需要补充语义信息。
实操验证案例
案例一:按 Plan 展示账户健康概览
用户提问:
系统行为:
- 找到答案构建器“账户健康概览”。
- 识别用户需要按
分组。plan - 传入
。dims = plan - 一次性返回多个指标。
- 自动生成表格和组合图,并给出业务洞察。
实际结果中,系统返回了 Basic、Business、Premium 三类 Plan 的账户数、活跃账户数、活跃率、总席位和活跃席位,并指出 Business Plan 账户数量少但活跃率和席位利用表现最好。
案例二:按过滤条件查看同一组指标
用户提问:
系统行为:
- 先查询
字段中的真实取值,确认存储格式是source
。Google - 继续使用同一个答案构建器。
- 传入
。dims = plan - 传入
。filters: source = Google - 只选择用户要求的输出列:
和active_account_rate
。active_seats
这说明答案构建器不仅能固定 SQL 口径,还能让系统在问答时动态选择维度、过滤条件和输出字段。
与指标、知识的配合
答案构建器通常不应孤立使用。
| 配置 | 作用 |
|---|---|
| 知识 | 解释业务词汇和口径,例如“活跃账户指 active_subscription = TRUE 的账户”。 |
| 指标 | 固化单个常用聚合口径,适合简单、高频问题。 |
| 答案构建器 | 固化复杂 SQL 模板,适合多指标、多维度、多过滤或明细查询。 |
实际问答中,系统会先搜索知识,理解“活跃账户”等业务概念;再查找可用指标和答案构建器;如果找到匹配的答案构建器,会优先使用其 SQL 模板执行计算。
名称、别名和描述怎么写
答案构建器里有几类名称,含义不同,建议不要混用。
| 配置项 | 面向对象 | 建议写法 |
|---|---|---|
| 答案构建器名称 | 系统匹配和管理列表 | 用业务主题命名,如“账户健康概览”。 |
| 答案构建器别名 | 用户自然语言匹配 | 写用户常用叫法,如“账户健康”“账户质量”“活跃概览”。 |
| 答案构建器描述 | 系统理解适用范围 | 写清包含哪些指标、支持哪些维度和过滤条件。 |
| 输出字段名 | SQL 和底层执行 | 可以使用英文技术名,如 。 |
| 输出指标名 | 问答和图表展示 | 建议使用业务名,如“账户活跃率”。 |
| 输出指标别名 | 用户不同叫法 | 补充“活跃率”“活跃占比”等表达。 |
| 输出指标描述 | 指标口径解释 | 写清计算公式,例如“活跃账户数 / 账户数”。 |
一个常见误区是只给答案构建器写了清晰名称,但输出字段仍保留英文技术名。这样系统可以执行,但最终答案、图表字段或记录里仍可能出现
active_account_rate_metric 之类的名称。最佳实践是:构建器名称负责“让系统选中模板”,输出指标名称负责“让用户看懂结果”。
常见问题与处理建议
| 问题 | 可能原因 | 处理建议 |
|---|---|---|
| 校验提示 SQL 缺少过滤条件参数 | SQL 没有 | 在 中加入 ,并绑定过滤字段。 |
| 用户说“按某字段分组”但系统没有使用该字段 | 没有配置 或没有绑定该字段为维度 | 在 SQL 中加入 和 ,并在配置步骤中选择维度字段。 |
| 问答结果出现英文技术名 | 输出字段没有配置中文指标名、别名或描述 | 保存前补充业务化名称和别名。 |
| 预览只有总数,没有分组 | 预览未传入具体维度, 默认替换为 | 保存后通过自然语言问题验证动态维度,或在预览中选择维度后再运行。 |
| 用户过滤条件没有生效 | 过滤字段未绑定,或字段值大小写/枚举值不一致 | 将字段加入过滤配置;必要时让系统先查询字段真实取值。 |
| 多个构建器都可能匹配 | 构建器名称、别名、描述不够清晰 | 使用明确的业务主题命名,并在描述中写清适用问题。 |
| 保存后记录里显示“执行指标计算” | 答案构建器输出可能会被注册成 SQL 类型指标调用 | 这是正常现象,可通过记录中的 、、 判断本次问答是否调用了构建器。 |
| 不知道“数据”页签有什么用 | 数据页签展示同数据源下可引用的数据表 | 编写 SQL 时可用它确认表资产;它不是答案构建器的结果页。 |
| 输出字段很多,不知道是否都要保留 | SQL 输出字段会分别创建指标 | 只输出用户会真正查询和解释的指标;无关中间字段不要出现在最终 SELECT 中。 |
| 高基数字段出现在维度列表中 | 字段可分组不代表适合业务分析 | ID、邮箱、姓名等字段通常不建议作为默认维度,除非问题确实需要明细级分析。 |
建议检查清单
上线一个答案构建器前,建议逐项检查:
- SQL 中是否包含必要的
。${filters} - 需要动态分组时,是否包含
和${dims}
。GROUP BY ${dims} - 过滤字段是否覆盖用户常用筛选条件。
- 维度字段是否覆盖用户常用拆分方式。
- 输出字段是否都配置了业务化指标名。
- 输出字段是否补充了别名和描述。
- 比例类指标是否使用合适的 POP 表达式。
- 预览运行结果是否符合预期。
- 是否用自然语言验证过典型问题。
- 构建器名称和描述是否能让系统准确匹配。
设计建议
答案构建器的颗粒度应围绕“一个业务分析主题”设计。
推荐:
账户健康概览订单转化分析渠道投放效果客户留存分析交易明细查询
不推荐:
- 把完全无关的指标放进一个构建器。
- 为每个简单 COUNT 单独创建答案构建器。
- 只写 SQL,不配置过滤字段、维度字段和业务描述。
- 输出字段全部保留英文技术名。
一个好的答案构建器应该让用户可以自然地问:
而不是要求用户知道底层表名、字段名和 SQL 逻辑。
相关文档
- 指标与答案构建器 — 答案构建器的创建流程与配置参考
- 配置分析域 — 分析域的创建与数据配置
- 分析域配置原则与常见问题 — 配置过程中的踩坑经验与 FAQ
- 问答准确率提升 — 语义层配置的整体方案
