如何利用 Snowflake ML 实现电商个性化 | 技术实践
来源: InfoQ - AI&大模型
生成式 AI 的投资回报远超预期?Snowflake 调研全球 1900 位企业与 IT 专业人士后发现平均 ROI 高达 41%!点击下载完整报告
在当今竞争激烈的电商领域,为客户提供个性化体验已不再是奢侈选项,而是驱动成功的关键要素。运用人工智能驱动分析、数据科学与机器学习的企业正日益超越竞争对手。消费者越来越期待定制化推荐与动态购物体验——这正是 Snowflake ML 的用武之地。
通过 Snowflake ML,开发者和分析师可直接在 Snowflake 平台中使用标准 SQL 实现以下功能:
加载与整合数据
构建客户细分画像
训练并部署机器学习模型
生成个性化评分
将结果输送到应用与实时工作流中
本文将深入探讨 Snowflake ML 如何为现代电商体验提供简洁、基于 SQL 的个性化解决方案。您将了解如何将客户数据接入 Snowflake,根据行为模式划分客群,并利用 Snowflake ML 构建预测高价值客户的智能模型。无论您是构建个性化工作流的开发者,还是提升营销效果的分析师,这些实践步骤都将助您快速入门。
请首先登录您的 Snowflake 账户(访问 Snowflake 网页控制台)。若尚未拥有账户或需测试环境进行学习,可在此免费注册体验。
步骤1:加载并准备数据
我们将首先创建一个客户订单的小型模拟数据集。
请在 Snowflake SQL 工作表中完整运行以下代码块:
-- Step 1.0: Create a database and schema
CREATE OR REPLACE DATABASE DATACLOUDDISPATCHSI;
USE DATABASE DATACLOUDDISPATCHSI;
CREATE OR REPLACE SCHEMA ECOMMERCE;
USE SCHEMA ECOMMERCE;
-- Step 1.1: Create a customer orders table
CREATE OR REPLACE TABLE CUSTOMER_ORDERS (
CUSTOMER_ID NUMBER,
ORDER_ID NUMBER,
ORDER_DATE DATE,
ORDER_VALUE NUMBER(10,2),
PRODUCT_ID NUMBER
);
-- Step 1.2: Insert sample order data
INSERT INTO CUSTOMER_ORDERS (CUSTOMER_ID, ORDER_ID, ORDER_DATE, ORDER_VALUE, PRODUCT_ID) VALUES
(1001,50001,'2023-01-15', 89.99,201),
(1001,50022,'2023-03-02',120.49,305),
(1002,50110,'2023-05-11', 45.00,110),
(1003,50155,'2023-02-19',239.00,402),
(1003,50190,'2023-05-22',130.00,233),
(1003,50201,'2023-06-01', 99.99,110),
(1004,50333,'2023-01-05', 19.99,502),
(1001,50390,'2023-11-11',301.00,900),
(1005,50400,'2023-12-12', 67.50,702);
-- Step 1.3: Verify data
SELECT * FROM CUSTOMER_ORDERS ORDER BY ORDER_DATE;该数据集包含重复的客户购买记录、多样化的订单金额以及用于后续客户分群和机器学习建模的实用字段,足以支持基础建模需求。
使用 Snowflake Workspace
若您倾向于通过可视化界面而非 SQL 加载数据,Snowflake Workspace 支持将文件(包括 Excel 和 CSV 格式)直接拖放至环境中。
1. 在 Snowflake 左侧导航栏中进入 Projects。
2. 点击下拉菜单中的 Workspaces(如图所示)。
3. 创建并打开一个新的 Workspace。
4. 在 Workspace 内点击+ Worksheet 以新建 SQL 工作表。
5. 运行 SQL 代码前,请确保工作表已设置正确的角色、仓库、数据库与模式。

本教程步骤 1 至 3 中的所有 SQL 命令均需在此 SQL 工作表中粘贴并执行。Snowflake 虽提供 Workspace、Notebook 等多种项目工具,但本教程全程使用标准 SQL 工作表完成。
步骤二:使用 SQL 构建客户细分模型
Snowflake 支持集成机器学习模型,用于预测客户行为、推荐产品及定制促销策略。开发人员可通过 Python 或 R 语言,结合 Snowflake 的 Data Science Workspace 部署模型,该模型可输入客户数据并输出个性化推荐。
一种基础的个性化策略是基于客户历史行为进行识别,我们将计算以下指标:
购买频率
客单价(AOV)
USE DATABASE DATACLOUDDISPATCHSI;
USE SCHEMA ECOMMERCE;-- Step 2.1: Create customer segments
CREATE OR REPLACE TABLE CUSTOMER_SEGMENTS AS
SELECT
CUSTOMER_ID,
COUNT(ORDER_ID) AS PURCHASE_COUNT,
AVG(ORDER_VALUE) AS AVG_ORDER_VALUE
FROM CUSTOMER_ORDERS
WHERE ORDER_DATE BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY CUSTOMER_ID;
-- Step 2.2: Inspect customer segments
SELECT * FROM CUSTOMER_SEGMENTS ORDER BY PURCHASE_COUNT DESC;
由此构建的 CUSTOMER_SEGMENTS 表将成为机器学习模型的基础数据层。
步骤三:训练与部署机器学习模型(基于 Snowflake ML 的纯 SQL 实现)
Snowflake ML 支持直接使用 SQL 训练模型,无需依赖 Python 或外部工具。
我们将完成以下任务:
1. 标记“高价值客户”(购买次数 ≥3次)
2. 训练分类模型
3. 对全部客户进行评分
步骤3.1:创建训练表
在 Snowflake 中训练机器学习模型前,需为模型提供学习样本。这意味着需要构建一个包含以下内容的表:
特征(模型学习的输入变量)
目标标签(模型需预测的结果)
本例中,我们的目标是识别高价值客户。因此,需要在历史数据中创建一列,明确标注哪些客户属于高价值客户。训练表的作用正在于此——它基于步骤二生成的客户分群,新增目标标签列。随后,Snowflake ML将利用此标注表学习高价值客户的特征模式。
-- Step 3.1: Add a target label for modeling
CREATE OR REPLACE TABLE CUSTOMER_SEGMENTS_TRAIN AS
SELECT
CUSTOMER_ID,
PURCHASE_COUNT,
AVG_ORDER_VALUE,
IFF(PURCHASE_COUNT >= 3, 1, 0) AS TARGET_HIGH_VALUE
FROM CUSTOMER_SEGMENTS;
SELECT * FROM CUSTOMER_SEGMENTS_TRAIN ORDER BY PURCHASE_COUNT DESC;步骤3.2:使用 Snowflake ML 训练分类模型
在获得已标注的训练表后,即可训练 Snowflake ML 识别高价值客户的潜在特征。通过训练分类模型,Snowflake 将学习:
应从哪些输入特征中学习规律(如购买次数与平均订单金额)
需要预测的目标结果(即高价值标签:0或1)
-- Step 3.2: Train the classification model
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION HIGH_VALUE_MODEL (
INPUT_DATA => SYSTEM$REFERENCE('TABLE', 'ECOMMERCE.CUSTOMER_SEGMENTS_TRAIN'),
TARGET_COLNAME => 'TARGET_HIGH_VALUE'
);
Snowflake automatically trains and tunes the model based on your training table.
(Optional) View metrics:
CALL HIGH_VALUE_MODEL!SHOW_EVALUATION_METRICS();步骤3.3:使用模型对客户进行评分(SQL)
模型训练完成后,即可用于预测。在此步骤中,模型将根据每位客户的购买行为(购买次数与平均订单金额)判断其是否为潜在高价值客户。
以下 SQL 命令将每位客户的特征输入模型,并返回预测结果:
-- Step 3.3: Score customers
SELECT
s.CUSTOMER_ID,
s.PURCHASE_COUNT,
s.AVG_ORDER_VALUE,
HIGH_VALUE_MODEL!PREDICT(
INPUT_DATA => OBJECT_CONSTRUCT(
'PURCHASE_COUNT', s.PURCHASE_COUNT,
'AVG_ORDER_VALUE', s.AVG_ORDER_VALUE
)
) AS MODEL_OUTPUT
FROM CUSTOMER_SEGMENTS AS s;MODEL_OUTPUT 是什么?
Snowflake 将模型的预测结果以 VARIANT 类型(一种结构化对象)返回。您无需运行或执行它——它仅仅是 Snowflake 所展示的结果!
为了使预测结果更易于使用,您可以只提取预测类别(0或1)。
1 表示模型将客户识别为高价值客户
0 表示非高价值客户
提取预测类别的语句为:
SELECT
CUSTOMER_ID,
PURCHASE_COUNT,
AVG_ORDER_VALUE,
HIGH_VALUE_MODEL!PREDICT(
INPUT_DATA => OBJECT_CONSTRUCT(
'PURCHASE_COUNT', PURCHASE_COUNT,
'AVG_ORDER_VALUE', AVG_ORDER_VALUE
)
):PREDICTION:"class"::NUMBER AS PREDICTED_HIGH_VALUE
FROM CUSTOMER_SEGMENTS;这将为您提供一个清晰的 0/1 指标,用于判断客户是否被视为“高价值客户”。
步骤3.4:持久化个性化评分(可选)
至此,您已通过在查询中直接使用模型生成预测,这非常适合探索性分析——但在实际场景中,您通常需要将这些预测存储到表中,以便供仪表板、应用程序、营销活动等重复使用。
以下 SQL 语句创建一个名为 CUSTOMER_VALUE_SCORES 的新表,其中包含每位客户、其购买行为以及模型的预测结果。
CREATE OR REPLACE TABLE CUSTOMER_VALUE_SCORES AS
SELECT
CUSTOMER_ID,
PURCHASE_COUNT,
AVG_ORDER_VALUE,
HIGH_VALUE_MODEL!PREDICT(
INPUT_DATA => OBJECT_CONSTRUCT(
'PURCHASE_COUNT', PURCHASE_COUNT,
'AVG_ORDER_VALUE', AVG_ORDER_VALUE
)
):PREDICTION:"class"::NUMBER AS PREDICTED_HIGH_VALUE
FROM CUSTOMER_SEGMENTS;
SELECT * FROM CUSTOMER_VALUE_SCORES ORDER BY PREDICTED_HIGH_VALUE DESC;现在您已拥有一个可用于下游个性化流程的数据表。您可以持续引用这些评分来定位高价值客户、触发个性化优惠、提供推荐内容等。
步骤四:实时个性化
获得每位客户的预测评分后,即可结合实时行为数据提供更智能的个性化推荐。实时行为数据包括:
最近浏览的商品
购物车中新增或移除的商品
浏览或会话事件
实时库存更新
针对更高级的用例,Snowflake 支持在线特征存储,允许应用程序(如网站或推荐引擎)在毫秒级延迟内获取最新的客户特征——包括近期点击行为、会话历史或模型生成的评分。这对于需要在应用用户体验中实现实时个性化(而非依赖批量调度)的场景尤为理想。
Snowflake 可通过 Kafka、Kinesis 或 Event Hubs 等工具接收此类流式数据,从而根据客户行为变化持续更新推荐结果。
为保持个性化数据的时效性,您还可以通过 Snowflake 任务定期更新推荐表。以下示例展示了一个每小时运行并刷新热门商品推荐的简化任务:
--示例:定期更新推荐数据
CREATE OR REPLACE TASK PERSONALIZE_RECOMMENDATIONS
WAREHOUSE = COMPUTE_WH
SCHEDULE = 'USING CRON 0 UTC'
AS
MERGE INTO LATEST_RECOMMENDATIONS tgt
USING (
SELECT CUSTOMER_ID, PRODUCT_ID, SCORE
FROM ECOMMERCE.RECOMMENDATIONS_STREAM
WHERE SCORE > 0.8
) src
ON tgt.CUSTOMER_ID = src.CUSTOMER_ID AND tgt.PRODUCT_ID = src.PRODUCT_ID
WHEN MATCHED THEN UPDATE SET SCORE = src.SCORE
WHEN NOT MATCHED THEN INSERT VALUES (src.CUSTOMER_ID, src.PRODUCT_ID, src.SCORE);此方案使您的应用程序能够始终查询最新、最相关的推荐结果,从而实现完全动态的个性化购物体验。
总结
个性化推荐现已不再局限于手动规则或外部机器学习流水线。借助 Snowflake ML,您可以在 Snowflake 平台内直接驱动端到端的电商个性化推荐。本教程展示了如何:
将全部电商数据整合至统一的单一平台
完全使用 SQL 构建客户细分模型
通过 Snowflake ML 训练机器学习模型——无需 Python 环境
完成客户评分并生成个性化洞察
利用实时数据流和任务机制保持推荐结果动态更新
最关键的是,所有操作均在 Snowflake 内完成——无需数据迁移、无需配置 Python 环境、无需依赖外部服务。这使得开发者、分析师和数据团队能够以前所未有的便捷度,提供高度个性化的购物体验。
注:本教程使用 SQL 和 Snowflake ML 进行演示,但 Snowflake 还提供更多人工智能与智能增强功能,可助力规模化扩展个性化应用场景。
想要一键复制代码以便跟随操作吗?
以下是您可以粘贴到 SQL workspace 中的分步最小可复现工作流程:
-- ============================================================
-- E-COMMERCE PERSONALIZATION QUICKSTART (SQL-ONLY)
-- End-to-end example:
-- 1. Create database & schema
-- 2. Load sample orders data
-- 3. Build customer segments
-- 4. Prepare training data for ML
-- 5. Train Snowflake ML classification model
-- 6. Score customers & optionally persist scores
-- ============================================================
----------------------------------------------------------------
-- (Optional) Step 0: Choose a warehouse
----------------------------------------------------------------
-- Uncomment and replace ;
----------------------------------------------------------------
-- Step 1: Create database, schema, and sample CUSTOMER_ORDERS
----------------------------------------------------------------
CREATE OR REPLACE DATABASE DATACLOUDDISPATCHSI;
USE DATABASE DATACLOUDDISPATCHSI;
CREATE OR REPLACE SCHEMA ECOMMERCE;
USE SCHEMA ECOMMERCE;
-- Create the orders table
CREATE OR REPLACE TABLE CUSTOMER_ORDERS (
CUSTOMER_ID NUMBER,
ORDER_ID NUMBER,
ORDER_DATE DATE,
ORDER_VALUE NUMBER(10,2),
PRODUCT_ID NUMBER
);
-- Insert sample e-commerce data
INSERT INTO CUSTOMER_ORDERS (CUSTOMER_ID, ORDER_ID, ORDER_DATE, ORDER_VALUE, PRODUCT_ID) VALUES
(1001,50001,'2023-01-15', 89.99,201),
(1001,50022,'2023-03-02',120.49,305),
(1002,50110,'2023-05-11', 45.00,110),
(1003,50155,'2023-02-19',239.00,402),
(1003,50190,'2023-05-22',130.00,233),
(1003,50201,'2023-06-01', 99.99,110),
(1004,50333,'2023-01-05', 19.99,502),
(1001,50390,'2023-11-11',301.00,900),
(1005,50400,'2023-12-12', 67.50,702);
-- Quick preview of raw orders
SELECT * FROM CUSTOMER_ORDERS ORDER BY ORDER_DATE;
----------------------------------------------------------------
-- Step 2: Build customer segments (frequency & average order value)
----------------------------------------------------------------
-- Aggregate behavior to create one row per customer
CREATE OR REPLACE TABLE CUSTOMER_SEGMENTS AS
SELECT
CUSTOMER_ID,
COUNT(ORDER_ID) AS PURCHASE_COUNT,
AVG(ORDER_VALUE) AS AVG_ORDER_VALUE
FROM CUSTOMER_ORDERS
WHERE ORDER_DATE BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY CUSTOMER_ID;
-- Inspect segments
SELECT * FROM CUSTOMER_SEGMENTS ORDER BY PURCHASE_COUNT DESC;
----------------------------------------------------------------
-- Step 3: Prepare training data for Snowflake ML
-- Add a label indicating whether a customer is “high-value”
-- (in this example: 3 or more purchases)
----------------------------------------------------------------
CREATE OR REPLACE TABLE CUSTOMER_SEGMENTS_TRAIN AS
SELECT
CUSTOMER_ID,
PURCHASE_COUNT,
AVG_ORDER_VALUE,
IFF(PURCHASE_COUNT >= 3, 1, 0) AS TARGET_HIGH_VALUE
FROM CUSTOMER_SEGMENTS;
-- View training data with target
SELECT * FROM CUSTOMER_SEGMENTS_TRAIN ORDER BY PURCHASE_COUNT DESC;
----------------------------------------------------------------
-- Step 4: Train a classification model with Snowflake ML
-- This learns to predict TARGET_HIGH_VALUE from the features
-- PURCHASE_COUNT and AVG_ORDER_VALUE.
----------------------------------------------------------------
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION HIGH_VALUE_MODEL (
INPUT_DATA => SYSTEM$REFERENCE('TABLE','ECOMMERCE.CUSTOMER_SEGMENTS_TRAIN'),
TARGET_COLNAME => 'TARGET_HIGH_VALUE'
);
-- (Optional) Inspect training metrics
CALL HIGH_VALUE_MODEL!SHOW_EVALUATION_METRICS();
----------------------------------------------------------------
-- Step 5: Score customers with the trained model
-- This returns the predicted class (0 = not high-value, 1 = high-value).
----------------------------------------------------------------
SELECT
CUSTOMER_ID,
PURCHASE_COUNT,
AVG_ORDER_VALUE,
HIGH_VALUE_MODEL!PREDICT(
INPUT_DATA => OBJECT_CONSTRUCT(
'PURCHASE_COUNT', PURCHASE_COUNT,
'AVG_ORDER_VALUE', AVG_ORDER_VALUE
)
):PREDICTION:"class"::NUMBER AS PREDICTED_HIGH_VALUE
FROM CUSTOMER_SEGMENTS
ORDER BY PREDICTED_HIGH_VALUE DESC, PURCHASE_COUNT DESC;
----------------------------------------------------------------
-- Step 6 (Optional): Persist personalized scores for downstream use
-- This creates a reusable table that other teams, dashboards,
-- and applications can query.
----------------------------------------------------------------
CREATE OR REPLACE TABLE CUSTOMER_VALUE_SCORES AS
SELECT
CUSTOMER_ID,
PURCHASE_COUNT,
AVG_ORDER_VALUE,
HIGH_VALUE_MODEL!PREDICT(
INPUT_DATA => OBJECT_CONSTRUCT(
'PURCHASE_COUNT', PURCHASE_COUNT,
'AVG_ORDER_VALUE', AVG_ORDER_VALUE
)
):PREDICTION:"class"::NUMBER AS PREDICTED_HIGH_VALUE
FROM CUSTOMER_SEGMENTS;
-- Final scored output
SELECT * FROM CUSTOMER_VALUE_SCORES
ORDER BY PREDICTED_HIGH_VALUE DESC, PURCHASE_COUNT DESC; if needed:
-- USE WAREHOUSE