外事不决有某度,内事不决问 Kendra——自建企业级搜索引擎,方法很简单

image

面对互联网上浩如烟海的数据,如何快速找到自己需要的信息?搜索引擎!输入关键字,回车一下,海量结果等你来检阅。

但在企业环境中,面对五花八门的 IT 系统、文档库,以及其他种类各异的数据源,如何快速找到需要的内容?搜索就行。但假设你需要的信息分布在几个甚至十几个不同的应用或系统中,除了分别在这些地方进行搜索(前提是这些系统支持搜索),还有什么更好的办法吗?

如果能有一种服务,就像互联网上的搜索引擎那样,可以给企业内部的各类数据源创建索引,并让我们在一个位置,通过一次搜索操作,全面搜索内网中的各类数据源,并将结果统一呈现在一起,那该多方便!

Amazon Kendra 请了解一下

Amazon Kendra 是一项易于使用的企业级搜索服务,可帮助我们向应用程序中添加搜索功能,保证最终用户得以轻松从企业内部存储的不同数据源中查找信息(包括收据、业务文档、技术手册、销售报告、公司内部词汇表以及内部网站等)。除了搜索内部数据,我们还可以从Amazon Simple Storage Service(Amazon S3)和 OneDrive 等存储解决方案当中获取信息,甚至支持 SalesForce、SharePoint 及 Service Now 等应用程序,以及Amazon Relational Database Service(Amazon RDS)等关系数据库执行搜索。

在输入查询关键字时,该服务将使用机器学习(ML)算法理解上下文,并返回相关度最高的结果,其中可包含准确答案或完整文档。更重要的是,该服务无需具备任何机器学习经验即可完成操作。Amazon Kendra 还为大家提供了能够轻松与新应用程序或现有应用程序相集成的代码。

本文将介绍如何使用 Amazon Kendra 功能创建企业内部搜索系统,借此构建解决方案以创建并查询自己的搜索索引。在本文的示例中,我们将使用 HTML 格式的 Amazon.com 帮助文档作为数据源,但 Amazon Kendra 也支持微软 Office(.doc、.ppt 等)、PDF 以及其他多种文本格式。

解决方案概述

本文将向大家介绍如何使用 Amazon Kendra 在 AWS 上创建企业搜索引擎。大家可以在一个小时之内配置起新的 Amazon Kendra 索引,且无需掌握深度技术或者丰富的机器学习经验。

本文还将演示如何通过添加常见问题答案,在自定义应用程序中部署 Amazon Kendra 与同步数据源,借此配置定制化 Amazon Kendra 使用体验。后文将详细阐述并解答这些问题。

先决条件

在本轮演练中,需要做好如下准备:

创建并配置文档库

首先需要将文档上传至 S3 存储桶中,而后才能在 Amazon Kendra 中创建索引。本节将介绍如何创建 S3 存储桶,随后获取文件并将其加载至存储桶当中。完成本节中所有步骤后,便拥有了可供 Amazon Kendra 使用的数据源。

  1. AWS 管理控制台的 Region 列表中,选择 US East (N. Virginia)或者希望 Amazon Kendra 运行所在的其他区域(请保证该区域提供 Kendra 服务)。
  2. 选择 Services。
  3. 在 Storage 之下,选择 S3。
  4. 在 Amazon S3 控制台上,选择 Create bucket。
  5. 在General configuration中提供以下信息:
  • Bucket name:kendrapost-{your account id}
  • Region:选择用于部署 Amazon Kendra 索引的同一区域(本文使用美国东部us-east-1,即北弗吉尼亚州区域)。
  1. 在 Bucket settings for Block Public Access下直接使用默认值。
  2. 在 Advanced settings 下直接使用默认值。
  3. 选择 Create bucket。
  4. 下载 amazon_help_docs.zip 并解压此文件。
  5. 在 Amazon S3 控制台上,选定刚刚创建完成的存储桶,而后选择 Upload。
  6. 上传解压后的文件。

此时,在存储桶内应该可以看到两个文件夹:amazon_help_docs(包含3100个对象)以及 faqs(包含1个对象)。

以下截屏所示,为 amazon_help_docs 文件的内容:
image

以下截屏所示,为 faqs 文件的内容:
image

创建索引

索引是 Amazon Kendra 中的一种组件,可提供文档及常见问题的搜索结果。在完成本节的所有步骤之后,我们将可以使用索引搜索来自不同数据源的文档。关于索引的更多详细信息,请参阅索引

要创建第一个 Amazon Kendra 索引,请完成以下操作步骤:

  1. 在控制台上,选择 Services。
  2. 在 Machine Learning 下选择 Amazon Kendra。

image

  1. Amazon Kendra 主页面中,选择 Create an Index。

image

  1. 在 Index details 部分的 Index name 当中,输入 kendra-blog-index。
  2. 在 Description 部分,输入My first Kendra index。
  3. 在 IAM role 部分,选择 Create a new role。
  4. 在 Role name 部分,输入-index-role (角色名称应使用AmazonKendra-YourRegion-前缀)。
  5. 在 Encryption 部分,不要选择 Use an AWS KMW managed encryption key。(默认情况下,我们的数据将使用 Amazon Kendra 所拥有的密钥进行加密。)
  6. 选择 Next。

image

关于 Amazon Kendra 创建的 IAM 角色的更多详细信息,请参阅先决条件。

Amazon Kendra 提供两个版本。其中 Kendra Enterprise 版主要为生产类工作负载提供高可用性服务,Kendra Developer 版则适用于构建概念验证与试验。本文将使用 Developer 版。

  1. 在 Provisioning editions 部分,选择 Developer edition。

选择 Create。
image

关于免费层、文档大小限制以及各 Amazon Kendra 版本总体存储空间的更多详细信息,请参阅 Amazon Kendra 计费标准

索引创建过程最多可能需要30分钟。创建完成后,我们将在页面上方看到一条消息,提示索引已经成功创建。
image

添加数据源

数据源是指存储文档以进行索引的位置。我们可以将数据源与 Amazon Kendra 索引自动同步,保证搜索能够正确反映源存储库内的新文档、更新文档或者已删除文档。

在完成本节中的所有步骤之后,我们将拥有一个与 Amazon Kendra 相链接的数据源。关于更多详细信息,请参阅从数据源中添加文档

在继续下一步前,请保证索引已经创建完成,且索引状态显示为 Active。

  1. 在kendra-blog-index页面中,选择 Add data sources。

image

Amazon Kendra 支持六种数据源类型:Amazon S3、SharePoint Online、ServiceNow、OneDrive、Salesforce online 以及 Amazon RDS。下文我们将以 Amazon S3 为例。

  1. 在 Amazon S3 之下,选择Add connector。

image

关于 Amazon Kendra 所支持的各种不同数据源的详细信息,请参阅从数据源中添加文档

  1. 在 Define attributes 部分的 Data source name位置,输入 amazon_help_docs。
  2. 在 Description 部分,输入 AWS services documentation。
  3. 选择 Next。

image

  1. 在 Configure settings 部分的 Enter the data source location 当中,输入刚创建的 S3 存储桶:kendrapost-{your account id}。
  2. 保留 Metadata files prefix folder location。

默认情况下,元数据文件将与文档存储在同一目录当中。如果要将这些文件放置在其他文件夹中,可以通过添加前缀实现。关于更多详细信息,请参阅S3文档元数据

  1. 在 Select decryption key 部分,取消全部勾选项。
  2. 在 Role name 部分,输入 source-role(角色以 AmazonKendra-为前缀)。
  3. 在 Additional configuration 部分,可以添加模式以包含或排除某些文件夹或文件。在本文的示例中,请直接保留默认值。

image

  1. 在Frequency部分,选择Run on demand。这一步定义了数据源与Amazon Kendra索引间的同步频率。对于本次演练,可以手动执行同步操作(仅一次)。
  2. 选择Next。

image

  1. 在 Review and create 页面中,选择 Create。

image

  1. 在数据源创建完成之后,选择 Sync now 将文档与 Amazon Kendra 索引进行同步。

image

整个同步过程的持续时间取决于索引的文档数量。在本用例中可能需要15分钟,之后应看能到一条消息提示同步成功。
image

在 Sync run history 部分,可以看到有3099个文档同步完成。

使用搜索控制台浏览搜索索引

本节的目的在于通过内置的 Amazon Kendra 控制台浏览可用的搜索查询。

要对之前创建完成的索引进行搜索,请完成以下操作步骤:

  1. 在 Indexes下选择 kendra-blog-index。

image

  1. 选择Search console。

image

Kendra 能够回答三种类型的问题:事实、描述性与关键字问题。关于更多详细信息,请参阅 Amazon Kendra 常见问题解答。我们可以使用之前上传的 Amazon.com 帮助文档提出相关问题。

在搜索字段中,输入:What is Amazon music unlimited?
image

对于这样一个事实性问题(谁、什么、什么时候、什么地方),Amazon Kendra 可以快速回答并提供指向源文档的链接。

在关键字搜索中输入 shipping rates to Canada。以下截屏所示,为 Amazon Kendra 提供的答案。
image

添加常见问题

大家也可以上传一份常见问题列表,为最终用户提出的常见问题直接提供答案。为此,我们需要加载对应的.csv文件,其中包含与问题相关的信息。本节将介绍如何创建并配置此文件,并将其加载至 Amazon Kendra。

  1. 在 Amazon Kendra 控制台上,导航至索引。
  2. 在 Data management 下选择 FAQs。

image

  1. 选择 Add FAQ。

image

  1. 在 Define FAQ project 部分的 FAQ name 当中,输入 kendra-post-faq。
  2. 在 Description 部分,输入 My first FAQ list。

image

Amazon Kendra能够接受.csv文件当中每一行以问题开头、以答案结尾的内容。具体参见下表:
image

下面来看本示例中使用的.csv 文件格式:

"How do I sign up for the Amazon Prime free Trial?"," To sign up for the Amazon Prime free trial, your account must have a current, valid credit card. Payment options such as an Amazon.com Corporate Line of Credit, checking accounts, pre-paid credit cards, or gift cards cannot be used. "," https://www.amazon.com/gp/help/customer/display.html/ref=hp_left_v4_sib?ie=UTF8&nodeId=201910190”
  1. 在 FAQ settings下的 S3 部分,输入s3://kendrapost-{your account id}/faqs/kendrapost.csv。
  2. 在 IAM role 部分,选择 Create a new role。
  3. 在 Role name 部分,输入 faqs-role(角色名称应使用AmazonKendra-YourRegion-前缀)。

image

  1. 选择 Add。
  2. 稍等一会儿,直到状态显示为 Active。

image
现在,我们应该可以在搜索控制台上查看常见问题能否正常起效了。

  1. 在 Indexes 下选择我们的索引。
  2. 在 Data management 下选择 Search console。

image

  1. 在搜索字段中,输入 How do I sign up for the Amazon Prime free Trial?
  2. 以下截屏所示,为 Amazon Kendra 将之前上传的常见问题添加至结果清单,并提供答案与指向该文档的链接。

image

在自有应用程序中使用Amazon Kendra

我们可以在应用程序中通过搜索控制台添加以下组件:

l Main search page:包含所有组件的主页。在这里,可以将应用程序与Amazon Kendra API集成。

l Search bar:可在其中输入搜索词,并调用搜索功能的组件。

l Results:显示Amazon Kendra结果的组件。其中包含三个部分:最佳答案、常见问题解答结果与建议文档。

l Pagination:用于对Amazon Kendra响应结果进行分页的组件。

Amazon Kendra还提供可部署在网站中的源代码。此项功能基于修改后的MIT许可,因此我们可以直接套用或者根据实际需求做出修改。

本节主要讲解如何将Amazon Kendra搜索机制部署到我们自己的网站中。我们将使用运行在本地计算机上的Node.js应用程序进行演示,此用例基于MacOS环境。

要运行此演示,需要准备以下组件:

l Npm (Node.js)

l IAM凭证,由具备适当权限的用户用于访问Amazon Kendra

l 下载amazon_aws-kendra-sample-app-master.zip文件并进行解压。

操作步骤如下:

  1. 打开终端窗口,并前往 aws-kendra-sample-app-master 文件夹:

cd /{folder path}/aws-kendra-sample-app-master

  1. 为.env.development.local.example文件创建一个名为.env.development.local的副本:

cp .env.development.local.example .env.development.local

  1. 编辑.env.development.local 文件,并添加以下连接参数:

l REACT_APP_INDEX:Amazon Kendra 索引 ID(可以在索引主页中找到此编号)。

l REACT_APP_AWS_ACCESS_KEY_ID:账户访问密钥。

l REACT_APP_AWS_SECRET_ACCESS_KEY:账户 secret 访问密钥。

l REACT_APP_AWS_SESSION_TOKEN:在本用例中,将此留空。

l REACT_APP_AWS_DEFAULT_REGION:用于部署 Kendra 索引的区域(例如us-east-1)。

  1. 保存各项变更。
  2. 安装Node.js依赖项:

npm install

  1. 启动本地开发服务器:

npm start

  1. 通过http://localhost:3000/查看演示应用。这时应该可以看到如下所示的内容。

image

  1. 输入之前测试常见问题的同一问题:How do I sign up for the Amazon Prime free Trial?

以下截屏所示,为即使演示网页运行在计算机本地,其结果仍与我们从 Amazon Kendra 控制台处获得的完全相同。
image

资源清理

为避免未使用的角色与策略继续产生不必要成本,请删除之前创建的资源:Amazon Kendra 索引、S3 存储桶以及对应的 IAM 角色。

  1. 若要删除 Amazon Kendra 索引,请在 Indexes下选择 kendra-blog-index。

image

  1. 在 index settings 部分,从 Actions 下拉菜单中选择 Delete。

image

  1. 在 index settings 部分,从 Actions 下拉菜单中选择 Delete ; image

等待直到收到确认删除的消息;整个过程最多可能需要15分钟。 image

关于删除 S3 存储桶的操作说明,请参阅如何删除S3存储桶?

总结

本文介绍了如何使用 Amazon Kendra 部署企业搜索服务。大家可以使用机器学习支持的 Amazon Kendra 改善公司内部的搜索体验,并在不具备任何机器学习/AI 经验的前提下,使用自然语言快速检索文档。

关于 Amazon Kendra 项目的更多详细信息,请参阅 AWS re: Invent 2019大会上 Andy Jassy 做出的主题演讲Amazon Kendra 常见问题解答以及Amazon Kendra 是什么

image

阅读 1.8k

推荐阅读
AWS_AI开发社区
用户专栏

AWS_AI 开发者社区是专注于人工智能领域 IT 人士交流与互动的平台。在这里,你可以分享和获取一切有关人...

882 人关注
79 篇文章
专栏主页