요즈음 IT업계에서 가장 큰 화두는 단연 GenAI입니다.
LLM(Large Language Model)의 등장으로 GenAI는 우리의 생활과 비지니스를 확연히 바꿔놓았는데요.
이러한 추세에 맞춰 Amazon, Google, MS 등의 여러 빅테크들이 GenAI as a Service 분야에서 경쟁하고 있습니다.
오늘은 이들 중 Amazon에서 내놓은 Amazon Bedrock에 대해서 알아보도록 하겠습니다.
Amazon Bedrock은 AWS(Amazon Web Service)를 통해 이용할 수 있는 완전관리형 GenAI 서비스인데요.
Amazon Bedrock을 통해 어떻게 모델을 사용할 수 있는지, 그리고 AI 데모 시연에 최적화된 웹 인터페이스 도구인 Gradio를 통해 간단한 웹 어플리케이션을 어떻게 만들 수 있는지 알아보도록 하겠습니다.
1. Amazon Bedrock이란?
Amazon Bedrock (이하 Bedrock)은 AWS에서 제공하는 완전관리형 GenAI 서비스입니다.
사용자는 Bedrock을 통해 AWS의 인프라스트럭쳐에서 LLM을 쉽고 빠르게 배포할 수 있으며, 다양한 모델을 기반으로 Fine-Tuning, RAG, Prompt Engineering 등의 커스텀을 쉽게 수행하도록 제공하고 있습니다.
Bedrock이 제공하는 기능들을 간단히 정리하면 아래와 같습니다.
- Foundation Model 제공
현재(2024-09-29) 기준 Bedrock은 Claude, Mistral, Llama, Titan등의 강력한 모델을 제공하고 있습니다.
이를 통해 고도로 훈련된 LLM을 그대로 사용하거나, 이를 기반으로 추가적인 Custom을 수행할 수 있습니다. - RAG(Retrieval Augmented Generation) 구현 제공
RAG는 특정한 Data source를 기반으로 답변을 제공하는 기법을 말합니다.
Bedrock의 KnowledgeBase 기능을 활용해 다양한 소스로 RAG를 구현할 수 있습니다. - AWS를 이용한 Model Deployment
생성된 모델을 배포하기 위해 별도의 인프라스트럭쳐를 구현할 필요 없이 AWS의 인프라를 활용하여 배포할 수 있습니다. - No-Code Customization
LLM을 Customization하기 위해 필요한 Fine-Tuning, Pre-Training, Guardrail 등의 기능을 코드 없이 구현할 수 있습니다.
따라서 Coding skill 이 부족하더라도 GUI 기반의 콘솔을 활용해 모델을 커스텀할 수 있습니다.
1-1. Knowledge Base로 RAG 구현하기
앞서 Bedrock이 제공하는 기능 중 RAG 구현 제공이 있다고 말씀드렸는데요.
RAG는 별도의 DataSource를 인용하여 답변을 제공할 수 있기 때문에 특정한 정보를 기반으로 답변을 구성해야 하는 경우 유용합니다.
Bedrock은 이 RAG를 KnowledgeBase 기능을 이용하여 쉽고 빠르게 구현할 수 있도록 제공하고 있습니다.
KnowledgeBase를 활용해 어떻게 RAG을 구현할 수 있는지 알아보도록 하겠습니다.
Bedrock KnowledgeBase 생성
가장 먼저 Bedrock에서 Knowledgebase를 생성해야 합니다.
Knowledgebase의 생성은 AWS Console에서 Builder tools -> Knowledge bases -> Create knowledge base를 클릭해 수행할 수 있습니다.
Datasource 선택
Knowledgebase 생성 페이지로 진입하면 Name, Permission 등의 정보들을 지정할 수 있습니다.
그리고 RAG를 구현하기 위해 참조할 Data source를 선택할 수 있는데요.
현재 Bedrock의 Knowledgebase가 지원하는 Data source는 Amazon S3, Web page, Confluence, Salesforce, Sharepoint의 5개 입니다.
이 중 오늘 포스팅에서는 Web Crawler를 활용해 Public web page 정보를 기반으로 Data source를 구성해보겠습니다.
Source 정보 구성
Next를 클릭해 다음 페이지로 넘어가면 Data source로 활용할 URL에 대한 정보를 구성할 수 있습니다.
Source URLs 박스를 이용해 정보를 가져올 Public Web page를 지정할 수 있습니다.
이 때 주의해야 할 것은, Web Crawler가 robots.txt를 활용해 크롤링하기 때문에 이 같은 방식을 허용하는 웹 페이지인지 확인해야 합니다.
또한 WIkipedia 등의 거대한 페이지를 크롤링할 경우, Crawling data Limitation에 위배될 수 있으니 Sync scope, Include, Exclude를 이용해 범위를 적절히 구성해야 합니다.
Embedding model과 Vector Store 구성하기
마지막으로 Data를 Embedding하기 위한 Embedding Model과 Data를 저장할 Vector store를 지정합니다.
Embedding Model은 텍스트를 실수 형태의 Vector Data로 변환하는데 활용되는 Model을 말합니다. Embedding Model을 통해 Web Crawaling으로 가져온 텍스트 정보 간의 관계를 실수 형태의 Vector Data로 변환할 수 있습니다.
Embedding Model을 활용해 생성된 Vector Data는 Vector Store에 저장할 수 있습니다.
Vector Store란 Vector Data 저장에 최적화된 데이터 저장소로, AWS에서는 대표적으로 Amazon Opensearch를 이용할 수 있습니다.
이번에는 Embedding Model로 텍스트 기반의 정보를 지원하는 Amazon Titan Text Embeddings v2를, Vector Store로 Serverless 형태로 Opensearch를 이용할 수 있는 Amazon OpenSearch Serverless를 사용하겠습니다.
Datasource Sync
생성된 Knowledgebase에서 Data source를 Sync하는 것으로 Web Crawling을 통해 데이터를 가져와 Embedding할 수 있습니다.
Crawling할 웹 페이지의 상태에 따라 Permission, Data size 등의 제약으로 Sync가 정상적으로 수행되지 않을 수도 있으니 이 경우 Sync History를 통해 문제를 확인해야 합니다.
현재까지의 구성을 다이어그램으로 그리면 아래와 같습니다.
1-2. Agent를 활용해 LLM 배포하기
Bedrock의 Agent 기능은 End-user에게 다양한 동작을 수행하여 적절한 응답을 제공하도록 구성할 수 있는 기능입니다.
Agent 기능을 이용하여 Foundation Model이 Knowledgebase 기반으로 답변을 구성하거나, Action Group으로 특정한 동작을 수행하도록 설정할 수 있습니다.
또한 배포한 Agent를 Versiong, Alias를 통해 관리할 수 있습니다.
이 Agent 기능을 활용하여 앞서 구성한 Knowledgebase를 기반으로 RAG를 구현한 Foundation Model을 배포해보겠습니다.
Bedrock Agent 생성
Bedrock Agent를 생성하기 위해 Builder tools -> Agents -> Create Agent를 클릭합니다.
이후 별도의 생성 페이지 없이 Agent가 생성됩니다.
Foundation Model 및 Instruction 구성
이후 생성된 Agent의 Edit 페이지로 진입하면 Agent가 사용할 Foundation Model과 응답을 위한 Instruction을 지정할 수 있습니다.
이번 포스팅에서는 Foundation Model로 Anthropic의 Claude 3.5 Sonnet을 사용했습니다.
Instructions for the Agent를 통해서 Foundation Model이 구성할 응답에 대한 지시를 Prompt-Engineering할 수 있으며, 이를 통해 Agent가 응답을 위해 수행할 구체적인 동작, 스타일, 톤을 지정할 수 있습니다.
이번 포스팅에서는 Instruction으로 User의 응답에 적절한 결과를 제공할 것, 정보를 찾지 못할 경우 이를 언급할 것, 제공할 답변을 더블체크할 것 등을 지시했습니다.
Knowledgebase 추가
다음으로 Agent가 RAG을 구현할 수 있도록 이전에 생성한 Knowledgebase를 추가합니다.
추가한 Knowledgebase의 State가 Enabled인지 여부를 확인합니다.
Enabled가 아니라면 Knowledgebase의 Sync 단계에서 문제가 있었는지 확인해야 합니다.
Alias 추가
마지막으로 Agent가 특정한 Version을 기반으로 배포될 수 있도록 Alias를 생성합니다.
Aliases 탭의 Create 버튼을 클릭한 뒤, Alias 이름과 연결할 Version을 지정하는 것으로 Alias를 생성할 수 있습니다.
준비가 완료된 Agent는 Web Console의 Test 탭에서 미리 응답을 구성해볼 수 있습니다.
현재까지의 구성을 다이어그램으로 그리면 아래와 같습니다.
2. Gradio를 활용한 Web Interface 구성
Gradio는 AI Demo 시연에 최적화된 채팅 인터페이스를 구현할 수 있는 라이브러리입니다.
Gradio를 사용하면 복잡한 인터페이스와 Model 연결 없이 간단하게 Model과 상호작용할 수 있는 웹 애플리케이션을 구성할 수 있습니다.
이번 포스팅에서는 위에서 구성한 Bedrock 모델과 상호작용하기 위해 Gradio를 이용한 채팅 웹 애플리케이션을 생성해보겠습니다.
2-1. Infrastructure 구성하기
가장 먼저 Gradio를 배포하기 위한 Infrastructure를 구성합니다.
이번 포스팅에서는 Amazon Bedrock을 이용하기 위해 AWS 환경에 인프라를 구축합니다.
단 이번 포스팅에서 구성한 인프라는 테스트를 위한 환경이므로, 최대한 간단한 구성으로 구축합니다. 운영 환경을 고려한다면 더욱 세밀한 설계와 구성이 필요하다는 점 유의 바랍니다.
Gradio를 위한 인프라스트럭쳐는 아래와 같이 구성되어 있습니다.
- 네트워크 계층
AWS VPC와 VPC 내의 Subnet, Public IP 그리고 Internet Gateway - 컴퓨팅 계층
EC2 Instance 한 대로 구성 - 액세스 제어
Security Group을 이용한 네트워크 액세스 제어, IAM을 이용한 Permission 제어
위 구성요소들을 포함한 구성을 다이어그램으로 그리면 아래와 같이 표현됩니다.
이번 포스팅에서는 Gradio를 배포한 EC2 Instance가 Bedrock Instance와 통신할 시 Internet Gateway를 지나게 됩니다.
만약 EC2 Instance가 Private Subnet에 위치한 격리 환경이라면, 이 AWS 블로그 포스팅을 참고하여 PrivateLink 기능을 통해 Private 통신을 구현할 수 있습니다.
EC2 Instance에서 Bedrock Agent를 호출하기 위해서는 적절한 IAM Policy가 포함된 IAM Role이 Attach되어있어야 합니다.
아래는 Bedrock Agent 호출을 위해 Least Previlege로 구성한 IAM Policy입니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeAgent"
],
"Resource": "*"
}
]
}
|
cs |
2-2. Bedrock Agent 호출하기
AWS Infrastructure를 구축했다면 이제 Bedrock Agent를 호출하는 Gradio 애플리케이션을 배포해야 합니다.
이번 포스팅에서는 boto3를 이용한 Python으로 Gradio 애플리케이션을 구성해보겠습니다.
생성한 EC2 Instance에 아래 코드로 구성된 Python 파일을 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import gradio as gr
import boto3
import json
import uuid
import traceback
client = boto3.client('bedrock-agent-runtime', region_name='us-east-1')
def call_bedrock(prompt):
try:
response = client.invoke_agent(
agentAliasId='AGENTALIASID',
agentId='AGENTID',
inputText=prompt,
sessionId=str(uuid.uuid1())
)
for event in response['completion']:
chunk = event.get('chunk')
if chunk:
message = chunk.get('bytes').decode()
return message
except Exception as e:
print("Error occurred:", e)
print(traceback.format_exc())
return None
iface = gr.Interface(
fn=call_bedrock,
inputs="text",
outputs="text",
title="AWS Bedrock Model with Gradio",
description="Enter a prompt to interact with the AWS Bedrock model."
)
iface.launch(server_name="0.0.0.0", server_port=8080)
|
cs |
위 코드를 기능별로 나누어 분석해보겠습니다.
client 정의
1
2
3
|
client = boto3.client('bedrock-agent-runtime', region_name='us-east-1')
|
cs |
Bedrock Agent를 호출하기 위해 boto3를 이용해 bedrock-agent-runtime Client를 정의합니다.
region_name 속성에는 Agent를 생성한 Region을 지정해야 합니다.
Bedrock Agent 호출 함수 정의
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def call_bedrock(prompt):
try:
response = client.invoke_agent(
agentAliasId='AGENTALIASID',
agentId='AGENTID',
inputText=prompt,
sessionId=str(uuid.uuid1())
)
for event in response['completion']:
chunk = event.get('chunk')
if chunk:
message = chunk.get('bytes').decode()
return message
except Exception as e:
print("Error occurred:", e)
print(traceback.format_exc())
return None
|
cs |
Bedrock Agent를 호출하기 위한 함수를 정의합니다.
response 정의시 agentAliasId, agentId 속성에 생성한 Agent와 Alias의 ID를 기입합니다.
가장 단순한 Response를 가정한 코드임을 유의하고 사용해야 합니다.
만약 Session 설정, 대화 종료, Citiation 등의 기능을 활용하고 싶다면 코드를 더욱 고도화해야 합니다.
Gradio 인터페이스 정의 및 실행
1
2
3
4
5
6
7
8
9
|
iface = gr.Interface(
fn=call_bedrock,
inputs="text",
outputs="text",
title="AWS Bedrock Model with Gradio",
description="Enter a prompt to interact with the AWS Bedrock model."
)
iface.launch(server_name="0.0.0.0", server_port=8080)
|
cs |
위 코드를 통해 Gradio 인터페이스를 정의하고 서버를 실행할 수 있습니다.
Gradio의 인터페이스를 구성하는 방법은 크게 Interface Class로 구성하는 것과 Block Class로 구성하는 것 2가지가 존재합니다.
Interface Class는 Chat Interface를 구현하는 가장 간단한 방법으로, 별도의 구성 없이 Web-GUI 인터페이스를 구성할 수 있습니다.
Block Class는 Interface Class보다 비교적 복잡하지만 Custom이 가능한 블록을 기반으로 인터페이스를 구성할 수 있습니다.
이번 포스팅에서는 간단하게 데모를 구현하기 위해 Interface Class를 사용했습니다.
Interface를 정의할 시 fn 속성에 이전에 정의한 bedrock 호출 함수를 기입합니다.
3. DEMO
위에서 생성한 Python 코드를 실행하면 8080포트로 노출한 애플리케이션이 실행됩니다.
브라우저에서 EC2 Instance에 부착한 PublicIP를 8080포트로 접속하면 아래와 같은 Web Interface를 확인할 수 있습니다.
Gradio의 Interface 클래스를 활용했기 때문에 별도의 설정 없이도 단순한 Chatting interface가 구현된 것을 확인할 수 있습니다.
prompt란에 질문을 적으면 Bedrock Agent에서 응답한 답변이 output에 출력됩니다.
질문을 적으면 Bedrock Agent의 Foundation Model(여기서는 Claude Sonnet)이 Knowledgebase와 Instruction을 기반으로 제공하는 답변을 받을 수 있습니다.
비교를 위해 Knowledgebase와 Instruction이 적용되지 않은 Foundation Model에 동일한 질문을 제공해봤습니다.
WOW wiki를 RAG으로 구현해 World of Warcraft의 등장인물을 답변한 Bedrock Agent Model과 달리, Foundation Model은 노르웨이 극작가의 극에 등장하는 인물로 답변하는 것을 볼 수 있었습니다.
이를 통해 Knowledgebase를 기반으로 제공된 Bedrock Agent Model이 RAG을 성공적으로 구현했음을 확인할 수 있습니다.
4. 마치며
이번 포스팅에서는 Amazon Bedrock을 기반으로 상호작용할 수 있는 Grafio 애플리케이션을 배포해봤습니다.
Amazon Bedrock은 AWS에서 제공하는 완전관리형 GenAI 서비스로, LLM을 배포 및 커스터마이징할 수 있는 다양한 기능을 제공하고 있음을 알아봤습니다.
Gradio는 AI 모델과 상호작용할 수 있는 웹 인터페이스를 쉽게 구성할 수 있는 도구로, 이번 포스팅엣허 Bedrock 모델과 통합하여 사용하는 것을 시연해봤습니다.
Gradio의 배포에는 AWS의 인프라스트럭쳐를 활용했으며, 적절한 네트워크 및 접근,액세스 제어의 구성이 필요하였습니다.
마지막으로 Gradio 애플리케이션에서 Bedrock Agent Model을 호출함으로써 성공적으로 RAG 기반 LLM의 응답을 제공받을 수 있었습니다.
이 포스팅을 통해 Bedrock을 시연하고자 하는 분들에게 도움이 되기를 바랍니다.
'AWS' 카테고리의 다른 글
S3 + Cloudfront를 이용해 www redirect를 구현한 Static Website 호스팅하기 (0) | 2023.08.22 |
---|---|
AWS EKS의 IP 주소 관리: 쿠버네티스 클러스터의 네트워킹 고려사항 (0) | 2023.08.01 |
django + mysql + AWS 로 쇼핑 정보 가져오는 게시판 만들기 (Daeran.net) (2) (4) | 2020.04.21 |
django + mysql + AWS 로 쇼핑 정보 가져오는 게시판 만들기 (Daeran.net) (1) (0) | 2020.04.09 |
AWS Certified Solutions Architect-Associate(AWS SAA) 자격증 취득기 -2 (0) | 2020.02.05 |