使用 Amazon SageMaker JumpStart、Llama 2 和 Amazon Ope
利用 Amazon SageMaker 构建金融服务的上下文聊天机器人
关键要点
本文介绍了如何使用 Amazon SageMaker JumpStart 和 Llama 2 构建针对金融服务行业的上下文聊天机器人。使用检索增强生成RAG方法,结合大语言模型LLMs,提高问答任务的准确性和相关性。SageMaker JumpStart 提供必要的数据安全性、合规性,并允许用户自定义模型以适应特定商业用例。在构建过程中,使用 OpenSearch Serverless 的向量引擎存储嵌入数据。金融服务FinServ行业尤其是与生成式 AI 相关的应用在域特定数据、数据安全、合规控制以及行业标准方面有其自身的独特要求。此外,客户希望在选择性能最优且成本效益高的机器学习ML模型上有更多选择,并能够进行必要的自定义微调,以适应他们的商业用例。Amazon SageMaker JumpStart 是应对这些需求的理想解决方案,因为它提供了必要的数据安全控制并满足合规性标准。
在本文中,我们将展示如何使用一种基于 RAG 的方法,通过 SageMaker JumpStart 完成问答任务,并以一个简单的金融领域用例为例。RAG 是一种提高文本生成质量的框架,通过整合大型语言模型LLMs与信息检索IR系统。LLM 生成文本,IR 系统从知识库中检索相关信息,然后将这些信息用于强化 LLM 的输入,从而帮助提高模型生成文本的准确性和相关性。RAG 在如问答和摘要等多种文本生成任务中均显示出了其有效性,是提升文本生成模型质量和准确性的有希望的方法。
使用 SageMaker JumpStart 的优势
通过 SageMaker JumpStart,ML 实践者可以从众多先进模型中选择,以满足内容创作、图像生成、代码生成、问答、文案撰写、摘要、分类、信息检索等用例的需求。实践者还可以从网络隔离环境中部署基础模型至专用的 Amazon SageMaker 实例,并利用 SageMaker 对模型进行训练和部署的自定义。
SageMaker JumpStart 为金融服务客户提供以下优点:
优势描述自定义能力提供示例笔记本和详细的步骤说明,指导用户进行基础模型的领域适应。数据安全通过单租户端点和私有模型集线器等功能,确保推理数据的安全性,并满足个别安全要求。合规控制和合规性SageMaker 符合 HIPAA BAA、SOC123、PCI 和 HITRUST CSF 等标准,确保与金融领域的严格监管环境一致。模型选择提供一系列先进的 ML 模型,其在行业公认的 HELM 基准测试中表现优异,涵盖 Llama 2、Falcon 40B 等多个顶级模型。本文将探讨如何利用 RAG 架构和 Llama 2 基础模型构建适用于金融服务组织的上下文聊天机器人,并使用 Hugging Face GPTJ6BFP16 嵌入模型,这两者均可在 SageMaker JumpStart 中获取。同时,我们还利用 OpenSearch Serverless (当前处于预览中) 的向量引擎作为嵌入数据存储。
大型语言模型的局限性
大型语言模型LLMs在海量非结构化数据的训练中表现出色。然而,现成的 LLMs 存在一些局限性:
它们的离线训练使其无法获取最新信息。由于训练数据多数为普遍性数据,它们在特定领域任务中的效能受到限制。举例来说,金融公司可能希望其问答机器人从最新的内部文件中提取答案,从而确保准确性和合规性。对嵌入信息的依赖影响了解释性。为了在 LLM 中使用特定数据,常用的三种方法包括:
将数据嵌入模型提示中,允许模型在生成输出时利用这些上下文信息。利用提示和完成对进行微调。RAG 方法,检索外部数据并将其嵌入提示中,从而丰富上下文。然而,第一种方法在上下文大小上受到模型限制,难以输入较长文档,可能导致成本增加。微调方法虽然有效,但资源消耗大,特别是在外部数据快速变化时,导致部署延迟和成本上升。结合 RAG 和 LLM 提供了解决先前提到的局限性的方案。
检索增强生成RAG
RAG 检索外部数据非参数并将其整合到 ML 提示中,从而丰富上下文。Lewis 等人在 2020 年率先提出 RAG 模型,将其概念化为预训练序列到序列模型参数内存与通过神经检索器访问的维基百科密集向量索引非参数内存的融合。
以下是 RAG 的工作方式:
数据来源:RAG 可以从各种数据源提取数据,包括文档存储库、数据库或 APIs。数据格式化:用户的查询和文档都被转换为适合相关性比较的格式。嵌入:使用语言模型将查询和文档集合或知识库转换为数值嵌入,以便进行比较。这些嵌入数值化地封装了文本概念。相关性搜索:用户查询的嵌入与文档集合的嵌入进行比较,通过相似性搜索识别相关文本。上下文丰富:将识别到的相关文本附加到用户的原始提示上,从而增强其上下文。LLM 处理:向 LLM 提供丰富的上下文,使其生成结果更具相关性和准确性。异步更新:为了确保参考文档保持最新,可以异步更新文档及其嵌入表示,确保未来模型响应以最新信息为基础,从而保证准确性。总体而言,RAG 为 LLM 注入实时、相关信息,确保生成准确及时的输出。
以下示意图展示了 RAG 与 LLM 的概念流程。
解决方案概述
创建金融服务应用的上下文问答聊天机器人需要以下步骤:
使用 SageMaker JumpStart 的 GPTJ6B 嵌入模型为 Amazon Simple Storage Service Amazon S3上传目录中的每个 PDF 文档生成嵌入。通过以下步骤识别相关文档:使用相同模型为用户查询生成嵌入。利用 OpenSearch Serverless 的向量引擎特性,在嵌入空间中搜索与文档索引最相关的 K 个文档。收回对应的文档。将检索到的文档与用户的提示和问题结合,并发送给 SageMaker LLM 进行响应生成。我们运用 LangChain,一个流行框架,来协调这个过程。LangChain 专为由 LLM 驱动的应用而设计,提供多种 LLM 的通用接口,简化多个 LLM 的集成,确保在调用之间的状态持久性。此外,它通过可定制的提示模板、综合的应用构建代理和专门的搜索与检索索引来提升开发者效率。详细信息请参阅 LangChain 文档。
前提条件
构建我们的上下文感知聊天机器人需要以下前提条件:
拥有适当的 AWS Identity and Access Management IAM权限的 AWS 账户。一名 Amazon SageMaker Studio 用户及其域。有关设置说明,请参阅 使用快速设置加入 Amazon SageMaker 域。一个 OpenSearch Serverless 集合。一个具有 OpenSearch Serverless 访问权限的 SageMaker 执行角色。有关如何设置 OpenSearch Serverless 向量引擎的说明,请参阅 介绍 Amazon OpenSearch Serverless 的向量引擎,现在处于预览中。
要获取以下解决方案的完整操作步骤,请克隆 GitHub 仓库 并参考 Jupyter 笔记本。
使用 SageMaker JumpStart 部署 ML 模型
部署 ML 模型的步骤如下:
从 SageMaker JumpStart 部署 Llama 2 LLM:
pythonfrom sagemakerjumpstartmodel import JumpStartModelllmmodel = JumpStartModel(modelid=metatextgenerationllama27bf)llmpredictor = llmmodeldeploy()llmendpointname = llmpredictorendpointname
部署 GPTJ 嵌入模型:
pythonembeddingsmodel = JumpStartModel(modelid=huggingfacetextembeddinggptj6bfp16)embedpredictor = embeddingsmodeldeploy()embeddingsendpointname = embedpredictorendpointname
拆分数据并创建文档嵌入对象
在这一部分,您需要将数据拆分成较小的文档。拆分是将大型文本分割成更小部分的一种技术。这是一个关键步骤,因为它优化了 RAG 模型的查询相关性,从而提高了聊天机器人的质量。每个块的大小取决于文档类型和所用模型。选择了 chunksize=1600,因为这是段落的大致大小。随着模型的进步,其上下文窗口大小将增加,以允许更大的块大小。
请参考 GitHub 仓库中的 Jupyter 笔记本 以获取完整解决方案。
扩展 LangChain 的 SageMakerEndpointEmbeddings 类,创建一个自定义嵌入函数,使用您刚刚创建的 gptj6bfp16 SageMaker 端点:
pythonfrom langchainembeddings import SagemakerEndpointEmbeddingsfrom langchainembeddingssagemakerendpoint import EmbeddingsContentHandler
logger = logginggetLogger(name)
class SagemakerEndpointEmbeddingsJumpStart(SagemakerEndpointEmbeddings) def embeddocuments(self texts List[str] chunksize int = 1) gt List[List[float]] results = [] chunksize = len(texts) if chunksize gt len(texts) else chunksize st = timetime() for i in range(0 len(texts) chunksize) response = selfembeddingfunc(texts[i i chunksize]) resultsextend(response) timetaken = timetime() st loggerinfo(fgot results for {len(texts)} in {timetaken}s length of embeddings list is {len(results)}) print(fgot results for {len(texts)} in {timetaken}s length of embeddings list is {len(results)}) return results
创建嵌入对象并批量创建文档嵌入:

pythonembeddings = createsagemakerembeddingsfromjsmodel(embeddingsendpointname awsregion)
将这些嵌入通过 LangChain 的 OpenSearchVectorSearch 存储在向量引擎中。您可以迭代块文档,创建嵌入并将其存储在向量搜索集合中创建的 OpenSearch Serverless 向量索引中。查看以下代码:
pythondocsearch = OpenSearchVectorSearchfromtexts( texts=[dpagecontent for d in docs] embedding=embeddings opensearchurl=[{host aosshost port 443}] httpauth=awsauth timeout=300 usessl=True verifycerts=True connectionclass=RequestsHttpConnection indexname=aosindex)
通过文档进行问答
到目前为止,您已经将大型文档拆分为小块、创建了向量嵌入并将其存储在向量引擎中。现在可以回答与这些文档数据相关的问题。因为您已经对数据创建了索引,所以可以进行语义搜索;这使得只有为回答问题而需要的相关文档被传递给 LLM 作为提示。这让您能节省时间和成本,因为只将相关文档传送给 LLM。有关使用文档链的更多详细信息,请参阅 Documents。
完成以下步骤以使用文档回答问题:
使用 LangChain 的 SageMaker LLM 端点,使用 langchainllmssagemakerendpointSagemakerEndpoint 来简化 SageMaker LLM 端点的抽象。如下代码所示,您需要为请求和响应负载进行转换。请注意,根据您选择的 LLM 模型,您可能需要调整 ContentHandler 中的代码,具体取决于 contenttype 和 accepts 格式。
pythoncontenttype = application/jsonaccepts = application/json
def transforminput(self prompt str modelkwargs dict) gt bytes payload = { inputs [ [ {role system content prompt} {role user content prompt} ] ] parameters { maxnewtokens 1000 topp 09 temperature 06 } } inputstr = jsondumps(payload) return inputstrencode(utf8)
def transformoutput(self output bytes) gt str responsejson = jsonloads(outputread()decode(utf8)) content = responsejson[0][generation][content] return content
contenthandler = ContentHandler()
smjumpstartllm = SagemakerEndpoint( endpointname=llmendpointname regionname=awsregion modelkwargs={maxnewtokens 300} endpointkwargs={CustomAttributes accepteula=true} contenthandler=contenthandler)
现在您可以与金融文档进行交互。
使用以下查询和提示模板来询问有关文档的问题:
一元机场官网首页pythonfrom langchain import PromptTemplate SagemakerEndpointfrom langchainllmssagemakerendpoint import LLMContentHandler
query = 总结一下收益报告,并说明报告年份prompttemplate = 仅使用上下文回答最后的问题。
{context}
问题 {question}答案
prompt = PromptTemplate(template=prompttemplate inputvariables=[context question])
class ContentHandler(LLMContentHandler) contenttype = application/json accepts = application/json
def transforminput(self prompt str modelkwargs dict) gt bytes payload = { inputs [ [ {role system content prompt} {role user content prompt} ] ] parameters { maxnewtokens 1000 topp 09 temperature 06 } } inputstr = jsondumps(payload) return inputstrencode(utf8)def transformoutput(self output bytes) gt str responsejson = jsonloads(outputread()decode(utf8)) content = responsejson[0][generation][content] return contentcontenthandler = ContentHandler()
chain = loadqachain( llm=SagemakerEndpoint( endpointname=llmendpointname regionname=awsregion modelkwargs={maxnewtokens 300} endpointkwargs={CustomAttributes accepteula=true} contenthandler=contenthandler ) prompt=prompt)
simdocs = docsearchsimilaritysearch(query includemetadata=False)chain({inputdocuments simdocs question query} returnonlyoutputs=True)
清理
为了避免产生后续的费用,请删除在本笔记本中创建的 SageMaker 推理端点。您可以在 SageMaker Studio 笔记本中运行以下代码:
python
删除 LLM
llmpredictordeletemodel()ll