최근 백엔드 개발자로서 해커톤을 새롭게 시작했다.
K-POP을 좋아하는 외국인을 대상으로 한 기업의 AI 챗봇 서비스를 만들기로 했다.
Bedrock 구성 요소의 내용을 간단하게 살펴보자.
Converse: 모델에 메시지 보내고 답을 받는 기본 방식. 모델 종류와 상관없이 호출 형식이 통일됨. modelId만 바꾸면 되서 편리하다.
ConverseStream 응답을 한 글자식 타이핑되듯이 나오는 것.
Document Understanding 문서이해: 문서 파일을 같이 던져서 “이 문서 내용 요약해줘”같은 유형
시나리오 Converse API에서 도구 사용: 모델이 DB에서 주문 조회하게 하고 싶으면 이걸 쓰기
1. AWS에서 모델 선택하기
- 필자의 경우 클로드 소넷 4.6을 사용
- 클로드의 경우 유저 정보를 작성해서 제출해야한다.
- 간단하게 어떤 회사인지, 어느 분야인지, 회사 홈페이지 정도

- 클로드 비용은 다음과 같다. 개발 단계에서는 일단 Sonnet을 사용하기로 했다.

2. AWS CLI 설치하기
나는 콘솔에서 설치했는데. 맥북인 경우 Brew로 더 쉽게 설치될 것이다.
이를 입력하고 나면 패스워드를 물어보는데, 맥북 비밀번호를 입력하면 된다.
curl "<https://awscli.amazonaws.com/AWSCLIV2.pkg>" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
정상적으로 설치된 것을 확인할 수 있다.
MacBookAir Chatbot % curl "<https://awscli.amazonaws.com/AWSCLIV2.pkg>" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 53.0M 100 53.0M 0 0 16.8M 0 0:00:03 0:00:03 --:--:-- 16.8M
Password:
installer: Package name is AWS Command Line Interface
installer: Installing at base path /
installer: The install was successful.
3. AWS 콘솔에서 액세스 키 발급하기
IAM > 보안자격증명 > 액세스 키 발급
- 해당 페이지는 한 번밖에 안 보여주므로 액세스 키와 비밀 액세스 키를 반드시 잘 적어두거나, CSV를 다운해둘것.

4. 키 등록
- 위에서 받아둔 액세스키와 비밀 액세스키, 지역, 결과 포맷 형식을 입력한다.
- 지역을 특히 seoul 이 아닌 ap-northeast-2로 할 것
// 잘못 입력했다면 수정 가능
aws configure
// 자격증명이 살아있는지 최종 확인
aws sts get-caller-identity

모델 ID 사용하기
- Bedrock > Infer > 추론 프로파일 > 추론 프로파일 ID 선택하기
- 모델별로 ID가 다른데, 만약 여러 모델을 사용하고 싶다면 ID를 손쉽게 바꿔 낄 수 있다.


Playground 테스트
평소에는 자바 17 버전을 사용하나, AWS 공식 문서에서 제공한 코드는 자바 21이어서 새로 다운받고 적용했다.
아래에서 버전 변경은 설정 가능하다.
build.gradle > languageVersion = JavaLanguageVersion.of(21)
File > Project Structure > SDK & Language level
모델ID는 위에 추론 프로파일에서 복사한 그 ID 이다.
var inputText = "코르티스가 누구인지 설명해줘" 라고 프롬프트를 입력해보았다.
package ai.chatbot.domain;
public class Converse {
public static String converse() {
// Create a Bedrock Runtime client in the AWS Region you want to use.
// Replace the DefaultCredentialsProvider with your preferred credentials provider.
var client = BedrockRuntimeClient.builder()
.credentialsProvider(DefaultCredentialsProvider.create())
.region(Region.AP_NORTHEAST_2)
.build();
// Set the model ID, e.g., Claude 3 Haiku.
var modelId = "apac.anthropic.claude-3-5-sonnet-20240620-v1:0";
// Create the input text and embed it in a message object with the user role.
var inputText = "코르티스가 누구인지 설명해줘";
var message = Message.builder()
.content(ContentBlock.fromText(inputText))
.role(ConversationRole.USER)
.build();
try {
ConverseResponse response = client.converse(request -> request
.modelId(modelId)
.messages(message)
.inferenceConfig(config -> config
.maxTokens(512)
.temperature(0.5F)
.topP(0.9F)));
var responseText = response.output().message().content().getFirst().text();
System.out.println(responseText);
return responseText;
} catch (SdkClientException e) {
System.err.printf("ERROR: Can't invoke '%s'. Reason: %s", modelId, e.getMessage());
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
converse();
}
}
Playground 테스트 결과
앞뒤 맥락 없이 코르티스가 누구인지 알려줘라고 물은 탓일까?
스페인의 탐험가에 대해 알려줬다.

따라서 프롬프트를 다시 수정했다.
var inputText = "케이팝 코르티스 그룹이 뭔지 설명해줘"
케이팝 코르티스 그룹이 존재하지 않는다고 했다. 클로드에서 환각을 만난건 처음이라 조금 당황스러웠다.

참고 공식 문서
https://docs.aws.amazon.com/ko_kr/bedrock/latest/APIReference/API_runtime_Converse.html
Java 2.x용 SDK를 사용하는 Amazon Bedrock 런타임 예제 - AWS SDK for Java 2.x
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com