SuperAPI AI 工具集

analyst-literal-search

数据与分析

查看项目

更新于 10-21 20:12

技能介绍

用途

Cortex Analyst 在将自然语言查询匹配到列中的字面值时,如果维度带有提示(hints),匹配效果会更好。本技能通过丰富语义模型 YAML 或语义视图来改善字面值搜索,适用于以下场景:Cortex Analyst 无法将自然语言短语匹配到字面列值(例如“iced tea”找不到“Ice Tea”),或希望增强语义模型的字面值匹配能力。

主要能力

本技能对语义模型进行两类增强:

  • 对低基数维度(不同值不超过 10 个)添加 is_enum: true 以及全部不同值。
  • 对高基数维度(不同值超过 10 个)创建 Cortex Search Service,并添加 3 个 sample_values。

支持三种来源:本地 YAML、暂存区(staged)YAML 和语义视图(semantic view)。

使用方式

工作流分为六个步骤:

步骤 1:确认连接与来源。 验证 Snowflake 连接:

SELECT CURRENT_ACCOUNT(), CURRENT_USER(), CURRENT_ROLE();

向用户询问来源(本地 YAML / 暂存区 YAML / 语义视图 FQN)以及用于搜索服务的仓库(XSMALL 即可)。对于语义视图,列出并读取:

SHOW SEMANTIC VIEWS IN <db>.<schema>;
SELECT SYSTEM$READ_YAML_FROM_SEMANTIC_VIEW('<DB.SCHEMA.VIEW>');

对于暂存区 YAML,将文件作为单个值读取以避免记录被拆分:

CREATE TEMP FILE FORMAT IF NOT EXISTS _yaml_fmt
  TYPE = 'CSV' FIELD_DELIMITER = NONE RECORD_DELIMITER = NONE;
SELECT $1 FROM @<stage>/<path>/model.yaml (FILE_FORMAT => '_yaml_fmt');

步骤 2:分析维度。 对每个缺少配置的文本维度,查询基数和样本值:

SELECT COUNT(DISTINCT <col>) AS distinct_count
FROM <base_table> WHERE <col> IS NOT NULL;

SELECT DISTINCT <col> FROM <base_table>
WHERE <col> IS NOT NULL ORDER BY <col> LIMIT <N>;

将每个维度归类为 enum、search-service 或已配置。

步骤 3:展示建议。 显示维度 → 不同值数量 → 建议的表格,并询问 TARGET_LAG(默认 '1 day')。

⚠️ 停止点:在执行任何 DDL 之前,获得用户对要配置哪些维度的明确批准。

步骤 4:应用枚举维度(低基数)。 编辑 YAML / 视图以包含:

dimensions:
  - name: region
    expr: region_column
    is_enum: true
    sample_values: ["North America", "Europe", "Asia Pacific"]

步骤 5:创建搜索服务并更新模型(高基数)。

⚠️ 停止点:在运行 CREATE OR REPLACE 之前,确认服务名称和仓库。

CREATE OR REPLACE CORTEX SEARCH SERVICE <db>.<schema>.<table>_<col>_ss
  ON <col>
  WAREHOUSE = <wh>
  TARGET_LAG = '<lag>'
  AS (SELECT DISTINCT <col> FROM <db>.<schema>.<table>);

对于 YAML 模型,添加:

- name: product_name
  expr: product_name_column
  cortex_search_service:
    service: <table>_<col>_ss
    literal_column: <col>
    database: <db>
    schema: <schema>
  sample_values: ["Example A", "Example B"]

对于语义视图,通过 DDL 重建。所需语法:

  • WITH CORTEX SEARCH SERVICE 必须位于 COMMENT 之前。
  • WITH EXTENSION (CA = '<json>') 携带 is_enum / sample_values。
  • 在 TABLES 中使用完全限定表名。
  • 使用 COPY GRANTS。
CREATE OR REPLACE SEMANTIC VIEW DB.SCHEMA.MY_VIEW
  TABLES (DB.SCHEMA.ORDERS COMMENT = 'Orders')
  DIMENSIONS (
    ORDERS.PRODUCT_NAME AS PRODUCT_NAME
      WITH CORTEX SEARCH SERVICE DB.SCHEMA.ORDERS_PRODUCT_NAME_SS
      COMMENT = 'Product',
    ORDERS.REGION AS REGION COMMENT = 'Region'
  )
  WITH EXTENSION (CA = '{"tables":[{"name":"ORDERS","dimensions":[{"name":"REGION","is_enum":true,"sample_values":["NA","EU","APAC"]}]}]}')
  COPY GRANTS;

验证:

SHOW CORTEX SEARCH SERVICES IN <schema>;

步骤 6:验证。

cortex analyst query "<question with a literal value>" --view=<view>

确认匹配能够正确解析。

脚本

对于语义视图,随附脚本可自动化步骤 2 和步骤 5。依赖项位于 pyproject.toml / uv.lock;使用 uv 运行。<SKILL_DIR> 是本技能所在目录。--connection 默认为 SNOWFLAKE_CONNECTION_NAME,否则使用连接器的默认连接。

scripts/analyze_table.py(只读):读取语义视图 YAML,查找字符串维度,查询每个基表的基数和样本值,并将建议(不同值不超过 10 个为 enum,否则为 search_service)写入 JSON 文件。

uv run --project <SKILL_DIR> python <SKILL_DIR>/scripts/analyze_table.py \
  --semantic-view DB.SCHEMA.VIEW --warehouse <wh> --output analysis.json [--connection <name>]

scripts/apply_changes.py(破坏性):根据 analysis.json,为高基数维度运行 CREATE OR REPLACE CORTEX SEARCH SERVICE,并通过 SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML(会复制现有授权)重建语义视图,包含 is_enum、sample_values 和搜索服务引用。它会打印计划执行的语句,仅在交互式输入 y 或使用 --yes 后才执行。

uv run --project <SKILL_DIR> python <SKILL_DIR>/scripts/apply_changes.py \
  --analysis analysis.json [--update-lag '1 day'] [--connection <name>] [--yes]

⚠️ 停止点:在运行 apply_changes.py 之前,向用户展示计划变更(来自 analysis.json,或不带 --yes 运行以打印语句并中止),并获得明确批准。仅在批准后才传入 --yes。

常见错误

  • COMMENT 位于 WITH CORTEX SEARCH SERVICE 之前——DDL 会失败。搜索子句应放在前面。
  • TABLES (...) 子句中使用未限定的表名——应使用 DB.SCHEMA.TABLE。
  • WITH EXTENSION (CA = '...') 中的 JSON 格式错误——运行前先验证。
  • 缺少 SNOWFLAKE.CORTEX_USER 角色——搜索服务创建会失败。
  • 在超大列上采样不同值时跳过 LIMIT——查询会变慢。
  • 为仓库设置过于激进的 TARGET_LAG——会增加成本而无精度收益。建议从 '1 day' 开始。
  • 测试前未等待索引完成——初始索引构建需要时间。

停止点

  • 步骤 3——在任何 DDL 之前,批准维度建议和 TARGET_LAG。
  • 步骤 5——在 CREATE OR REPLACE 之前,确认服务名称、仓库和视图 DDL。

故障排除

  • 搜索服务创建被拒绝:向角色授予 schema 上的 CREATE CORTEX SEARCH SERVICE 以及 SNOWFLAKE.CORTEX_USER。
  • 找不到语义视图名称:先运行 SHOW SEMANTIC VIEWS;用户输入通常略有差异。
  • 没有匹配改善:通过 SHOW CORTEX SEARCH SERVICES 确认服务处于 READY 状态,并确认自创建以来 TARGET_LAG 已过。