跳转至

业务指标智能化

从 **0.2.4 版本**开始,指标组件专注于创建标准化、可查询的业务指标,作为独立的语义查询层。指标可通过 MetricFlow 直接执行查询,而不仅仅作为 LLM 生成 SQL 的参考。

核心价值

解决常见的企业挑战: - 重复的 SQL 查询:直接查询指标,而非重写相似的 SQL - 不一致的定义:通过可执行的规范跨团队标准化指标定义 - 手动分类:使用层级主题树分类体系组织指标 - 临时 SQL 复杂性:对常见指标使用语义查询(query_metrics)而非生成 SQL

工作原理

指标是构建在语义模型之上的业务级计算。从 0.2.4 版本开始,它们独立运行:

  • 指标(本文档):通过 MetricFlow 查询的标准化 KPI
  • 语义模型(参见 semantic_model.zh.md):用于临时 SQL 生成的 schema 扩展

两者都可以从历史 SQLs 生成,但指标专注于可复用的业务逻辑,而语义模型专注于 schema 理解。

查询指标

定义指标后,可使用 MetricFlow 工具直接查询:

# 在 agent 对话或工作流中
# 搜索相关指标
search_semantic_objects(query="daily active users", kinds=["metric"])

# 执行指标查询
query_metrics(
    metrics=["daily_active_users"],
    group_by=["platform", "country"],
    start_time="2024-01-01",
    end_time="2024-01-31"
)

指标优先策略:当用户查询涉及 KPI(例如 "按平台展示 DAU")时,agent 将: 1. 使用 search_semantic_objects 搜索匹配的指标 2. 如果找到,通过 query_metrics 执行(首选) 3. 仅当不存在指标时才回退到临时 SQL 生成

这确保了组织内指标定义的一致性。

使用方法

前置条件:此命令依赖 datus-semantic-metricflow,请先运行 pip install datus-semantic-metricflow 安装。

基本命令

# 从 CSV(历史 SQLs)
datus-agent bootstrap-kb \
    --namespace <your_namespace> \
    --components metrics \
    --success_story path/to/success_story.csv

# 从 YAML(语义模型)
datus-agent bootstrap-kb \
    --namespace <your_namespace> \
    --components metrics \
    --semantic_yaml path/to/semantic_model.yaml

关键参数

参数 必需 描述 示例
--namespace 数据库命名空间 sales_db
--components 要初始化的组件 metrics
--success_story ⚠️ 包含历史 SQLs 和问题的 CSV 文件(如果没有 --semantic_yaml 则必需) success_story.csv
--semantic_yaml ⚠️ 语义模型 YAML 文件(如果没有 --success_story 则必需) semantic_model.yaml
--kb_update_strategy 更新策略 overwrite/incremental
--subject_tree 预定义分类(逗号分隔) Sales/Reporting/Daily,Finance/Revenue/Monthly
--pool_size 并发线程数 4

主题树分类

使用层级分类法组织指标:domain/layer1/layer2(例如 Sales/Reporting/Daily

两种模式: - 预定义:使用 --subject_tree 强制指定特定分类 - 学习:省略 --subject_tree 以复用现有分类或创建新分类

# 预定义模式示例
--subject_tree "Sales/Reporting/Daily,Finance/Revenue/Monthly"

# 学习模式:省略 --subject_tree 参数

生成的标签格式:

指标生成后,主题树分类存储在 locked_metadata.tags 中,格式为 "subject_tree: {domain}/{layer1}/{layer2}"

metric:
  name: daily_revenue
  type: simple
  type_params:
    measure: revenue
  locked_metadata:
    tags:
      - "Finance"
      - "subject_tree: Sales/Reporting/Daily"

YAML 导入注意事项:

使用 --semantic_yaml 从 YAML 文件同步指标到 lancedb 时,必须在 YAML 文件中手动添加包含 subject_tree 格式的 locked_metadata.tags 才能成功分类。系统不会自动对从 YAML 导入的指标进行分类,需要自行添加标签:

metric:
  name: your_metric
  # ... 其他字段
  locked_metadata:
    tags:
      - "YourDomain"
      - "subject_tree: Domain/Layer1/Layer2"

数据源格式

CSV 格式

question,sql
How many customers have been added per day?,"SELECT ds AS date, SUM(1) AS new_customers FROM customers GROUP BY ds ORDER BY ds;"
What is the total transaction amount?,SELECT SUM(transaction_amount_usd) as total_amount FROM transactions;

YAML 格式(仅指标)

从 YAML 文件导入指标时,指标定义引用已存在的语义模型:

metric:
  name: total_revenue
  description: "Total revenue from all transactions"
  type: simple
  type_params:
    measure: amount  # 引用语义模型中的 measure
  filter: "amount > 0"
  locked_metadata:
    tags:
      - "Finance"
      - "subject_tree: Finance/Revenue/Total"

注意:底层的语义模型(包含 dimensions/measures 的 data_source)应该已经存在。参见 semantic_model.zh.md 了解如何定义语义模型。

总结

指标组件建立了一个**语义查询层**,将历史 SQLs 转换为标准化、可执行的指标定义。与传统的仅作为 LLM 参考的语义层不同,Datus 指标可通过 MetricFlow 直接查询,无需为常见 KPI 生成临时 SQL。

主要特点: - 可执行指标:通过 query_metrics 查询而非生成 SQL - 指标优先策略:Agent 优先使用指标查询而非临时 SQL - 独立于语义模型:指标作为独立的查询工具运行,而非嵌入在 schema 定义中 - 层级组织:主题树分类法提高可发现性

这种方法确保了团队之间指标定义的一致性,同时降低了查询复杂性并提高了性能。