Press "Enter" to skip to content

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍

在今天快节奏的世界中,客户期望企业提供快速高效的服务。然而,当查询量超过解决它们所需的人力资源时,提供卓越的客户服务可能会极具挑战性。不过,随着生成式人工智能(generative AI)和大型语言模型(LLMs)的进步,企业可以在提供个性化和高效的客户服务的同时应对这一挑战。

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

截至本文撰写时,各大小企业都希望使用这项技术,但需要帮助确定从何处开始。如果您想开始使用生成式AI和LLMs在对话式AI中的应用,本文适合您。我们提供了一个示例项目,快速部署一个消耗预训练开源LLM的Amazon Lex bot。该代码还包括实现自定义内存管理器的起点。这种机制允许LLM回忆以前的互动,以保持对话的上下文和节奏。最后,需要强调的是,重要的是尝试调整提示和LLM随机性和确定性参数,以获得一致的结果。

解决方案概述

本解决方案将Amazon Lex bot与Amazon SageMaker JumpStart中的热门开源LLM集成,可通过Amazon SageMaker端点访问。我们还使用了LangChain,这是一个流行的框架,可简化LLM驱动的应用程序。最后,我们使用QnABot为我们的聊天机器人提供用户界面。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第1张

首先,我们从以下图表中描述了每个组件:

  • JumpStart为各种问题类型提供预训练的开源模型。这使您可以快速开始机器学习(ML)。它包括FLAN-T5-XL模型,这是一个部署到深度学习容器中的LLM。它在各种自然语言处理(NLP)任务中表现良好,包括文本生成。
  • SageMaker实时推理端点可快速扩展ML模型以预测事件。由于能够与Lambda函数集成,端点允许构建自定义应用程序。
  • AWS Lambda函数使用Amazon Lex bot或QnABot的请求来准备负载,以使用LangChain调用SageMaker端点。LangChain是一个让开发人员创建LLM驱动应用程序的框架。
  • Amazon Lex V2 bot具有内置的AMAZON.FallbackIntent意图类型。当用户的输入与机器人中的任何意图不匹配时,它会被触发。
  • QnABot是一个开源的AWS解决方案,提供用户界面以让用户与Amazon Lex bot交互。我们配置了一个Lambda挂钩函数用于CustomNoMatches项,当QnABot找不到答案时,它会触发Lambda函数。我们假设您已经部署了它,并在以下部分中包含了配置步骤。

解决方案在以下顺序图中以高层次描述。 探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第2张

解决方案执行的主要任务

在本节中,我们将查看解决方案中执行的主要任务。本解决方案的整个项目源代码可在此GitHub代码库中供您参考。

处理聊天机器人的回退

Lambda函数通过Amazon Lex V2中的AMAZON.FallbackIntent和QnABot中的CustomNoMatches项处理“不知道”的答案。当触发时,此函数查看会话和回退意图的请求。如果匹配,则将请求交给Lex V2 dispatcher;否则,QnABot dispatcher使用请求。请参见以下代码:

def dispatch_lexv2(request):
    """概述
    Args:
        request (dict): Lambda事件,包含用户的输入聊天消息和上下文(历史会话)
        使用LexV2会话API管理过去的输入 https://docs.aws.amazon.com/lexv2/latest/dg/using-sessions.html
    
    Returns:
        dict: 描述
    """
    lexv2_dispatcher = LexV2SMLangchainDispatcher(request)
    return lexv2_dispatcher.dispatch_intent()

def dispatch_QnABot(request):
    """概述
    
    Args:
        request (dict): Lambda事件,包含用户的输入聊天消息和上下文(历史会话)
    
    Returns:
        dict: 格式化为文档中所述的QnABot上的“不知道”答案的lambda钩子的字典。
        参见 https://docs.aws.amazon.com/solutions/latest/QnABot-on-aws/specifying-lambda-hook-functions.html
    """
    request['res']['message'] = "嗨!这是您的自定义Python Hook!"
    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会话API来跟踪会话属性和通过先前交互为对话模型提供上下文。请参见以下代码:

class LexConversationalMemory(BaseMemory, BaseModel):

    """使用Lex Conversation历史记录的Langchain自定义内存类
    
    Attributes:
        history (dict): 存储会话历史记录的字典,充当Langchain内存
        lex_conv_context (str): 作为会话历史记录输入的LexV2会话API
            内存从此处加载
        memory_key (str): 聊天历史Langchain内存变量的键 - “history”
    """
    history = {}
    memory_key = "chat_history" #使用键传递到提示
    lex_conv_context = ""

    def clear(self):
        """清除聊天历史记录
        """
        self.history = {}

    @property
    def memory_variables(self) -> List[str]:
        """加载内存变量
        
        Returns:
            List[str]: 包含Langchain内存的键列表
        """
        return [self.memory_key]

    def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, str]:
        """从lex中加载内存到当前Langchain会话内存中
        
        Args:
            inputs (Dict[str, Any]): 当前Langchain会话的用户输入
        
        Returns:
            Dict[str, str]: Langchain内存对象
        """
        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中引入自定义内存类创建的示例代码:

# 使用提示、托管在Sagemaker中的LLM和自定义内存类创建对话链
self.chain = ConversationChain(
    llm=sm_flant5_llm,
    prompt=prompt,
    memory=LexConversationalMemory(lex_conv_context=lex_conv_history),
    verbose=True
)

提示定义

LLM的提示是一个问题或语句,设置了生成的响应的基调。提示作为一种上下文形式,有助于将模型引导到生成相关响应的方向。请参见以下代码:

# 定义提示
prompt_template = """以下是人类和AI之间友好的对话。AI健谈,提供来自其上下文的许多具体细节。如果AI不知道答案,则会诚实地说不知道。如果相关,会提供有关人类提到的实体的信息。

聊天记录:
{chat_history}

对话:
人类: {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.html
        self.intent_request = intent_request
        self.localeId = self.intent_request['bot']['localeId']
        self.input_transcript = self.intent_request['inputTranscript'] # 用户输入
        self.session_attributes = utils.get_session_attributes(
            self.intent_request)
        self.fulfillment_state = "Fulfilled"
        self.text = "" # 来自端点的响应
        self.message = {'contentType': 'PlainText','content': self.text}

class QnABotSMLangchainDispatcher():
    def __init__(self, intent_request):
        # QnABot会话属性
        self.intent_request = intent_request
        self.input_transcript = self.intent_request['req']['question']
        self.intent_name = self.intent_request['req']['intentname']
        self.session_attributes = self.intent_request['req']['session']

先决条件

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

  • 通过可以启动AWS云形成堆栈的用户访问AWS管理控制台
  • 熟悉导航到Lambda和Amazon Lex控制台

部署解决方案

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

  1. 选择Launch Stack以在us-east-1区域中启动解决方案:探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第3张
  2. 对于Stack name,输入唯一的堆栈名称。
  3. 对于HFModel,我们使用JumpStart上可用的Hugging Face Flan-T5-XL模型。
  4. 对于HFTask,输入text2text
  5. S3BucketName保持不变。

这些用于查找Amazon Simple Storage Service(Amazon S3)部署解决方案所需的资产,可能会随着此帖子的更新而发生变化。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第4张

  1. 确认功能。
  2. 选择Create stack

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

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第5张

配置Amazon Lex V2机器人

与Amazon Lex V2机器人无需进行任何操作。我们的CloudFormation模板已经完成了繁重的工作。

配置QnABot

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

  1. 在AWS CloudFormation控制台上,导航到您部署的主堆栈。
  2. Outputs选项卡上,记下LambdaHookFunctionArn,因为您需要在QnABot中插入它。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第6张

  1. 以管理员身份登录QnABot Designer用户界面(UI)
  2. Questions UI中,添加一个新问题。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第7张

  1. 输入以下值:
    • IDCustomNoMatches
    • Questionno_hits
    • Answer – 任何默认的“不知道”答案
  2. 选择Advanced并进入Lambda Hook部分。
  3. 输入先前注意到的Lambda函数的Amazon资源名称(ARN)。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第8张

  1. 滚动到该部分的底部,选择创建。

您将获得一个带有成功消息的窗口。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第9张

您的问题现在可在Questions页面上看到。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第10张

测试解决方案

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

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

此部分可帮助您测试与调用托管LLM的SageMaker端点的Lambda函数集成的Amazon Lex V2机器人。

  1. 在Amazon Lex控制台上,导航到名为Sagemaker-Jumpstart-Flan-LLM-Fallback-Bot的机器人。该机器人已配置为在未匹配其他意图时调用调用SageMaker端点的LLM的Lambda函数作为回退意图。
  2. 在导航窗格中选择Intents

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第11张

右上角显示消息:“English(US)未构建更改。”

  1. 选择Build
  2. 等待完成。

最后,您将获得一个成功消息,如下屏幕截图所示。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第12张

  1. 选择Test

聊天窗口会出现,您可以与模型进行交互。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第13张

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

使用QnABot实例进行测试

本节测试QnABot在AWS集成中调用在SageMaker端点部署的Lambda函数的LLM。

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

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第14张

  1. 选择QnABot Client

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第15张

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

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第16张

  1. 在用户界面中输入任何问题。
  2. 评估回答。

探索生成式人工智能在对话体验中的应用:使用亚马逊Lex、Langchain和SageMaker Jumpstart进行介绍 AI 新闻 第17张

清理

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

  1. 在AWS CloudFormation控制台上,选择名为SagemakerFlanLLMStack(或您为堆栈设置的自定义名称)的堆栈。
  2. 选择删除
  3. 如果您为测试部署了QnABot实例,则选择QnABot堆栈。
  4. 选择删除

结论

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

我们鼓励您:

  • 将对话历史保存到外部持久性机制中。例如,您可以将对话历史保存到Amazon DynamoDB或S3存储桶中,并在Lambda函数钩子中检索它。这样,您就不需要依赖Amazon Lex提供的内部非持久性会话属性管理。
  • 尝试摘要 – 在多轮对话中,生成摘要有助于在提示中添加上下文并限制对话历史的使用。这有助于修剪机器人会话大小并使Lambda函数记忆体消耗低。
  • 尝试提示变体 – 修改与您的实验目的相匹配的原始提示描述。
  • 为实现最佳结果而调整语言模型 – 您可以通过微调高级LLM参数(例如随机性(temperature)和确定性(top_p))来实现这一点。根据您的应用程序。我们演示了使用预训练模型和样本值的示例集成,但是可以通过调整值来适应您的用例。

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

你正在AWS上尝试LLM聊天机器人吗?在评论中告诉我们更多!

资源和参考

  • 本篇文章的配套源代码
  • Amazon Lex V2开发人员指南
  • AWS解决方案库:QnABot on AWS
  • 使用FLAN T5模型进行文本生成
  • LangChain-使用LLMs构建应用程序
  • Amazon SageMaker示例与Jumpstart Foundation Models
  • Amazon BedRock-使用基础模型构建和扩展生成式AI应用程序的最简单方法
  • 使用Amazon Kendra、LangChain和大型语言模型快速构建基于企业数据的高精度生成式AI应用程序
Leave a Reply

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