


























2026 年,智能体将在企业级应用中取得哪些实质性突破?点击下载《2026 年 AI 与数据发展预测》白皮书,获悉专家一手前瞻,抢先拥抱新的工作方式!
业务用户总是想要新的东西,而且想要得很快。今天上午按区域拆分,午饭后按季度看趋势,下班前按部门做透视。传统的请求、开发、测试和部署周期根本跟不上现代分析需求的节奏。如果我们把交付的概念改成一个始终可用、并且保留完整审计轨迹的自助式报表集市,会怎样?
本文介绍了一种创新方法,可以在 Snowflake 中以极低的管理开销自动处理大多数临时报表请求。通过将 Snowflake Semantic Views 与 Streamlit 界面结合起来,我们把报表创建的能力直接交到业务用户手中。无需提交工单,无需等待。
这个解决方案的亮点如下。设置大约只需要五分钟。只需克隆代码仓库并部署到你的 Snowflake 账户。业务用户可以通过直观的 UI 自助使用。报表可以即时交付、完全可配置,并且系统会记住用户创建过的每一份报表,方便以后访问。
该解决方案利用了多项 Snowflake 原生能力。Snowflake 中的 Streamlit 提供应用层。Semantic Views 提供驱动 UI 的结构化元数据。Cortex Analyst 支持一个可选的自然语言 Agent。而整个解决方案都是使用 Snowflake Cortex Code 编写的,这是 Snowflake 自家的 agentic AI 编码助手。

这个解决方案涉及两个角色:一个用于部署和维护应用的开发者角色,以及一个供业务用户使用应用的用户角色。
开发者角色需要以下权限来创建和管理 Streamlit 应用、semantic views、sequences 以及底层对象。这里假设该角色已经对所需的数据库、schema 和 warehouse 拥有 USAGE 权限,并且对所需的报表表和 semantic views 拥有 SELECT 权限。
-- Set these session variables before runningSET dev_role = 'YOUR_DEV_ROLE';SET use_database = 'YOUR_DATABASE';SET use_schema = 'YOUR_SCHEMA';SET app_schema = $use_database || '.' || $use_schema;-- Object creation privilegesGRANT CREATE TABLE, CREATE SEQUENCE, CREATE SEMANTIC VIEW, CREATE STREAMLITON SCHEMA IDENTIFIER($app_schema) TO ROLE IDENTIFIER($dev_role);-- Cortex Analyst (for the optional Cortex Agent tab)GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE IDENTIFIER($dev_role);复制代码
使用开发者角色在应用 schema 中配置以下 sequence 对象和主配置表,用于记录保存:
-- Sequence for report IDs (create once, shared among all users)CREATE SEQUENCE IF NOT EXISTS REPORT_MART_CONFIG_SEQ START = 1 INCREMENT = 1;-- Master config history table (shared audit log)CREATE TABLE IF NOT EXISTS REPORT_MART_MASTER_CONFIG_HISTORY ( REPORT_ID NUMBER(38,0), REPORT_NAME VARCHAR(500), REQUEST_TIMESTAMP TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP(), REQUEST_USER VARCHAR(255) DEFAULT CURRENT_USER(), SEMANTIC_VIEW VARCHAR(500), TABLE_NAME VARCHAR(500), TIME_DIMENSION VARCHAR(255), START_DATE VARCHAR(20), END_DATE VARCHAR(20), AGG_WINDOW VARCHAR(20), GROUP_COL VARCHAR(255), EXCLUDE_VALS VARCHAR(2000), MEASURES VARCHAR(2000), AGGREGATION VARCHAR(50), INCLUDE_NULLS BOOLEAN, CHART_TYPE VARCHAR(50), SHOW_ALL_AVAILABLE BOOLEAN, ADD_ACCUMULATIVE BOOLEAN, GENERATED_SQL TEXT, ACTION VARCHAR(10));复制代码
用户角色需要以下权限来运行 Streamlit 应用、查询表和 semantic views,并将报表配置保存到自己的个人配置表中。这里同样假设该角色已经像开发者角色一样具备必要的 USAGE 和 SELECT 权限。
用户角色需要能够创建基于用户的报表配置表,在个人配置表中追加/移除记录,并在主配置表中追加记录。在这个演示中,sequence 对象和主配置表名称都硬编码在应用定义中。
-- Set these session variables before runningSET user_role = 'YOUR_USER_ROLE';SET tbl_conf = $app_schema||'.REPORT_MART_MASTER_CONFIG_HISTORY';SET seq_conf = $app_schema || '.REPORT_MART_CONFIG_SEQ';SET app_name = $app_schema || '.' || 'YOUR_APP_NAME';-- Create personal config tables (one per user)GRANT CREATE TABLE ON SCHEMA IDENTIFIER($app_schema) TO ROLE IDENTIFIER($user_role);-- Write access for personal config tablesGRANT INSERT ON TABLE IDENTIFIER($tbl_conf)TO ROLE IDENTIFIER($user_role);-- Sequence usage for report IDsGRANT USAGE ON SEQUENCE IDENTIFIER($seq_conf) TO ROLE IDENTIFIER($user_role);-- Streamlit app usage (grant after app is deployed)GRANT USAGE ON STREAMLIT IDENTIFIER($app_name) TO ROLE IDENTIFIER($user_role);-- Cortex Analyst (for the optional Cortex Agent tab)GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE IDENTIFIER($user_role);复制代码
Snowflake Semantic View 是一个 schema 级对象,它把表元数据组织成一个结构化的 YAML 定义。它将列分类为维度、时间维度和事实(度量),并为每个列提供数据类型和描述。可以把它理解为一份契约,用来描述你的表包含什么内容,以及应该如何使用这些内容。
Semantic Views 最初是为支持 Cortex Analyst 而设计的,Cortex Analyst 是 Snowflake 的自然语言查询引擎。你将 Cortex Analyst 指向一个 semantic view,它就会使用元数据来理解你的数据、生成准确的 SQL,并用自然语言回答业务问题。
在这个解决方案中,我们采用了不同的方法。我们解析 semantic view 的 YAML,动态填充 Streamlit UI。维度变成分组选择器。时间维度变成日期范围筛选器。事实变成度量复选框。最终得到的是一个通用、可配置的界面,可以适用于任何表——所有这些都由结构化元数据驱动。
在 Snowflake 中创建 semantic view 有几种方式:
从 Snowsight UI 创建——在 Snowsight 对象浏览器中导航到一张表,并使用内置向导以可视化方式定义维度、时间维度和事实。对于偏好点击式体验的用户来说,这是最容易上手的选项;
直接从 YAML 创建——手动编写 semantic model YAML(或从其他工具导出),并使用 CREATE SEMANTIC VIEW 进行部署。这让你可以完全控制列描述、表达式和自定义指标;
使用 Snowflake Cortex Code——Snowflake 的 AI 编码助手内置了 semantic view 技能,可以通过交互方式引导你完成整个流程。它会发现你的表,让你验证和编辑 YAML,并部署 semantic view——所有步骤都在一次对话中完成。这也是我们在这个演示中采用的方法。
完整文档请参阅 Snowflake 文档:https://docs.snowflake.com/en/user-guide/views-semantic/overview。
由于每个 semantic view 都遵循相同的结构——维度、时间维度和事实——我们可以解析该 YAML,并将其输入到一个 Streamlit 模板中。应用在运行时使用 SYSTEM$READ_YAML_FROM_SEMANTIC_VIEW 函数读取 semantic view,提取列分类,并动态构建参数控件。无需硬编码,也无需针对特定表编写逻辑。
为了让这个演示易于复现,完整代码解决方案已经发布在 GitHub 上。整个应用只有一个文件:app.py。部署它有两个简单选项。
第一个选项是直接复制粘贴——在 Snowsight 中,导航到 Projects > Streamlit,点击 + Streamlit App,选择你的数据库、schema 和 warehouse,然后将 app.py 的内容粘贴到编辑器中并点击 Run。在左侧面板的包列表中添加 plotly 和 pyyaml,或提供 environment.yml 文件来指定依赖项。
第二个选项是使用 Snowflake Cortex Code(CoCo)部署应用。只需把文件路径(本地或 GitHub)提供给 CoCo,并告诉 CoCo 将应用部署到你的目标数据库和 schema,它就会生成部署清单,并一步完成应用推送。

给出的示例解决方案还支持在需要自定义调整时在本地测试 Streamlit 应用。它会自动检测环境类型(SnowSight 或本地),并相应选择连接上下文。
在这个演示中,我们创建了一个名为 REPORT_TABLE 的 transient table,包含 30 个列,覆盖多种数据类型。它包括一些具有不同基数的分类维度,一些表示财务度量的数值列,比如 REVENUE 和 COST,若干时间列,以及一些包含半结构化数据类型的列。然后插入了 10,000 行合成数据,用于模拟真实的报表场景。
create or replace TRANSIENT TABLE REPORT_TABLE ( REPORT_ID NUMBER(38,0) autoincrement start 1 increment 1 noorder, REPORT_NAME VARCHAR(255), DESCRIPTION VARCHAR(16777216), CREATED_DATE DATE, UPDATED_TIMESTAMP TIMESTAMP_NTZ(9), SUBMITTED_AT TIMESTAMP_LTZ(9), IS_ACTIVE BOOLEAN, STATUS VARCHAR(50), PRIORITY NUMBER(2,0), CATEGORY VARCHAR(100), REGION VARCHAR(50), COUNTRY_CODE VARCHAR(3), DEPARTMENT VARCHAR(100), ASSIGNED_TO VARCHAR(255), CUSTOMER_EMAIL VARCHAR(320), REVENUE NUMBER(18,2), COST NUMBER(18,2), DISCOUNT_PERCENT FLOAT, QUANTITY NUMBER(38,0), UNIT_PRICE NUMBER(12,4), TAX_RATE FLOAT, TOTAL_AMOUNT NUMBER(18,2), RATING NUMBER(38,0), WEIGHT_KG FLOAT, NOTES VARCHAR(16777216), TAGS ARRAY, METADATA VARIANT, ADDRESS OBJECT, START_TIME TIME(9), BINARY_ATTACHMENT BINARY(8388608));复制代码
随后,我们在这张表之上创建了一个名为 REPORT_TABLE_SV 的 semantic view。该 semantic view 的 YAML 将 30 个列组织成三类:用于分组的维度(例如 REGION、DEPARTMENT、STATUS)、用于日期筛选的时间维度(例如 CREATED_DATE、UPDATED_TIMESTAMP),以及用于聚合的事实(例如 REVENUE、COST、TOTAL_AMOUNT)。演示 YAML 文件也包含在 GitHub 仓库中。
该应用分为三个标签页。Self-Service 标签页用于让用户选择 semantic view、配置参数,并即时生成报表。Report Mart 标签页以可视化网格显示所有之前保存的报表——这是一个跨会话持久保存的个人仪表板。Cortex Agent 标签页提供由 Cortex Analyst 支持的自然语言聊天界面,用于自由探索数据。
应用会发现你在不同数据库和 schema 中有权访问的所有 semantic views,并将它们列在一个下拉菜单中。选择一个后,YAML 会显示在应用的可展开面板中——该 YAML 会被解析,每种列类型都会直接映射到一个 UI 控件。
时间维度会变成日期范围选择器,包含开始日期、结束日期和聚合窗口(日、周、月)。维度会填充到分组下拉菜单和排除筛选器中。事实会变成度量列表,并驱动聚合方法选择器(SUM、AVG、COUNT、MAX 等)。最终结果是一个完全动态的界面——切换到不同的 semantic view,整个表单就会自动重新配置。

当你点击“Generate Report”时,应用会接收你选择的所有参数,并动态组合一条 SQL 查询。它会根据你选择的度量和聚合方法构建 SELECT 子句,根据维度和时间窗口添加 GROUP BY,应用日期范围筛选器,并排除你选择的任何分类值。
生成的 SQL 会显示在一个可展开面板中,便于查看和复制;查询结果会立即以数据表和交互式图表两种形式呈现,并带有下载按钮,可将数据导出为 CSV。

在数据表下方,应用会使用查询结果和你的配置选择渲染一个交互式图表。图表类型——柱状图、折线图、箱线图或瀑布图——从侧边栏选择,并且应用会根据你的参数智能默认:当启用时间维度时默认使用折线图,否则默认使用柱状图。分组维度会添加颜色编码,单一度量报表会为每个类别使用不同颜色。

在提交到 Report Mart 之前,你可以检查并调整输入,确保每份保存的报表都完全符合你的预期。
当你对可视化结果满意后,点击“Add Visual to Report Mart”,系统会弹出一个对话框提示你为报表命名。默认名称会根据聚合方法和所选度量自动建议——例如 “Sum of Revenue”。你可以编辑名称,也可以保留默认名称,然后点击“Save”以持久保存完整配置。所有参数、图表类型和生成的 SQL 都会一步写入你的个人配置表。该报表现在会永久出现在 Report Mart 标签页中。

Self-Service 标签页允许你即时配置并渲染报表。但当你离开页面或刷新页面时,配置就会消失。Report Mart 通过将每份报表的完整配置——参数、图表类型和生成的 SQL——持久保存到个人配置表中来解决这个问题。下次你打开应用时,你的报表已经在那里了。
每个用户都会获得自己的个性化配置表,表名为 REPORT_MART_CONFIG_。该表会在用户第一次保存报表时自动创建——无需管理员设置。它会存储复现报表所需的一切信息:semantic view 引用、时间范围、分组列、度量、聚合方法、图表类型以及生成的 SQL 查询。下面是个人配置表的 DDL:
CREATE TABLE IF NOT EXISTS REPORT_MART_CONFIG_<current_user> ( REPORT_ID NUMBER(38,0) DEFAULT REPORT_MART_CONFIG_SEQ.NEXTVAL, REPORT_NAME VARCHAR(500), REQUEST_TIMESTAMP TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP(), REQUEST_USER VARCHAR(255) DEFAULT CURRENT_USER(), SEMANTIC_VIEW VARCHAR(500), TABLE_NAME VARCHAR(500), TIME_DIMENSION VARCHAR(255), START_DATE VARCHAR(20), END_DATE VARCHAR(20), AGG_WINDOW VARCHAR(20), GROUP_COL VARCHAR(255), EXCLUDE_VALS VARCHAR(2000), MEASURES VARCHAR(2000), AGGREGATION VARCHAR(50), INCLUDE_NULLS BOOLEAN, CHART_TYPE VARCHAR(50), SHOW_ALL_AVAILABLE BOOLEAN, ADD_ACCUMULATIVE BOOLEAN, GENERATED_SQL TEXT);复制代码
为了展示 Report Mart 体验,我们从演示表中生成了多种不同配置的示例报表——按区域查看收入的柱状图、月度成本趋势折线图、按区域查看数量的瀑布图、按状态查看平均评分,等等。这让你能够真实地看到一个已填充的 Report Mart 会是什么样子,其中混合了不同图表类型、聚合方法和分组维度。

Report Mart 标签页会从你的配置表中加载所有已保存的报表,并以三列可视化网格呈现。每张卡片都会显示图表,并以报表名称作为标题。每张图表下方有四个操作按钮:Refresh 会用最新数据重新运行查询,Download 会将结果导出为带时间戳的 CSV,Query 会切换显示已保存的 SQL 供检查,Remove 会在永久删除报表前打开确认对话框。
除了结构化的 Self-Service 门户之外,应用还包含一个由 Snowflake Cortex Analyst 支持的 Cortex Agent 标签页。这为用户提供了一个对话式界面,让他们可以自由探索自己的数据。该 Agent 使用在 Self-Service 标签页中选择的同一个 semantic view,因此无需任何额外配置,它就能理解表结构、列含义和关系。
Cortex Agent 可以回答各种分析问题。你可以让它按类别汇总总计,按任意度量查找排名靠前的记录,识别随时间变化的趋势,或并排比较不同分段。它会自动生成 SQL、执行查询,并通过自动生成的图表显示结果。动态建议按钮——根据 semantic view 中的实际维度和度量生成——可以帮助用户立即从相关问题开始探索。

使用 Snowflake Semantic Views、Streamlit 和 Cortex Analyst 构建。使用 Cortex Code 编写。

点击链接立即报名注册:Ascent - Snowflake Platform Training - China,更多 Snowflake 精彩活动请关注专区。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。