亚马逊AWS官方博客

HAQM Bedrock 数据自动化现已正式推出

许多应用程序需要与通过不同模式提供的内容进行交互。其中一些应用程序处理复杂的文件,例如保险索赔和医疗账单。移动应用程序需要分析用户生成的媒体。企业需要在其数字资产(包括文档、图像、音频和视频文件)的基础上建立语义索引。但是,从非结构化多模态内容中获取见解并不容易:您必须针对不同的数据格式实施处理管道,并通过多个步骤来获取所需的信息。这通常意味着要有多个模型投入生产,您必须对这些模型进行成本优化(通过微调和提示工程)、保护措施(例如,防范幻觉)、与目标应用程序的集成(包括数据格式)和模型更新。

为简化这一过程,我们在 AWS re:Invent 期间推出HAQM Bedrock 数据自动化的预览版,这是 HAQM Bedrock 的一项功能,可简化从非结构化、多模态内容(例如文档、图像、音频和视频)生成有价值的见解的过程。借助 Bedrock Data Automation,您可以减少构建智能文档处理、媒体分析和其他以数据为中心的多模态自动化解决方案的开发时间和精力。

您可以将 Bedrock 数据自动化用作独立功能,也可以用作 HAQM Bedrock 知识库的解析器,对来自多模态内容的见解进行索引,并为检索增强生成(RAG)提供更相关的响应。

如今,Bedrock Data Automation 现已正式推出,支持跨区域推理端点,可在更多 AWS 区域使用,并在不同地点无缝使用计算。根据您在预览期间的反馈,我们还提高了准确性,增加了对图像和视频徽标识别的支持。

让我们来看看它在实践中是如何运行的。

将 HAQM Bedrock 数据自动化与跨区域推理端点配合使用

针对 Bedrock 数据自动化预览发布的博客文章展示了如何使用 HAQM Bedrock 控制台中的可视化演示从文档和视频中提取信息。我建议您通过控制台演示体验来了解这项功能的工作原理,以及如何对其进行自定义。在这篇文章中,我将重点介绍 Bedrock 数据自动化在您的应用程序中的工作原理,首先介绍控制台中的几个步骤,然后介绍代码示例。

现在,HAQM Bedrock 控制台数据自动化部分会在您首次访问时确认是否启用跨区域支持。例如:

控制台屏幕截图。

从 API 的角度来看,InvokeDataAutomationAsync 操作现在需要一个附加参数(dataAutomationProfileArn)来指定要使用的数据自动化配置文件。此参数的值取决于该地区和您的 AWS 账户 ID:

arn:aws:bedrock:<REGION>:<ACCOUNT_ID>:data-automation-profile/us.data-automation-v1

此外,dataAutomationArn 参数已更名为 dataAutomationProjectArn,以更好地反映该参数包含项目 HAQM 资源名称(ARN)。在调用 Bedrock 数据自动化时,您现在需要指定要使用的项目或蓝图。如果输入蓝图,将获得自定义输出。要继续获取标准默认输出,请将参数 DataAutomationProjectArn 配置为使用 arn:aws:bedrock:<REGION>:aws:data-automation-project/public-default

顾名思义,InvokeDataAutomationAsync 操作是异步的。您只需传递输入和输出配置,结果就会按照输出配置的指定写入 HAQM Simple Storage Service(HAQM S3)的存储桶中。您可以使用 notificationConfiguration 参数从 Bedrock 数据自动化接收 HAQM EventBridge 通知。

借助 Bedrock 数据自动化,您可以通过两种方式配置输出:

  • 标准输出可提供与数据类型相关的预定义见解,如文档语义、视频章节摘要和音频转录。使用标准输出,您只需几个步骤即可获取所需的见解。
  • 自定义输出让您可使用蓝图指定提取需求,从而获得更有针对性的见解。

为了查看新功能的实际运行情况,我创建了一个项目并自定义了标准输出设置。对于文档,我选择纯文本而不是标记符。请注意,您可以使用 Bedrock 数据自动化 API 自动执行这些配置步骤。

控制台屏幕截图。

对于视频,我需要完整的音频转录和整个视频的摘要。我还要求提供各章的摘要。

控制台屏幕截图。

要配置蓝图,我在 HAQM Bedrock 控制台导航窗格的数据自动化部分选择自定义输出设置。在那里,我搜索了美国驾驶执照示例蓝图。您可以浏览其他示例蓝图,以获取更多示例和想法。

示例蓝图无法编辑,因此我使用操作菜单复制蓝图,并将其添加到我的项目中。在那里,我可以通过修改蓝图和添加自定义字段来微调要提取的数据,这些字段可以使用生成式人工智能,以我需要的格式提取或计算数据。

控制台屏幕截图。

我在 S3 存储桶中上传了美国驾照的图片。然后,我使用这个示例 Python 脚本,通过适用于 Python 的 HAQM SDK(Boto3)使用 Bedrock 数据自动化从图像中提取文本信息:

import json
import sys
import time

import boto3

DEBUG = False

AWS_REGION = '<REGION>'
BUCKET_NAME = '<BUCKET>'
INPUT_PATH = 'BDA/Input'
OUTPUT_PATH = 'BDA/Output'

PROJECT_ID = '<PROJECT_ID>'
BLUEPRINT_NAME = 'US-Driver-License-demo'

# Fields to display
BLUEPRINT_FIELDS = [
    'NAME_DETAILS/FIRST_NAME',
    'NAME_DETAILS/MIDDLE_NAME',
    'NAME_DETAILS/LAST_NAME',
    'DATE_OF_BIRTH',
    'DATE_OF_ISSUE',
    'EXPIRATION_DATE'
]

# 适用于 Python 的 HAQM SDK(Boto3)客户端
bda = boto3.client('bedrock-data-automation-runtime', region_name=AWS_REGION)
s3 = boto3.client('s3', region_name=AWS_REGION)
sts = boto3.client('sts')


def log(data):
    if DEBUG:
        if type(data) is dict:
            text = json.dumps(data, indent=4)
        else:
            text = str(data)
        print(text)

def get_aws_account_id() -> str:
    return sts.get_caller_identity().get('Account')


def get_json_object_from_s3_uri(s3_uri) -> dict:
    s3_uri_split = s3_uri.split('/')
    bucket = s3_uri_split[2]
    key = '/'.join(s3_uri_split[3:])
    object_content = s3.get_object(Bucket=bucket, Key=key)['Body'].read()
    return json.loads(object_content)


def invoke_data_automation(input_s3_uri, output_s3_uri, data_automation_arn, aws_account_id) -> dict:
    params = {
        'inputConfiguration': {
            's3Uri': input_s3_uri
        },
        'outputConfiguration': {
            's3Uri': output_s3_uri
        },
        'dataAutomationConfiguration': {
            'dataAutomationProjectArn': data_automation_arn
        },
        'dataAutomationProfileArn': f"arn:aws:bedrock:{AWS_REGION}:{aws_account_id}:data-automation-profile/us.data-automation-v1"
    }

    response = bda.invoke_data_automation_async(**params)
    log(response)

    return response

def wait_for_data_automation_to_complete(invocation_arn, loop_time_in_seconds=1) -> dict:
    while True:
        response = bda.get_data_automation_status(
            invocationArn=invocation_arn
        )
        status = response['status']
        if status not in ['Created', 'InProgress']:
            print(f" {status}")
            return response
        print(".", end='', flush=True)
        time.sleep(loop_time_in_seconds)


def print_document_results(standard_output_result):
    print(f"Number of pages: {standard_output_result['metadata']['number_of_pages']}")
    for page in standard_output_result['pages']:
        print(f"- Page {page['page_index']}")
        if 'text' in page['representation']:
            print(f"{page['representation']['text']}")
        if 'markdown' in page['representation']:
            print(f"{page['representation']['markdown']}")


def print_video_results(standard_output_result):
    print(f"Duration: {standard_output_result['metadata']['duration_millis']} ms")
    print(f"Summary: {standard_output_result['video']['summary']}")
    statistics = standard_output_result['statistics']
    print("Statistics:")
    print(f"- Speaket count: {statistics['speaker_count']}")
    print(f"- Chapter count: {statistics['chapter_count']}")
    print(f"- Shot count: {statistics['shot_count']}")
    for chapter in standard_output_result['chapters']:
        print(f"Chapter {chapter['chapter_index']} {chapter['start_timecode_smpte']}-{chapter['end_timecode_smpte']} ({chapter['duration_millis']} ms)")
        if 'summary' in chapter:
            print(f"- Chapter summary: {chapter['summary']}")


def print_custom_results(custom_output_result):
    matched_blueprint_name = custom_output_result['matched_blueprint']['name']
    log(custom_output_result)
    print('\n- Custom output')
    print(f"Matched blueprint: {matched_blueprint_name}  Confidence: {custom_output_result['matched_blueprint']['confidence']}")
    print(f"Document class: {custom_output_result['document_class']['type']}")
    if matched_blueprint_name == BLUEPRINT_NAME:
        print('\n- Fields')
        for field_with_group in BLUEPRINT_FIELDS:
            print_field(field_with_group, custom_output_result)


def print_results(job_metadata_s3_uri) -> None:
    job_metadata = get_json_object_from_s3_uri(job_metadata_s3_uri)
    log(job_metadata)

    for segment in job_metadata['output_metadata']:
        asset_id = segment['asset_id']
        print(f'\nAsset ID: {asset_id}')

        for segment_metadata in segment['segment_metadata']:
            # Standard output
            standard_output_path = segment_metadata['standard_output_path']
            standard_output_result = get_json_object_from_s3_uri(standard_output_path)
            log(standard_output_result)
            print('\n- Standard output')
            semantic_modality = standard_output_result['metadata']['semantic_modality']
            print(f"Semantic modality: {semantic_modality}")
            match semantic_modality:
                case 'DOCUMENT':
                    print_document_results(standard_output_result)
                case 'VIDEO':
                    print_video_results(standard_output_result)
            # Custom output
            if 'custom_output_status' in segment_metadata and segment_metadata['custom_output_status'] == 'MATCH':
                custom_output_path = segment_metadata['custom_output_path']
                custom_output_result = get_json_object_from_s3_uri(custom_output_path)
                print_custom_results(custom_output_result)


def print_field(field_with_group, custom_output_result) -> None:
    inference_result = custom_output_result['inference_result']
    explainability_info = custom_output_result['explainability_info'][0]
    if '/' in field_with_group:
        # For fields part of a group
        (group, field) = field_with_group.split('/')
        inference_result = inference_result[group]
        explainability_info = explainability_info[group]
    else:
        field = field_with_group
    value = inference_result[field]
    confidence = explainability_info[field]['confidence']
    print(f'{field}: {value or '<EMPTY>'}  Confidence: {confidence}')


def main() -> None:
    if len(sys.argv) < 2:
        print("Please provide a filename as command line argument")
        sys.exit(1)
      
    file_name = sys.argv[1]
    
    aws_account_id = get_aws_account_id()
    input_s3_uri = f"s3://{BUCKET_NAME}/{INPUT_PATH}/{file_name}" # File
    output_s3_uri = f"s3://{BUCKET_NAME}/{OUTPUT_PATH}" # Folder
    data_automation_arn = f"arn:aws:bedrock:{AWS_REGION}:{aws_account_id}:data-automation-project/{PROJECT_ID}"

    print(f"Invoking Bedrock Data Automation for '{file_name}'", end='', flush=True)

    data_automation_response = invoke_data_automation(input_s3_uri, output_s3_uri, data_automation_arn, aws_account_id)
    data_automation_status = wait_for_data_automation_to_complete(data_automation_response['invocationArn'])

    if data_automation_status['status'] == 'Success':
        job_metadata_s3_uri = data_automation_status['outputConfiguration']['s3Uri']
        print_results(job_metadata_s3_uri)


if __name__ == "__main__":
    main()

脚本中的初始配置包括用于输入和输出的 S3 存储桶名称、输入文件在存储桶中的位置、结果的输出路径、用于从 Bedrock 数据自动化获取自定义输出的项目 ID,以及要在输出中显示的蓝图字段。

我运行传递输入文件名称的脚本。在输出中,我看到了 Bedrock 数据自动化提取的信息。美国驾照与之匹配,并在输出中打印出驾照上的姓名和日期。

python bda-ga.py bda-drivers-license.jpeg

Invoking Bedrock Data Automation for 'bda-drivers-license.jpeg'................Success

Asset ID: 0

- Standard output
Semantic modality: DOCUMENT
Number of pages: 1
- Page 0
NEW JERSEY

Motor Vehicle
 Commission

AUTO DRIVER LICENSE

Could DL M6454 64774 51685                      CLASS D
        DOB 01-01-1968
ISS 03-19-2019          EXP     01-01-2023
        MONTOYA RENEE MARIA 321 GOTHAM AVENUE TRENTON, NJ 08666 OF
        END NONE
        RESTR NONE
        SEX F HGT 5'-08" EYES HZL               ORGAN DONOR
        CM ST201907800000019 CHG                11.00

[SIGNATURE]



- Custom output
Matched blueprint: US-Driver-License-copy  Confidence: 1
Document class: US-drivers-licenses

- Fields
FIRST_NAME: RENEE  Confidence: 0.859375
MIDDLE_NAME: MARIA  Confidence: 0.83203125
LAST_NAME: MONTOYA  Confidence: 0.875
DATE_OF_BIRTH: 1968-01-01  Confidence: 0.890625
DATE_OF_ISSUE: 2019-03-19  Confidence: 0.79296875
EXPIRATION_DATE: 2023-01-01  Confidence: 0.93359375

不出所料,我在输出中看到了从与 Bedrock 数据自动化项目相关的蓝图中选择的信息。

同样,我在同事 Mike Chambers 提供的视频文件上运行了相同的脚本。为了保持较小的输出量,我不会打印完整的音频脚本或视频中显示的文本。

python bda.py mike-video.mp4
Invoking Bedrock Data Automation for 'mike-video.mp4'..........................................................................................................................................................................................................................................................................Success

Asset ID: 0

- Standard output
Semantic modality: VIDEO
Duration: 810476 ms
摘要:在本综合演示中,技术专家探讨了大型语言模型(LLM)的功能和局限性,同时展示使用 AWS 服务的实际应用程序。他首先谈到了关于 LLM 的一个常见误解,解释说,虽然 LLM 拥有来自训练数据的一般性世界知识,但除非连接到外部数据来源,否则它们缺乏当前的实时信息。

为了说明这一概念,他演示了一个“服装规划师”应用程序,该程序可根据地理位置和天气条件提供着装建议。以澳大利亚布里斯班为例,该应用程序将 LLM 功能与实时天气数据相结合,为热带气候推荐轻便的亚麻衬衫、短裤和帽子等合适的服装。

随后,演示转向 HAQM Bedrock 平台,该平台使用户能够使用基础模型构建和扩展生成式人工智能应用程序。演讲者展示了“OutfitAssistantAgent”(着装助手智能代理),解释了它如何访问实时天气数据以提出明智的着装建议。通过该平台的“显示跟踪”功能,他揭示了智能代理的决策过程,以及如何检索和处理位置和天气信息。

在演讲者使用 HAQM Bedrock 配置 OutfitAssistant 时,探讨了技术实现细节。智能代理的工作流程设计为完全无服务器,并在 HAQM Bedrock 服务内进行管理。

该演示文稿进一步探讨了技术方面,涵盖了 AWS Lambda 控制台集成,展示了如何创建连接到 OpenWeatherMap API 等外部服务的操作组函数。演讲者强调,当连接到提供相关数据来源(无论是数据库、文本文件还是外部 API)的工具时,LLM 才会真正发挥作用。

演示结束时,演讲者鼓励观众探索更多 AWS 开发人员内容,并通过点赞和订阅与该频道互动,从而强调了将 LLM 与外部数据来源相结合以创建强大的情境感知应用程序的实际价值。
统计数据:
- 扬声器数量:1
- 章节数:6
- 射门次数:48
第 0 章 00:00:00:00-00:01:32:01(92025 毫秒)
- 章节摘要:一个留着络腮胡、戴着眼镜的男人,身穿带有各种徽标和文字的灰色连帽运动衫,正坐在办公桌前,背景色彩鲜艳。他讨论了新的大型语言模型(LLM)的频繁发布,以及人们如何经常通过提出“谁赢得了世界大赛”等问题来测试这些模型。 该男子解释说,LLM 是根据来自互联网的一般数据进行培训的,因此它们可能掌握过去事件的信息,但不掌握当前事件的信息。然后,他提出了一个关于他对大语言模型(LLM)有何期望的问题,他表示希望大语言模型具备一般性世界知识,比如能够理解像“上就是上”和“下就是下”这样的基本概念,但并不需要特定的事实性知识。该男子建议他可以将其他系统连接到 LLM,以获取与其需求有关的最新事实数据。他强调了掌握一般性世界知识的重要性,以及使用工具和与智能代理工作流(他称之为“智能代理工作流”)相联系的能力。 他鼓励听众将这个词添加到拼写检查器中,因为它很可能成为常用词。
第 1 章 00:01:32:01-00:03:38:18(126560 毫秒)
- 章节摘要:视频展示了一位留着络腮胡、戴着眼镜的男子在笔记本电脑上演示“服装规划师”应用程序。该应用程序让用户输入他们的位置,例如澳大利亚的布里斯班,并根据天气状况推荐合适的服装。该男子解释说,该应用程序使用大型语言模型生成这些建议,但由于无法直接访问现实世界的数据来源,有时会提供不准确或是凭空编造的信息。

这位男士演示了使用“服装规划师”的过程,他输入布里斯班作为地点,然后收到温度、湿度和云量等天气详情。然后,他展示了该应用程序如何推荐服装选项,包括轻质亚麻衬衫、短裤、凉鞋和帽子,以及在热带环境中穿着类似服装的女性的照片。

在整个演示过程中,该男子指出了当前语言模型在没有外部数据连接的情况下提供准确和最新信息所存在的局限性。他还强调需要在应用程序中编辑提示和调整设置,以便优化输出并提高所生成建议的准确性。
第 2 章 00:03:38:18-00:07:19:06(220620 毫秒)
- 章节摘要:该视频演示了 HAQM Bedrock 平台,该平台允许用户使用基础模型(FM)构建和扩展生成式人工智能应用程序。[speaker_0] 介绍了该平台的概述,重点介绍了其关键功能,例如从 AWS 管理 FM、与自定义模型集成以及为领先的人工智能初创企业提供访问权限。视频展示了 HAQM Bedrock 控制台界面,其中 [speaker_0] 导航到“智能代理”部分并选择了“OutfitAssistantAgent”智能代理。[speaker_0] 测试了 OutfitAssistantAgent,要求它推荐适合澳大利亚布里斯班的服装。由于天气凉爽、多雾,智能代理建议穿一件薄外套或毛衣。为了验证推荐的准确性,[speaker_0] 点击“显示跟踪”按钮,该按钮显示了智能代理的工作流程以及为检索布里斯班当前位置详细信息和天气信息所采取的步骤。该视频解释说,该智能代理使用编排和知识库系统,根据用户的查询和检索到的数据来确定适当的响应。它突显了该智能代理访问位置和天气数据等实时信息的能力,这对于生成准确和相关的响应至关重要。
第 3 章 00:07:19:06-00:11:26:13(247214 毫秒)
- 章节摘要:该视频演示了使用 HAQM Bedrock 配置名为“OutfitAssistant”的人工智能助手智能代理的过程。[speaker_0] 介绍了智能代理的目的,即根据当前的时间和天气状况推荐着装。配置界面允许从 Anthropic 中选择语言模型,在本例中为 Claud 3 Haiku 模型,并为智能代理的行为定义自然语言指令。[speaker_0] 解释说,行动组是一组将与外界互动的工具或操作。OutfitAssistant 智能代理使用 Lambda 函数作为其工具,使其完全无服务器化,并在 HAQM Bedrock 服务内进行管理。[speaker_0] 定义了两个操作组:“获取坐标”用于从地名检索纬度和经度坐标,“获取当前时间”用于根据位置确定当前时间。“获取当前天气”操作需要先调用“获取坐标”操作来获取位置坐标,然后使用这些坐标检索当前天气信息。这展示了智能代理的工作流程以及它如何利用已定义的操作来生成着装建议。在整个视频中,[speaker_0] 提供了有关智能代理配置的详细信息,包括其名称、描述、型号选择、说明和操作组。该界面显示与这些方面相关的各种选项和设置,允许 [speaker_0] 自定义智能代理的行为和功能。
第 4 章 00:11:26:13-00:13:00:17(94160 毫秒)
- 章节摘要:该视频展示了 [speaker_0] 在 AWS Lambda 控制台上的演示及其与用于构建强大智能代理的机器学习模型的集成。[speaker_0] 演示如何使用 AWS Lambda 创建操作组函数,该函数可用于根据位置、时间和天气数据等输入参数生成文本响应。显示了 Lambda 函数代码,该代码利用诸如 OpenWeatherMap API 之类的外部服务来获取天气信息。[speaker_0] 解释说,要使大型语言模型发挥作用,需要连接到提供相关数据来源的工具,例如数据库、文本文件或外部 API。该演示涵盖了定义操作、设置 Lambda 函数以及在 AWS 环境中利用各种工具来构建能够生成情境感知响应的智能代理的过程。
第 5 章 00:13:00:17-00:13:28:10(27761 毫秒)
- 章节摘要:一个留着络腮胡、戴着眼镜的男人,身穿带有各种徽标和文字的灰色连帽衫,正坐在办公桌前,背景色彩鲜艳。他正在使用的笔记本电脑上有贴纸和徽标,包括 AWS 徽标。该男子似乎在介绍或谈论 AWS(HAQM Web Services)及其服务,例如 Lambda 函数和大型语言模型。他提到,如果 Lambda 函数可以执行某些任务,就可以用来增强大型语言模型。最后,他表示希望观众觉得这段视频有用、有见地,并鼓励他们观看 AWS 开发人员频道上的其他视频。他还请观众给该视频点赞,订阅该频道并观看其他视频。

注意事项

HAQM Bedrock 数据自动化现在可通过跨区域推理,在以下两个 AWS 区域使用:美国东部(弗吉尼亚州北部)和美国西部(俄勒冈州)。使用这些区域的 Bedrock 数据自动化时,可以在以下四个区域中使用跨区域推理来处理数据:美国东部(俄亥俄州、弗吉尼亚州北部)和美国西部(加利福尼亚北部、俄勒冈州)。所有这些区域都位于美国,因此数据都是在相同的地理区域内处理的。我们正在努力在 2025 年晚些时候增加对欧洲和亚洲更多地区的支持。

与预览版和使用跨区域推理相比,定价没有变化。有关更多信息,请访问 HAQM Bedrock 定价

Bedrock 数据自动化现在还包括许多与安全、治理和可管理性相关的功能,如 AWS Key Management Service(AWS KMS) 客户管理密钥支持,可实现细粒度加密控制;AWS PrivateLink 可直接连接到虚拟私有云(VPC)中的 Bedrock 数据自动化 API,而无需通过互联网连接;对 Bedrock 数据自动化资源和作业进行标记,以跟踪成本并在 AWS Identity and Access Management(IAM)中执行基于标记的访问策略。

我在这篇博客文章中使用了 Python,但任何 AWS SDK 都支持 Bedrock 数据自动化。例如,您可以将 Java、.NET 或 Rust 用于后端文档处理应用程序;将 JavaScript 用于处理图像、视频或音频文件的 Web 应用程序;将 Swift 用于处理最终用户提供的内容的本机移动应用程序。从多模态数据中获得见解从未如此简单。

以下是一些阅读建议,以了解更多信息(包括代码示例):

Danilo

我们的表现如何? 请参加这个 1 分钟的调查!


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