生成式 AI 和大模型在 2024 年已经进入落地实践阶段。因此,围绕开发者在生成式应用程序开发中的主要痛点和需求,我们组织了这个 “Amazon Bedrock 实践” 的系列,希望可以帮助开发者高效地上手生成式 AI 和大模型的应用开发,本篇为第一篇。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!
Amazon Bedrock 是亚马逊云科技提供的一项服务,可以让开发者轻松使用称为基础模型(Foundation Model)的强大 AI 模型。以下是其关键功能概述:
-
访问高性能基础模型: Amazon Bedrock 提供对由领先 AI 公司和亚马逊自身开发的各种基础模型的访问权限。这些基础模型在大量数据上进行训练,可以执行各种任务,包括文本生成、图像识别和代码完成等
-
统一的 API: 开发者可以通过单个 API 与所有可用的基础模型进行交互,简化了在应用程序中使用基础模型的复杂过程,这消除了为每个基础模型学习不同 API 的必要性
-
轻松集成: Amazon Bedrock 是一项完全托管的服务,这意味着亚马逊云科技会负责管理底层基础设施,使开发者可以专注于构建应用程序,而无需担心服务器设置和维护
-
安全性和隐私性: Amazon Bedrock 提供了相关的功能来帮助开发者构建安全和私密的 AI 应用程序,开发者可以控制对基础模型和数据的访问,从而保护开发者的数据隐私
-
专注于生成式 AI: 虽然基础模型可以执行各种任务,但 Amazon Bedrock 特别关注生成式 AI 应用程序,这些应用程序使用 AI 创建新内容,例如文本、图像或代码等
总体而言,Amazon Bedrock 是一个功能强大的工具,适用于希望利用尖端 AI 模型的功能的开发人员,而无需管理底层基础设施的复杂性。
本文主要以 Claude 3 模型为例,探讨如何使用 Amazon Bedrock 构建不同业务场景的生成式 AI 应用程序。本文主要包括四部分内容:
-
在 Amazon Bedrock 中设置和获取模型访问权限
-
在 Amazon Bedrock 控制台中使用模型
-
调用 Amazon Bedrock API 来使用模型
-
Amazon Bedrock 参考资料
本篇探讨的 Anthropic Claude 3 模型,目前仅在亚马逊云科技的海外账户可用。
在 Amazon Bedrock 中设置和获取模型访问权限
首先我们需要在 Amazon Bedrock 中,获取特定模型的访问权限。以下将以 Claude 3 模型为例,逐步指导开发者们配置和获取模型的访问权限。
第一步:进入到 Amazon Bedrock 的 UI 控制台。 点击 Get started:
在这里我们可以看到 Amazon Bedrock 支持多个基础模型(foundation model),其中包括 Amazon Titan,Claude,Jurassic,Command,Mistral,Stable Diffusion 以及 Llama2。如下图所示:
确认右上角区域,若已是 Oregon,这一步跳过。若不是,请在右上角选择 Oregon,选择 us-west-2:
左侧的导航栏中点击 Model access,如下图所示:
若已有相应模型权限,即模型后面是 Access granted,可跳过这一步。否则,点击 Manage model access:
点击“Submit use case details” 来申请访问相关模型。如果你有详细的使用场景案例,你可以简述你的使用场景。对于一般测试,你可参考下图填写相关内容。在这个弹出的窗口里填写完成后,点击“Submit”提交:
成功提交之后,选择左上角的 CheckBox 选中所有 model,之后点击“Request model access”:
如果你已经完成提交并已经获得模型的访问权,你会看到如下图所示:
接下来,我们先探索在控制台使用 Playgrounds 的方式,测试 Claude 3 模型。
首先,在左侧的导航栏中点击 “Playgrounds – Chat” 进入聊天界面:
点击 Select model 来选择我们要使用的基础模型
我们选择 Anthropic 的 Claude 3 模型(Sonnet v1 或者 Haiku v 1)来体验其强大的推理能力和中文处理能力,点击“Apply”:
可以调整右侧的参数,然后就可以在聊天窗口中输入提示词和上传图片,回车或点击 “Run” 按钮获取模型输出。如下图所示:
至此,我们已经完全了解了如何在 Amazon Bedrock 中,获取 Claude 3 模型的访问权限。
在下一节里,我们将通过几种实际场景,详细诠释如何在控制台使用 Claude 3 模型。
在Amazon Bedrock 控制台中使用模型
本节将以 Claude 3 模型为例,阐述如何在Amazon Bedrock 控制台中使用模型。
翻译场景
首先我们测试下 Claude 3 模型的翻译场景。
测试的内容节选自了 3 月初 NVIDIA CEO (Jensen Huang) 在 Stanford University 的访谈视频。如果你是 AI 和机器学习行业的开发者、工程师、数据科学家等,该视频非常值得观看。在这个一小时左右的视频中,Jensen 在分享他眼中 AI 的未来之外,也分享了他对创业、人生选择、以及人类未来命运等经验和精彩观点,这些经验和观点建议,对从事该领域的年轻人非常有借鉴意义。
视频在 B 站上的链接如下:https://www.bilibili.com/video/BV15S421w7pd/?trk=cndc-detail (有中文字幕)
回到我们这个用 Claude 3 测试翻译场景的例子。
我们先在 Amazon Bedrock Playground 中,输入以下提示词(prompt)。其中“<org></org>
”定义的英文脚本,节选自以上访谈视频的内容:
你是一个帮助翻译剧本的助理。 你的任务是将中的英文源文本翻译成中文。翻译时,请遵守以下规则:
1/ 不要改变初衷
2/ 翻译前先了解上下文,保持语义连贯,阅读流畅,但不要故意夸大
3/ 原文大多是对话式的,因此翻译仍应符合 TikTok/ 短视频/视频博客 /Youtube 视频的上下文。注意避免使用通常不用于日常聊天的词语
4/适当的时候保留一些专有名词或专业术语未翻译,注意前后一致
5/ 在
<result><result>
中回复翻译。不要包含任何额外的内容
<org>
“Stanford Business Graduate School of Business student Jose: My name's Jose, I'm a class with the 2023 from the GSB. My question is, are you worried at all about the pace at which we're developing AI? And do you believe that any sort of regulation might be needed? Thank you.Jensen Huang: Yeah, the answer is yes and no. The greatest breakthrough in modern AI, of course deep learning, and it enabled great progress. But another incredible breakthrough is something that humans know and we practice all the time. And we just invented it for language models called grounding, reinforcement learning human feedback. I provide reinforcement learning human feedback every day. That's my job. And for the parents in the room, you're providing reinforcement learning human feedback all the time, okay? Now, we just figured out how to do that at a systematic level for artificial intelligence.”
</org>
点击“Run”,查看模型输出的翻译结果。如下图所示:
由翻译结果可见,Claude 3 还是翻译地比较自然的。
事实问答场景
接下来我们探索事实问答场景。在 Playground 中输入以下提示词(prompt)。
先用英文向 Claude 3 模型发问:
Could you please list the major events that happened in Istanbul between 1800 and 1900?
再用中文向 Claude 3 模型发问:
请罗列在 1800-1900 年伊斯坦布尔发生的大事。
可见,无论是中文还是英文发问,Claude 3 都抓住了历史上的主要事件,没有明显的事实错误和编造。
各位开发者可以自行修改提示词中的内容,进行更多事实问答的测试。
小说续写场景
然后是小说续写场景,看看如何用 Claude 3 大模型来写一篇精彩的小说。
在 Playground 中输入以下提示词(prompt):
小说续写 “剑·花·烟雨江南" 要有画面感和沧桑感,字数在 300 字以内
我们修改下 prompt,增加 story 风格的要求,修改提示词(prompt)如下:
模仿小说家古龙的风格, 小说续写 “剑·花·烟雨江南" 要有画面感和沧桑感,字数在 300 字以内
我们修改下 prompt,再修改下对故事风格的要求,修改的提示词(prompt)如下:
模仿莎士比亚的风格, 小说续写 “剑·花·烟雨江南" 要有画面感和沧桑感,字数在 300 字以内
你也可以在 Chat playground 里,比较两个不同的 Claude 3 模型(Haiku 和 Sonnet)的反应速度和输出,打开如下这个开关即可:
你会发现 Claude 3 Haiku 反应非常之快,对比于 Claude 3 Sonnet 模型,使用同样的提示词(prompt):
模仿小说家古龙的风格, 小说续写 “剑·花·烟雨江南" 要有画面感和沧桑感,字数在 300 字以内
在你点击完“Run”按钮之后,几乎 1 秒内就得到了返回结果。如下图所示:
图像理解场景
接下来是图像理解场景。
下图我在广州高铁站的星巴克里消费的一张小票,我准备发给 Claude 3 模型去理解,看看它怎么分析这张小票。
如果我们继续输入对 Claude 3 模型的要求,比如:
请用简体中文描述你理解的图片中的内容
好的, 我用简体中文描述图片中的内容:
这是一张星巴克咖啡店的收银小票,位于广州市南站 3F-A5 店铺。小票上显示了店铺地址、顾客姓名(张 Ashley)、订购的商品和价格、总金额以及交易时间。图片中没有出现任何人物照片,因此不需要避免识别人物身份。
小结
我们发现 Claude 3 理解基本正确,除了把这张收据上的“Ashley ZHANG”理解成了顾客(其实是星巴克当时的下单售货员)。其实这也不是 Claude 3 的错,因为在这张原始的收据上,从字面并没有说清楚“Ashley ZHANG”到底是顾客,还是星巴克的销售员呢!
还有很多有趣并实用的场景,我们将在下一集提高篇里,继续和大家分享。
调用 Amazon Bedrock API 使用模型
在前面的章节里,我们探讨了在 Amazon Bedrock 控制台访问模型。在本节中,我们将探讨如何编写一些简单代码,调用 Amazon Bedrock API 来使用模型。
运行环境配置
本例中使用了 Amazon SageMaker Notebook instances 环境,来调用 Amazon Bedrock API 访问各种大模型。如下图所示:
提醒:运行这个 notebook instance 的 role,需要具有访问 Amazon Bedrock 的权限。
本例中作者配置了 sagemaker-demo-role-haowen 这个自定义的 role 来运行 notebook instance。这个自定义的 role 中,包含了可以完全访问 Bedrock 的策略AmazonBedrockFullAcess,这个策略赋予了访问 Bedrock 服务的 full access 权限。如下图所示:
如果你想在本地电脑运行以上代码,需要在你的本地电脑先配置 Credentials,具体可参考: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html?trk=cndc-detail
代码功能分析
我们仍然以 Claude 3 模型为例,以下 Python 代码示例展示了如何使用 Amazon Bedrock,分别调用 Claude 3 的 Sonnet 模型和 Haiku 模型,描述一个输入的图像,并打印出其耗时等信息。另外,代码还比较了非流式、流式两种不同的调用方式。
代码涉及的主要功能如下:
编码图像:将给定图像转换为用于传输的 base64 编码字符串
调用大型语言模型生成文本:调用了两个模型(Sonnet 和 Haiku)来生成文本
处理模型响应:以两种模式(流式和非流式)分别来捕获模型输出
测量性能指标:记录输入和输出文本片段(token)计数、首字节延迟和整体调用延迟
完整代码如下所示:
!pip install -qU boto3
import json
import os
import sys
import boto3
import base64
import requests
import time
import pprint
from datetime import datetime
#获得模型的modelARN
region = 'us-east-1'#'us-west-2' #
boto3_bedrock = boto3.client('bedrock',region)
boto3_bedrock.list_foundation_models()
#获得实验图像,你也可以在这里替换为任何你自己想描述的图像
!wget https://cats.com/wp-content/uploads/2020/10/tabby-maine-coon-768x384.jpg
stream = False
# Function to encode the image 编码图像的函数
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
# non streaming mode 非流式调用方式
def anthropic_claude_3(modelId,image_path,max_tokens):
bedrock_runtime = boto3.client('bedrock-runtime')
base64_image = encode_image(image_path)
payload = {
"modelId": modelId,
"contentType": "application/json",
"accept": "application/json",
"body": {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": max_tokens,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": base64_image
}
},
{
"type": "text",
#"text": "Write me a detailed description of these two photos, and then a poem talking about it."
"text": f"What’s in this image? output {max_tokens} tokens"
}
]
}
]
}
}
# Convert the payload to bytes 转换负荷到字节
body_bytes = json.dumps(payload['body']).encode('utf-8')
# Invoke the model 调用模型
response = bedrock_runtime.invoke_model(
body=body_bytes,
contentType=payload['contentType'],
accept=payload['accept'],
modelId=payload['modelId']
)
# Process the response 处理响应
response_body = json.loads(response['body'].read().decode('utf-8'))
pprint.pprint(response_body)
#return round(end-start,2),response_body["usage"]["input_tokens"],response_body["usage"]["output_tokens"]
return round(float(response['ResponseMetadata']['HTTPHeaders']['x-amzn-bedrock-invocation-latency'])/1000,2),int(response['ResponseMetadata']['HTTPHeaders']['x-amzn-bedrock-input-token-count']),int(response['ResponseMetadata']['HTTPHeaders']['x-amzn-bedrock-output-token-count'])
# streaming mode 流式调用方式
def anthropic_claude_3_stream(modelId,image_path,max_tokens):
bedrock_runtime = boto3.client('bedrock-runtime')
base64_image = encode_image(image_path)
payload = {
"modelId": modelId,
"contentType": "application/json",
"accept": "application/json",
"body": {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": max_tokens,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": base64_image
}
},
{
"type": "text",
#"text": "Write me a detailed description of these two photos, and then a poem talking about it."
"text": f"What’s in this image? output {max_tokens} tokens"
}
]
}
]
}
}
# Convert the payload to bytes
body_bytes = json.dumps(payload['body']).encode('utf-8')
# Invoke the model
response = bedrock_runtime.invoke_model_with_response_stream(
body=body_bytes, modelId=payload['modelId'], accept=payload['accept'], contentType=payload['contentType']
)
stream = response.get('body')
chunk_obj = {}
if stream:
for event in stream:
chunk = event.get('chunk')
if chunk:
chunk_obj = json.loads(chunk.get('bytes').decode())
pprint.pprint(chunk_obj)
# Process the response
#response_body = json.loads(response['body'].read().decode('utf-8'))
#pprint.pprint(response_body)
{'type': 'message_stop', 'amazon-bedrock-invocationMetrics': {'inputTokenCount': 92, 'outputTokenCount': 277, 'invocationLatency': 3679, 'firstByteLatency': 677}}
return round(float(chunk_obj['amazon-bedrock-invocationMetrics']['firstByteLatency'])/1000,2),round(float(chunk_obj['amazon-bedrock-invocationMetrics']['invocationLatency'])/1000,2),chunk_obj['amazon-bedrock-invocationMetrics']['inputTokenCount'],chunk_obj['amazon-bedrock-invocationMetrics']['outputTokenCount']
# 调用结果
image_path = "tabby-maine-coon-768x384.jpg"
max_tokens = 200
#haiku
print("Haiku:")
modelId = "anthropic.claude-3-haiku-20240307-v1:0"
print(anthropic_claude_3(modelId,image_path,max_tokens))
print(anthropic_claude_3_stream(modelId,image_path,max_tokens))
#sonnet
print("Sonnet:")
modelId = "anthropic.claude-3-sonnet-20240229-v1:0"
print(anthropic_claude_3(modelId,image_path,max_tokens))
print(anthropic_claude_3_stream(modelId,image_path,max_tokens))
模型输出分析
以下摘要分析了两个不同的模型(Haiku 和Sonnet)的有趣输出结果。
对于 Haiku 模型:
{'content': [{'text': 'This image depicts a beautiful Maine Coon cat sitting '
'on a scratching post or cat tree. The cat has a thick, '
'fluffy coat with a distinctive tabby pattern of stripes '
'and markings. Its eyes are alert and focused, adding a '
"regal and intelligent expression to the feline's "
'appearance. The background appears to be a cozy indoor '
'setting, with the cat perched comfortably on the '
'scratching post. Maine Coon cats are known for their '
'large size, friendly personalities, and impressive '
'physical features, and this image captures the essence '
'of this majestic breed perfectly.',
'type': 'text'}],
……
{'amazon-bedrock-invocationMetrics': {'firstByteLatency': 291,
'inputTokenCount': 489,
'invocationLatency': 3431,
'outputTokenCount': 128},
……
对于 Sonnet 模型:
{'content': [{'text': 'This image shows a beautiful Maine Coon cat resting on '
'a cat tree or scratching post. The Maine Coon is a '
'large semi-longhaired breed known for its fluffy fur, '
'tufted ears, and bushy tail.\n'
'\n'
'The cat in the picture has a brown tabby coat with '
'distinctive striped markings. Its face has a '
'distinctive "M" marking above the eyes, typical of '
"tabby cats. The cat's large, expressive eyes are a "
'striking yellow-green color, giving it an intense yet '
'gentle gaze.\n'
'\n'
'The feline is lounging comfortably on a beige carpeted '
'platform, with one paw tucked under its body and the '
'other extending forward. The cat tree or post appears '
'to be made of sisal rope wrapped around a wooden frame, '
'providing an ideal surface for the cat to scratch and '
'stretch.\n'
'\n'
'The background is slightly blurred, but it seems to be '
'an indoor setting, perhaps a living room',
'type': 'text'}],
……
{'amazon-bedrock-invocationMetrics': {'firstByteLatency': 1752,
'inputTokenCount': 443,
'invocationLatency': 9279,
'outputTokenCount': 139},
'type': 'message_stop'}
从 invocationLatency 指标以及firstByteLatency 指标,可以清晰的看到 Haiku 模型比 Sonnet 模型响应速度快得多,这一点和 Claude 3 模型系列的亚马逊官方网站介绍是一致的,即:
“该系列包括三种型号:Claude 3 Haiku,最快、最紧凑的型号,可实现近乎即时的响应;Claude 3 Sonnet,技能和速度的理想平衡模型;Claude 3 Opus,最智能的产品,可在高度复杂的任务上实现顶级性能。”
下一篇,我们将继续分析在 Amazon Bedrock 上使用 Claude 3 模型的更复杂场景和实现,敬请期待。
参考资料
标签:Claude,image,Amazon,bedrock,模型,Bedrock From: https://www.cnblogs.com/AmazonwebService/p/18090368