在 Amazon Bedrock 和 Amazon Kendra 上构建生成式 AI Slack 聊天助手
关键要点
员工和利益相关者在信息检索中面临挑战,影响工作效率。生成式 AI Slack 聊天助手可通过自然语言处理快速响应用户查询。本文提供构建智能聊天助手的架构框架,利用 Amazon Kendra 和 Amazon Bedrock 提升信息获取效率。尽管商业环境中信息和数据大量存在,员工和相关利益方常常仍需费时搜索信息,难以快速有效地得到问题的答案。这种情况可能导致生产力下降、挫折和决策延迟。
一个生成式 AI Slack 聊天助手能够帮助解决这些挑战,为用户提供一个随时可用的智能界面,便于他们获取所需信息。通过使用生成式 AI 的自然语言处理和生成能力,聊天助手能够理解用户的查询,从各种数据源中检索相关信息,并提供量身定制的上下文响应。
通过利用生成式 AI 的强大功能以及 AWS 服务,如Amazon Bedrock、Amazon Kendra、Amazon Lex,本解决方案提供了一个示例架构来构建一个智能 Slack 聊天助手,从而简化信息访问,提升用户体验,推动组织内生产力和效率。
一元梯子为什么选择 Amazon Kendra 构建 RAG 应用?
Amazon Kendra 是一项完全托管的服务,提供即开即用的语义搜索功能,具有文档和段落的最新排名能力。您可以利用 Amazon Kendra快速构建高精度的生成式 AI 应用,获取最相关的内容和文档,最大化您检索增强生成RAG有效负载的质量,从而提供比传统关键词搜索解决方案更好的大型语言模型LLM响应。Amazon Kendra 提供易用的深度学习搜索模型,预先训练在 14 个领域上,无需机器学习ML专业知识。它能够从多种来源索引内容,包括数据库、内容管理系统、文件共享和网页。
此外,Amazon Kendra 的 FAQ 功能相辅相成,允许 RAG 系统无缝切换在提供预写的常见问题响应和动态生成响应之间。这样,RAG 系统就能在生成响应时访问广泛的知识基础。通过将Amazon Kendra 的 FAQ 能力整合到 RAG 系统中,模型可以使用一组经过策划的高质量、权威的答案应对常见问题。这不仅可以提高整体响应质量和用户体验,还能减少语言模型从头生成基础响应的负担。
该解决方案在模型选择、提示工程和增加 FAQ 的自定义方面保持良好平衡,同时无需处理通常在 RAG 实施中所需的词嵌入、文档切块及其他底层复杂性。
解决方案概述
该聊天助手旨在通过回答用户的问题并提供各种主题的信息来协助用户。聊助手的目的是作为一个内部工具,帮助员工和利益相关者找到所需信息。

该架构使用 Amazon Lex 进行意图识别,利用AWS Lambda 处理查询,通过 Amazon Kendra 搜索常见问题和网页内容使用 Amazon Bedrock 生成上下文响应。通过结合这些服务,聊天助手能够理解自然语言查询,从多个数据源中检索相关信息,并提供符合用户需求的人性化响应。该解决方案展示了生成式 AI 在创建智能虚拟助手方面的能力,能够基于模型选择、FAQ 和修改系统提示及推理参数来优化工作流程和用户体验。
架构图
以下图示展示了 RAG 方法,用户通过 Slack 应用发送查询,收到基于 Amazon Kendra 索引数据生成的响应。在本文中,我们使用 Amazon Kendra 网页爬虫作为数据源,并包含存储在Amazon 简单存储服务(Amazon S3)上的常见问题。有关 Amazon Kendra 支持的数据源连接器的列表,请参见数据源连接器。
该架构的逐步工作流程如下:
用户通过 Slack 应用发送诸如 AWS WellArchitected Framework 是什么?的查询。查询发送至 Amazon Lex,由其识别意图。目前在 Amazon Lex 中配置有两个意图欢迎 和 回退意图。欢迎意图配置为在用户输入问候语如“嗨”或“你好”时回应问候。助手会回复:“您好!我可以帮助您回答基于提供的文档的查询。请问我可以帮您什么?” 回退意图通过 Lambda 函数实现。Lambda 函数通过 searchKendraFAQ 方法搜索 Amazon Kendra FAQ,参数是用户查询和 Amazon Kendra 索引 ID。如果有匹配且信心得分高,FAQ 的答案将返回给用户。pythondef searchKendraFAQ(question kendraindexid) 此函数接收用户的问题,检查问题是否存在于 Kendra FAQ 中。 param question 用户通过前端输入框问的内容。 param kendraindexid 包含文档和 FAQ 的 Kendra 索引。 return 如果在 FAQ 中找到,则返回答案以及任何相关链接;如果未找到,则返回 False,随后调用 kendraretrievedocument 函数。 kendraclient = boto3client(kendra) response = kendraclientquery(IndexId=kendraindexid QueryText=question QueryResultTypeFilter=QUESTIONANSWER) for item in response[ResultItems] scoreconfidence = item[ScoreAttributes][ScoreConfidence] if scoreconfidence == VERYHIGH and len(item[AdditionalAttributes]) gt 1 text = item[AdditionalAttributes][1][Value][TextWithHighlightsValue][Text] url = 无 if item[DocumentURI] != url = item[DocumentURI] return (text url) return (False False)
如果没有达到足够的信心得分,则将通过 kendraretrievedocument 方法检索 Amazon Kendra 中的相关文档,并将其发送到 Amazon Bedrock 以生成响应作为上下文。pythondef kendraretrievedocument(question kendraindexid) 此函数接收用户的问题,并检索基于默认页数为 10 的相关段落。 param question 用户通过前端输入框问的内容。 param kendraindexid 包含文档和 FAQ 的 Kendra 索引。 return 返回要发送给 LLM 的上下文和返回相关数据源的文档 URI。 kendraclient = boto3client(kendra) documents = kendraclientretrieve(IndexId=kendraindexid QueryText=question) text = uris = set() if len(documents[ResultItems]) gt 0 for i in range(len(documents[ResultItems])) scoreconfidence = documents[ResultItems][i][ScoreAttributes][ScoreConfidence] if scoreconfidence == VERYHIGH or scoreconfidence == HIGH text = documents[ResultItems][i][Content] n urisadd(documents[ResultItems][i][DocumentURI]) return (text uris)
Amazon Bedrock 将使用 invokeLLM 方法生成响应。以下是实现中的 invokeLLM 方法的一个代码段。有关修改传递到 Amazon Bedrock 调用模型请求的参数的更多信息,请参见推理参数和系统提示pythondef invokeLLM(question context modelId) 此函数接收用户的问题以及 Kendra 响应作为上下文,以生成应用前端的答案。 param question 用户通过前端输入框问的内容。 param documents Kendra 文档检索查询的响应,用作生成更好答案的上下文。 return 返回最终的答案,提供给询问原始问题的最终用户。 # 设置 Bedrock 客户端 bedrock = boto3client(bedrockruntime) modelId = modelId
body = jsondumps({ maxtokens 350 system 你是一个诚实的 AI 助手。你的目标是根据提供的文档为查询提供信息和实质性的回应。如果你不知道问题的答案,你应该诚实地说你不知道。 messages [{role user content 回答此用户查询 question ,上下文为 context}] anthropicversion bedrock20230531 temperature 0 topk 250 topp 0999})# 调用带有您指定的参数的 Bedrock 模型response = bedrockinvokemodel(body=body modelId=modelId)responsebody = jsonloads(responseget(body)read())answer = responsebodyget(content)return answer最后,从 Amazon Bedrock 生成的响应和相关引用 URL 返回给最终用户。在选择要索引的网站时,需遵循AWS 可接受使用政策和其他 AWS 条款。请记住,您只能使用 Amazon Kendra 网页爬虫索引您自己的网页或您获授权的网页。有关如何将网页爬虫作为数据源的信息,请访问Amazon Kendra 网页爬虫 数据源指南。使用 Amazon Kendra 网页爬虫对您不拥有的网站或网页进行快速爬取是不被允许的。
支持的功能
聊天助手支持以下功能:
支持 Amazon Bedrock 的以下 Anthropic 模型:claudev2claude3haiku20240307v10claudeinstantv1claude3sonnet20240229v10支持常见问题和 Amazon Kendra 网页爬虫数据源仅在信心得分为 VERYHIGH 时返回常见问题的答案仅检索 Amazon Kendra 中信心得分为 HIGH 或 VERYHIGH 的文档如果未找到信心得分高的文档,聊天助手将返回“未找到相关文档”。前置条件
要执行该解决方案,您需要具备以下前置条件:
对 AWS 的基本知识一个AWS 帐号,具备访问 Amazon S3 和 Amazon Kendra 的权限一个 S3 存储桶来存储您的文档。有关更多信息,请参阅步骤 1:创建您的第一个 S3 存储桶和Amazon S3 用户指南。一个与聊天助手集成的 Slack 工作区在 Slack 工作区中安装 Slack 应用的权限Amazon Kendra 网页爬虫数据源的种子 URL您需要授权才能抓取和索引任何提供的网站使用AWS CloudFormation 部署解决方案资源。构建生成式 AI Slack 聊天助手
要构建 Slack 应用,请按照以下步骤进行:
请求 Amazon Bedrock 的模型访问以获取所有 Anthropic 模型的权限。在 useast1北弗吉尼亚AWS 区域中创建 S3 存储桶。将AIBotLexJsonzip和SampleFAQcsv文件上传到 S3 存储桶。在 useast1北弗吉尼亚AWS 区域中启动 CloudFormation 栈。输入您选择的 栈名称。对于 S3BucketName,请输入步骤 2 中创建的 S3 存储桶的名称。对于 S3KendraFAQKey,请输入步骤 3 中上传到 S3 存储桶的 SampleFAQs 的名称。对于 S3LexBotKey,请输入步骤 3 中上传到 S3 存储桶的 Amazon Lex zip 文件的名称。对于 SeedUrls,输入多达 10 个 URL 作为网页爬虫的种子 URL,以逗号分隔。在本文示例中,给出公开可用的 Amazon Bedrock 服务页面作为种子 URL。其余项保持默认。选择 下一步。在 配置栈选项 页面再次选择 下一步。通过选择方框确认并选择 提交,如下截图所示。等待栈创建完成。验证所有资源已经创建。在 AWS 管理控制台中测试 Amazon Lex。在 Amazon Lex 控制台中,选择您的聊天助手 {YourStackName}AIBot。选择 意图。选择 版本 1,然后选择 测试,如下截图所示。选择 AIBotProdAlias,然后选择 确认,如下截图所示。如果需要对聊天助手进行更改,可以使用草稿版本,发布新版本,并将新版本分配给 AIBotProdAlias。了解有关版本控制和别名的更多信息。用诸如“哪个 AWS 服务具有 11 个九位的耐久性?”和“什么是 AWS WellArchitected Framework?”等问题测试聊天助手,并验证响应。以下表格显示了样本 csv 文件中有三个常见问题。问题 答案 来源uri哪个 AWS 服务具有 11 个九位的耐久性? Amazon S3 https//awsamazoncom/s3/什么是 AWS WellArchitected Framework? AWS WellArchitected Framework 使客户和合作伙伴能够使用一致的方法审查其架构,并提供改进设计的指导。 https//awsamazoncom/architecture/wellarchitected/Amazon Kendra 可用在哪些区域? Amazon Kendra 目前可用的 AWS 区域为:北弗吉尼亚、俄勒冈和爱尔兰。 https//awsamazoncom/aboutaws/globalinfrastructure/regionalproductservices/ 以下截图展示了问题 “哪个 AWS 服务具有 11 个九位的耐久性?” 及其响应。您可以观察到响应与 FAQ 文件相同并包含链接。![问题响应](https//d2908q01vomqb2cloudfrontnet/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59/