使用零射击提示调用 Bedrock 模型进行文本生成

本笔记本应该可以很好地与 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

调用 Amazon Titan Text 语言模型

首先,我们探索模型如何根据前面创建的提示生成输出。

完整输出生成
# 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,我们已经看到了生成电子邮件以响应客户负面反馈的用例。

要点

  • 调整此笔记本以使用 Amazon Bedrock 提供的其他模型,如 Anthropic Claude 和 AI21 Labs Jurassic 模型。
  • 更改提示以适应我们的特定用例,并评估不同模型的输出。
  • 调整令牌长度以了解服务的延迟和响应能力。
  • 应用不同的提示工程原则以获得更好的输出。

谢谢