构建一个使用 Amazon Bedrock 的多模态社交媒体内容生成器 机器学习博客
作者:Ying Hou 和 Bishesh Adhikari 日期:2024年9月25日发布于 Amazon Bedrock、内容生产、生成式 AI、技术指南评论
在数字时代,社交媒体彻底改变了品牌与消费者之间的互动方式,迫切需要能够快速生产动态且吸引人的内容。为解决内容创作者和影响者面临的挑战,本文介绍了如何使用 Amazon Bedrock 创建一个多模态社交媒体内容生成器应用程序。该应用程序运用生成式 AI 和多模态大语言模型LLM来自动化内容生成流程,包括图片和文本,增强创意表达并保持品牌一致性。
如今,社交媒体在品牌与消费者之间的互动中扮演了重要角色,促使品牌需要不断生产动态且引人入胜的内容,以吸引目标受众。内容创造者和影响者在这里面临巨大的竞争压力,他们必须快速生产出新颖、有趣且符合品牌形象的内容。这种挑战主要来自三个方面:快速的内容生产,个性化、引人注目的内容需求,以及与品牌身份、信息、审美和语调一致的内容需求。
传统的内容创建过程时间耗费巨大,通常需要经过多个阶段,如构思、研究、撰写、编辑、设计和审查。然而,这种缓慢的创作周期并不适应社交媒体的快速节奏。
生成式 AI 提供了解决这一挑战的新可能性,可以帮助内容团队和影响者在保持品牌一致性的同时提升创意和互动性。尤其是大语言模型LLMs的多模态能力,使我们可以创建跨越文本、图像、音频和视频格式的丰富精彩内容,这些内容在广告、营销和社交媒体中随处可见。借助最近视图 LLM 的进步,创作者可以利用视觉输入如参考图片启动内容创作过程。图像相似性搜索和文本语义搜索进一步提高了这一过程,通过快速检索相关内容和上下文来增强创作。
在本文中,我们将详细介绍如何通过 Amazon Bedrock API 和 Amazon OpenSearch Serverless 创建一个社交媒体内容生成器应用程序,使用诸如 Anthropic 的 Claude 3、Amazon Titan 图像生成器以及 Amazon Titan 多模态嵌入模型。
在这一解决方案中,我们首先进行数据准备,原始数据集将存储在 Amazon Simple Storage Service (Amazon S3) 桶中。我们提供一个 Jupyter Notebook 来预处理原始数据,并使用 Amazon Titan 多模态嵌入模型将图像和文本转换为嵌入向量。这些向量随后将保存在 OpenSearch Serverless 中,作为集合,如下图所示。
接下来是内容生成。我们使用 Streamlit 应用程序托管的 GUI 网页,用户可以提供初始产品图像以及对图像期望效果的简要描述。从应用程序中,用户还可以选择品牌这将链接到特定品牌模板、选择图像风格例如,摄影或电影风格,并选择文本语调例如,正式或随意。
提供所有配置后,内容创建过程将启动。在第一阶段,解决方案从 CSV 文件中检索品牌特定的模板和指南。在生产环境中,您可以将品牌模板表保存在 Amazon DynamoDB 中,以实现可扩展性、可靠性和维护。在此阶段,用户输入将被用来生成增强的图像,并通过 Amazon Titan 图像生成器与其他信息一起输入到具有视觉能力的 Claude 3 模型,以生成与品牌指南和增强图像紧密相关的初始帖子文本。在这一阶段结束时,增强后的图像和初始帖子文本将被创建并发回 GUI 显示给用户。
在第二阶段,我们结合帖子文本和图像,并使用 Amazon Titan 多模态嵌入模型生成嵌入向量。多模态嵌入模型将来自不同数据类型如文本和图像的信息集成到统一表示中。这使得用户能够使用文本描述搜索图像,或根据视觉内容识别相似图像,或者将文本和图像输入结合在一起以优化搜索结果。在这个解决方案中,多模态嵌入向量用于在 OpenSearch 向量存储中搜索和检索三条最相似的历史帖子。检索到的结果被输入到 Anthropic 的 Claude 3 模型中,以生成标题、提供有关为什么这些历史帖子受欢迎的见解,并提出用户可以如何改进其帖子的建议。
在第三阶段,根据第二阶段的建议,解决方案自动优化帖子文本,并提供最终版本给用户。用户可以灵活选择他们喜欢的版本并在发布前进行修改。整个内容生成过程的步骤由 Streamlit 应用进行编排。
该解决方案已在 AWS 区域 useast1 测试。但是,它也可以在其他可用的区域上工作。在继续之前,请确保您已经设置好以下内容:
一台 AWS 账户一个 Amazon SageMaker 域一个 SageMaker 域用户配置文件我们使用 Amazon SageMaker Studio 生成历史帖子嵌入并将这些嵌入向量保存到 OpenSearch Serverless。此外,您将在 SageMaker Studio 终端中运行 Streamlit 应用程序,以可视化和测试该解决方案。在 SageMaker 环境中测试 Streamlit 应用程序旨在用于临时演示。对于生产环境,我们建议将 Streamlit 应用部署在 Amazon Elastic Compute CloudAmazon EC2或 Amazon Elastic Container ServiceAmazon ECS服务上,并采取适当的安全措施,如身份验证和授权。
我们在解决方案中使用了以下来自 Amazon Bedrock 的模型。请参见 AWS 区域模型支持 并选择支持所有三种模型的区域:
Amazon Titan 多模态嵌入模型Amazon Titan 图像生成器Claude 3 SonnetJupyterLab 空间是 SageMaker Studio 中的私人或共享空间,管理运行 JupyterLab 应用程序所需的存储和计算资源。
设置 JupyterLab 空间的步骤:
登录到您的 AWS 账户并打开 AWS 管理控制台,进入 SageMaker Studio。选择您的用户配置文件,然后选择 打开 Studio。在左上角的 应用程序 中选择 JupyterLab。如果您已经有一个 JupyterLab 空间,选择 运行。如果没有,则选择 创建 JupyterLab 空间,输入名称并选择 创建空间。将实例更改为 t3large,然后选择 运行空间。一分钟后,您应该可以看到 JupyterLab 空间已准备就绪。选择 打开 JupyterLab。在 JupyterLab 启动窗口中,选择 终端。在终端中运行以下命令以从 Github 下载示例代码:bashgit clone https//githubcom/awssamples/BuildamultimodalsocialmediacontentgeneratorusingAmazonBedrockgit
在代码库中,我们提供了一些示例产品图像包、车、香水和蜡烛,这些图像是使用 Amazon Titan 图像生成器模型创建的。接下来,您可以使用 Notebook syntheticdatagenerationipynb 通过以下步骤生成一些合成社交媒体帖子。生成的帖子文本将保存在 metadatajsonl 文件中如果您准备了自己的产品图像和帖子文本,可以跳过此步骤。然后,为图像和生成的文本对计算多模态嵌入。最后,将多模态嵌入数据传送到 Amazon OpenSearch Serverless 的向量存储中。
生成示例帖子的步骤:
在 JupyterLab 中选择 文件浏览器 并导航到 socialmediagenerator/embeddinggeneration 文件夹。打开 Notebook syntheticdatagenerationipynb。选择默认的 Python 3 内核和 Data Science 30 镜像,然后按照 Notebook 中的说明进行操作。此时,您将生成示例帖子并在 datamappingcsv 中可用。打开 Notebook multimodalembeddinggenerationipynb。该 Notebook 首先为帖子图像对创建多模态嵌入。然后将计算出的嵌入传送到 Amazon OpenSearch Serverless 的向量存储中。在 Notebook 末尾,您应该能够对集合执行简单查询,如下所示:pythonqueryprompt = christmas tree holiday bagssimilaritems = findsimilaritemsfromquery( queryprompt=queryprompt k=3 numresults=5 indexname=indexname dataset=df opensearchclient=ossclient)
准备步骤完成。如果您想直接尝试该解决方案,可以跳转到 使用 Streamlit 应用程序运行解决方案,以快速测试在您的 SageMaker 环境中的解决方案。不过,如果您想更详细地了解每个步骤的代码和说明,请继续阅读。
在该解决方案中,我们通过 Amazon Bedrock 使用 FMs 进行内容创作。我们首先使用 Amazon Titan 图像生成器模型增强输入的产品图像,为目标产品周围添加相关背景。
gettitanairequestbody 函数为 Titan 图像生成器模型创建 JSON 请求体,使用其 Outpainting 功能。该函数接受四个参数:outpaintprompt例如,“圣诞树,节日装饰”或“母亲节,鲜花,温馨灯光”,negativeprompt要在生成图像中排除的元素,maskprompt指定保留的区域,例如“包”或“车”,以及 imagestr以 base64 字符串编码的输入图像。
generateimage 函数需要 modelid 和 body来自 gettitanairequestbody 的请求体。它通过 bedrockinvokemodel 调用模型,并返回包含 base64 编码生成图像的响应。
最后,代码片段调用 gettitanairequestbody,并传入提供的提示和输入图像字符串,然后将请求体传递给 generateimage,从而获得增强后的图像。
pythondef gettitanairequestbody(outpaintprompt negativeprompt maskprompt imagestr=None)
seed = randomrandint(0 2147483647)body = { taskType OUTPAINTING outPaintingParams { text outpaintprompt negativeText negativeprompt image imagestr maskPrompt maskprompt outPaintingMode PRECISE # 或 DEFAULT } imageGenerationConfig { numberOfImages 1 quality premium cfgScale 8 seed seed }}return jsondumps(body)
def generateimage(modelid body) Args modelid (str) 要使用的模型 ID。 body (str) 要使用的请求体。 Returns imagebytes (bytes) 模型生成的图像。 loggerinfo(使用模型 s 生成图像 modelid)
accept = application/jsoncontenttype = application/jsonresponse = bedrockinvokemodel( body=body modelId=modelid accept=accept contentType=contenttype)responsebody = jsonloads(responseget(body)read())
return responsebody
body = gettitanairequestbody(outpaintprompt negativeprompt maskprompt imagestr=imagestr)response = generateimage(modelid=MODELIMAGE body=body)imageenhanced = base64toimage(response[images][0])
以下图像展示了根据像“圣诞树,节日装饰,温馨灯光”这样的输入提示、特定位置如底中间和品牌如“奢侈品牌”生成的增强版本。如果生成的图像不满意,可以反复执行该过程,直至达到期望结果。
接下来,通过考虑用户输入、品牌指南在 brandguidelinecsv 文件中提供,您可以用您的数据替换以及上一阶段生成的增强图像来生成帖子文本。
generatetextwithclaude 函数是一个高级函数,处理图像和文本输入,准备必要的数据,并调用 generatevisionanswer 与 Amazon Bedrock 模型Claude 3 模型互动以获取所需响应。generatevisionanswer 函数执行与 Amazon Bedrock 模型之间的核心交互,处理模型响应并将其返回给调用者。这两个函数结合在一起,使得基于图像和文本输入生成文本响应成为可能。
在以下代码片段中,使用格式化占位符构造初始帖子提示,包含各种元素如角色、产品名称、目标品牌、语调、标签、文案和品牌信息。这些元素在 brandguidelinecsv 文件中提供,以确保生成的文本与品牌偏好和指南一致。然后,将初始提示传递给 generatetextwithclaude 函数,并与增强图像一起生成最终的帖子文本。
pythondef generatevisionanswer(bedrock boto3client messages list modelid str claudeconfig dict systemprompt str) 使用指定的模型和配置生成视觉答案。 body = {messages [messages] claudeconfig system systemprompt} bedrock = boto3client(servicename=bedrockruntime)
response = bedrockinvokemodel(modelId=modelid body=jsondumps(body)) response = jsonloads(response[body]read()decode(utf8))print(Claude 视觉答案生成成功)formattedresponse = postprocessanswer(response[content][0][text])return formattedresponse
def generatetextwithclaude(image prompt) 为帖子生成文本使用 Claude 以及历史帖子分析 with BytesIO() as byteio imagesave(byteio format=PNG) imagebytes = byteiogetvalue()
messages = {role user content [{ type image source { type base64 mediatype image/jpeg data base64b64encode(imagebytes)decode() }}{type text text prompt}]}claudetext = generatevisionanswer(bedrock messages MODELTEXT CLAUDECONFIG SYSTEMPROMPT) return claudetextinitialpostprompt = PROMPTTEXTformat( role=role productname=productinput targetbrand=brand tone=tone hashtag=hashtag copywriting=copywriting brandmessageing=brandmessageing)
posttext = generatetextwithclaude( image=imageenhanced prompt=initialpostprompt)
以下示例展示了生成的帖子文本。它对产品进行了详细描述,与品牌指南相符,并结合图像中的元素如圣诞树。此外,我们指示模型在适当的时候包括标签和表情符号,结果表明它有效执行了提示指令。
下一步是利用生成的图像和文本,从向量数据库中搜索三条最相似的历史帖子。我们使用 Amazon Titan 多模态嵌入模型来创建嵌入向量,并将其存储在 Amazon OpenSearch Serverless 中。这些相关的历史帖子可能会获得许多点赞,并在应用程序网页上展示,以使用户了解什么是成功的社交媒体帖子。此外,我们分析这些检索到的帖子,并为用户提供切实可行的改进建议。
速云梯下载