본문 바로가기

블로그

LG CNS 기술블로그 DX Lounge에서 최신 IT 소식을 만나보세요!

AWS Ambassador

Amazon Bedrock Knowledge base로 구현하는 RAG(검색 증강 생성)

2024.04.22

Intro

LLM(Large Language Models)에 최신 혹은 세부적인 내용에 대해 질문하면, 제대로 된 답변을 받지 못하는 경우가 있습니다. 그 이유는 LLM이 사전에 학습된 데이터를 기반으로 작동하기 때문인데요. 모델이 학습한 시점 이후의 최신 정보나, 학습 데이터에 포함되지 않은 세부적인 정보에 대해서는 정확한 답변을 받지 못할 수 있습니다.

RAG(Retriever-Augmented Generation, 검색 증강 생성, 이하 RAG)는 이러한 문제를 해결하기 위해 개발된 모델 중 하나인데요. RAG는 기존의 언어 모델에 정보 검색(retrieval) 기능을 추가해, 모델이 학습한 데이터 범위를 넘어서는 정보에 대해서도 답변할 수 있도록 도와줍니다.

Amazon Bedrock Knowledge base를 사용하면, Amazon Bedrock의 파운데이션 모델(Foundation Model, 대규모 딥 러닝 신경망, 이하 FM)을 추가적인 데이터와 안전하게 연결해 RAG를 지원할 수 있습니다. 이를 통해 FM을 다시 훈련할 필요 없이 관련성과 정확도가 높은 답변을 제공받을 수 있습니다.

이번 글에서는 기존 Bedrock Foundation Model의 답변과 Amazon Bedrock Knowledge base를 사용한 답변을 비교해 RAG의 기능 향상 여부를 확인해 보겠습니다.


1. 데모

1) 아키텍처 다이어그램

이번 데모는 [그림1]과 같은 아키텍처 구성으로, AWS의 다른 서비스들과 조합해 Amazon Bedrock Knowledge base 기능을 검증해 보겠습니다.

[그림 1]

2) Bedrock Invoke Lambda Function 구성

Amazon Bedrock Knowledge base와 비교하기 위해 일반적인 Bedrock FM 호출 Lambda Function을 구성합니다.

이번 데모에서는 FM으로 Anthropic Claude 모델을 사용합니다. Anthropic Claude 모델 설정 방법은 아래와 같습니다.


Request model access

(1) AWS Console ➔ Amazon Bedrock ➔ Providers ➔ Anthropic ➔ Request model access

[그림 2]

(2) Manage model access ➔ Claude ➔ Save Changes

[그림 3]


Lambda Function 구성

(1) Code Deploy

아래와 같이 Anthropic Claude 모델을 호출하는 Bedrock runtime을 Deploy 합니다.

[그림 4] Code Block 1 Python code for Invoke Foundation Model

Amazon Bedrock User Guide 참고


(2) 권한 및 Timeout 설정

Lambda Function이 Bedrock Model을 Invoke 할 수 있도록 Policy를 추가합니다.

[그림 5] Code Block 2 IAM_Policy for invokeModel

Response를 받기 위해 Timeout 시간을 늘립니다. (3sec ➔ 1min)

[그림 6]

(3) Test Function 설정

테스트 질문과 답변을 설정해보겠습니다.


테스트 질문 = “which team is winner in premier league 2022/2023?”

테스트 답변 = ” The 2022/2023 Premier League season is still ongoing. As of February 2023, Arsenal are currently top of the table. The season will conclude in May 2023, so we don’t know the winner yet. Arsenal, Manchester City, and Manchester United are the main title contenders at this stage of the season.”

[그림 7]

[그림 7]에서 알 수 있듯, FM의 학습 시점이 2023년 이전이기 때문에 테스트 질문에 대해 정확한 답변을 할 수 없음을 확인할 수 있습니다.


3) (Optional) Local 환경에서 테스트를 위한 환경 준비

이번 데모에서는 Bedrock 환경을 사용자 Local 환경에서 직접 테스트해보기 위해 API Gateway와 정적 웹 호스팅을 구현해 보겠습니다.


API Gateway 구성하기

API Gateway를 구성하는 방법은 아래와 같습니다.


(1) API Gateway ➔ APIs ➔ Create API ➔ REST API “Build” ➔ “Create API”

[그림 8]

(2) Resources ➔ Create resource ➔ “Check CORS” & “Create resource”

[그림 9]

(3) Resources ➔ Create method ➔ “Create Method”

해당 페이지에 도달했다면 아래와 같이 설정하면 됩니다.


– Method type : POST

– Integration type : Lambda Function

– Lambda Function : 이전 단계에서 생성한 Lambda Function

[그림 10]

(4) API Gateway 리소스 생성 확인

[그림 11]

(5) Enable CORS

– Access-Control-Allow-Methods : Check POST ➔ “Save”

[그림 12]

(6) Deploy API

[그림 13]

(7) Invoke URL 확인

[그림 14]


정적 웹 호스팅 구성하기

(1) S3 Bucket 정적 호스팅 구성하기

• Amazon S3 ➔ Buckets ➔ Create bucket ➔ Bucket name 설정 후 기본 값으로 “Create Bucket”

• Permissions ➔ Cross-origin resource sharing (CORS) ➔ “Edit” ➔ CORS Policy 업데이트 ➔ “Save Changes”

[그림 15] Code Block 3 CORS Policy

• Index.html 구성

[그림 16] Code Block 4 index.html

• S3 “Upload” index.html


(2) CloudFront 구성

• CloudFront ➔ Distributions ➔ Create

Create 페이지에 도달했다면 아래와 같이 설정하면 됩니다.

[그림 17]

– Origin domain ➔ 앞 단계에서 생성한 정적 웹 호스팅용 S3 Bucket

– Origin access : Origin access control settings (recommended)


이후 세팅은 아래와 같이 적용하면 됩니다.

1. S3 Bucket을 Private으로 쓰기 위해 OAC(Origin Access Control)를 별도 구성하여 Bucket policy를 업데이트합니다.

2. “Create new OAC”

3. “Copy policy” ➔ 앞 단계에서 생성한 정적 웹 호스팅용 S3 Bucket ➔ “Edit” Bucket policy

[그림 18]

– 데모용이기 때문에 WAF는 Disable 하겠습니다. WAF: Do not enable security protections

– “Create Distribution”


• CloudFront ➔ Distributions ➔ 생성 된 Distribution ➔ Error pages ➔ Create custom error response

[그림 19]

해당 페이지에 도달했다면 아래와 같이 설정하면 됩니다.

(1) HTTP error code: 403: Forbidden

(2) Customize error response : Yes

– Response page path : /index.html

– HTTP Response code : 200: OK

(3) “Create custom error response”


위의 단계까지 진행했다면, 웹 페이지 확인을 위해 Distribution domain name으로 접속해 보겠습니다.

[그림 20]


4) Amazon Bedrock Knowledge base 구성

Data source 구성하기

이번 데모에서는 테스트 질문이었던 “which team is winner in premier league 2022/2023?”에 대한 정확한 답변을 Premier League Annual Report(PDF Files)를 활용해 확인해 보겠습니다.


(1) 신규 S3 Bucket 생성 및 데이터 업로드

[그림 21]


Knowledge base 구성하기

(1) Amazon Bedrock ➔ Knowledge bases ➔ “Create knowledge base”


각 단계 진행 시 설정 방법을 설명해 드리겠습니다.

– Provide knowledge base details ➔ “Next”

[그림 22]


– Set up data source

S3 URI 탭에서 데이터 소스 Bucket 선택 후 “Next”

[그림 23]


– Select embeddings model and configure vector store

이번 데모에서 데이터 전처리(Pre-processing, 데이터에서 효율적인 검색을 위해 문서를 관리 가능한 덩어리(Chunk)로 분할하는 방법)를 위해 사용될 Embedding Model로 Amazon Titan을 사용하겠습니다.

[그림 24]

– Vector database : Knowledge base에선 기존에 사용자가 구축한 4가지 종류의 Vector database를 지원하고 있습니다. Vector database는 비용과 사용성을 고려해 선택해야 합니다.

이번 데모에서는 Vector database로 Quick create를 통해 Amazon OpenSearch Serverless를 사용해보겠습니다.

[그림 25]

– Review and create ➔ “Create knowledge base”를 선택하면, Knowledge bases 구성이 완료된 것입니다.


(2) Data source ➔ “Sync”에서 첫 번째 Sync를 실행합니다.

[그림 26]


5) Bedrock Knowledgebase Invoke Lambda function 구성

Lambda function 구성

(1) Code Deploy

아래와 같이 Bedrock Knowledge base를 호출하는 Bedrock agent runtime을 Deploy 합니다.

이번 데모에서는 일반 Foundation model invoke 와의 동일한 비교를 위해 Anthropic Claude v2를 사용하겠습니다.

[그림 27] Code Block 5 Python code for Invoke Knowledgebase

Amazon Bedrock API reference 확인 하기


(2) 권한 및 Timeout 설정

• Lambda function 이 Bedrock Model을 Invoke 할 수 있도록 Policy를 추가합니다.

[그림 28] Code Block 6 IAM_Policy for invokeModel


• Response를 받기 위해 Timeout 시간을 늘립니다. (3sec ➔ 1min)

[그림 29]


6) (Optional) Local 환경에서 테스트를 위한 환경 준비

Bedrock Knowledge base 환경을 호출하기 위한 API Gateway와 정적 웹 호스팅을 추가 구현해보겠습니다.


API Gateway 구성하기

API Gateway 구성은 아래의 방법으로 진행하면 됩니다.

(1) API Gateway ➔ APIs ➔ “이전 과정에서 생성한 API Gateway” ➔ Resources ➔ “Create resource”

[그림 30]


(2) Resources(/신규리소스) ➔ Create method ➔ “Create Method”


이후 설정은 아래와 같이 동일하게 적용하면 됩니다.

– Method type: POST

– Integration type : Lambda function

– Lambda function : 이전 단계에서 생성한 Knowledge base Invoke Lambda function

[그림 31]


(3) Resources(/신규리소스) ➔ Enable CORS

– Access-Control-Allow-Methods 항목에서 POST를 체크한 뒤 “Save”

[그림 32]

(4) (기존 Stage에) Deploy API

[그림 33]

(5) Invoke URL 확인

[그림 34]


정적 웹사이트 수정

(1) 신규 index.html 파일로 수정 및 S3 업로드(index.html)

[그림 35] Code Block 7 index.html


7) 테스트

(Optional) CloudFront Invalidation

신규 index.html이 적용되지 않을 시 CloudFront invalidation을 진행합니다.

[그림 36]


질문 테스트

다음과 같이 Knowledge base를 사용한 RAG를 통해 정확한 답변을 얻은 것을 확인할 수 있습니다.

[그림 37]


8) 데모 자원 삭제

이번 데모에서 사용한 리소스를 삭제합니다.

• CloudFront Distributions

• API Gateway APIs

• Lambda Functions

• S3 Buckets

• Amazon Bedrock Knowledge base

• Amazon OpenSearch Serverless

– Vector database는 별도로 삭제하는 것이 중요합니다.


Outro

이번 글을 통해 Amazon Bedrock Knowledge base를 활용하면, 별도의 FM 튜닝 없이 개인 데이터 소스를 사용해 쉽고 빠른 RAG 구성으로 한층 더 개인화된 검색 결과를 도출할 수 있음을 알 수 있었는데요.

Amazon Bedrock과 함께 AWS에서 제공하는 다양한 서비스를 조합한다면, 개인화된 강력한 챗봇 또는 검색엔진을 누구나 쉽게 생성해 볼 수 있을 것입니다.

챗봇과 대화를 할 수 있어요