使用 LangChain 和零射击提示调用 Bedrock 模型

这个笔记本应该可以在 SageMaker Studio 中的 Data Science 3.0 内核上很好地运行

简介

在这个笔记本中,我们展示了如何使用 LLM 为一位客户生成电子邮件回复,该客户对客户支持工程师提供的客户服务质量提出了负面反馈。

我们将在这个例子中使用 Anthropic 提供的 Claude 模型,该模型由 Bedrock 提供。我们将使用与 LangChain 集成的 Bedrock 版本。LangChain 是一个用于开发由语言模型驱动的应用程序的框架。该框架的关键方面允许我们通过将各种组件链接在一起来增强大型语言模型,从而创建高级用例。

在这个笔记本中,我们将使用 LangChain 提供的 Bedrock API。在这个例子中使用的提示被称为零射击提示,因为我们除了提示本身没有提供任何其他上下文。

注意: 这个笔记本可以在 AWS 环境内或外运行

背景

在这个笔记本中,我们将利用 LangChain 框架,探讨如何使用 Boto3 客户端与 Amazon Bedrock API 进行通信。我们将探讨 LangChain 框架内 Amazon Bedrock 集成的使用,以及如何使用 PromptTemplate 来生成文本。

模式

我们将简单地为 LangChain 实现的 Amazon Bedrock API 提供一个包含任务、指令和模型输入的输入。目的是展示强大的 LLM 如何轻松理解任务并生成令人信服的输出,而无需提供任何额外的示例。

用例

为了演示 Amazon Bedrock 中模型的生成能力,让我们以电子邮件生成为例。

角色

你是 AnyCompany 的客户服务经理 Bob,一些客户对客户服务不满意,并对客户支持工程师提供的服务提出了负面反馈。现在,你想回复这些客户,诚恳地为糟糕的服务道歉,重建信任。你需要 LLM 的帮助,为你生成大量人性化和个性化的电子邮件,以回应客户之前的电子邮件。

实现

为了实现这个用例,在这个笔记本中,我们将展示如何根据客户之前的电子邮件生成一封带有感谢信的电子邮件。我们将使用 Amazon Bedrock LangChain 集成中的 Amazon Titan Text Large 模型。

设置

安装所需模块

%pip install anthropic==0.9.0 --quiet
# 重启内核
from IPython.core.display import HTML
HTML("<script>Jupyter.notebook.kernel.restart()</script>")
import json
import os
import sys

import boto3
import botocore

boto3_bedrock = boto3.client('bedrock-runtime')

使用 LangChain 集成调用 Bedrock 客户端

让我们从创建一个 Bedrock 类的实例开始,该类来自 llms。这需要 Amazon Bedrock 中可用模型的 model_id

我们可以选择性地传递一个之前创建的 boto3 client,以及一些 model_kwargs,其中可以包含参数,如 temperaturetopPmaxTokenCountstopSequences(可以在 Amazon Bedrock 控制台中探索更多参数)。

查看文档 了解 Amazon Bedrock 下可用的文本生成模型 ID。

请注意,不同的模型支持不同的 model_kwargs

from langchain.llms.bedrock import Bedrock

inference_modifier = {
    "max_tokens_to_sample": 4096,
    "temperature": 0.5,
    "top_k": 250,
    "top_p": 1,
    "stop_sequences": ["\n\nHuman"],
}

textgen_llm = Bedrock(
    model_id="anthropic.claude-v2",
    client=boto3_bedrock,
    model_kwargs=inference_modifier,
)

通过在 LangChain 中传递 client,我们应该能够确保该库使用我们之前检查过配置的同一个 boto3 客户端:

print(boto3_bedrock)
print(textgen_llm.client)

LangChain 已经抽象了 Amazon Bedrock API,使构建用例变得更加容易。我们可以传入提示,它会自动路由到适当的 API 来生成响应。我们只需获取文本输出,而不需要从响应主体中提取结果。

让我们准备一个提示,为客户服务经理生成一封电子邮件,发送给提供负面反馈的客户。

response = textgen_llm("""

H: Write an email from Bob, Customer Service Manager, 
to the customer "John Doe" that provided negative feedback on the service 
provided by our customer support engineer.

A:""")

print(response)

背景

在上一节中,我们探讨了如何使用 LangChain 框架与 Amazon Bedrock API 进行通信。在这个笔记本中,我们将尝试使用 PromptTemplates 增加一些复杂性,以利用 LangChain 框架实现类似的用例。PrompTemplates 允许我们创建通用的模板,稍后可以用信息填充,并根据不同的场景获得模型输出。

作为这个笔记本的一部分,我们将探讨 LangChain 框架内 Amazon Bedrock 集成的使用,以及如何使用 PromptTemplate 来生成文本。

模式

我们将简单地为 LangChain 实现的 Amazon Bedrock API 提供一个包含任务、指令和模型输入的输入。目的是展示强大的 LLM 如何轻松理解任务并生成令人信服的输出,而无需提供任何额外的示例。

用例

为了演示 Amazon Bedrock 中模型的生成能力,让我们以电子邮件生成为例。

角色

你是 AnyCompany 的客户服务经理 Bob,一些客户对客户服务不满意,并对客户支持工程师提供的服务提出了负面反馈。现在,你想回复这些客户,诚恳地为糟糕的服务道歉,重建信任。你需要 LLM 的帮助,为你生成大量人性化和个性化的电子邮件,以回应客户之前的电子邮件。

实现

为了实现这个用例,我们将向我们展示如何根据客户之前的电子邮件生成一封带有感谢信的电子邮件。我们将使用 Amazon Bedrock LangChain 集成中的 Amazon Titan Text Large 模型。

调用 Bedrock LLM 模型

我们将从创建一个 Bedrock 类的实例开始,该类来自 llms。这需要 Amazon Bedrock 中可用模型的 model_id

我们可以选择性地传递一个之前创建的 boto3 客户端,以及一些 model_kwargs,其中可以包含参数,如 temperaturetopPmaxTokenCountstopSequences(可以在 Amazon Bedrock 控制台中探索更多参数)。

查看文档 了解 Amazon Bedrock 下可用的文本生成模型 ID。

请注意,不同的模型支持不同的 model_kwargs

from langchain.llms.bedrock import Bedrock

inference_modifier = {'max_tokens_to_sample':4096, 
                      "temperature":0.5,
                      "top_k":250,
                      "top_p":1,
                      "stop_sequences": ["\n\nHuman"]
                     }

textgen_llm = Bedrock(model_id = "anthropic.claude-v2",
                    client = boto3_bedrock, 
                    model_kwargs = inference_modifier 
                    )

创建 LangChain 自定义提示模板

通过创建提示模板,我们可以在每次运行时向其传递不同的输入变量。当我们需要从数据库中获取不同的输入变量来生成内容时,这很有用。

之前我们硬编码了提示,可能是因为我们有多个客户发送类似的负面反馈,现在我们想使用每个客户的电子邮件并向他们道歉,但我们也希望保持响应的个性化。在下面的单元格中,我们正在探索如何创建一个 PromptTemplate 来实现这种模式。

from langchain.prompts import PromptTemplate

# 创建一个具有多个输入变量的提示模板
multi_var_prompt = PromptTemplate(
    input_variables=["customerServiceManager", "customerName", "feedbackFromCustomer"], 
    template="""

H: Create an apology email from the Service Manager {customerServiceManager} to {customerName} in response to the following feedback that was received from the customer: 
<customer_feedback>
{feedbackFromCustomer}
</customer_feedback>

A:"""
)

# 为输入变量传入值
prompt = multi_var_prompt.format(customerServiceManager="Bob", 
                                 customerName="John Doe", 
                                 feedbackFromCustomer="""Hello Bob,
     I am very disappointed with the recent experience I had when I called your customer support.
     I was expecting an immediate call back but it took three days for us to get a call back.
     The first suggestion to fix the problem was incorrect. Ultimately the problem was fixed after three days.
     We are very unhappy with the response provided and may consider taking our business elsewhere.
     """
     )

num_tokens = textgen_llm.get_num_tokens(prompt)
print(f"Our prompt has {num_tokens} tokens")

再次调用

使用提示模板调用,并期望获得一个精心编写的响应

response = textgen_llm(prompt)

email = response[response.index('\n')+1:]

print(email)

结论

我们现在已经尝试使用 LangChain 框架,该框架提供了 Amazon Bedrock API 的抽象层。使用这个框架,我们已经看到了生成电子邮件响应客户负面反馈的用例。

要点

  • 调整这个笔记本,以实验 Amazon Bedrock 提供的不同模型,如 Anthropic Claude 和 AI21 Labs Jurassic 模型。
  • 更改提示以适应我们的特定用例,并评估不同模型的输出。
  • 调整不同的参数,以了解服务的延迟和响应能力。
  • 应用不同的提示工程原则以获得更好的输出。
  • 在没有任何上下文的情况下调用 LLM 可能无法产生理想的结果。通过添加上下文,并进一步使用提示模板来限制 LLM 的输出,我们能够成功获得所需的输出。