由 Nolan Chen 撰写于 2024 年 8 月 5 日,发布于 Amazon Bedrock、Amazon OpenSearch 服务、Amazon Transcribe、生成性 AI、技术如何做 永久链接 评论 共享
在数字时代,信息检索系统通过快速处理大量数据并返回相关结果推动了信息时代的发展。搜索引擎和数据库等系统通常通过对数据文件中的关键字和字段进行索引来实现这一目标。
然而,我们在数字时代的大量数据也以非文本格式出现,比如音频和视频文件。要找到相关内容,通常需要搜索手动添加的文本元数据,比如时间戳。这在非结构化音频和视频文件不断增多的情况下,难以扩展。
幸运的是,人工智能AI解决方案的出现可以转录音频并提供语义搜索能力,这为高效查询音频文件中的内容提供了新的思路。Amazon Transcribe 是 AWS 的 AI 服务,能够轻松地将语音转换为文本。与此同时,Amazon Bedrock 是一项完全托管的服务,通过单一 API 提供来自领先 AI 公司的高效基础模型FMs,以及构建安全、隐私和负责任 AI 应用程序的广泛能力。
在这篇文章中,我们将展示如何利用 Amazon Transcribe 和 Amazon Bedrock 简化音频节目编目、查询和搜索的过程,以 AWS reThink 播客系列为例。
以下的图示说明了如何使用 AWS 服务部署一个用于音频文件内容编目、查询和搜索的解决方案。
在此解决方案中,首先将存储为 mp3 格式的音频文件上传至 Amazon Simple Storage ServiceAmazon S3存储。支持语言中的视频文件例如 mp4也可以作为此解决方案的一部分上传至 Amazon S3。随后,Amazon Transcribe 将转录这些文件,并将整份抄本以 JSON 格式存储为 Amazon S3 的对象。
为了对这些文件进行编目,我们应该为 Amazon S3 中的每个 JSON 文件标记相应的剧集标题。这样,后续在查询结果时,便可以轻松检索到相应的剧集标题。
接下来,我们使用 Amazon Bedrock 来创建内容的数值表示方法。这些数值表示法也称为 嵌入,它们将作为向量存储在后续可查询的向量数据库中。
Amazon Bedrock 是一项完全托管的服务,通过 API 提供来自领先 AI 初创公司和亚马逊的 FMs。随着 Amazon Bedrock 提供的 Amazon Bedrock Knowledge Bases 服务,搭建检索增强生成RAG工作流变得更加简单。
使用 Amazon Bedrock Knowledge Bases,我们首先在 AWS 上设置一个向量数据库。随后,这项服务能够自动将存储在 Amazon S3 中的数据文件拆分为多个块,并利用 Amazon Titan 创建每个块的嵌入。Amazon Titan 是亚马逊推出的一系列高效 FMs,其中就包括 Amazon Titan Text Embeddings,我们将用其生成每个块中文本的数值表示并将其存储在向量数据库中。
当用户通过生成性 AI 应用或 AWS Lambda 功能查询音频文件内容时,它会向 Amazon Bedrock Knowledge Bases 发出 API 调用。随后,Amazon Bedrock Knowledge Bases 将协调向向量数据库发起语义搜索,返回最相关的结果。接下来,该服务会将用户的原始查询与这些结果一起增强为提示,并发送给大型语言模型LLM。LLM 将返回与用户查询更加准确和相关的结果。
现在,让我们通过一个使用 AWS AI 服务的示例,演示如何对音频文件库进行编目、查询和搜索。本文将使用包含 20 多集的 reThink 播客系列的各集作为示例。每集均为以 mp3 格式录制的音频节目。随着我们不断添加新的节目,我们将需要利用 AI 服务,使查询和搜索特定内容的任务更具扩展性,而无需手动添加每集的元数据。
除了需要通过 AWS 管理控制台 访问 AWS 服务外,您还需要一些其他资源来部署该解决方案。
首先,您需要一组音频文件进行编目、查询和搜索。本文将使用 AWS reThink 播客系列中的各集作为示例。
为了从我们的生成性 AI 应用向 Amazon Bedrock 发出 API 调用,我们使用 Python 3114 版本和 AWS SDK for Python (Boto3) 。
首件任务是使用 Amazon Transcribe 对每个 mp3 文件进行转录。关于如何使用 AWS 管理控制台或 AWS CLI 进行转录的说明,请参考 Amazon Transcribe 开发者指南。Amazon Transcribe 可以为每集中创建一个抄本,并将其以 JSON 格式存储为 S3 对象。
为了对每集进行编目,我们为每集在 S3 对象中添加相应的剧集标题作为标记。有关在 S3 中标记对象的说明,请参考 Amazon Simple Storage Service 用户指南。例如,对于 S3 对象 AIAcceleratorsjson,我们将其标记为 key = “title” 和 value = “第 20 集:云中的 AI 加速器。
标题是我们需要手动添加的唯一元数据。无需手动为每一章或每个部分添加时间戳,以便后续搜索特定内容。
接下来,我们使用 Amazon Bedrock Knowledge Bases 设置完全托管的 RAG 工作流。有关创建知识库的说明,请参考 Amazon Bedrock 用户指南。我们首先指定数据源。在这个例子中,我们选择存储我们 JPEG 格式抄本的 S3 存储桶位置。
接下来,我们选择嵌入模型。嵌入模型会将每段抄本转换为嵌入。嵌入是数字,每个嵌入的含义取决于模型。在本例中,我们选择 Titan Text Embeddings v2,其维度大小为 1024。
嵌入以向量形式存储在向量数据库中。您可以指定一个已创建的现有向量数据库,或者让 Amazon Bedrock Knowledge Bases 为您创建一个。在我们的示例中,我们让 Amazon Bedrock Knowledge Bases 使用 Amazon OpenSearch Serverless 创建一个向量数据库。
在查询向量数据库之前,您首先需要与数据源同步。每个同步操作中,Amazon Bedrock Knowledge Bases 会将数据源拆分成多个块,然后使用所选的嵌入模型将每个块嵌入为向量。随后,Amazon Bedrock Knowledge Bases 将把这些向量存储到向量数据库中。
同步操作及其他 Amazon Bedrock 的操作可以通过控制台或 API 调用执行。
现在我们准备查询和搜索我们播客系列中的特定内容。在第 20 集标题为 “云中的 AI 加速器” 中,我们的嘉宾 Matthew McClean,AWS Annapurna 团队的高级经理,分享了 AWS 为什么在 2015 年决定收购 Annapurna Labs。我们的第一个查询是:“AWS 为什么收购 Annapurna Labs?”
我们在 Amazon Bedrock Knowledge Bases 中输入了该查询,并使用 Anthropic Claude 得到以下回复:
“AWS 在 2015 年收购 Annapurna Labs,因为 Annapurna 为 AWS 提供了排放虚拟化、安全、网络和存储的 Nitro 卡,使 EC2 实例的 CPU 资源得以释放。”
这句话是 Matthew McClean 在播客中的确切引用。如果您在其他公开的生成性 AI 聊天机器人中输入相同的提示,您不会获得该引用,因为它们没有包含播客抄本的嵌入向量数据库,从而无法提供更相关的上下文。
接下来,假设除了获得更相关的响应,我们还希望从播客剧集目录中检索与此查询相关的正确播客剧集标题。
为了检索剧集标题,我们首先使用查询的最相关数据块。每当 Amazon Bedrock Knowledge Bases 回复查询时,它还提供了一条或多条从向量数据库中检索到的与该查询最相关的数据块,这些块按相关性排序。我们可以取返回的第一个块。返回的块作为 JSON 文档,嵌套在 JSON 中的是抄本对象的 S3 位置。在我们的示例中,S3 位置为 s3//rethinkpodcast/text/transcripts/AIAcceleratorsjson 。

块文本的开头是:“是的,当然。那么也许我可以从 Annapurna 的历史开始
因为我们已经在 Amazon S3 中将该抄本对象标记为剧集标题,所以我们可以通过检索 key = “title” 的标签值来获取标题。在这个例子中,标题为 “第 20 集:云中的 AI 加速器”。
如果我们还想找到与该内容有关的起始时间,该如何操作?我们希望在不手动阅读抄本或从头开始收听剧集的情况下,找到相关内容的起始时间,而并不希望为每个章节手动添加时间戳。
通过让我们的生成性 AI 应用进行更多 API 调用,我们可以更快地找到开始时间。我们首先将块文本视为整个抄本的子字符串。然后搜索块文本中第一个单词的开始时间。
在我们的示例中,返回的第一个单词是“是的”。我们现在需要在整个抄本中搜索单词“是”的开始时间。
Amazon Transcribe 在抄本中输出每个单词的开始时间。然而,任何单词可能出现多次。单词“是”的出现次数为 28 次,每次出现都有其开始时间。那么,我们该如何确定示例中“是”的正确开始时间呢?
应用程序开发者可以使用多种方法来查找正确的开始时间。在我们的示例中,我们使用 Python 的 find() 方法查找块文本在整个抄本中的位置。
对于以“是的,当然。那么也许我可以从 Annapurna 的历史开始”开头的块文本,find() 方法返回的位置为 2047。如果我们把抄本看作一个长文本字符串,那么块“是的,当然。那么”的开始位置是字符位置 2047。
找到开始时间现在变成计算抄本中每个单词的字符位置,然后使用它来查找从 Amazon Transcribe 生成的抄本文件的正确开始时间。对人来说这可能是繁琐的,但对计算机来说是微不足道的。
在我们的示例 Python 代码 中,我们循环处理包含每个 token 开始时间的数组,同时计算每个 token 开始的字符位置。因为我们正在循环处理 tokens,所以可以构建一个新数组来存储每个字符位置的开始时间。
在此示例查询中,“是”在位置 2047 的开始时间是 160 秒,或播客中的 2 分 40 秒。您可以查看 录音,从 2 分 40 秒开始播放。
该解决方案的使用会根据您所使用的服务产生费用:
Amazon Transcribe 采用按需定价模式。有关更多详细信息,请参阅 Amazon Transcribe 定价。Amazon Bedrock 根据按需配额收费,因此您只需为使用的部分付费。有关更多信息,请参阅 Amazon Bedrock 定价。使用 OpenSearch Serverless 时,您只需为您的工作负载消耗的资源付费。如果您将 Amazon Bedrock Knowledge Bases 与 OpenSearch Serverless 之外的其他向量数据库一起使用,则即使在未运行任何查询时,您仍可能会产生费用。建议您在测试完该解决方案后,删除知识库及其关联的向量存储,以及存储在 Amazon S3 中的音频文件,以避免不必要的费用。大规模音频文件的编目、查询和搜索可能很难扩展。在本文中,我们展示了 Amazon Transcribe 和 Amazon Bedrock Knowledge Bases 如何帮助自动化和扩展从音频文件中检索相关信息的过程。
您可以开始使用 Amazon Transcribe 转录您的音频文件库。要了解 Amazon Bedrock Knowledge Bases 如何为您的抄本提供带有向量存储的 RAG 工作流,请参考 知识库现在在 Amazon Bedrock 中提供完全托管的 RAG 体验。
借助这些 AI 服务,我们现在可以扩展知识库的边界。
Nolan Chen 是 AWS 的合作伙伴解决方案架构师,帮助初创公司利用云构建创新解决方案。在加入 AWS 之前,Nolan 专注于数据安全,帮助客户部署高性能广域网络。他拥有普林斯顿大学机械工程的学士学位。
tg加速器下载