亚马逊AWS官方博客

利用 AWS Step Functions 集成现有系统快速实现个性化邮件触达

背景

业务运营过程中,我们需要通过各种方式增强用户关系,邮件是必不可少的一种。尤其对于海外用户,他们大多都有定期使用邮件的习惯。做好与用户的邮件触达,可以提升产品的点击和转化,也能提高客户忠诚度,优化营销效果。

问题

需要注意的是,因为邮件营销的成本较低,所以用户很容易被来自各类发送方大量的邮件所骚扰。如果邮件让用户反感,引起客诉,不但达不到好的运营效果,反而会造成客户流失。

优化邮件内容,确保邮件的个性化,会让用户感到贴心,这是避免上述问题的重要方法之一。但当用户数量和触达内容都很多时,个性化每一封邮件将会是一件繁重的任务。

方案

大多数企业在长期运营的过程中,已积累了个性化的数据资源,如:用户和产品数据库,交互日志,推荐系统等,本文试图利用低代码的 Step Functions 平台,整合企业现有系统能力,再结合 GenAI,为企业快速构建个性化邮件发送的能力。

系统整体架构如图:

实现步骤

准备测试数据

为了方便测试,本文使用全托管的数据库 Amazon DynamoDB,你也可以集成 RDS 或其它数据库,只需要修改后续流程中的相应节点。

新建表 user 和 product 表如下:

表中数据大致如下:

User 表:

Product 表:

推荐系统

本文使用 Amazon Personalize 作为推荐系统,它可以通过简单的导入数据,便可自动训练模型并提供 API。如果你已经自有推荐系统,可以使用 AWS Lambda 结点代替后续流程中的推荐节点,从而集成企业现有 API。

Personalize 的 Demo 初始化过程请参考 入门教程,该教程中有示例数据和详细的操作过程。这里简述步骤如下:

  1. 下载示例数据,导入 Personalize 的 Dataset
  2. 选择域数据集入门或自定义数据集中的任意一种
  3. 创建 recommender(域)或 Solution 与 campaign(自定义)
  4. 等待模型自动训练好,并测试

以上,请按入门教程中的详细说明操作。

完成好后的效果(本文使用“自定义数据集“的方式)如图:

点击 Campaign 的名字,即可在页面上输入参数(如用户 ID),进行 API 测试。

Amazon Simple Email Service 设置

你可以使用任一邮件系统来发送邮件,本文使用 Amazon Simple Email Service (SES),它在发送营销邮件时,有很多辅助合规性功能。

在 SES 控制台主页上选择 “开始使用”,将会有向导引导您完成 SES 帐户设置步骤。

我们只要完成创建发送身份并验证后即可使用。

StepFunctions 设置

使用 StepFunctions,可以创建工作流(也称为状态机),以构建分布式应用程序、自动化流程、协调微服务等。

创建 State machines

您可以进入 Step Functions 控制台,进入 State machines 菜单,点击 Create State machines 按钮。因为我们将构建一个全新的流程,你可以从一个空模版开始。

你可以按照流程图通过节点选择编辑流程,也可通过将下面的代码(JSON),复制到图示的 Code 编辑器,快速生成本文的示例流程。

{
  "Comment": "Distributed map that reads CSV file for order data and detects delayed orders",
  "StartAt": "参数输入",
  "States": {
    "参数输入": {
      "Type": "Pass",
      "Next": "并行处理用户和产品"
    },
    "并行处理用户和产品": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "GetRecommendations",
          "States": {
            "GetRecommendations": {
              "Type": "Task",
              "Parameters": {
                "CampaignArn": "<这里填入推荐系统的CampaignArn>",
                "UserId.$": "$.UserId",
                "NumResults.$": "$.NumResults"
              },
              "Resource": "arn:aws:states:::aws-sdk:personalizeruntime:getRecommendations",
              "Next": "Map推荐结果"
            },
            "Map推荐结果": {
              "Type": "Map",
              "ItemProcessor": {
                "ProcessorConfig": {
                  "Mode": "INLINE"
                },
                "StartAt": "提取商品ID",
                "States": {
                  "提取商品ID": {
                    "Type": "Pass",
                    "End": true,
                    "Parameters": {
                      "id": {
                        "S.$": "$.ItemId"
                      }
                    }
                  }
                }
              },
              "Next": "获取推荐产品详细信息",
              "ItemsPath": "$.ItemList"
            },
            "获取推荐产品详细信息": {
              "Type": "Task",
              "Parameters": {
                "RequestItems": {
                  "product": {
                    "Keys.$": "$"
                  }
                }
              },
              "Resource": "arn:aws:states:::aws-sdk:dynamodb:batchGetItem",
              "End": true
            }
          }
        },
        {
          "StartAt": "获取用户基本信息",
          "States": {
            "获取用户基本信息": {
              "Type": "Task",
              "Resource": "arn:aws:states:::dynamodb:getItem",
              "Parameters": {
                "TableName": "user",
                "Key": {
                  "id.$": "$.UserId"
                }
              },
              "End": true
            }
          }
        }
      ],
      "Next": "Bedrock生成邮件文案"
    },
    "Bedrock生成邮件文案": {
      "Type": "Task",
      "Resource": "arn:aws:states:::bedrock:invokeModel",
      "Parameters": {
        "ModelId": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0",
        "Body": {
          "anthropic_version": "bedrock-2023-05-31",
          "max_tokens": 1024,
          "system": "你的名字是‘AI小乖’,你的任务是编写HTML格式的产品推广文案,收件人信息以JSON格式描述在<receiver>标签中,待推广的产品以JSON格式描述在<products>标签中。\n我们发送邮件的原因是他已经三个月没有访问我们的网站了,我们想表达对他的关心和期待他回归。\n邮件内容必须是HTML格式,分三个部份:\n1。问候和说是来信原因\n2。根据商品信息,分析他的兴趣,说明商品被推荐的原因,文案风格是幽默的且简洁的\n3展示商品:商品水平展示在一行,每个商品展示格里包含:商品图片,名称,价格三个信息,其中,商品图片大小200X200, src为产品信息的img_uri字段, 窗格里的所有内容加超链接,链接的href都设为https://xxx.com/prd/<id>\n4。祝福并期待用户来xxx.com看更多新商品\n\n 必须直接输出HTML格式的邮件内容",
          "messages": [
            {
              "role": "user",
              "content": [
                {
                  "type": "text",
                  "text.$": "States.Format('<receiver>\n{}\n</receiver><products>\n{}\n</products>', $[1].Item, $[0].Responses)"
                }
              ]
            }
          ]
        }
      },
      "Next": "SES发送Email",
      "ResultPath": "$[0].Item"
    },
    "SES发送Email": {
      "Type": "Task",
      "Parameters": {
        "Destination": {
          "ToAddresses.$": "States.Array($[1].Item.email.S)"
        },
        "Message": {
          "Body": {
            "Html": {
              "Charset": "UTF-8",
              "Data.$": "$[0].Item.Body.content[0].text"
            }
          },
          "Subject": {
            "Charset": "UTF-8",
            "Data": "xxx.com期待您的回顾"
          }
        },
        "Source": "<您测试的发件人地址,应和SES的发件身份保持一致>"
      },
      "Resource": "arn:aws:states:::aws-sdk:ses:sendEmail",
      "End": true
    }
  }
}

创建好的 StateMachine 如图示:

状态机代码解释

  1. StateMachine 应用场景,设定为用户召回(长期未访问网站时执行)
  2. 通过推荐系统,根据用户以往访问产品的行为,为用户推荐 3 款商品
  3. 从数据库取回商品的详细信息和用户的详细信息
  4. 用 Amazon Bedrock 调用 Claude LLM 模型生成个性化邮件(提示词已在“Bedrock 生成邮件文案”节点)
  5. 调用 SES 发送邮件

执行权限

流程创建好后,点击“Create”,此时,系统会将节点中的权限为执行角色添加,“Confirm”即可。

注意:如果运行时报权限不足的 Exception,请通过 IAM 为 StateMachines 的执行 Role 添加相应的权限。

运行测试

点击“Start execution”

邮件效果

邮件效果(内容)主要由 LLM 模型的 Prompt 决定,您可以按真实场景的要求再优化,本文主要展示它进行个性化营销的可能性和便捷性。

总结

    1. 企业已有系统和数据可以通过串联集成,产生新的业务价值。
    2. AWS Step Functions 可以用流程编排的方式快速集成现有系统,实现复杂的企业应用。
    3. 集成 LLM(Claude3/3.5)的文字理解和生成能力,可为业务带来新的可能性,如千人千面的个性化营销。

*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

本篇作者

黄蔚

亚马逊云科技高级解决方案架构师,熟悉大宗、零售等业务,对交易、供应链、履约等业务环节有深入研究,并有 20 年架构实践设计经验。目前专注于利用大数据及 AI/ML 技术赋能业务,及创新业务价值的研究。