在对话式体验中探索生成式AI:Amazon Lex、Langchain和Amazon SageMaker Jumpstart简介

4e3244c8a6d145d8b57bc0c517b31889.gif

在当今快节奏的世界里,客户希望企业提供快速高效的服务。但是,当咨询量超过了处理这些咨询所需的人力资源时,提供优质客户服务就会面临巨大挑战。然而,借助由大型语言模型(LLM)支持的生成式 AI 的进步,企业可以应对这一挑战,同时提供个性化和高效的客户服务。

生成式 AI 聊天机器人因其模仿人类智力的能力而声名鹊起。不过,与面向任务的机器人不同,这些机器人使用 LLM 进行文本分析和内容生成。LLM 基于 Transformer 架构,这是 2017 年 6 月推出的一种深度学习神经网络,可以在海量未标记的文本语料库上进行训练。这种方法创造了一种更像人类的对话体验,并且可以容纳多个主题。

截至本文撰写之时,各种规模的公司都想使用这项技术,但在如何开始使用方面需要帮助。如果您想开始使用生成式 AI 以及在对话式人工智能中使用 LLM,那么这篇文章就是为您准备的。我们提供了一个示例项目,用于快速部署使用预训练的开源 LLM 的 Amazon Lex 机器人。该代码还包括实现自定义内存管理器的起点。这种机制可以让 LLM 回想之前的互动,以保持对话的语境和节奏。最后,有必要强调对提示和 LLM 随机性和确定性参数进行微调实验以获得一致结果的重要性。

解决方案概览

该解决方案将 Amazon Lex 机器人与 Amazon SageMaker JumpStart 的流行开源 LLM 集成在一起,可通过 Amazon SageMaker 端点进行访问。我们还使用 LangChain,这是一种流行的框架,可简化基于 LLM 的应用程序。最后,我们使用 QnABot 为聊天机器人提供用户界面。

3e4e5e8fa5e7342279b120feaf004112.png

首先,我们对上图中的每个组件进行描述:

  • Amazon JumpStart 为各种问题类型提供预训练的开源模型。这使您能够快速开始机器学习(ML)。此组件包括 FLAN-T5-XL 模型,这是一种部署在深度学习容器中的 LLM。此组件在包括文本生成在内的各种自然语言处理(NLP)任务中表现出色。

  • Amazon SageMaker 实时推理端点支持快速、可扩展地部署机器学习模型以预测事件。由于能够与 Lambda 函数集成,此端点支持构建自定义应用程序。

  • Amazon Lambda 函数使用来自 Amazon Lex 机器人或 QnABot的请求来准备有效负载,以便使用 LangChain 调用 SageMaker 端点。LangChain 是一种框架,开发人员可以使用此框架创建由 LLM 支持的应用程序。

  • Amazon Lex V2 机器人内置了 AMAZON.FallbackIntent 意图类型。当用户的输入与机器人中的任何意图都不匹配时,就会触发此意图类型。

  • QnABot 是一种开源亚马逊云科技解决方案,旨在为 Amazon Lex 机器人提供用户界面。我们为 CustomNoMatches项配置了 Lambda hook 函数,当 QnABot 找不到答案时,此解决方案就会触发 Lambda 函数。我们假定您已经部署了此解决方案,并在以下各节中包含了配置步骤。

下面的序列图对此解决方案进行了详细描述。

421c13b5b8370eb86dc7bcb6ab07e67d.png

解决方案执行的主要任务

在本节中,我们将介绍在解决方案中执行的主要任务。此解决方案的整个项目源代码可在此 GitHub 存储库中查阅:

  • GitHub 存储库

    https://github.com/aws-samples/conversational-ai-llms-with-amazon-lex-and-sagemaker

处理聊天机器人回退

Lambda 函数通过 Amazon Lex V2 中的 AMAZON.FallbackIntent 和 QnABot 中的 CustomNoMatches 项处理“don’t know”答案。触发后,此函数会查看会话请求和回退意图。如果有匹配项,此函数会将请求移交给 Lex V2 调度程序;否则,QnABot 调度程序将使用该请求。请参阅以下代码:

def dispatch_lexv2(request):"""SummaryArgs:request (dict): Lambda event containing a user's input chat message and context (historical conversation)Uses the LexV2 sessions API to manage past inputs https://docs.aws.amazon.com/lexv2/latest/dg/using-sessions.htmlReturns:dict: Description"""lexv2_dispatcher = LexV2SMLangchainDispatcher(request)return lexv2_dispatcher.dispatch_intent()def dispatch_QnABot(request):"""SummaryArgs:request (dict): Lambda event containing a user's input chat message and context (historical conversation)Returns:dict: Dict formatted as documented to be a lambda hook for a "don't know" answer for the QnABot on AWS Solutionsee https://docs.aws.amazon.com/solutions/latest/QnABot-on-aws/specifying-lambda-hook-functions.html"""request['res']['message'] = "Hi! This is your Custom Python Hook speaking!"qna_intent_dispatcher = QnASMLangchainDispatcher(request)return qna_intent_dispatcher.dispatch_intent()def lambda_handler(event, context):print(event)if 'sessionState' in event:if 'intent' in event['sessionState']:if 'name' in event['sessionState']['intent']:if event['sessionState']['intent']['name'] == 'FallbackIntent':return dispatch_lexv2(event)else:return dispatch_QnABot(event)

左滑查看更多

为 LLM 提供内存

为了在多轮对话中保留 LLM 内存,Lambda 函数包含一个 LangChain 自定义内存类机制,该机制使用 Amazon Lex V2 Sessions API 来跟踪正在进行的多轮对话消息的会话属性,并通过之前的交互为对话模型提供上下文。请参阅以下代码:

class LexConversationalMemory(BaseMemory, BaseModel):"""Langchain Custom Memory class that uses Lex Conversation historyAttributes:history (dict): Dict storing conversation history that acts as the Langchain memorylex_conv_context (str): LexV2 sessions API that serves as input for convo historyMemory is loaded from herememory_key (str): key to for chat history Langchain memory variable - "history""""history = {}memory_key = "chat_history" #pass into prompt with keylex_conv_context = ""def clear(self):"""Clear chat history"""self.history = {}@propertydef memory_variables(self) -> List[str]:"""Load memory variablesReturns:List[str]: List of keys containing Langchain memory"""return [self.memory_key]def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, str]:"""Load memory from lex into current Langchain session memoryArgs:inputs (Dict[str, Any]): User input for current Langchain sessionReturns:Dict[str, str]: Langchain memory object"""input_text = inputs[list(inputs.keys())[0]]ccontext = json.loads(self.lex_conv_context)memory = {self.memory_key: ccontext[self.memory_key] + input_text + "\nAI: ",}return memory

左滑查看更多

下面是我们为在 LangChain ConversationChain 中引入自定义内存类而创建的示例代码:

# Create a conversation chain using the prompt,
# llm hosted in Sagemaker, and custom memory class
self.chain = ConversationChain(llm=sm_flant5_llm,prompt=prompt,memory=LexConversationalMemory(lex_conv_context=lex_conv_history),verbose=True
)

左滑查看更多

提示定义

LLM 的提示是为生成的响应定下基调的问题或陈述。提示作为一种情境形式,有助于引导模型生成相关的响应。请参阅以下代码:

# define prompt
prompt_template = """The following is a friendly conversation between a human and an AI.The AI is 
talkative and provides lots of specific details from its context.If the AI does not know 
the answer to a question, it truthfully says it does not know.You are provided with information
about entities the Human mentions, if relevant.Chat History:
{chat_history}Conversation:
Human: {input}
AI:"""

左滑查看更多

使用 Amazon Lex V2 会话

来支持 LLM 内存

当用户与机器人互动时,Amazon Lex V2 会启动会话。除非手动停止或超时,否则会话会随着时间的推移而持续存在。会话存储元数据和应用程序特定的数据,即会话属性。当 Lambda 函数添加或更改会话属性时,Amazon Lex 会更新客户端应用程序。QnABot 包含一个在 Amazon Lex V2 基础上设置和获取会话属性的接口。

在我们的代码中,我们使用这种机制在 LangChain 中构建了一个自定义内存类,以跟踪对话历史记录并使 LLM 能够调用短期和长期的互动。请参阅以下代码:

class LexV2SMLangchainDispatcher():def __init__(self, intent_request):# See lex bot input format to lambda https://docs.aws.amazon.com/lex/latest/dg/lambda-input-response-format.htmlself.intent_request = intent_requestself.localeId = self.intent_request['bot']['localeId']self.input_transcript = self.intent_request['inputTranscript'] # user inputself.session_attributes = utils.get_session_attributes(self.intent_request)self.fulfillment_state = "Fulfilled"self.text = "" # response from endpointself.message = {'contentType': 'PlainText','content': self.text}class QnABotSMLangchainDispatcher():def __init__(self, intent_request):# QnABot Session attributesself.intent_request = intent_requestself.input_transcript = self.intent_request['req']['question']self.intent_name = self.intent_request['req']['intentname']self.session_attributes = self.intent_request['req']['session']

左滑查看更多

先决条件

要开始部署,您需要满足以下先决条件:

  • 通过可以启动 Amazon CloudFormation 堆栈的用户访问亚马逊云科技管理控制台

  • 熟悉 Lambda 和 Amazon Lex 控制台的导航功能

部署解决方案

要部署解决方案,请继续执行以下步骤:

1. 选择启动堆栈,在 us-east-1 区域启动解决方案:

https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/quickcreate?templateURL=https://s3.us-east-1.amazonaws.com/aws-blogs-artifacts-public/artifacts/ML-12016/v1/stacks/SMJumpstartFlanT5-llm-main.yaml&stackName=SagemakerFlanLLMStack

2. 对于堆栈名称,输入唯一的堆栈名称。

3.对于 HFModel,我们使用 JumpStart 上提供的 Hugging Face Flan-T5-XL 模型。

4. 对于 HFTask,输入 text2text 。

5. 保持 S3BucketName 不变。

这些信息用于查找部署解决方案所需的 Amazon Simple Storage Service(Amazon S3)资产,并且可能会随着这篇文章的更新发布而发生变化。

8d2ac2b290925e5bc6fc071cf31cbbc3.png

6. 确认能力。

7. 单击 Create stack(创建堆栈)

应该有四个成功创建的堆栈。

26a133d9d5dfc694bfa62805be9d211d.png

配置 Amazon Lex V2 机器人

对于 Amazon Lex V2 机器人,无需配置任何内容。我们的 CloudFormation 模板已经完成了繁重的工作。

配置 QnABot

我们假设您的环境中已经部署了现有的 QnABot。但如果您需要帮助,请按照这些说明进行部署。

  • 说明:

    https://docs.aws.amazon.com/solutions/latest/qnabot-on-aws/aws-cloudformation-template.html

1. 在 Amazon CloudFormation 控制台上,导航到您部署的主堆栈。

2. 在输出选项卡上,记下 LambdaHookFunctionArn ,因为稍后需要将此项插入 QnABot 中。

b054cc8c3cc59ac99e84e6f94c946256.png

3. 以管理员身份登录 QnABot Designer 用户界面(UI)。

4. 在问题用户界面中,添加一个新问题。

994e36733ffc0799b043002c1b0ee0c6.png

5. 输入以下值:

  • ID –  CustomNoMatches 

  • 问题 –  no_hits 

  • 答案 –“don’t know”的任何默认答案

6. 选择高级,然后转到 Lambda Hook 部分。

7. 输入您之前记下的 Lambda 函数的 Amazon 资源名称(ARN)。

66879bc35d7c7532d718f281729b7972.png

8. 向下滚动到该部分的底部,然后选择创建

您会看到一个显示成功消息的窗口。

15c2c32b2df6275240a0470189b39e10.png

您的问题现已显示在问题页面上。

cd318ee78aaf97e5fe0c9115f4e44cb5.png

测试解决方案

让我们继续测试解决方案。首先,值得一提的是,我们部署的是 JumpStart 提供的 FLAN-T5-XL 模型,没有进行任何微调。这可能会有一些不可预测性,导致响应略有不同。

使用 Amazon Lex V2 机器人进行测试

本节有助于您测试 Amazon Lex V2 机器人与 Lambda 函数的集成,该函数调用部署在 SageMaker 端点中的 LLM。

1. 在 Amazon Lex 控制台上,导航到名为 Sagemaker-Jumpstart-Flan-LLM-Fallback-Bot 的机器人。


此机器人已配置为在没有其他意图匹配时调用 Lambda 函数,该函数调用托管 LLM 的 SageMaker 端点作为回退意图。

2. 在导航窗格中选择意图

b4c7383916ff6bceaf30f0a6563b81a3.png

右上方显示“英语(美国)尚未生成更改”消息。

3. 选择构建

4. 等待构建完成。

最后,您会看到一条成功消息,如以下屏幕截图所示。

5fd42aea9ec332e69a31ade576026e10.png

选择测试。此时会出现一个聊天窗口,您可以在其中与模型进行交互。

02a4e961a31b285d98972d3cc398e40c.png

我们建议探索 Amazon Lex 机器人与 Amazon Connect 之间的内置集成。此外,还有消息平台(Facebook、Slack、Twilio SMS)或使用 Amazon Chime SDK 和 Genesys Cloud 的第三方联络中心等。

使用 QnABot 实例进行测试

本节测试亚马逊云科技上的 QnABot 与 Lambda 函数的集成,该函数调用部署在 SageMaker 端点中的 LLM。

1. 打开左上角的工具菜单。

012957b9c7fd8bae425c5b0f81e02d13.png

2. 选择 QnABot 客户端

eaf2ac176ded7f90b838685eec208add.png

3. 选择以管理员身份登录

164ae7cdde35d0be2ef4664c8c55e5e5.png

4. 在用户界面中输入任何问题。

5. 评估响应。

707c60413f34d4adb0d7ad7bd14e18fd.png

清理

为避免将来产生费用,请按照以下步骤删除我们的解决方案创建的资源:

  1. 在 Amazon CloudFormation 控制台上,选择名为 SagemakerFlanLLMStack 的堆栈(或您为堆栈设置的自定义名称)。

  2. 选择 Delete(删除)。

  3. 如果您为测试目的部署了 QnABot 实例,请选择 QnABot 堆栈。

  4. 选择 Delete(删除)。

总结

在这篇文章中,我们探讨了在面向任务的机器人中添加开放域功能的问题,该机器人会将用户请求路由到开源的大型语言模型。

我们鼓励您:

  • 将对话历史记录保存到外部持久机制中。例如,您可以将对话历史记录保存到 Amazon DynamoDB 或 S3 存储桶,然后在 Lambda hook 函数中检索记录。这样,您就无需依赖 Amazon Lex 提供的内部非持久会话属性管理。

  • 尝试摘要 – 在多轮对话中,生成摘要很有帮助,您可以在提示中使用摘要来添加上下文并限制对话历史记录的使用。这有助于削减机器人会话大小并保持较低的 Lambda 函数内存消耗。

  • 尝试不同的提示 – 修改原始的提示描述,以符合您的实验目的。

  • 调整语言模型以获得最佳结果 – 您可以根据自己的应用程序,通过微调随机性( temperature )和确定性( top_p )等高级 LLM 参数来实现这一目标。我们使用带样本值的预训练模型演示了一个集成示例,但您也可以根据自己的使用案例调整样本值。

在下一篇文章中,我们计划协助您了解如何使用自己的数据微调预训练的 LLM 支持的聊天机器人。

资源和参考资料

  • 本文配套源代码

    https://github.com/aws-samples/conversational-ai-llms-with-amazon-lex-and-sagemaker

  • Amazon Lex V2 开发指南

    https://docs.aws.amazon.com/lexv2/latest/dg/what-is.html

  • 亚马逊云科技解决方案库:亚马逊云科技上的 QnABot

    https://aws.amazon.com/solutions/implementations/qnabot-on-aws/

  • 使用 FLAN T5 模型生成 Text2Text

    https://github.com/aws/amazon-sagemaker-examples/blob/main/introduction_to_amazon_algorithms/jumpstart-foundation-models/text2text-generation-flan-t5.ipynb

  • LangChain – 使用 LLM 构建应用程序

    https://github.com/hwchase17/langchain

  • 使用 Jumpstart 根基模型的 Amazon SageMaker 示例

    https://github.com/aws/amazon-sagemaker-examples/tree/58a3ffa17601bc5d4e8dd3a6edf89ede54b535d3/introduction_to_amazon_algorithms/jumpstart-foundation-models

  • Amazon BedRock – 使用根基模型构建和扩展生成式人工智能应用程序的最简单方法

    https://aws.amazon.com/bedrock/

  • 使用 Amazon Kendra、LangChain 和大型语言模型根据企业数据快速构建高精度的生成式人工智能应用程序

    https://aws.amazon.com/blogs/machine-learning/quickly-build-high-accuracy-generative-ai-applications-on-enterprise-data-using-amazon-kendra-langchain-and-large-language-models/

  • Original URL: 

    https://aws.amazon.com/blogs/machine-learning/exploring-generative-ai-in-conversational-experiences-an-introduction-with-amazon-lex-langchain-and-sagemaker-jumpstart/

本篇作者

a9c24b55ac633c51e4ec69f6271cbd80.jpeg

Marcelo Silva 

是一位经验丰富的技术专家,擅长设计、开发和实施尖端产品。在 Cisco 开始职业生涯时,Marcelo 参与了各种备受瞩目的项目,包括部署有史以来第一个运营商路由系统和成功推出 ASR9000。在加入 GenAI 之前,他曾在 Cisco、Cape Networks 和亚马逊云科技等多家公司担任高级经理,专业领域涉及云技术、分析和产品管理。Marcelo 目前担任对话式人工智能/GenAI 产品经理,在为各行各业提供创新解决方案方面继续表现出色。

42f7369f9433472ac7d6097ba9640c8c.jpeg

Victor Rojo

是一位经验丰富的技术专家,他对人工智能、机器学习和软件开发的最新技术充满热情。凭借他的专业知识,他在将 Amazon Alexa 推向美国和墨西哥市场方面发挥了关键作用,同时带头向亚马逊云科技合作伙伴成功推出 Amazon Textract 和 Amazon Contact Center Intelligence(CCI)。作为对话式人工智能能力合作伙伴计划的现任首席技术负责人,Victor 致力于推动创新并提供尖端解决方案,以满足行业不断变化的需求。

38e1cd0f511ef8c313aa87981d851fae.jpeg

Justin Leto

是亚马逊云科技的高级解决方案架构师,专门研究机器学习。他热衷于协助客户利用机器学习和人工智能的力量推动业务增长。Justin 曾在包括亚马逊云科技峰会在内的全球人工智能会议上发表演讲,并在大学讲课。他是纽约市机器学习和人工智能聚会的负责人。在业余时间,他喜欢海上航行和演奏爵士乐。他与妻子和宝贝女儿住在纽约市。

ea83392a65a8c85efb211f3465026120.jpeg

Ryan Gomes

是 Amazon Professional Services Intelligence Practice 的数据和机器学习工程师。他热衷于通过云端的分析和机器学习解决方案协助客户取得更好的成果。工作之余,他喜欢健身、烹饪,也喜欢与朋友和家人共度美好时光。

791633fc6cb746ca11dfbbb0724e5edc.jpeg

Mahesh Birardar

是亚马逊云科技的高级解决方案架构师,专门研究 DevOps 和可观测性。他乐于协助客户实施具有成本效益的可扩展架构。工作之余,他喜欢看电影和徒步旅行。

7d65ba962bdd39e40449279b4326f3f2.png

Kanjana Chandren

是亚马逊云科技的解决方案架构师,对机器学习充满热情。她协助客户设计、实施和管理亚马逊云科技工作负载。工作之余,她喜欢旅行、阅读,也喜欢与家人和朋友共度时光。

7b28f0e5138e70d139d6ce8e82a69185.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

60a3775b52dd7b28652a978e431aee00.gif

听说,点完下面4个按钮

就不会碰到bug了!

73ac1fe58c08236dd1a46401bd0d4180.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179873.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看? (六)

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

基于JavaWeb的网上体育商城的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…

【保姆级教程】Linux安装JDK8

本文以centos7为例,一步一步进行jdk1.8的安装。 1. 下载安装 官网下载链接: https://www.oracle.com/cn/java/technologies/downloads/#java8 上传jdk的压缩包到服务器的/usr/local目录下 在当前目录解压jdk压缩包,如果是其它版本&#xf…

格式工厂——万能格式转换器

很多时候,大家从网络上下载的文件不一定是自己想要的类型,比如flv等视频文件,而强行改文件后缀名只会造成文件格式错误,无法打开;而很多文件的格式并不能轻易转换,且很多渠道都需要收费。今天介绍的这款For…

MySQL中全文索引和普通索引的区别

MySQL中的全文索引(Full-Text Index)和普通索引(比如B-Tree索引)是为了提高查询效率而设计的,但它们适用于不同的场景和查询类型。 普通索引(如B-Tree索引) 适用场景:普通索引适用于…

自动备份pgsql数据库

bat文件中的内容: PATH D:\Program Files\PostgreSQL\13\bin;D:\Program Files\7-Zip set PGPASSWORD**** pg_dump -h 8.134.151.187 -p 5466 -U sky -d mip_db --schema-only -f D:\DB\backup\%TODAY%-schema-mip_db_ali.sql pg_dump -h 8.134.151.187 -p 5466…

工业除尘器笔记

工业除尘器用于对工业生产产生的有害气体和粉尘进行吸附。相关标准的制定最早可以追溯到1960年代以前。注意,本文的附录包含一起完整的工业除尘器事故的分析和定责过程。相关事故分析定责文档源头摘自上海市政府网站。 在产品设计行业和关联下游行业,在…

关闭RecyclerView惯性滚动,以及多个RecyclerView在嵌套滚动中的注意事项

前言: 当前RecyclerView 下拉到顶部 或者 上拉到底部时,虽然滚动列表停止了,但惯性任务并没有结束,一些特殊需求可能受到影响,需要手动停止。 1. RecyclerView源码 调用 rv.stopScroll() 停止; 2. Recycl…

python+django+mysql个人博客项目部署(VMware部署)

目录 一、Vmware新建win7虚拟机 二、组件/软件安装 2.1 安装python3 2.2 更新pip 2.3 安装pycharm 2.4 安装django 2.5 win安装mysql 三、配置数据库 3.1 安装sqlite客户端 3.2 db.sqlite3导出为myblog.sql 3.3 Heidisql连接本地sql 四、部署项目 4.1 安装模块 4.2 尝试运行 …

基于Qt Linux开发板USER-KEY按键实现

介绍如何在 Qt 应用上使用嵌入式 GET6818 Linux 开发板 上的按键。 工具:Qt Creator 5.14.2 平台:windows ## 资源简介 在GET6818 开发板,开发板板载资源上有两个用户按键。如下图原理图(下图开发板的按键原理图)。 ## 应用实例 想要监测这个 KEY0,首先出厂内核已经…

通过IP地理位置阻止网络攻击

随着网络技术的不断发展,网络安全问题日益引起人们的关注。网络攻击者往往隐藏在虚拟的网络世界中,难以追踪其真实身份和位置。然而,近年来技术专家们借助IP地址定位的方法来阻止网络被攻击,这种方法引起了广泛关注。本文将探讨通…

武汉凯迪正大—锂电池均衡维护仪

产品概况 KDZD885C 电池容量平衡测试系统,主要用于锂电池箱充放电测试及均衡维护,解决锂电池包单芯电压不均衡的痛点,用于快速解决锂电池电压不一致的难题,适用于各锂电池模组电压等级,集单芯放电,充电,均…