在新闻出版行业,快速提供个性化和有用的内容对吸引读者至关重要。利用亚马逊个性化与亚马逊Titan文本嵌入,可以在新闻发布后几秒内向用户推荐相关的文章,解决新闻文章短时间内失去关注度的问题。本文探讨了如何通过亚马逊的各项服务实现这一目标,并详细描述了实施步骤。
新闻出版商一直希望为读者提供个性化的信息体验,但由于新闻文章的有效阅读时间较短,这一目标的实现变得相对困难。一般来说,新闻文章在发布当天便迎来阅读高峰。而由于新闻出版社频繁发布文章,他们需要在尽可能短的时间内将新文章展示给感兴趣的读者。这对互动型推荐系统如协同过滤和基于深度学习的方法提出了挑战。亚马逊个性化是一个管理服务,能够根据用户过去的行为学习其偏好,并快速调整推荐以应对用户行为的实时变化。
然而,大多数新闻出版商并没有足够的预算或人员来尝试内部算法,因此需要一个完全托管的解决方案。本文展示了如何利用亚马逊Bedrock中的文本嵌入为短时间有效的文章提供高质量的推荐。
通过将亚马逊Titan文本嵌入与亚马逊个性化的实时性相结合,我们可以在文章发布后的几秒钟内向感兴趣的用户推荐内容。虽然亚马逊个性化能在文章发布后不久提供推荐,但通常需要几个小时才能将文章推荐给正确的用户。我们的用例希望在发布后立即推荐新文章。
以下是该解决方案的工作流程架构图,展示了高层步骤。
plaintext[AWS架构图]
工作流程包含以下步骤:
新文章发布后,触发器调用一个AWS Lambda函数,执行步骤25。托管在亚马逊Bedrock上的文本嵌入模型为文章内容生成嵌入表示。由亚马逊SageMaker托管的模型将文章归类到类似文章的集群中。如果需要,亚马逊Bedrock托管的模型还可以为新文章生成标题和摘要。新文章与其类型和发布时间的信息一起存入亚马逊DynamoDB表,并设置TTL来指示该文章不再是突发新闻的时间点。用户访问网站时,请求由亚马逊API Gateway处理。API Gateway请求亚马逊个性化,以了解到个别文章和文章类型,展示给读者。为推荐突发新闻文章,调用DynamoDB来确认每种类型下最近发布的文章,从而在数秒内向感兴趣的读者展示新发布的文章。当用户阅读文章时,他们的互动数据通过亚马逊Kinesis数据流实时传输给亚马逊个性化的事件追踪器。亚马逊个性化事件追踪器将在12秒内更新其个性化推荐模型。为实施上述解决方案,您需要:
拥有一个AWS账户,并对亚马逊个性化、SageMaker、DynamoDB和亚马逊Bedrock有一定了解。在亚马逊Bedrock中启用亚马逊Titan文本嵌入V2模型,状态为“Access granted”。创建一个SageMaker域。拥有一个AWS OpenSearch Service域,或一个亚马逊OpenSearch无服务器集合。首先,您需要加载一组历史发布的文章,以便有用户互动的历史记录,并使用亚马逊Titan文本嵌入生成其嵌入表示。AWS还提供机器学习服务,可以执行翻译、摘要生成和辨识文章标签、标题或类型等任务。以下代码示例展示了如何使用亚马逊Titan文本嵌入生成嵌入表示:
pythondef titanembeddings(text bedrockclient) prompt = f{text} body = jsondumps({ inputText prompt })
modelid = amazontitanembedtextv20accept = application/json contenttype = application/jsonresponse = bedrockclientinvokemodel( body=body modelId=modelid accept=accept contentType=contenttype)responsebody = jsonloads(response[body]read())return responsebodyget(embedding)
接下来,为历史文章部署聚类模型。聚类模型识别文章嵌入的集群,并为每个集群分配ID。此处,我们使用托管在SageMaker上的kmeans模型,但您也可以选择其他聚类方法。
以下代码示例说明如何使用上述Python函数生成文本嵌入,并创建文章嵌入的kmeans聚类。选择100个集群的数量是任意的,应该根据您的用例进行实验,找到最佳的数量。
pythontextembeddingslist = []for text in textlist textembeddingslistappend(titanembeddings(text bedrockclient))
numclusters = 100
kmeans = KMeans( role=role instancecount=1 instancetype=mlt3medium outputpath=s3//youruniques3bucketname/ k=numclusters numtrials=numclusters epochs=10)
kmeansfit(kmeansrecordset(npasarray(textembeddingslist dtype=npfloat32)))
在训练和部署聚类模型后,您可以通过将历史文章的嵌入传递给kmeans或其他聚类模型来为每篇文章分配集群ID。为任何被视为突发新闻的文章分配集群也非常重要。
接下来的步骤是设置一个DynamoDB表,用于存储突发新闻文章及其标识符和集群。此DynamoDB表将帮助您在查询文章项目ID与集群ID之间的映射时。
突发新闻表具有以下属性:
文章集群ID 初始集群ID文章ID 文章的ID此示例为数字格式文章时间戳 文章创建时间文章类型 文章类型,例如科技、设计最佳实践等文章语言 文章的双字母语言代码文章内容 实际的文章内容文章集群ID作为分区键,而文章时间戳以Unix Epoch Time表示作为突发新闻表的排序键。
在创建亚马逊个性化用户个性化活动时,项目交互数据集代表了用户与您项目的交互历史。为了实现我们用例的目的,我们对文章集群进行推荐,而非单个文章。这将使模型能够基于集群层级的互动趋势推荐,并了解用户对文章类型的偏好。
实现时,您需要更新交互数据集,将单个文章ID替换为文章的集群ID,并将项目交互数据集存储在亚马逊简单存储服务S3中,以便为亚马逊个性化所用。
USERPERSONALIZATION配方生成特定用户的推荐列表,并加以约束条件的过滤器应用于其中。此功能非常适合填充网站主页和特定专区,以便关注特定类型的文章、产品或其他内容。您可以参考以下的亚马逊个性化用户个性化示例,以获取创建用户个性化模型的详细步骤:
亚马逊个性化工作流程的步骤如下:
创建数据集组。准备并导入数据。创建推荐模型或定制资源。获取推荐结果。要创建并部署用户个性化活动,您首先需要创建一个用户个性化解决方案。解决方案是数据集组与配方的组合,实际上是亚马逊个性化为如何准备模型来解决特定业务用例的指令集合。
以下代码示例展示了如何创建用户个性化解决方案资源:
pythoncreatesolutionresponse = personalizecreatesolution( name=personalizedarticlessolution datasetGroupArn=datasetgrouparn recipeArn=arnawspersonalizerecipe/awsuserpersonalizationv2)solutionarn = createsolutionresponse[solutionArn]
以下代码示例展示了如何创建用户个性化解决方案版本资源:
pythoncreatesolutionversionresponse = personalizecreatesolutionversion( solutionArn=solutionarn)solutionversionarn = createsolutionversionresponse[solutionVersionArn]
以下代码示例展示了如何创建用户个性化活动资源:
pythoncreatecampaignresponse = personalizecreatecampaign( name=personalizedarticlescampaign solutionVersionArn=solutionversionarn)campaignarn = createcampaignresponse[campaignArn]
可以从您在上节中训练的文章集群的亚马逊个性化活动中选出突发新闻部分的文章。该模型识别每个用户的文章类型偏好和兴趣。
此类文章则可以通过查询DynamoDB获取所有相应类型的文章,并选择相关类型中最新的文章。此解决方案还允许编辑团队一定的策划能力,以确保用户在享受超个性化体验的同时,也能看到网站上可用内容的广泛性与多元化。
通过设置每种类型可显示的最大文章数该值可通过实验或编辑团队确认,可以从每个集群中选择最新发布的文章,直到达到所需文章总数为止。
以下Python函数用于获取在文章集群中最近发布的文章:
pythondef querydynamodbarticles( cluster indexname dynamoclient tablename maxpercluster)
arguments = { TableName tablename IndexName indexname ScanIndexForward False KeyConditionExpression articleClusterId = V1 ExpressionAttributeValues { V1 {S str(cluster)} } Limit maxpercluster}return dynamoclientquery(arguments)使用上述函数,以下函数选择由亚马逊个性化用户个性化模型推荐的每个集群相关的文章,并继续迭代,以获得最大所需文章数,参数包括:
personalizeruntime 代表亚马逊个性化运行时的Boto3客户端personalizecampaign 您在部署用户个性化活动时生成的活动ARNuserid (str) 读者的用户IDdynamoclient Boto3 DynamoDB客户端tablename (str) 存储信息的DynamoDB表名indexname (str) 索引的名称maxpercluster (str) 每个集群拉取的最大文章数desireditems (int) 返回的文章总数pythondef breakingnewsclusterrecommendation(personalizeruntime personalizecampaign userid dynamoclient tablename indexname maxpercluster desireditems)

recommendation = personalizeruntimegetrecommendations( campaignArn=personalizecampaign userId=userid) # 返回推荐的clusterId列表itemcount = 0itemlist = []for clusternumber in recommendation[itemList] cluster = clusternumber[itemId] dynamoqueryresponse = querydynamodbarticles( cluster indexname dynamoclient tablename maxpercluster ) for item in dynamoqueryresponse[Items] itemlistappend(item) itemcount = 1 if itemcount == desireditems breakreturn itemlist
当用户与文章互动时,交互信息会送往事件追踪器。与典型的亚马逊个性化部署不同,这种情况下,我们将交互记录为该文章所属的集群。可以用几种方法实现,一种是将文章的集群嵌入其元数据中,并与文章ID一同提供给事件追踪器。另一种是使用轻量级缓存或键值数据库查找文章的集群。
无论采用哪种方式,获得文章的集群后,您都会通过事件追踪器流式发送该交互数据。
以下代码片段用于设置事件追踪器:
pythoncreateeventtrackerresponse = personalizecreateeventtracker( name=eventtrackername datasetGroupArn=datasetgrouparn)
通过以下代码片段将新交互数据送入事件追踪器:
pythoneventtrackerid = createeventtrackerresponse[trackingId]
鲤鱼加速器免费签到response = personalizeeventsputevents( trackingId=eventtrackerid userId=sampleuser sessionId=sessionid # 当前用户会话的唯一ID eventList=[] # 包含最多10个项目交互的列表)
这些新交互会促使亚马逊个性化实时更新其推荐结果。
使用源自CIampT DeskDrop数据集的样本数据集,一个用户登录其主页后,将会看到这些文章。所有显示的文章被认为是突发新闻,意味着我们尚未在数据集中追踪这些文章的交互,且这些文章的推荐是通过上述聚类技术实现的。
然而,我们也能与更具技术深度的文章互动。
每次刷新推荐页面时,内容将得到更新。
如果我们改变行为,更多地与设计最佳实践和职业发展相关的文章互动,也会获得相应的推荐。
通过限制每个集群可以抽取的文章数,我们可以在推荐中也增强多样性。
随着新文章作为新闻发布过程的一部分被添加,首先将这些文章保存到S3桶中。为指导该桶上的Lambda触发器,调用以下步骤:
使用亚马逊Bedrock上的模型生成文章内容的嵌入表示。利用此前训练的kmeans聚类模型确定文章的集群ID。在DynamoDB表中存储该文章的相关信息。为避免未来产生额外费用,请删除创建此解决方案时使用的所有资源:
删除SageMaker资源。删除亚马逊个性化资源。删除亚马逊DynamoDB表。本文描述了如何利用AWS的AI/ML服务向用户推荐突发新闻。通过利用亚马逊个性化和亚马逊Titan文本嵌入的强大功能,您可以在文章发布后几秒内向感兴趣的用户展示相应内容。
如同往常,AWS欢迎您的反馈。请在评论区留下您的想法和问题。如需了解更多本文讨论的服务,您可以注册AWS Skill Builder账户,查找有关亚马逊个性化、亚马逊Bedrock、亚马逊SageMaker及其他AWS服务的免费在线课程。
Eric Bolme 是AWS的一名解决方案架构师,专注于东海岸。他在深度学习和其他AI用例方面有8年的经验,主要关注AWS的个性化和推荐用例。
Joydeep Dutta 是AWS的首席解决方案架构师,热衷于协助AWS客户迁移工作负载到云端、优化成本,并帮助制定最佳架构实践。生活在新泽西的他在业余时间喜欢听音乐和享受户外活动。
标签: 亚马逊机器学习 亚马逊个性化 亚马逊SageMaker
留言框-