AWS 기술 블로그

Amazon Kendra로 모든 유형의 자료 검색 구축하기 [1부-인덱스 생성과 문서 검색]

자료 검색 엔진 구축을 위해서는 편리한 UI/UX 제공, 빅데이터 및 인공지능 기술의 활용, 검색 엔진을 활용한 분석 및 시각화 등을 제공하여야 하며 다양한 데이터 소스를 연결하여 분산되어 있는 자료를 검색하고 관리하는 것이 필요합니다. 이러한 검색 엔진 구축을 통해 기업의 직원들은 필요한 정보를 훨씬 빠르게 찾고, 더 효과적으로 협업하며, 새로운 제품을 빠르게 개발할 수 있습니다.

Amazon Kendra는 자료 검색 엔진을 고객이 직접 구축할 필요없이 필요한 모든 기능을 완전 관리형 서비스로 제공합니다. 많은 고객들이 Amazon Kendra를 통해 위에서 언급된 자료 검색 엔진의 장점을 경험하고 있습니다. (Amazon Kendra 고객 사례)

Amazon Kendra는 여러 데이터 소스에 존재하는 문서와 텍스트 유형의 데이터를 크롤링하여 검색 결과에 반영하는 지능형 검색 엔진 서비스입니다. 데이터를 추출하거나 데이터 소스 연결을 위한 커넥터를 만들거나 인덱스에 대한 튜닝 작업을 구현할 필요 없이, 몇 번의 클릭만으로 검색 인덱스를 생성하고 바로 쿼리할 수 있습니다. 또한, SSO 구성을 위한 검색 애플리케이션 사용, 프론트 엔드 애플리케이션을 직접 구현할 필요 없이 제공되는 기능을 이용하여 통합 자료 검색 애플리케이션을 쉽게 구축할 수 있습니다. 이를 통해 전통적인 자료 검색 방식인 자산의 제목, 설명, 파일명 등 적은 정보를 기반으로 검색하는 것이 아닌 실제 찾고자 하는 자료의 내용을 기반으로 더욱 빠르게 찾고 비즈니스에 활용할 수 있습니다. (지원되는 Amazon Kendra 데이터 소스 커넥터 리스트)

배경

실제 비즈니스에서 사용되는 자료는 텍스트와 문서에 그치지 않고 음성, 영상, 웹사이트, 이미지 등으로 확장됩니다. 이러한 유형의 자료가 더 많이 사용되는 산업이 있기도 합니다. 텍스트와 문서와 마찬가지로 음성, 영상, 웹사이트, 이미지와 같은 자료들도 하나의 검색 플랫폼에서 분류되어 저장되고 내용을 기반으로 검색되면 비즈니스에서 자료를 활용하는 효율성이 크게 증가할 것입니다.

이 블로그 시리즈에서는 Amazon Kendra를 사용하여 기본 인덱스 생성과 문서 검색부터 음성, 영상, 웹사이트, 이미지에 대한 자산 유형을 검색할 수 있는 방법에 대해 안내합니다. 이를 통해 비즈니스에서 활용되는 모든 유형에 대한 자료 검색 플랫폼을 구축하는 방법을 단계별로 안내합니다.

  • 1부 – 인덱스 생성과 문서 검색
  • 2부 – 음성 및 영상 검색
  • 3부 – 웹 사이트 검색
  • 4부 – 이미지 검색
  • 5부 – Generative AI를 활용하여 더 똑똑한 검색과 자료 관리

필수 단계인 1부를 제외한 나머지는 독립적으로 구성할 수 있도록 작성된 가이드입니다. 비즈니스에서 주로 활용하고 있는 유형에 대한 자료 검색, 분류 및 관리를 원하시는 경우, 유형에 맞는 해당 시리즈의 다른 블로그 포스팅을 참고하시기 바랍니다.

시리즈 최종 목표 구성도

아래의 구성도는 가장 기본적인 아이디어만을 나타냅니다. Amazon Kendra와 연결되어질 검색 대상 데이터 소스로는 Amazon S3를 사용합니다. AWS AI 서비스들을 사용하여 Amazon Kendra에서 지원하는 포맷으로 자료를 변환한 뒤에 데이터 소스에 등록하여 검색 가능하도록 구현합니다.

인덱스 생성하기

Amazon Kendra를 시작하기 위해서 검색 대상을 담고 있는 인덱스를 생성하여야 합니다. 인덱스를 생성하면 검색 엔진을 위한 인프라를 서비스가 프로비저닝하기 때문에 유저는 별도의 검색 인프라 구축 작업 및 관리를 할 필요가 없습니다.

Amazon Kendra 인덱스는 아래와 같이 두가지 에디션으로 제공됩니다.

원하는 용도에 맞는 한도를 제공하는 에디션을 선택하여 사용하시면 됩니다.

해당 블로그 가이드에서는 개발자 에디션을 선택하겠습니다.

  1. 해당 링크에서 인덱스를 생성합니다. 인덱스는 Amazon Kendra가 지원되는 도쿄(ap-northeast-1) 리전에 생성합니다.
  2. [Index name]에 원하는 인덱스 명을 입력합니다.
  3. [IAM role]은 [Create a new role]로 선택하고 인덱스의 역할에 대한 이름을 입력합니다.
  4. [Next]를 클릭합니다. [Configure user access control]은 추후 AWS SSO 구성 후, 설정합니다. 바로 [Next]를 클릭하여 넘어갑니다.
  5. 원하는 에디션을 선택하고 [Create]를 클릭합니다.
  6. 약 15 – 30분 후에 아래와 같이 검색할 수 있는 인덱스가 생성됩니다.
  7. [Index setting] 부분의 Index ID 와 Role ARN 을 기록해둡니다.

검색 대상 S3 버킷 설정하기

위에서 생성한 Amazon Kendra 인덱스와 연결되어지는 데이터 소스인 S3 버킷을 생성합니다. 데이터 소스로 S3를 선택한 이유는 여러가지가 있지만 가장 핵심적으로는 Amazon S3 document metadata 기능을 활용하기 위해서 입니다. 이 기능은 S3에 저장된 객체에 대하여 추가 정보를 인덱스에 제공합니다.

해당 기능은 문서 객체에 대하여 [카테고리], [태그], [요약 정보], [뷰 카운트]등과 같은 메타데이터를 아래와 같이 JSON 파일을 만들어 <document>.<extension>.metadata.json 와 같은 형식으로 파일명을 지정하여 문서 객체와 동일한 경로에 저장하게 되면 Amazon Kendra가 데이터 소스에 대한 크롤링 시에 해당 정보를 검색 결과에 반영합니다. 또한, 아래와 같이 메타데이터에 대한 필드를 인덱스에 추가하여 필드에 대한 [Facetable], [Searchable], [Displayable], [Sortable] 설정을 할 수 있습니다.

실제사용법과 사례에 대해서는 이후 시리즈에서 다루겠습니다. 먼저, S3 버킷을 생성하고 Amazon Kendra가 버킷에 접근하여 크롤링 할 수 있도록 IAM 정책을 인덱스의 역할에 추가할 것입니다. 그런 다음, Kendra Connector를 통해 S3 연결을 설정합니다.

  1. 해당 링크에서 S3 버킷을 생성합니다.
  2. [Bucket name]은 중복을 피해 고유한 값을 입력합니다.
  3. [AWS Region]은 Amazon Kendra 인덱스의 리전과 동일한 리전을 선택합니다. 해당 블로그에서는 도쿄(ap-northeast-1)을 사용합니다.
  4. 나머지 설정은 변경하지 않고 [Create bucket]을 눌러 생성합니다.
  5. IAM의 역할에서 AmazonKendra- 로 검색하여 인덱스의 역할을 찾아 선택합니다.
  6. [Add permissions → Create inline policy]를 선택합니다.
  7. [JSON]탭을 클릭하고 아래 항목에서 YOUR_BUCKET_NAME , YOUR_REGION , YOUR_ACCOUNT_NUMBER , YOUR_KENDRA_INDEX_ID 항목을 알맞게 변경하여 붙여 넣고 [Review policy]를 클릭합니다.

아래는 실제 JSON의 예시입니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR_BUCKET_NAME/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR_BUCKET_NAME"
            ],
            "Effect": "Allow"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kendra:BatchPutDocument",
                "kendra:BatchDeleteDocument"
            ],
            "Resource": [
                "arn:aws:kendra:YOUR_REGION:YOUR_ACCOUNT_NUMBER:index/YOUR_KENDRA_INDEX_ID"
            ]
        }
    ]
}
  1. [Name]을 입력하고 [Create policy]를 클릭하여 생성합니다.
  2. 다시 Amazon Kendra의 Indexes로 돌아와 생성한 인덱스를 선택합니다.
  3. 좌측 패널에서 [Data management → Data sources]를 클릭합니다.
  4. [Amazon S3 connector]를 찾아 선택합니다.
  5. [Data source name]과 [Description]을 입력하고 [Language]는 Korean (ko) 을 선택합니다. [Next]를 클릭합니다.
  6. [IAM role]은 [Enter a custom IAM role ARN]을 선택하고 인덱스의 Role ARN 을 입력하고 [Next]를 클릭합니다.
  7. [Sync scope]의 [Enter the data source location]에 s3://YOUR_BUCKET_NAME 을 입력합니다.
  8. [Sync run schedule]의 [Frequency]는 [Run on demand]로 선택합니다. (해당 데이터 소스에 대하여 얼마의 주기로 Sync 작업을 할 것인지 설정하는 것입니다.)
  9. 추가 설정 없이 [Next]를 클릭하고 설정을 확인한 후, [Add data source]를 클릭하여 인덱스에 대한 S3 데이터 소스를 생성합니다.

검색해보기

Amazon Kendra와 연결된 S3 버킷에 아래 지원되는 유형의 객체를 업로드하고 결과가 어떻게 나오는지 확인해보겠습니다.

Amazon Kendra에서 S3에 저장된 객체에 대하여 지원되는 포맷은 아래와 같습니다.

  • HTML files
  • Microsoft PowerPoint (PPT) presentations
  • MS WORD documents
  • Plain text documents
  • PDFs
  • Comma Separated Values (CSV) files
  • Microsoft Excel (MS EXCEL) files
  • XML files
  • JSON files
  • Markdown Documentation (MD) files
  • Rich Text Format (RTF) files
  • Extensible Stylesheet LanguageTransformation (XSLT) files

이 중, 아무 포맷을 선택하여 검색 대상 파일을 준비합니다.

  1. S3 버킷 리스트에서 Amazon Kendra와 연결된 버킷을 찾아 선택합니다.
  2. [Create folder]를 클릭하고 [Folder name]에는 document 를 입력합니다. [Create folder]를 클릭하여 폴더를 생성합니다.
  3. 생성된 폴더를 선택하고 [Upload]를 클릭하여 지원되는 포맷의 파일을 업로드합니다.
  4. 생성한 Amazon Kendra 인덱스로 돌아와서 좌측 패널의 [Data sources]를 클릭하고 S3 데이터 소스를 선택합니다.
  5. [Sync now]를 클릭하여 업로드 된 객체를 크롤링합니다.
  6. Sync의 상태가 Completed로 되면 좌측 패널에서 [Search indexed content]를 클릭합니다.
  7. 아래 스크린샷과 같이 언어 설정을 해준 후, 검색 창에 찾고자 하는 내용을 입력하고 엔터를 누릅니다. 

사용 방안

이번 가이드에서는 기초적인 Amazon Kendra의 인덱스 생성과 검색 대상이 되는 S3 데이터 소스의 연결을 진행했습니다. 중요한 것은 Amazon Kendra는 검색 엔진을 머신러닝 기반으로 제공합니다. 우리는 제공되는 검색엔진에 쿼리를 날려 원하는 검색 결과를 얻어야합니다.

이에 대한 방법으로 Amazon Kendra는 프론트엔드 레벨로는 크게 앞에서 사용한 [Search indexed content]와 Experience를 제공합니다. Experience는 사용자가 코드 없이 인덱스에 대한 검색 프론트 애플리케이션을 드래그앤 드롭으로 구성하여 배포할 수 있게하는 기능입니다.

해당 기능을 통해서 간단한 뷰 구성을 하여 AWS IAM Identity Center와의 통합을 통해 인증된 사용자가 접속하여 검색할 수 있도록 할 수 있습니다.

하지만 자체로 지원되는 구성만 가능하여 아래와 같이 영상에 대한 검색 기능을 개발하기 위해 이에 맞는 뷰를 구성하기 위해서는 별도의 프론트엔드 애플리케이션을 만드는 것이 필요합니다.

따라서, 모든 유형의 자료를 위한 검색 애플리케이션을 만드는 경우, Amazon Kendra를 검색을 위한 하나의 백엔드 애플리케이션으로 활용할 수 있어야 하고 프론트엔드 애플리케이션은 별도의 개발이 필요할 수 있습니다.

검색 백엔드 애플리케이션을 위해 Amazon Kendra는 AWS SDK를 지원하며 애플리케이션에서 쿼리하고 결과를 받을 수 있으며 검색 이외에도 모든 Amazon Kendra의 기능들이 SDK로 구현 가능합니다. (링크는 AWS Javascript SDK 예시입니다.)

정통적인 문서를 위한 검색 백엔드 시스템 구축은 검색 클러스터의 운영과 관리부터 튜닝 작업 언어별로 필요한 라이브러리 구성 등 굉장히 시간과 인프라 투자가 많이 필요한 작업입니다. 하지만, Amazon Kendra는 이를 대신하여 설명 드린 기능들을 제공함으로써 이러한 문제를 해결합니다.

다음 블로그 포스팅에서는 AWS AI 및 서버리스 서비스들을 이용하여 콘텐츠를 텍스트화하여 Amazon Kendra를 통해 검색할 수 있도록 하는 방법을 가이드할 예정입니다.

마무리

이번 가이드에서는 Amazon Kendra의 인덱스 생성과 검색 대상이 되는 S3 데이터 소스의 연결 방법을 소개했습니다. 이를 통해 기본적인 문서 또는 텍스트 유형의 자료에 대한 검색을 손쉽게 구축할 수 있습니다.

Amazon Kendra는 검색 백엔드 시스템 구축에 필요한 많은 비용과 시간을 절약할 수 있으며, 인덱스 생성과 데이터 소스 연결 등의 작업은 상대적으로 쉽고 빠르게 진행될 수 있습니다. 또한, 머신러닝을 기반으로 제공되는 검색 엔진으로 정확한 검색 결과를 제공할 수 있어, 사용자들의 검색 편의성을 높일 수 있습니다.

이 시리즈에서는 Amazon Kendra에서 기본 제공되는 문서, 텍스트 유형에 그치는 것이 아닌 음성, 영상, 웹사이트, 이미지 등에 대한 검색의 구현 방법을 백엔드 애플리케이션 관점으로 가이드하여 여러분들이 비즈니스에서 활용하고 있는 모든 유형의 자료를 하나의 검색엔진에서 검색하고 관리할 수 있도록 하고자 합니다.

리소스 정리하기

더 이상 해당 블로그 시리즈에서 가이드한 리소스를 사용하지 않는 경우,콘솔에서 생성한 리소스들을 삭제하여 주세요. 프리 티어가 적용되지 않는 경우 비용이 발생할 수 있습니다.

Amazon Kendra 인덱스 삭제

  1. 해당 링크에서 생성한 인덱스를 선택합니다.
  2. [Delete]를 클릭하여 인덱스를 삭제합니다.

Amazon S3 버킷 삭제

  1. 해당 링크에서 생성한 버킷을 선택합니다.
  2. [Empty]를 클릭하여 버킷의 객체를 모두 삭제합니다.
  3. [Delete]를 클릭하여 버킷을 삭제합니다.
Sangbeom Ma

Sangbeom Ma

마상범 솔루션즈 아키텍트는 영상 이커머스 스타트업 경험을 바탕으로, 클라우드를 통한 애플리케이션 운영, 미디어, AIML 등 다양한 영역에서 고객이 최적의 아키텍처를 구성하도록 돕고 고객의 비즈니스 성과를 달성하도록 AWS 클라우드 전환을 지원하는 업무를 담당하고 있습니다.