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);为什么使用 Semantic View?
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进行部署。这让你可以完全控制列描述、表达式和自定义指标;FROM YAML ' '
使用 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 仓库中。
浏览 Streamlit 应用
该应用分为三个标签页。Self-Service 标签页用于让用户选择 semantic view、配置参数,并即时生成报表。Report Mart 标签页以可视化网格显示所有之前保存的报表——这是一个跨会话持久保存的个人仪表板。Cortex Agent 标签页提供由 Cortex Analyst 支持的自然语言聊天界面,用于自由探索数据。
从 YAML 到 UI
应用会发现你在不同数据库和 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 标签页中。

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 会在永久删除报表前打开确认对话框。
添加 Cortex Agent
除了结构化的 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 精彩活动请关注专区。





