LLM 애플리케이션 설정하기
LLM 애플리케이션을 실행할 EC2 인스턴스와 실행 환경을 구성해봅시다.
-
EC2 > 인스턴스 > 인스턴스 시작 을 통해 아래와 같이 인스턴스를 생성합니다.
- 이름:
ausg-aws-2025 - AMI:
Amazon Linux 2023 AMI - 인스턴스 유형:
t2.micro - 아키텍쳐: 64비트(X86)

- 키 페어(로그인) -
새 키 페어 생성클릭- 키 페어 이름:
ausg-aws-2025-key - 키 페어 유형:
RSA - 프라이빗 키 파일 형식:
.pem
- 키 페어 이름:
- 네트워크 설정
- VPC: 기본값
- 퍼블릭 IP 자동 할당:
활성화 - 방화벽(보안그룹):
보안 그룹 생성- 보안 그룹 이름 :
ausg-aws-2025-sg - 설명:
Allows EC2 Instance Connect - 인바운드 보안 그룹 규칙:
- SSH | TCP | 22 | 사용자 지정 |
com.amazonaws.us-west-2.ec2-instance-connect - HTTP | TCP | 80 | 위치 무관 (혹은
인터넷에서 HTTP 트래픽 허용체크박스 클릭)
- SSH | TCP | 22 | 사용자 지정 |
- 보안 그룹 이름 :

- 이름:
-
위와 같이 설정 후
인스턴스 시작을 클릭합니다. -
EC2 > 인스턴스 이동 후 생성한 인스턴스를 클릭하고
연결을 클릭합니다
-
EC2 인스턴스 연결탭 선택 후 다시연결버튼을 누릅니다.
-
아래 명령어를 EC2 인스턴스에서 차례대로 실행하여 프로젝트와 가상환경을 생성합니다.
sudo su - mkdir llm-app cd llm-app python3 -m venv .venv # Python 가상환경 만들기 source .venv/bin/activate # 가상 환경 활성화 pip install langchain-core langchain-aws boto3 streamlit # 필요한 라이브러리 다운로드 -
LLM 애플리케이션에 필요한 AWS SDK를 사용하기 위해 IAM > 역할 > 역할 생성 에서 새로운 역할을 생성합니다.
- 1단계 신뢰할 수 있는 엔터티 선택
- 신뢰할 수 있는 엔터티 유형:
AWS 서비스 - 사용 사례
- 서비스 또는 사용 사례:
EC2 - 사용 사례:
EC2
- 서비스 또는 사용 사례:
다음클릭
- 신뢰할 수 있는 엔터티 유형:

- 2단계 권한 추가
- 추가 없이
다음클릭
- 추가 없이
- 3단계 이름 지정, 검토 및 생성
- 역할 이름:
EC2ApplicationRole 역할 생성클릭
- 역할 이름:
- 1단계 신뢰할 수 있는 엔터티 선택
-
IAM > 역할 에서
EC2ApplicationRole검색 후 클릭합니다.
-
권한 추가 > 인라인 정책 생성을 클릭합니다 -
JSON클릭 후 아래의 내용을정책 편집기에 붙여넣고다음을 클릭합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:Retrieve",
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}-
정책 이름은BedrockChatbotPolicy로 설정한 후정책 생성을 클릭합니다. -
EC2 > 인스턴스 에서
ausg-aws-2025인스턴스를 클릭한 후작업 > 보안 > IAM 역할 수정을 클릭합니다.
-
IAM 역할을EC2ApplicationRole로 설정한 후IAM 역할 업데이트를 클릭합니다.
-
EC2 인스턴스에서 아래 명령어를 입력하여 현재 AWS API를 호출하는 주체(identity)의 정보를 확인합니다.
aws sts get-caller-identity
-
LLM 애플리케이션이 사용할 환경변수 설정을 위해
config.py파일을 아래와 같이 생성합니다.vi ~/llm-app/config.py -
아래의 코드를
config.py에 붙여넣고esc를 누른 후:wq+enter를 입력하여 저장합니다.REGION = "us-west-2" MAX_TOKENS = 2048 # 생성할 최대 토큰 수 TEMPERATURE = 0.0 # 응답의 다양성 조절 (0-1) TOP_P = 0.01 # 누적 확률 기준 토큰 필터링 TOP_K = 250 # 다음 토큰 선택시 고려할 상위 토큰 수 MODEL_ID = "anthropic.claude-3-5-sonnet-20240620-v1:0" # Claude 3.5 Sonnet # GUARDRAIL_ID = "" # 가드레일 아이디 # GUARDRAIL_VERSION = "" # 가드레일 버전 # KB_ID = "" # 지식 기반 아이디 -
llm-app디렉토리에서demo1.py파일을 아래와 같이 생성합니다.vi ~/llm-app/demo1.py# demo1.py import boto3 import streamlit as st from langchain_core.prompts import ChatPromptTemplate from langchain_aws import ChatBedrock # config.py에서 필요한 설정값들을 가져옴 from config import (REGION, MODEL_ID, MAX_TOKENS, TEMPERATURE, TOP_K, TOP_P) # 스트림릿 웹 페이지 설정 st.set_page_config(page_title='Amazon Bedrock 기반 고객상담 챗봇') # 첫 실행시 채팅 이력을 초기화하고 환영 메시지 설정 if "messages" not in st.session_state.keys(): st.session_state.messages = [{"role": "assistant", "content": "How may I assist you today?"}] # Bedrock 서비스 클라이언트 생성 bedrock_runtime = boto3.client( service_name="bedrock-runtime", region_name=REGION ) # LLM 모델의 추론 설정 model_kwargs = { "temperature": TEMPERATURE, # 응답의 다양성 조절 (0-1) "max_tokens": MAX_TOKENS, # 생성할 최대 토큰 수 "top_k": TOP_K, # 다음 토큰 선택시 고려할 상위 토큰 수 "top_p": TOP_P, # 누적 확률 기준 토큰 필터링 "stop_sequences": ["\n\nHuman"] # 응답 생성 중단 조건 } # LLM에 전달할 프롬프트 템플릿 정의 template = ''' Answer the question based on the context below. If the question cannot be answered using the information provided answer with "I don't know". Context: {context} Question: {question} ''' prompt = ChatPromptTemplate.from_template(template) # Bedrock 모델 초기화 model = ChatBedrock( client=bedrock_runtime, model_id=MODEL_ID, model_kwargs=model_kwargs ) # 사이드바 구성 with st.sidebar: st.title('Amazon Bedrock 기반 고객상담 챗봇') # 이전 대화 내용을 화면에 표시 for message in st.session_state.messages: with st.chat_message(message["role"]): st.write(message["content"]) # 사용자 입력 처리 if user_input := st.chat_input(): # 사용자 메시지 저장 및 표시 st.session_state.messages.append({"role": "user", "content": user_input}) with st.chat_message("user"): st.write(user_input) # AI 응답 생성 및 표시 with st.chat_message("assistant"): response = model.invoke(user_input) st.write(response.content) st.session_state.messages.append({"role": "assistant", "content": response.content})- 이전과 같이
esc+:wq+enter를 입력하여 저장합니다.
- 이전과 같이
-
아래 명령어를 실행하여 서버를 시작합니다.
streamlit run demo1.py --server.port 80 --server.address 0.0.0.0 -
EC2 Instance Connet창의 왼쪽 아래에 있는PublicIPs를 복사합니다.
-
브라우저에서 해당 IP로 접속해봅니다.