AWS 기술 블로그
미리캔버스 AI 프레젠테이션 생성 서비스: Amazon Bedrock으로 그려낸 미리캔버스의 미래
미리디는 디자인 생태계를 혁신하여 간편한 디자인 문화를 만들어가는 회사입니다. 미리디가 제공하고 있는 미리캔버스는 무료 디자인 템플릿으로 저작권 걱정 없이, 누구나 간편하게 사용할 수 있는 웹 기반의 디자인 툴 입니다. 디자인을 몰라도, 문구만 바꿔도, 이미지가 없어도 누구나 쉽게 나만의 디자인을 자유롭게 편집하고 완성할 수 있습니다.
이 블로그에서는 미리캔버스의 ‘AI 프레젠테이션 생성’
서비스를 소개합니다. 이 서비스는 사용자가 프레젠테이션의 주제, 슬라이드 수, 그리고 원하는 디자인 템플릿을 선택하면 Claude 3 Sonnet 모델을 통해 해당 주제에 맞는 내용을 생성하고, 선택한 템플릿에 자동으로 입력하여 즉시 발표 가능한 수준의 고품질 프레젠테이션을 제공합니다.
미리캔버스의 사용자들은 일반적으로 자신의 메시지를 효과적으로 전달할 수 있는 프레젠테이션 디자인 템플릿을 먼저 선택한 후, 해당 디자인에 맞춰 내용을 채워넣습니다. 그러나 이 내용 작성 과정은 많은 시간과 노력을 요구하는 어려운 작업입니다. 사용자들의 이러한 어려움을 해소하고 프레젠테이션 제작 시간을 단축하기 위해, 미리캔버스는 ‘AI 프레젠테이션 생성’
서비스를 개발하게 되었습니다.
서비스 기능 살펴보기
AI 프레젠테이션 자동 생성 기능의 전체적인 작동 과정을 살펴보겠습니다. 이를 통해 각 단계가 어떻게 연결되어 최종 프레젠테이션 결과물을 만들어내는지 이해할 수 있을 것입니다.
1. 개요 작성
사용자가 원하는 프레젠테이션의 주제를 입력하면, 자동으로 그에 맞는 개요를 생성합니다.
이렇게 생성된 개요의 내용과 순서는 사용자의 필요에 따라 자유롭게 수정할 수 있습니다. 이를 통해 사용자는 AI가 제안한 구조를 기반으로 하되, 자신이 의도에 맞게 프레젠테이션의 흐름을 최적화할 수 있습니다.
2. 레이아웃 결정
이전 단계에서 자동으로 생성된 각 개요 항목에 가장 적합한 페이지 레이아웃이 추천됩니다. 이 과정에서 내용의 특성과 템플릿의 디자인이 조화롭게 어우러지도록 고려됩니다. 사용자는 추천된 템플릿 중에서 원하는 템플릿을 선택합니다.
3. 내용 생성
생성된 개요와 선택된 템플릿의 레이아웃을 기반으로, 프레젠테이션에 포함될 구체적인 내용이 생성됩니다. 필요에 따라 텍스트 뿐만 아니라 관련 이미지도 함께 포함됩니다.
4. 결과
AI가 생성한 프레젠테이션 초안이 완성되면, 사용자는 이를 검토하고 필요에 따라 세부 내용을 수정할 수 있습니다. 텍스트 편집, 이미지 교체, 레이아웃 조정 등 다양한 편집 작업을 통해 최종 프레젠테이션을 완성합니다. 특히 이미지의 경우, AI가 제안한 이미지를 그대로 사용하거나 미리캔버스에서 제공하는 다른 이미지로 대체할 수 있으며, 사용자가 직접 파일을 업로드하여 커스터마이즈 할 수도 있습니다. 이러한 과정을 통해 사용자는 AI가 생성한 기본 구조를 토대로 자신만의 독특하고 효과적인 프레젠테이션을 완성할 수 있습니다.
솔루션 요약 및 구성 요소 설명
아키텍처
첨부된 이미지는 ‘AI 프레젠테이션 생성’ 서비스의 구조와 데이터 데이터 흐름을 도식화한 것입니다.
이제 전체 흐름을 단계별로 살펴보겠습니다.
[sync 동작]
1. 사용자 요청
Amazon ECS 서버를 통해 사용자의 API 요청을 받습니다.
2. 데이터베이스에 요청 데이터 저장
Amazon RDS에 사용자의 요청 데이터를 저장합니다.
3. 텍스트 생성을 위한 Amazon Bedrock API 호출
Amazon Bedrock API를 통해 Claude 3 Sonnet에게 프레젠테이션 내용 생성을 요청합니다.
4. 사용자 응답 전송
요청이 정상적으로 접수되었음을 사용자에게 API 응답으로 반환합니다.
5. Polling API
사용자는 Polling API를 통해 주기적으로 외부 API 처리 완료 여부를 확인합니다. 아래 async 동작이 완료된 이후 요청된 건에 대해서는 사용자에게 최종 응답 결과를 전달합니다.
[async 동작]
위 sync 동작 중 3. 텍스트 생성을 위한 Amazon Bedrock API 호출 이후 아래 순서대로 비동기적으로 동작합니다.
1. Amazon Bedrock API 응답
Claude 3 Sonnet으로부터 텍스트 생성 요청에 대한 응답을 받습니다.
2. 이미지 생성 요청 (optional)
필요시 생성된 텍스트 내 이미지에 대한 설명을 바탕으로 사내 AI 이미지 서버에 이미지 생성 요청 후 응답을 받습니다.
3. 데이터베이스에 외부 API 응답 데이터 업데이트
Amazon RDS에 저장된 요청 데이터를 찾아 그에 해당하는 외부 API(텍스트, 이미지 생성) 응답 데이터를 업데이트 합니다.
솔루션 구현 상세
모델 선정 이유: Anthropic Claude 3 Sonnet의 선택
AI 프레젠테이션 생성 툴 개발 초기, 미리캔버스 팀은 세 가지 주요 LLM 모델을 고려했습니다:
- Anthropic Claude 3 Sonnet
- OpenAI GPT-4-turbo
- Google Gemini 1.5 Pro
각 모델의 기능과 성능을 철저히 평가한 결과, Claude 3 Sonnet을 프로덕션에 투입하기로 결정했습니다. 이 선택은 몇가지 기술적 우수성과 우리의 사용 사례에 대한 적합성을 바탕으로 이루어졌습니다.
[모델 평가 결과]
1. Anthropic Claude 3 Sonnet:
Claude 3 Sonnet은 자연어 이해와 처리 능력에서 뛰어난 성능을 보여줍니다. 사용자의 입력을 정확히 해석하고 적절한 내용을 생성하는데 특히 강점을 가집니다. 문장 구성의 일관성과 문체적 정확성이 뛰어나 사용자가 원하는 스타일과 톤에 맞춰 고도로 맞춤화된 프레젠테이션을 제작할 수 있게 합니다. 또한, 주어진 프롬프트에 대해 생각을 확장하고, 복잡한 사용자 요구사항을 해결할 수 있는 독특한 능력을 갖추고 있습니다. 이는 프레젠테이션의 목차와 내용을 자동으로 생성하는 과정에서 중요한 역할을 하며, 사용자의 애매모호한 요청을 명확한 결과로 전환할 수 있게 합니다. 안전성과 윤리적 사용을 중시하는 모델 설계로 인해 더 신뢰할 수 있는 결과물을 생성합니다.
2. OpenAI GPT-4-turbo:
GPT-4는 광범위한 지식 베이스와 함께 강력한 언어 생성 능력을 제공합니다. 이 모델은 특히 복잡한 주제에 대한 통찰을 제공하고, 이를 사용자가 이해하기 쉬운 형식으로 변환하는 능력이 탁월합니다. 그러나 때로는 필요 이상으로 방대한 정보를 생성하거나 과도한 창의성으로 인해 주어진 지침을 벗어나는 내용을 생성하는 경향이 있습니다.
3. Google Gemini 1.5 Pro:
Gemini 1.5 Pro는 데이터 처리와 분석에 강점을 보이며, 특히 대량의 정보를 효과적으로 처리합니다. 이 모델은 구조화된 데이터와의 상호작용에 최적화되어 있지만, 텍스트 중심의 문서 작성에서는 Claude 3 Sonnet만큼의 유연성을 보이지 않습니다.
이 세 모델 중, Claude 3 Sonnet을 선택한 결정적인 이유는 높은 수준의 언어 이해력과 사용자 의도 반영 능력입니다.
이 모델은 입력 데이터를 바탕으로 사용자의 의도를 정확히 파악하고, 이를 충실히 반영한 콘텐츠를 생성합니다. AI 프레젠테이션 툴에 필요한 정밀한 텍스트 작성, 일관된 스타일 유지, 복잡한 사용자 요구 해석과 반영 측면에서 Claude 3 Sonnet의 성능이 우수하다고 판단했습니다.
이러한 기술적 이점을 바탕으로, Claude 3 Sonnet은 사용자 경험 최적화와 고품질 프레젠테이션 자동 생성 서비스 제공에 핵심적인 역할을 하고 있습니다. 이 선택은 프로젝트의 성공을 이끄는 주요한 요인이 되었으며, 향후 서비스 개선과 확장의 기반이 될 것입니다.
Spring 애플리케이션과 Amazon Bedrock 연동하기
Amazon Bedrock은 Amazon과 Anthropic, Cohere 등 제3자 모델 제공업체의 기본 모델을 API를 통해 접근할 수 있게 해주는 완전 관리형 서비스입니다. Amazon Bedrock API에 직접 접근하여 간단한 학습과 솔루션 개발을 할 수 있습니다. 하지만 생성형 AI애플리케이션 개발은 단순히 API를 통해 대규모 언어모델(LLM)을 사용하는 것 이상입니다. 순차적 워크플로우 조정(예: LLM 응답을 기반으로 다른 LLM 호출), LLM에 추가 컨텍스트를 제공하기 위한 데이터 소스(텍스트, PDF, 링크 등) 로딩, 대화형/챗봇/QA 솔루션을 위한 히스토리 컨텍스트 유지 등 솔루션의 다른 부분들도 고려해야 합니다. 이러한 기능들을 쉽게 구현하기 위해 LangChain, Spring AI 등의 프레임워크를 사용할 수 있습니다.
미리디에서는 Spring AI에서 Claude 3를 아직 지원하지 않았던 시기(Spring API 0.8.1 기준)에 프로젝트를 시작하였기 때문에 Spring Boot 프로젝트에 Amazon Bedrock 클라이언트 관련 클래스를 직접 구성하여 사용했습니다.
1. Spring AI 없이 Spring Boot 프로젝트에서 Claude 3 사용하기
1) Anthropic Claude Messages API 스펙에 맞춘 Java 클래스 구현
Amazon Bedrock 문서에서 제공하는 Anthropic Claude Messages API 의 스펙에 맞게 클래스를 구성하였습니다. 아래는 Claude 3 Sonnet(anthropic.claude-3-sonnet-20240229-v1:0)기준으로 구성한 java 클래스 예제입니다.
Request.java
public class Request {
private String anthropicVersion;
private Integer maxTokens;
private List<Message> messages;
private String system;
private Float temperature;
private Float topP;
private Float topK;
private List<String> stopSequences;
...
}
Response.java
public class Response {
private String id;
private String model;
private String type;
private String role;
private List<Content> content;
private StopReason stopReason;
private String stopSequence;
private Usage usage;
...
}
2) BedrockRuntimeAsyncClient를 이용한 Amazon Bedrock 연동
AWS SDK for Java에서 제공하는 bedrockruntime 패키지를 활용하여 Amazon Bedrock과의 연동을 구현하였습니다. 아래는 BedrockRuntimeAsyncClient를 사용해 Claude 3 모델에 비동기 요청을 보내는 Java 코드 예시입니다.
InvokeModelRequest request = InvokeModelRequest.builder()
.body(SdkBytes.fromUtf8String(MAPPER.writeValueAsString(request)))
.modelId(model)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON_VALUE)
.build();
CompletableFuture<InvokeModelResponse> future = client.invokeModel(request);
2. 커스텀 SdkAsyncHttpClient 클래스 구현을 통한 타임아웃 설정 최적화
AWS SDK에서 기본 제공하는 클라이언트를 사용해도 기능적으로는 문제가 없었습니다. 그러나 기본 타임 아웃 설정이 우리의 서비스의 요구사항에 비해 짧다는 점이 확인되었습니다. 이 문제를 해결하기 위해 SdkAsyncHttpClient 클래스의 구현체를 커스터마이즈하여 타임아웃 설정을 최적화했습니다. 아래 코드는 BedrockRuntimeAsyncClient의 SdkAsyncHttpClient를 설정하는 Java 코드 예제입니다.
BedrockRuntimeAsyncClient client = BedrockRuntimeAsyncClient.builder()
.httpClient(getAsyncHttpClient())
...
.build();
private SdkAsyncHttpClient getAsyncHttpClient() {
return NettyNioAsyncHttpClient.builder()
.maxConcurrency(MAX_CONCURRENCY)
.readTimeout(READ_TIMEOUT)
.writeTimeout(WRITE_TIMEOUT)
...
.build();
}
현재는 Spring AI에서 Claude 3 모델을 공식 지원하고 있어, 이를 활용하면 복잡한 설정 없이도 Spring 애플리케이션과 Amazon Bedrock과의 연동을 더욱 간편하게 구현할 수 있습니다.
프롬프트 엔지니어링 과정
미리캔버스의 AI 프레젠테이션 생성 서비스는 Amazon Bedrock에서 Claude 3 Sonnet 모델을 활용하여 프레젠테이션 제작 과정을 자동화합니다. 이 서비스는 프레젠테이션의 목차 생성부터 시작하여 레이아웃 선택, 그리고 각 페이지별 텍스트 및 이미지 생성에 이르는 전체 과정을 포괄합니다.
전체 프로세스는 다음 세가지 주요 단계로 구성됩니다:
- 목차 생성
- 레이아웃 선택
- 각 페이지 별 텍스트 및 이미지 프롬프트 생성
이제 각 단계에서 사용되는 프롬프트와 그 역할에 대해 자세히 살펴보겠습니다.
1. 목차 생성
Claude 3 Sonnet 모델은 사용자가 입력한 주제와 페이지 수를 기반으로 프레젠테이션의 목차를 생성합니다. 이 과정에서 모델은 먼저 주제를 발표 형식에 적합하게 정제한 후 목차를 작성합니다. 사용자들이 종종 모호한 요구사항을 입력하는 경우가 많기 때문에, Chain of Thought(CoT) 방식으로 주제를 명확히 하고 체계적인 목차를 생성하도록 설계되었습니다.
다음은 주어진 주제와 페이지 수를 바탕으로 목차를 생성하는 프롬프트입니다.
[목차 생성 프롬프트]
[Output]
2. 레이아웃 선택
미리캔버스는 AI 프레젠테이션 자동 생성에 활용할 수 있는 다양한 템플릿을 보유하고 있습니다. 이를 효과적으로 활용하기 위해, 각 템플릿의 특성을 텍스트로 정의하는 사전 작업을 수행했습니다. 각 페이지의 목적, 텍스트 박스 수, 이미지 프레임 등 템플릿의 세부 구조를 명확히 기술하였습니다. 이를 바탕으로 Claude 3 Sonnet 모델은 앞서 생성된 목차에 가장 적합한 레이아웃을 이 템플릿 라이브러리에서 선별합니다.
Figure 1 개요를 바탕으로 각 페이지 별 어울리는 레이아웃 선택
[각 템플릿의 특성을 텍스트로 정의한 템플릿 세트]
이를 바탕으로 Claude 3 Sonnet 모델은 앞서 생성된 목차에 가장 적합한 레이아웃을 이 템플릿 라이브러리에서 선별합니다.
[레이아웃 선택 프롬프트]
[Output]
{"1":1,"2":4,"3":5,"4":11,"5":8,"6":13,"7":16,"8":18}
3. 각 페이지 별 텍스트 및 이미지 프롬프트 생성
최종 단계에서는 앞서 선택된 레이아웃에 맞춰 각 슬라이드의 텍스트와 이미지를 생성합니다. Claude 3 Sonnet 모델은 주어진 정보를 바탕으로 완성도 높은 프레젠테이션 자료를 자동으로 구성합니다. 이 과정은 다음과 같이 세부적으로 진행됩니다:
1) 사용 언어 확인
먼저, 사용자가 입력한 프레젠테이션 주제와 개요를 분석하여 사용된 언어를 식별합니다. 예를 들어, 입력된 내용이 한국어인 경우 “Language: Korean”으로 출력됩니다. 이는 LLM이 콘텐츠 작성 방향을 설정하고, 어떤 정보를 중점적으로 다룰지 결정하는 데 중요한 요소로 작용합니다.
2) 슬라이드 텍스트 생성
각 슬라이드의 텍스트는 주제, 소주제, 그리고 선택된 레이아웃 정보를 기반으로 작성됩니다. 레이아웃마다 슬라이드의 목적, 사용 가능한 텍스트 박스의 개수, 각 텍스트 박스의 글자 수 제한 등이 명시되어 있습니다. 이러한 제약 조건을 엄격히 준수하면서, 각 페이지에 적합한 텍스트를 생성합니다.
3) 이미지 설명 생성
레이아웃에 이미지 프레임이 포함된 경우, 해당 프레임에 들어갈 이미지를 설명하는 텍스트를 생성합니다. 이 설명은 슬라이드의 주제와 레이아웃 내 이미지의 위치를 고려하여, 적절한 시각적 요소를 표현할 수 있도록 작성됩니다. 생성된 텍스트 설명은 후속 단계에서 이미지 생성 모델을 통해 실제 이미지로 변환됩니다.
아래는 “여행 목적지 선택하기”란 주제로 4개의 이미지 프레임에 대해 생성된 이미지 설명입니다.
이제 각 설명을 이미지 생성 모델의 입력 프롬프트로 사용해 이미지를 생성한 후, 생성된 이미지를 해당 인덱스 번호의 프레임에 배치합니다
[내용&이미지 설명 생성 프롬프트]
[Output]
마무리
지금까지 Amazon Bedrock과 Claude 3 Sonnet 모델을 활용하여, 사용자의 아이디어를 프레젠테이션 내용 생성부터 디자인까지 한 번에 구현하는 AI 프레젠테이션 생성 서비스 구현 과정을 소개해 드렸습니다. 현재 AI 프레젠테이션을 사용하는 유저 중 10%는 매주 다시 방문하여 AI 프레젠테이션으로 새로운 프레젠테이션을 만들고 있습니다. 더불어 약 3,500명의 유저들이 매주 AI 프레젠테이션 생성 기능을 사용하고 있습니다.
그리고 미리캔버스에서 자연어로 원하는 디자인 템플릿을 추천 받는 챗봇 서비스를 소개하는 아래 블로그도 읽어 보시는 것을 권장 드립니다.
미리디 알파 스쿼드는 현재 미리캔버스의 모든 프레젠테이션 템플릿을 대상으로 이 서비스를 확장하고 있습니다. 더불어, 보다 신뢰할 수 있는 프레젠테이션 내용 생성을 위해 구글 검색 엔진을 도입하여 최신 정보를 정확하게 반영하고자 노력하고 있습니다. 이를 통해 사용자들에게 더욱 풍부하고 정확한 프레젠테이션 제작 경험을 제공할 수 있을 것으로 기대합니다.