Press "Enter" to skip to content

使用Amazon SageMaker JumpStart用Falcon创建一个HCLS文档摘要应用程序

健康保健和生命科学(HCLS)客户采用生成性人工智能作为一种工具来更好地利用他们的数据。使用案例包括摘要文件,以帮助读者专注于文件的关键点,并将非结构化文本转化为标准化格式以突出重要属性。由于独特的数据格式和严格的监管要求,客户正在寻找选择最高性能和具有成本效益的模型的选择,以及执行必要的定制化(微调)以适应其业务用例的能力。在本文中,我们将为您介绍如何使用Amazon SageMaker JumpStart部署Falcon大型语言模型(LLM),并使用该模型使用LangChain和Python对长文档进行摘要。

解决方案概述

Amazon SageMaker构建于亚马逊二十年来开发实际机器学习应用的经验基础上,包括产品推荐、个性化、智能购物、机器人和语音助手设备。SageMaker是一项符合HIPAA标准的托管服务,提供工具,使数据科学家、机器学习工程师和业务分析师能够进行机器学习创新。SageMaker中包含Amazon SageMaker Studio,这是一个专为协作式机器学习工作流而构建的集成开发环境(IDE),其中包含各种快速入门解决方案和预训练的机器学习模型,集成到称为SageMaker JumpStart的集线器中。通过SageMaker JumpStart,您可以使用预训练的模型,如Falcon LLM,并使用预构建的示例笔记本和SDK支持进行实验和部署这些强大的转换模型。您可以在您的AWS帐户中使用SageMaker Studio和SageMaker JumpStart部署和查询自己的生成模型。

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

Falcon LLM是由科技创新学院(TII)的研究人员使用AWS训练的大型语言模型,使用超过1万亿个标记进行训练。Falcon具有多个不同的变体,其两个主要组成部分是Falcon 40B和Falcon 7B,分别由400亿和70亿个参数组成,还针对特定任务进行了微调版本的训练,例如按照说明进行操作。Falcon在各种任务中表现良好,包括文本摘要、情感分析、问题回答和对话。本文提供了一个步骤,您可以按照步骤在SageMaker JumpStart中部署Falcon LLM,并使用SageMaker JumpStart通过托管的笔记本实例进行文本摘要的实验。

SageMaker JumpStart模型集包括完整的笔记本来部署和查询每个模型。截至本文撰写时,在SageMaker JumpStart模型集中有六个版本的Falcon可用:Falcon 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开始文档摘要。

准备条件

为了完成本教程,您需要具有SageMaker域的AWS帐户。如果您还没有SageMaker域,请参考Onboard to Amazon SageMaker Domain创建一个。

使用SageMaker JumpStart部署Falcon 7B

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

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

从SageMaker JumpStart选择Falcon-7B-Instruct

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

  1. 选择打开笔记本

SageMaker JumpStart模型部署页面

  1. 运行笔记本的前四个单元格,以部署Falcon 7B Instruct端点。

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

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

SageMaker JumpStart已启动的模型页面

使用部署的Falcon LLM端点,您已准备好查询模型。

运行您的第一个查询

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

  1. 文件菜单中,选择新建笔记本以打开一个新的笔记本。

您还可以在此处下载已完成的笔记本下载此处

创建SageMaker Studio笔记本

  1. 在提示时选择图像、内核和实例类型。对于本文,我们选择Data Science 3.0图像、Python 3内核和ml.t3.medium实例。

设置SageMaker Studio笔记本内核

  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痴迷于长颈鹿,这是地球上最壮丽的动物。与壮丽的长颈鹿相比,Giraftron认为其他所有动物都是无关紧要的。\n丹尼尔:你好,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实例。
上传文件到SageMaker Studio

出厂的Falcon LLM能够支持文本摘要。

  1. 让我们创建一个使用提示工程技术来总结document.txt的函数:
def summarize(text_to_summarize):    summarization_prompt = """请处理以下文本,然后执行后续的指示:{text_to_summarize}提供前面文本的简短摘要。"""    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的增强摘要功能绕过这个限制,LangChain允许将更大的输入传递到LLM。

导入并运行一个摘要链

LangChain是一个开源软件库,允许开发人员和数据科学家快速构建、调整和部署自定义生成应用程序,无需管理复杂的ML交互,通常仅需几行代码即可摘要AI语言模型的常见用例。LangChain对AWS服务的支持包括对SageMaker端点的支持。

LangChain为LLM提供了一个易于使用的接口。其功能包括提示模板和链接提示的工具。这些链接可以用于对超过语言模型支持的单个调用中的文本文档进行摘要。您可以使用映射—减少策略来对长文档进行摘要,将其分解为可管理的块,进行摘要,然后将它们组合起来(如果需要,再次进行摘要)。

  1. 让我们开始安装LangChain:
%pip install langchain
  1. 导入相关模块并将长文档分解为块:
import langchainfrom langchain import SagemakerEndpoint, PromptTemplatefrom langchain.llms.sagemaker_endpoint import LLMContentHandlerfrom langchain.chains.summarize import load_summarize_chainfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.docstore.document import Documenttext_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. 您可以定义自定义提示作为PromptTemplate对象,这是LangChain提示的主要方式,用于map-reduce汇总方法。这是一个可选步骤,因为如果在加载汇总链(load_summarize_chain)时未定义参数,则默认提供映射和组合提示。
map_prompt = """以几个完整句子简要概括以下文本内容:{text}简要概括:"""map_prompt_template = PromptTemplate(                        template=map_prompt,                         input_variables=["text"]                      )combine_prompt = """将以下所有摘要组合并生成一个最终摘要的几个完整句子:{text}最终摘要:"""combine_prompt_template = PromptTemplate(                            template=combine_prompt,                             input_variables=["text"]                          )      
  1. LangChain支持在SageMaker推理终端上托管的LLMs,因此您可以通过LangChain初始化连接,而不是使用AWS Python SDK,以提高可访问性:
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"])   

因为verbose参数设置为True,您将看到map-reduce方法的所有中间输出。这对于跟踪事件的顺序以得出最终摘要非常有用。通过这种map-reduce方法,您可以有效地汇总比模型最大输入令牌限制更长的文档。

清理

在使用推理终端后,重要的是删除它,以避免产生不必要的费用,可以通过以下代码行完成:

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

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

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

  • 如果您通过summarize()方法(不使用LangChain的方法)进行摘要,您可能需要更改payload参数的JSON结构,以及query_endpoint()函数中对response变量的处理。
  • 如果您通过LangChain的load_summarize_chain()方法进行摘要,您可能需要修改ContentHandlerTextSummarization类,特别是transform_input()transform_output()函数,以正确处理LLM期望的有效负载和LLM返回的输出。

粉底模型的差异不仅在于推理速度和质量等因素,还包括输入和输出格式。请参考LLM的相关信息页面,了解预期的输入和输出情况。

结论

Falcon 7B Instruct模型可在SageMaker JumpStart模型库中找到,并在多种用例中发挥作用。本文演示了如何使用SageMaker JumpStart将自己的Falcon LLM端点部署到环境中,并从SageMaker Studio开始进行首次实验,从而能够快速原型化您的模型,并无缝过渡到生产环境。借助Falcon和LangChain,您可以在大规模上对长篇医疗和生命科学文档进行有效摘要。

有关在AWS上使用生成式AI的更多信息,请参考AWS上关于生成式AI的新工具公告。您可以开始尝试使用本文中概述的方法,为面向医疗保健和生命科学的GenAI应用构建文档摘要概念验证。当Amazon Bedrock普遍可用时,我们将发布一个后续文章,展示如何使用Amazon Bedrock和LangChain实施文档摘要。

Leave a Reply

Your email address will not be published. Required fields are marked *