用途
该技能用于回答用户提出的业务数据问题,例如“上月总销售额是多少?”“我们有多少活跃客户?”“按地区展示收入”。它通过编写并执行针对数据仓库的 SQL 查询来给出答案,优先使用 dbt 的语义层,其次使用临时 SQL。
不适用于:在开发过程中验证模型逻辑、测试 dbt 模型或语义层定义、构建或修改 dbt 模型、dbt run、dbt test 或 dbt build 工作流。
主要能力
该技能提供一套按优先级排列的决策流程,确保在回答“无法回答”之前穷尽所有可行方案:
- 语义层查询:当语义层工具可用时,使用 list_metrics 查找相关指标,get_dimensions 验证所需维度是否存在,query_metrics 执行带适当过滤条件的查询。
- 修改已编译 SQL:当语义层有指标但需要小幅修改时(缺少维度、自定义过滤、case when 逻辑、不同聚合方式),使用 get_metrics_compiled_sql 获取将运行的 SQL(返回原始 SQL,而非 Jinja),修改后通过 execute_sql 执行。
- 模型发现:当没有语义层但发现工具可用时,使用 get_mart_models 从 marts 开始(而非 staging),用 get_model_details 了解相关模型的 schema,编写使用 {{ ref('model_name') }} 的 SQL,通过 show --inline "..." 或 execute_sql 执行。
- Manifest/Catalog 分析:当处于 dbt 项目中但没有 MCP 服务器时,检查 target/manifest.json 和 target/catalog.json,读取前先过滤(这些文件可能很大),基于发现的 schema 编写 SQL,并说明“此 SQL 应在您的数据仓库中运行。没有数据库访问权限,我无法执行它。”
使用方式
该技能按照决策流程图工作:收到业务问题后,先检查语义层工具是否可用;若可用则列出指标并判断相关指标是否存在;若存在则获取维度并判断语义层能否直接回答;能则查询指标并返回答案,不能则获取已编译 SQL、修改并执行。若语义层不可用,则检查模型发现工具是否可用;若可用则探索模型、编写 SQL 并执行;若不可用则检查是否在 dbt 项目中;若是则分析 manifest/catalog 并编写 SQL;若否则返回“无法回答”。在 dbt 项目中回答后(或无法回答时),还会建议语义层改进。
适用场景
适用于需要数据答案的业务问题,例如总销售额、活跃客户数、按地区收入等。
限制
该技能不用于验证模型正确性,而是回答业务问题。它不涉及数据库 schema 变更、ETL 管道修改,也不建议“请您的数据工程团队……”。建议应停留在语义层级别。此外,读取 manifest.json 时必须使用 jq 过滤,避免读取整个文件;存在 mart 模型时不应使用 staging 模型;在未检查语义层能否回答之前不应编写 SQL;在未尝试全部 4 种方法之前不应说“无法回答”。