本笔记本应该可以很好地与 SageMaker Studio 中的
Python 3
内核和SageMaker Distribution 2.1
一起使用
在本笔记本中,我们将向我们展示如何使用 LLM 为客户生成电子邮件响应,该客户对客户支持工程师提供的客户服务质量提出了负面反馈。
我们将使用 Bedrock 的 Amazon Titan Text 大型模型和 Boto3 API。
在这个例子中使用的提示被称为零射击提示,因为我们除了提示之外,没有提供任何文本示例及其分类。
注意: 本笔记本可以在 AWS 环境内外运行。
为了演示 Amazon Bedrock 的文本生成功能,我们将探索使用 Boto3 客户端与 Amazon Bedrock API 进行通信。我们将演示可用的不同配置,以及简单的输入如何导致所需的输出。
我们将简单地向 Amazon Bedrock API 提供一个由任务、指令和输入组成的输入,而不提供任何额外的示例。目的是演示强大的 LLM 如何轻松理解任务并生成引人入胜的输出。
为了演示 Amazon Bedrock 中模型的生成能力,让我们以电子邮件生成为用例。
我们是 AnyCompany 的客户服务经理 Bob,一些客户对客户服务不满意,并就客户支持工程师提供的服务提供了负面反馈。现在,我们希望以谦逊的方式向这些客户道歉,并重建信任。我们需要 LLM 的帮助为我们生成大量人性化和个性化的电子邮件,以回应客户之前的电子邮件情绪。
为了满足这一用例,在本笔记本中,我们将展示如何使用 Amazon Bedrock API 和 Boto3 客户端生成一封感谢信,基于客户之前的电子邮件。我们将使用 Amazon Titan Text Large 模型。
⚠️ ⚠️ ⚠️ 在运行此笔记本之前,请确保我们已经运行了 Bedrock 基础笔记本 。⚠️ ⚠️ ⚠️
import json
import os
import sys
import boto3
import botocore
boto3_bedrock = boto3.client("bedrock-runtime")
# - 使用此选项配合 profile
根据上述用例,让我们为 Amazon Bedrock 服务准备一个输入,以生成一封电子邮件。请注意,此提示需要使用 Human:/Assistant: 格式进行修改,以用于 Claude。
# 创建提示
prompt_data = """
命令: 编写一封来自客户服务经理 Bob 的电子邮件,发送给客户"John Doe",他对我们客户支持工程师提供的服务提出了负面反馈
"""
让我们从使用 Amazon Titan Large 模型开始。Amazon Titan 系列模型支持高达 32k 个令牌的大上下文窗口,并接受以下参数:
inputText
: 提供给 LLM 的提示textGenerationConfig
: 模型在生成输出时将考虑的参数。body = json.dumps(
{
"inputText": prompt_data,
"textGenerationConfig": {"maxTokenCount": 1024, "topP": 0.95, "temperature": 0.1},
}
)
Amazon Bedrock API 提供了一个 invoke_model
API,它接受以下内容:
modelId
: 这是各种基础模型的模型 ARN,可在 Amazon Bedrock 下使用accept
: 输入请求的类型contentType
: 输出的内容类型body
: 包含提示和配置的 json 字符串检查文档 以了解可用的文本生成模型 ID
首先,我们探索模型如何根据前面创建的提示生成输出。
# modelId = 'amazon.titan-text-premier-v1:0' # 在我们进行此工作坊之前,请确保 Titan text premier 在我们的帐户中可用,然后取消注释!
modelId = "amazon.titan-text-express-v1" # "amazon.titan-tg1-large"
accept = "application/json"
contentType = "application/json"
outputText = "\n"
try:
response = boto3_bedrock.invoke_model(
body=body, modelId=modelId, accept=accept, contentType=contentType
)
response_body = json.loads(response.get("body").read())
outputText = response_body.get("results")[0].get("outputText")
except botocore.exceptions.ClientError as error:
if error.response["Error"]["Code"] == "AccessDeniedException":
print(
f"\x1b[41m{error.response['Error']['Message']}\
\n请参考以下资源来解决此问题。\
\nhttps://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_access-denied.html\
\nhttps://docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html\x1b[0m\n"
)
else:
raise error
# 响应的相关部分从第一个换行符之后开始
# 下面我们从第一次出现 '\n' 之后开始打印响应。
email = outputText[outputText.index("\n") + 1 :]
print(email)
上面是 Amazon Titan Large 模型生成的一封示例电子邮件,它通过理解输入请求并利用其对不同模式的内在理解来生成输出。此对 API 的请求是同步的,并等待模型生成整个输出。
Bedrock 还支持以块的形式流式传输模型生成的输出。下面是一个使用流式选项调用模型的示例。invoke_model_with_response_stream
返回一个 ResponseStream
,我们可以从中读取。
我们可能希望在下面的输出单元上启用滚动:
output = []
try:
response = boto3_bedrock.invoke_model_with_response_stream(
body=body, modelId=modelId, accept=accept, contentType=contentType
)
stream = response.get("body")
i = 1
if stream:
for event in stream:
chunk = event.get("chunk")
if chunk:
chunk_obj = json.loads(chunk.get("bytes").decode())
text = chunk_obj["outputText"]
output.append(text)
print(f"\t\t\x1b[31m**Chunk {i}**\x1b[0m\n{text}\n")
i += 1
except botocore.exceptions.ClientError as error:
if error.response["Error"]["Code"] == "AccessDeniedException":
print(
f"\x1b[41m{error.response['Error']['Message']}\
\n请参考以下资源来解决此问题。\
\nhttps://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_access-denied.html\
\nhttps://docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html\x1b[0m\n"
)
else:
raise error
上述方法可以快速获取模型的输出,并在我们读取时让服务完成。这有助于在需要模型生成较长文本的用例中使用。我们稍后可以将生成的所有块组合起来形成完整的输出,并将其用于我们的用例。
我们现在已经使用 boto3
SDK 进行了实验,该 SDK 提供了对 Amazon Bedrock API 的原始访问。使用此 API,我们已经看到了生成电子邮件以响应客户负面反馈的用例。