본문 바로가기

블로그

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

AWS Ambassador

‘Amazon Bedrock’ 사용해 간단한 챗봇 만들기

2024.03.14

Intro

Amazon Bedrock은 AI21 Labs, Anthropic, Cohere, Meta, Stability AI 및 Amazon과 같은 AI 회사의 다양한 고성능 파운데이션 모델(Foundation Model, FM, 대규모 딥 러닝 신경망)을 단일 API(Application Programming Interface, API, 컴퓨터나 컴퓨터 프로그램 사이의 연결)를 통해 제공하는 완전관리형 서비스입니다.

이번 글에선 Amazon Bedrock을 사용해 간단한 챗봇을 만드는 방법을 알아보겠습니다. 복잡한 코딩 없이 쉽고 빠르게 챗봇을 만들기 위해 Amazon Bedrock과 Streamlit, LangChain을 함께 사용하는 방법입니다.

Streamlit은 Python을 활용해 앱을 빠르고 쉽게 만들 수 있게 도와주는 오픈 소스 앱이며, LangChain은 대규모 언어 모델(LLM)을 활용해 애플리케이션을 개발하는 프레임워크입니다.


아키텍처 다이어그램

[그림 1]

내 로컬 환경에 Python을 사용한 챗봇 환경을 생성하고, Amazon Bedrock API를 통해 나의 질문에 대한 응답을 받는 구조입니다.


데모

이번 데모에서는 다음과 같은 준비 사항이 필요합니다.

• AWS 계정

• Visual Studio Code


1) 모델 접근 요청하기

Amazon Bedrock에서 제공하는 파운데이션 모델을 사용하기 위해선 모델 접근 요청을 해야 합니다. 이번 데모에서는 Anthropic사의 Claude 모델을 사용해 보겠습니다.


모델 접근 요청 방법

• AWS Console ➔ Amazon Bedrock ➔ Providers ➔ Anthropic ➔ Request Model Access

[그림2] 모델 접근 요청 1단계 (출처: Amazon Bedrock)


• Manage Model Access ➔ Claude ➔ Save Changes

[그림 3] 모델 접근 요청 2단계 (출처: Amazon Bedrock)


• Access Granted

[그림 4] 모델 접근 요청 3단계 (출처: Amazon Bedrock)

해당 단계를 완료해야 Amazon Bedrock을 통해 Anthropic Claude 모델을 사용할 수 있는 상태가 됩니다.


2) Python Code로 Amazon Bedrock 호출 테스트하기

AWS 개발 및 Streamlit, LangChain을 사용하기 전에 Python 패키지를 설치하겠습니다.

[그림 5] Code Block 1 pip install packages


다음과 같은 코드로 Amazon Bedrock 호출 테스트를 진행해 보겠습니다.

[그림 6] Code Block 2 backend.py

[그림 6]에 보여지는 코드는 lanchain.llms 모듈을 Import하고, bedrock_chatbot이라는 함수를 정의하는 예시입니다.

bedrock chatbot 함수는 input_text라는 매개변수를 받아들이고, 이를 통해 Bedrock 모델을 활용해 챗봇의 응답을 생성합니다.

그리고 Bedrock 객체를 생성할 때, credentials_profile_name, model_id, model_kwargs 등의 인자를 설정하는데요. 이때 Credentials_profile_name은 AWS 자격증명 프로파일의 이름을 지정하는 것이고, model_id는 사용할 모델의 ID를 지정하는 것입니다.

Amazon Bedrock에서 사용하는 model_id 확인하러 가기

Model_kwargs는 모델에 대한 추가적인 설정을 담고 있는 딕셔너리(사전형 데이터, 각 키에 대응하는 값을 저장하는 자료 구조)로, [그림 6]에선 prompt, temperature, top_p, top_k, max_tokens_to_sample 등의 설정을 지정하고 있습니다.

AWS가 제공하는 Amazon Bedrock 모델 추론 파라미터 확인하러 가기

마지막으로 demo_llm.predict(input_text)를 호출해 입력한 텍스트에 대한 챗봇의 응답을 반환합니다.


아래와 같이 결과값이 리턴 된다면 성공적으로 Amazon Bedrock을 사용해 Anthropic Claude 모델의 응답을 받은 것입니다.

[그림 7] Code Block 3 api test response


3) 챗봇 만들기

본격적으로 챗봇을 만들기 위한 Backend를 만들겠습니다.

[그림 8] Code Block 4 backend.py

[그림 8]의 모듈은 아래와 같습니다.

ChatAPI는 stateless기 때문에 Langchain.memory는 이전 대화 내용 저장을 위해 Memory가 필요한데요. 때문에 Langchain.memory는 입력과 출력을 저장하는 리스트라고 생각하면 됩니다.

Langchain.chains은 다른 모듈과 같이 맞물려 동작할 수 있게 해주는 모듈입니다. 어떤 Model, Prompt, Memory를 사용할지 정의하며 이번 데모에서는 Model과 Memory만 엮어서 동작 시키겠습니다.


4) Streamlit으로 Frontend 만들기

[그림 9] Code Block 5 frontedn.py

streamlit과 backend 모듈을 import한 뒤, st.title을 사용해 웹 애플리케이션의 제목을 설정할 수 있습니다.

st.session_state.memory와 st.session_state.chat_history를 사용해 세션 상태에 메모리와 채팅 기록을 저장하겠습니다.

또 st.chat_message와 st.markdown을 사용해 채팅 메시지를 출력하겠습니다. 이때, message [‘role’]은 메시지 역할(사용자, 챗봇)을 나타내고, message [‘text’]는 메시지 내용을 나타냅니다.

st.chat_input을 사용하면 사용자로부터 질문을 입력 받을 수 있습니다. 입력된 질문은 st.chat_message와 st.markdown를 통해 출력되고, st.session_state.chat_history에 채팅 기록이 추가됩니다.

Be.cnvs_chain을 호출해 챗봇의 응답을 생성하고 이를 출력합니다. 위와 마찬가지로 st.session_state.chat_history에 채팅 기록이 추가됩니다.


5) streamlit을 이용해 APP을 기동하기

[그림 10] Code Block 6 streamlit run
[그림 11] (왼) 챗봇 가동 화면 / (오) 챗봇 활용 화면

App을 가동하면 챗봇 화면이 [그림 11]처럼 나타날 것입니다.

질문과 답변을 통해 챗봇이 정상적으로 동작함을 확인할 수 있습니다.


Outro

이번 포스팅에선 Amazon Bedrock의 파운데이션 모델을 사용해 나만의 챗봇을 손쉽게 만드는 방법을 소개해 드렸습니다.

앞서 말씀드렸듯이 Amazon Bedrock은 다양한 파운데이션 모델을 손쉽게 사용할 수 있게 도와주는 완전관리형 서비스로, 우리 주변에 적용할 수 있는 부분이 무궁무진합니다.

Amazon은 PartyRock을 오픈했는데요. PartyRock은 Amazon Bedrock 기반의 플레이그라운드로, 코드 작성 없이 프롬프트 엔지니어링을 배우고 미니 앱도 빌드해 볼 수 있습니다. PartyRock을 통해 가볍게 생성형 AI(Generative AI)를 경험해 보면 어떨까요?

챗봇과 대화를 할 수 있어요