亚马逊AWS官方博客

基于 Amazon Connect、Lex 和 Bedrock 打造智能客户问答方案

前言

Amazon Connect 是一种基于云的联络中心服务,旨在帮助企业提供更灵活、更高效的客户支持。通过集成多种通信渠道和自动化工具,Amazon Connect 能够显著提升客户体验和业务效率。某客户前期已经使用 Amazon Connect 在工作时间为其终端用户提供人工电话咨询服务。为了在非工作时间为终端用户提供自动化问答服务,我们将 Amazon Lex 和 Amazon Bedrock 与现有知识库结合起来,借助大型语言模型,为客户构建一个自动化的问答方案。

方案介绍

本方案中,用户基于 Amazon Connect 通过打电话语音或者聊天窗口文字的方式将问题进行输入,由 Lex 调用后面的 Lambda Function(Rewrite & Get Answer Lambda)进行意图的识别和结合上下文重写问题,如果用户说谢谢时直接进行回复; 如果用户的问题与产品信息无关,会返回询问明确用户意图,如果是咨询产品问题先在知识库中查询到相关的知识数据,再交给大语言模型针对当前问题进行回答。

本方案中知识库我们使用了 Amazon Bedrock Knowledge Base。这个服务使用方式相对简单,只需要调用 Bedrock Knowledge Base 的 API 即可就可以对知识库进行查询。Bedrock Knowledge Base 的数据源来源于 S3 桶,用户可以离线准备好知识库的文件,将其上传到 S3 Bucket,在 Bedrock Knowledge Base 中点击同步按钮即可。

整个方案的架构图如下图所示,其中连线上的数字序号代表每个问答请求进来之后的执行顺序:

本方案的架构中主要组件和服务包括:

Amazon Connect:基于云的联络中心服务,帮助企业以低于传统联络中心系统的成本,通过语音和聊天渠道提供卓越的客户服务。在本项目中,它作为用户交互的服务,包括人工和自动化客户服务。

Amazon Lex:本项目中我们直接从流程中调用 Amazon Lex,以调用 Lex 机器人进行自然语言理解(NLU)和自动语音识别(ASR)。

Lambda:AWS Lambda 服务,允许无服务器计算和事件驱动的应用程序。在本项目中,它用于对话管理和与 Bedrock 知识库及其他服务的交互。核心处理逻辑将在 Lambda 中运行。

Amazon OpenSearch Serverless:Amazon OpenSearch 服务中的无服务器选项。开发人员可以使用 OpenSearch Serverless 运行 PB 级工作负载,而无需配置、管理或扩展 OpenSearch 集群。它提供与 OpenSearch 服务相同的交互式毫秒级响应时间,同时享受无服务器环境的简便性。在本项目中,它作为知识库存储。

Amazon Bedrock:Amazon Bedrock 是一种完全托管的服务,通过单一 API 提供来自领先 AI 公司(如 AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI 和 Amazon)的高性能基础模型(FMs),以及构建生成式 AI 应用所需的各种功能,确保安全、隐私和负责任的 AI。在本项目中,我们通过它的 API 使用 Embedding 模型和 LLM。

DynamoDB:Amazon DynamoDB 服务,一种完全托管的 NoSQL 数据库。在本项目中,它用于存储用户的会话数据,来自 Connect 的一次连接作为一次 Session。

S3:Amazon S3(简单存储服务)。用于离线存储已有的问答对、用户手册等对用户提问有帮助的知识数据。

知识库建立

Amazon Bedrock 的知识库为您提供了将数据源汇集到信息存储库的能力。通过知识库,您可以轻松构建一个应用程序,利用检索增强生成(RAG)技术。在这种技术中,从数据源检索信息来增强模型响应的生成。

数据源包含可在查询知识库时检索的信息文件。您可以通过将源文档文件上传到 Amazon S3 存储桶来为知识库设置数据源。

请确保每个源文档文件符合以下要求,首先,文件必须是以下支持格式之一:

格式 后缀
Plain text .txt
Markdown .md
HyperText Markup Language .html
Microsoft Word document .doc/.docx
Comma-separated values .csv
Microsoft Excel spreadsheet .xls/.xlsx
Portable Document .pdf

每个知识数据的文件大小不得超过 50 MB 的配额。有关更多信息,请参阅知识库配额

您可以选择为数据源中的文件添加元数据以进行过滤。元数据允许在查询知识库时对数据进行过滤。要为数据源中的文件包含元数据,请创建一个 JSON 文件,其中包含一个 metadataAttributes 字段,该字段映射到一个对象,该对象为每个元数据属性包含一个键值对。然后将其上传到 Amazon S3 存储桶中与源文档文件相同的文件夹中。以下显示了元数据文件的一般格式:

{
    "metadataAttributes": {
        "brand": "product-brand", 
        "category": "product-category",
        "products": ["product1-name","product2-name"]
    }
}

以下数据类型支持作为属性的值:

  • 字符串(String)
  • 数字(Number)
  • 布尔值(Boolean)

请确保每个元数据文件符合以下要求:

  • 文件名与其关联的源文档文件相同。
  • 在文件扩展名后添加 .metadata.json(例如,如果您有一个名为 pdf 的文件,则元数据文件必须命名为 product_quick_guide.pdf.metadata.json)。
  • 元数据文件大小不得超过 10 KB 的配额。
  • 文件位于 Amazon S3 存储桶中与其关联的源文档文件相同的目录中。

如果您要向 Amazon Knowledge Base 数据库集群中的现有向量索引添加元数据(metadata),则必须在开始 Sync(同步)之前,为元数据文件中的每个元数据属性向表中添加一列。元数据属性值将写入这些列中。同步数据源后,您可以在查询知识库时过滤结果。

以下是我们在实施本次项目时在 Lambda Function 查询知识库的示例代码:

import boto3
import logging

# 创建bedrock agent client
agent_client = boto3.client("bedrock-agent-runtime")

# 从Bedrock Knowledge Base中获取数据
response = agent_client.retrieve(
    knowledgeBaseId=os.environ.get("KNOWLEDGE_BASE_ID"),
    retrievalQuery={"text": question},
    retrievalConfiguration={
        "vectorSearchConfiguration": {
            "numberOfResults": 10,
            "filter": {'andAll': [{'equals': {'key': 'brand', 'value': 'my-brand'}},
                        {'equals': {'key': 'category', 'value': 'my-category'}},
                        {'in': {'key': 'products', 'value': ['product1', 'product2']}}
                       ]
                      },

        },
    },
)

logger.info(f"knowledge base response: {response}")

# 根据Knowledge Base返回的数据构造传入大语言模型的documents参数
i = 0
for item in response['retrievalResults']:
    docs.append({"id": "doc_" + str(i), "snippet": item['content']['text']})
    i += 1

以上代码中 vectorSearchConfiguration 中的 filter 即为根据 metadata 筛选知识数据的部分, 其中对于 products 这个字段,由于它在 metadata 文件中的类型是一个 List, 因此在查询时也需要做相应的适配,查询关键字为 in,并且 value 也可以是一个 List。

这里有两个限制需要注意:

  1. 如果 filter 的 value 是一个 list,那么这个 list 的长度目前不能超过 10 个 value。
  2. 目前用 filter 查询时有字符长度限制,整个 filter 对应的字典的 value 的字符不能太长。

以上两点,在设计 metadata 的结构时需要考虑。

同时在准备知识库数据时,我们建议多使用文本文件,比如 TXT 或 Word。PDF 在 Knowledge Base 自动处理时,可能会由于 PDF 本身的图片和文字设置的问题导致一些文字不能被很好的识别出来,并且 PDF 在文件超过 50MB 时也会同步失败,本次项目中,我们对于大于 50MB 的 PDF 文件进行了提前处理,将其转换为 TXT 文件后再上传到 Knowledge Base 的 S3 bucket。

Connect 配置

本次方案中我们支持中文和英文问题的回答,需要配置在 Connect Flow 中配置一个电话提示音,您可以根据需求提前准备一个 WAV 的音频文件, 例如这个音频文件的语音为:“您好,我是某某助手,可以帮您回答某某问题,中文请按 1,For English press 2 please”,您可以直接在 Connect 控制台将您的 WAV 文件上传到 Prompts,并在 Connect Flow 中修改音频提示。

在 Connect Flow 中的几个配置举例。

下图是是配置 Prompt 的举例,其中 1、2 不同按键对应不同的语言选择:

为了提供更好的电话应答体验给用户,我们建议您根据当前流程调整一些参数以满足您的期望。本链接包含了用户语音输入的一些属性。请根据您的需求进行配置。例如,如果您想增加 start-timeout-ms(其默认值为 4000 毫秒),可以将其添加到上图中 max-speech-duration 的同一级别,并相应地设置其值。

请注意,在目前的服务中,Lex 的响应时间不应超过 10 秒。如果您的 Lex 服务无法在规定时间内返回结果,请考虑重新设计您的流程,将其拆分为不同的步骤,以获得更多处理时间。

总结

通过 AWS 快速原型团队和 Account 团队的优化和扩展,基于 Amazon Bedrock 知识库的自动问答服务将为客户提供更智能、更高效的解决方案,帮助客户在竞争激烈的市场中脱颖而出,赢得更多用户的信赖和满意。 这个博客概述详细介绍了客户现有系统的背景、Amazon Bedrock 知识库的功能以及优化后的自动问答服务的优势,旨在展示如何通过技术手段提升客户支持的效率和质量。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

有用的链接

  1. Amazon Connect 服务配额 https://docs.thinkwithwp.com/zh_cn/connect/latest/adminguide/amazon-connect-service-limits.html
  2. Amazon Bedrock Knowledge Base 配额 https://docs.thinkwithwp.com/bedrock/latest/userguide/quotas.html#quotas-kb

本篇作者

贾婷

亚马逊云科技快速原型解决方案架构师,致力于帮助客户设计和开发大数据方向的快速原型方案,有游戏、汽车等行业的大数据开发经验。

洪丹

亚马逊云科技原型解决方案架构师,负责机器学习应用场景的快速构建,为客户提供高效、精准的解决方案,以满足他们独特的业务需求和挑战。

邓冠群

亚马逊云科技原型解决方案架构师,专注于快速构建机器学习应用场景,为客户提供高效且精准的解决方案,有丰富的视觉和大语言模型项目的开发经验。

陈灝

亚马逊云科技技术客户经理,专注为客户提供量身的顾问服务,包括战略评估、安全改进、架构优化和成本管理等,并在 AWS 平台上为客户的应用提供全面指导,确保客户获得最大价值。