使用亚马逊 SageMaker JumpStart 使用 Falcon 创建 HCLS 文档摘要应用程序

医疗保健和生命科学 (HCLS) 客户正在采用生成式 AI 作为从数据中获取更多收益的工具。用例包括文档摘要,以帮助读者专注于文档的关键点,以及将非结构化文本转换为标准化格式以突出重要属性。凭借独特的数据格式和严格的监管要求,客户正在寻找选择性能最高、最具成本效益的模型,以及进行必要的自定义(微调)以适应其业务用例的能力。在这篇文章中,我们将引导你使用 亚马逊 S ageMaker JumpStart 部署猎鹰大型语言模型 (LLM),并使用该模型使用 LangChain 和 Python 汇总长文档。

解决方案概述

Amazon S ageMaker 建立在亚马逊二十年开发现实机器学习应用的经验之上,包括产品推荐、个性化、智能购物、机器人和语音辅助设备。SageMaker 是一项符合 HIPAA 标准的托管服务,它提供的工具使数据科学家、机器学习工程师和业务分析师能够利用 ML 进行创新。SageMaker 内部是 亚马逊 S ageMaker Studio,这是一个专为协作机器学习工作流程构建的集成开发环境 (IDE),反过来,它在一个名为 SageMaker JumpStart 的集成中心中包含各种快速入门解决方案和预训练的机器学习模型。借助 SageMaker JumpStart,您可以使用预先训练的模型,例如 Falcon LLM,以及预先构建的示例笔记本和 SDK 支持,来试验和部署这些强大的变压器模型。您可以使用 SageMaker Studio 和 SageMaker JumpStart 在您的 亚马逊云科技 账户中部署和查询自己的生成模型。

您还可以确保推理负载数据不会离开您的 VPC。您可以将模型配置为单租户端点,并通过网络隔离进行部署。此外,您可以使用 SageMaker JumpStart 中的私有模型中心功能并将批准的模型存储在其中来管理和管理满足您自己的安全要求的选定模型集。 SageMaker 适用于 HIPAA BAA 、 SOC123 和 H ITRUST CSF。

Falcon LLM 是一个大型语言模型,由技术创新研究所 (TII) 的研究人员使用 亚马逊云科技 对超过 1 万亿个代币进行培训。Falcon有许多不同的变体,其两个主要组成部分是Falcon 40B和Falcon 7B,分别包含400亿和70亿个参数,并针对特定任务(例如遵循指令)进行了微调版本。Falcon 在各种任务上表现良好,包括文本摘要、情感分析、问答和对话。这篇文章提供了一个演练,您可以按照该演练将 Falcon LLM 部署到您的 亚马逊云科技 账户,通过 SageMaker JumpStart 使用托管笔记本实例来尝试文本摘要。

SageMaker JumpStart 模型中心包括完整的笔记本电脑,用于部署和查询每个模型。截至撰写本文时,SageMaker JumpStart 模型中心有六个版本的猎鹰可用:猎鹰 40B Instruct BF16、Falcon 40B BF16、Falcon 180B BF16、Falcon 180B Chat BF16、Falcon 7B Instruct BF16 和 Falcon 7B BF16。这篇文章使用了 Falcon 7B Instruct 模型。

在以下部分中,我们将介绍如何通过在 SageMaker Jumpstart 上部署 Falcon 7B 来开始进行文档摘要。

先决条件

在本教程中,您需要一个具有 SageMaker 域的 亚马逊云科技 账户。如果你还没有 SageMaker 域名,请参阅 Onboard to Amazon Sag eMaker 域名来 创建一个。

使用 SageMaker JumpStart 部署 Falcon 7B

要部署您的模型,请完成以下步骤:

  1. 从 SageMaker 控制台导航到您的 SageMaker Studio 环境。
  2. 在 IDE 中,在导航窗格的 SageMaker JumpStart 下,选择 型号、笔记本电脑、解决方案
  3. 将 Falcon 7B Instruct 模型部署到端点进行推断。

Choosing Falcon-7B-Instruct from SageMaker JumpStart

这将打开 Falcon 7B Instruct BF16 模型的模型卡。在此页面上,您可以找到 “ 部署” 或 “ 训练” 选项以及在 SageMaker Studio 中打开示例笔记本的链接。这篇文章将使用来自 SageMaker JumpStart 的示例笔记本来部署该模型。

  1. 选择 “ 打开笔记本” 。

SageMaker JumpStart Model Deployment Page

  1. 运行笔记本电脑的前四个单元来部署 Falcon 7B Instruct 端点。

你可以在已启动的 JumpStart 资产 页面上看到已部署的 JumpStart 模型。

  1. 在导航窗格中的 SageMaker Jumpstart 下 ,选择启动的 JumpStart 资源。
  2. 选择 模型端点 选项卡以查看终端节点的状态。

SageMaker JumpStart Launched Model Page

部署 Falcon LLM 端点后,您就可以查询模型了。

运行你的第一个查询

要运行查询,请完成以下步骤:

  1. 在 “ 文件” 菜单上,选择 “ 新建 笔记本” 以打开新的笔记本。

你也可以在 此处 下载完整的笔记本 。

Create SageMaker Studio notebook

  1. 出现提示时,选择映像、内核和实例类型。在这篇文章中,我们选择了数据科学 3.0 图片、Python 3 内核和 ml.t3.medium 实例。

Setting SageMaker Studio Notebook Kernel

  1. 通过在第一个单元格中输入以下两行来导入 Boto3 和 JSON 模块:
import json
import boto3
  1. 住 Shift + Enter 键 运行单元格。
  2. 接下来,你可以定义一个调用你的端点的函数。此函数接受字典负载并使用它来调用 SageMaker 运行时客户端。然后它反序列化响应并打印输入和生成的文本。
newline, bold, unbold = '\n', '\033[1m', '\033[0m'
endpoint_name = 'ENDPOINT_NAME'

def query_endpoint(payload):
    client = boto3.client('runtime.sagemaker')
    response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/json', Body=json.dumps(payload).encode('utf-8'))
    model_predictions = json.loads(response['Body'].read())
    generated_text = model_predictions[0]['generated_text']
    print (
        f"Input Text: {payload['inputs']}{newline}"
        f"Generated Text: {bold}{generated_text}{unbold}{newline}")

有效负载包括作为输入的提示以及将传递给模型的推理参数。

  1. 您可以在提示符下使用这些参数来调整用例的模型输出:
payload = {
    "inputs": "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe.\nDaniel: Hello, Girafatron!\nGirafatron:",
    "parameters":{
        "max_new_tokens": 50,
        "return_full_text": False,
        "do_sample": True,
        "top_k":10
        }
}

使用摘要提示进行查询

这篇文章使用样本研究论文来演示摘要。示例文本文件涉及生物医学文献中的自动文本摘要。完成以下步骤:

  1. 下载 PDF 并将文本复制到名为 document.txt 的文件中 。
  2. 在 SageMaker Studio 中,选择上传图标并将文件上传到您的 SageMaker Studio 实例。

Uploading File to SageMaker Studio

Falcon LLM 开箱即用,为文本摘要提供支持。

  1. 让我们创建一个使用即时工程技术来总结 document.txt 的函数 :
def summarize(text_to_summarize):
    summarization_prompt = """Process the following text and then perform the instructions that follow:

{text_to_summarize}

Provide a short summary of the preceeding text.

Summary:"""
    payload = {
        "inputs": summarization_prompt,
        "parameters":{
            "max_new_tokens": 150,
            "return_full_text": False,
            "do_sample": True,
            "top_k":10
            }
    }
    response = query_endpoint(payload)
    print(response)
    
with open("document.txt") as f:
    text_to_summarize = f.read()

summarize(text_to_summarize)

你会注意到,对于较长的文档,会出现错误——Falcon和所有其他 LLM 一样,对作为输入传递的代币数量有限制。我们可以使用 LangChain 增强的摘要功能来绕过这个限制,它允许将更大的输入传递给 LLM。

导入并运行汇总链

LangChain 是一个开源软件库,允许开发人员和数据科学家在不管理复杂的机器学习交互的情况下快速构建、调整和部署自定义生成应用程序,通常用于在短短几行代码中抽象出生成式 AI 语言模型的许多常见用例。LangChain 对 亚马逊云科技 服务的支持包括对 SageMaker 终端节点的支持。

LangChain 为 LLM 提供了一个可访问的接口。它的功能包括用于即时模板和提示链接的工具。这些链可用于在单次调用中汇总比语言模型支持的长度更长的文本文档。您可以使用 map-reduce 策略对长文档进行汇总,方法是将长文档分解成可管理的块,对它们进行汇总,然后将其合并(如果需要,还可以再次进行汇总)。

  1. 让我们开始安装 LangChain:
%pip install langchain
  1. 导入相关模块并将长文档分解成块:
import langchain
from langchain import SagemakerEndpoint, PromptTemplate
from langchain.llms.sagemaker_endpoint import LLMContentHandler
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.docstore.document import Document

text_splitter = RecursiveCharacterTextSplitter(
                    chunk_size = 500,
                    chunk_overlap  = 20,
                    separators = [" "],
                    length_function = len
                )
input_documents = text_splitter.create_documents([text_to_summarize])
  1. 为了让 LangChain 有效地与 Falcon 一起工作,你需要为有效的输入和输出定义默认的内容处理器类:
class ContentHandlerTextSummarization(LLMContentHandler):
    content_type = "application/json"
    accepts = "application/json"

    def transform_input(self, prompt: str, model_kwargs={}) -> bytes:
        input_str = json.dumps({"inputs": prompt, **model_kwargs})
        return input_str.encode("utf-8")

    def transform_output(self, output: bytes) -> json:
        response_json = json.loads(output.read().decode("utf-8"))
        generated_text = response_json[0]['generated_text']
        return generated_text.split("summary:")[-1]
    
content_handler = ContentHandlerTextSummarization()
  1. 您可以将自定义提示定义为 promptTemplat e 对象,即使用 LangChain 进行提示的主要工具,用于地图缩减汇总方法。这是一个可选步骤,因为如果加载汇总链(lo ad_summarimize_ chain)中的参数未定义,则默认情况下会提供映射和组合提示。
map_prompt = """Write a concise summary of this text in a few complete sentences:

{text}

Concise summary:"""

map_prompt_template = PromptTemplate(
                        template=map_prompt, 
                        input_variables=["text"]
                      )


combine_prompt = """Combine all these following summaries and generate a final summary of them in a few complete sentences:

{text}

Final summary:"""

combine_prompt_template = PromptTemplate(
                            template=combine_prompt, 
                            input_variables=["text"]
                          )      
  1. LangChain 支持在 SageMaker 推理端点上托管的 LLM,因此,您可以通过 LangChain 初始化连接以提高可访问性,而不是使用 亚马逊云科技 Python 开发工具包:
summary_model = SagemakerEndpoint(
                    endpoint_name = endpoint_name,
                    region_name= "us-east-1",
                    model_kwargs= {},
                    content_handler=content_handler
                )
  1. 最后,您可以使用以下代码加载汇总链并对输入文档运行摘要:
summary_chain = load_summarize_chain(llm=summary_model,
                                     chain_type="map_reduce", 
                                     map_prompt=map_prompt_template,
                                     combine_prompt=combine_prompt_template,
                                     verbose=True
                                    ) 
summary = summary_chain({"input_documents": input_documents, 'token_max': 700}, return_only_outputs=True)
print(summary["output_text"])   

由于 详细 参数设置为 Tru e ,因此您将看到 map-reduce 方法的所有中间输出。这对于跟踪事件顺序以得出最终摘要很有用。使用这种 map-reduce 方法,您可以有效地总结文档,比模型的最大输入令牌限制通常允许的时间长得多。

清理

使用完推理端点后,请务必将其删除,以免通过以下几行代码产生不必要的成本:

client = boto3.client('runtime.sagemaker')
client.delete_endpoint(EndpointName=endpoint_name)

在 SageMaker JumpStart 中使用其他基础模型

利用 SageMaker JumpStart 中提供的其他基础模型进行文档摘要所需的设置和部署开销最小。LLM 偶尔会随输入和输出格式的结构而变化,随着向 SageMaker JumpStart 添加新模型和预制解决方案,根据任务实现的不同,您可能需要更改以下代码:

  • 如果您通过 summarize () 方法(该方法不使用 LangChain)进行 汇总,则可能需要更改 有效负载 参数的 JSON 结构,以及 query_ endpoint () 函数中对响应变量的处理
  • 如果你通过 LangChain 的 l oad_summarize_chain () 方法进行汇总,则可能需要修改 Cont entHandlerTextS ummarization 类,特别是 transform_input () 和 transfor m_output () 函数,才能正确处理 LLM 期望的负载 和 LLM 返回的输出

基础模型不仅在推理速度和质量等因素上有所不同,而且在输入和输出格式方面也有所不同。有关预期的输入和输出,请参阅 LLM 的相关信息页面。

结论

Falcon 7B Instruct 模型在 SageMaker JumpStart 模型中心上线,适用于多种用例。这篇文章演示了如何使用 SageMaker JumpStart 将自己的 Falcon LLM 端点部署到您的环境中,并在 SageMaker Studio 中进行首次实验,从而使您能够快速对模型进行原型设计并无缝过渡到生产环境。借助Falcon和LangChain,您可以大规模有效地总结医疗保健和生命科学的长篇文档。

有关在 亚马逊云科技 上使用生成式 AI 的更多信息,请参阅 宣布在 亚马逊云科技 上使用生成式 AI 进行构建的新工具 。您可以使用本文中概述的方法,开始为您的医疗保健和生命科学导向的 GenAI 应用程序进行实验和构建文档摘要概念证明。当 Amazon Bedrock 正式上市后,我们将发布一篇后续文章,介绍如何使用亚马逊 Bedrock 和 LangChain 实现文档摘要。


作者简介

John Kitaok a 是亚马逊网络服务的解决方案架构师。John 帮助客户在 亚马逊云科技 上设计和优化 AI/ML 工作负载,以帮助他们实现业务目标。

Josh Famestad 是亚马逊网络服务的解决方案架构师。Josh 与公共部门客户合作,构建和执行基于云的方法,以实现业务优先事项。