Skip to content

Commit

Permalink
fix : update chatgptController, service
Browse files Browse the repository at this point in the history
  • Loading branch information
YoungGyo-00 committed Jan 29, 2024
1 parent 70cbc06 commit 32b1744
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import com.example.reddiserver.common.ApiResponse;
import com.example.reddiserver.dto.chatgpt.request.ChatGptRequest;
import com.example.reddiserver.dto.chatgpt.response.ChatGptCreationResultDto;
import com.example.reddiserver.dto.chatgpt.response.ChatGptResponse;
import com.example.reddiserver.service.ChatGptService;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -20,7 +23,7 @@ public class ChatGptController {

@Operation(summary = "ChatGPT로 원하는 브랜드 만들기")
@PostMapping("/question")
public ApiResponse<String> postChat(@RequestBody ChatGptRequest chatGptRequest) {
public ApiResponse<ChatGptCreationResultDto> postChat(@RequestBody ChatGptRequest chatGptRequest) throws JsonProcessingException {
return ApiResponse.successResponse(chatGptService.postChat(chatGptRequest), "AI 브랜딩 성공");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

@Getter
public class ChatGptRequest {
private String elements; // 원하는 브랜드 요소
private String atmospheres; // 원하는 브랜드 분위기
private String industries; // 종사하는 산업군
private String targets; // 어떤 고객 타켓
private String elements; // 브랜드 요소
private String atmospheres; // 브랜드 분위기
private String industries; // 산업군
private String targets; // 타켓
private String similarServices; // 유사 서비스
}
137 changes: 109 additions & 28 deletions src/main/java/com/example/reddiserver/service/ChatGptService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import com.example.reddiserver.dto.chatgpt.request.ChatGptContent;
import com.example.reddiserver.dto.chatgpt.request.ChatGptMessage;
import com.example.reddiserver.dto.chatgpt.request.ChatGptRequest;
import com.example.reddiserver.dto.chatgpt.response.ChatGptCreationResultDto;
import com.example.reddiserver.dto.chatgpt.response.ChatGptResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -16,7 +19,9 @@
import org.springframework.web.reactive.function.client.WebClient;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
Expand All @@ -37,75 +42,117 @@ public ChatGptService(WebClient.Builder webClientBuilder, @Value("${chatgpt.api-
this.objectMapper = objectMapper;
}

public String postChat(ChatGptRequest chatGptRequest) {
String elements = chatGptRequest.getElements();
public ChatGptCreationResultDto postChat(ChatGptRequest chatGptRequest) throws JsonProcessingException {
String[] elements = chatGptRequest.getElements().split(", ");
String atmospheres = chatGptRequest.getAtmospheres();
String industries = chatGptRequest.getIndustries();
String targets = chatGptRequest.getTargets();
String similarServices = chatGptRequest.getSimilarServices();

String data = """
String data1 = """
# 브랜드 스토리
왜 금융은 어려워야만 할까요? 필요하지만 어려운, 장벽이 있는 금융에 도전장을 던진 기업이 있습니다. 바로 토스입니다. 토스 등장 이전까지, 모바일 송금 절차는 어려웠습니다. 공인인증서가 필요했고 OTP나 보안카드 등 절차가 까다로웠죠. 하지만 2015년, 토스는 간편송금 서비스를 제공합니다. 이는 “편하고 쉬운 금융”의 시작이었습니다.
22년 토스는 리브랜딩을 통해 간편 송금을 넘어 투자, 보험 심지어 대출까지 다양한 금융서비스의 제공을 발표합니다. 그리고 “새로운 차원의 금융”을 선보인다고 공표하죠. 이는 간편함과 편리함을 넘어, 금융 생활 전반의 혁신을 일으키기 위한 첫 시작입니다. 어렵고 모르는 금융에서 쉽고 편리한 일상에 녹아드는 금융을 만들기까지, 토스의 여정은 계속됩니다.
22년 토스는 리브랜딩을 통해 간편 송금을 넘어 투자, 보험 심지어 대출까지 다양한 금융서비스의 제공을 발표합니다. 그리고 “새로운 차원의 금융”을 선보인다고 공표하죠. 이는 간편함과 편리함을 넘어, 금융 생활 전반의 혁신을 일으키기 위한 첫 시작입니다. 어렵고 모르는 금융에서 쉽고 편리한 일상에 녹아드는 금융을 만들기까지, 토스의 여정은 계속됩니다.
# 슬로건
금융을 쉽고 간편하게
# 브랜드 철학
자유롭게
푸른 컬러는 모두의 자유로운 금융생활을 꿈꾸는 토스의 비전을 의미합니다.
## 자유롭게
푸른 컬러는 모두의 자유로운 금융생활을 꿈꾸는 토스의 비전을 의미합니다.
## 유연하게
로고에서 볼 수 있는 부드럽게 이어지는 곡선은 끊임없이 도전하는 토스의 태도를 보여줍니다.
## 대담하게
공간감을 가진 토스의 새로운 로고는 새로운 차원의 금융을 약속하고, 이를 위한 의지를 보입니다.
""";

String data2 = """
# 브랜드 스토리
논픽션(NONFICTION)은 스튜디오 콘크리트를 역임한 차혜영 대표가 창업한 코스메틱 브랜드입니다. 논픽션이 출시한 제품은 향수, 바디용품, 핸드워시, 핸드크림 등의 라인업을 갖고 있습니다. 일반적인 뷰티 브랜드와 달리 논픽션은 한남동, 성수동 등 쇼룸에서 시작해 백화점 및 편집숍에 입점하는 색다른 행보를 보여주었습니다. 이는 논픽션의 프리미엄 컨셉의 브랜딩에 맞는 프리미엄 공간 추구성을 나타내며 그 공간에서의 제품 노출에 따른 브랜드 인식을 소비자에게 세워주기 위함으로 보입니다. 제품, 향, 입점 채널 모두 프리미엄 컨셉을 가진 논픽션은 최근 MZ 사이에서 작은 돈으로 사치를 누리는 '스몰 럭셔리'의 영향으로 높은 판매율을 기록했습니다.
# 슬로건
## Uncover your story
논픽션은 향을 매개로 내면의 힘을 이야기하는 라이프스타일 뷰티 브랜드입니다.
# Mission
## 고객에게 최상의 제품과 아름다운 라이프스타일 경험을 함께 선사하는 것
# 브랜드 네이밍
픽션(fiction)이 상상의 세계를 여는 문이라면, 논픽션(nonfiction)은 치장을 걷어낸 본질을 비추는 거울입니다. 우리는 자신과 만나는 일상 속 가장 내밀한 순간을 통해 그 순수한 이야기의 힘을 교감하고자 합니다. 모호한 현실과 부산한 잡음 사이에서 나만의 해답을 찾아내는 일. 나를 둘러싼 수많은 삶 속에서 목적과 의미를 되찾는 일. 논픽션은 변하지 않는 나만의 이야기를 찾아가는 순간과 함께합니다.
""";

String data3 = """
# 브랜드 스토리
누데이크(NUDAKE)는 아이웨어 브랜드 젠틀몬스터에서 만든 디저트 브랜드입니다. 패션과 아트를 합쳐 특별한 디저트를 만든다는 신념 하에 유니크한 디자인과 독특한 맛으로 다른 디저트 브랜드와 차별화를 시도 했습니다. 누데이크의 시그니쳐 디저트인 피크(Peak) 케이크는 한동안 SNS 상에서 큰 인기를 끌기도 했습니다. 누데이크는 주로 젊은 세대를 타켓으로 하며 젠틀몬스터에서 만든 브랜드인만큼 감각적인 공간 구성을 선보이며 젊은 고객의 선택을 많이 받고 있습니다. 누데이트는 패션과 예술에 대한 이해가 높은 기획자와 전문 파티시에가 협업해 특별함을 더하고 디저트 외에도 공간 곳곳에 설치된 오브제와 조형물, 공간의 여백까지 공간 예술적 구현을 통해 누데이트만의 브랜드 매력을 크게 나타내었습니다.
# 슬로건
## Make New Fantasy
# 브랜드 네이밍
New, Different, Cake. 세 가지 단어를 조합해 기존 F&B 업계에서는 볼 수 없었던 새로움을 가지고 있으면서도 맛있는 디저트라는 뜻입니다.
""";

String system_content = """
당신은 AI 브랜드를 만들어주는 서비스입니다
당신의 역할은 아래와 같습니다.
1. 기존에 존재하는 브랜드의 name, 브랜드의 tag, 브랜드의 content 를 제공받습니다
<브랜드 데이터 목록>
--------------------------------------------
* data
%s
* data 1 : %s
* data 2 : %s
* data 3 : %s
--------------------------------------------
2. 사용자의 입력은 아래와 같아
* 생성하고 싶은 브랜드 요소
예시 : 네이밍, 슬로건, 로고, 비전 미션, 브랜드 에센스, 키워드, 메니페스토 등등
* 생성하고 싶은 브랜드의 분위기
예시 : 역동적인, 즐거운 등등
* 생성하고 싶은 브랜드의 산업군
예시 : 금융, F&B
* 생성하고 싶은 브랜드의 타겟 고객
예시 : gen Z, 시니어, 20대 등등
* 생성하고 싶은 브랜드의 유사 서비스
예시 : 토스, 카카오뱅크 등등
위 네 가지 카테고리에 대해서 사용자의 입력을 받아 브랜드 정보를 생성해줘
3. 브랜드 태그 종류와 각 속성들은 아래와 같아
* 산업군 : F&B, 패션, 금융, 뷰티
* 브랜드 분위기 : 힙함, 키치함, 영함, 스트리트, 캐주얼, 심플함, 클래식, 아날로그, 귀여움, 세련됨 등등
* 브랜드 색감 : 흰색, 푸른색, 초록색 등등
4. 제약 조건
브랜드 스토리는 최대한 상세하게 적어줘
<브랜드 생성 예시>
브랜드 이름(네이밍) :
브랜드 네이밍 이유 :
브랜드 분위기 :
브랜드 색감 :
브랜드 스토리 :
브랜드 슬로건 :
""".formatted(data);
생성할 때 들어갈 key 값들은 총 7가지로, 아래와 같아
'브랜드 네이밍(name)', '브랜드 네이밍 이유(reason)', '브랜드 슬로건(slogan)', '비전(vision)'
'브랜드 에센스(essence)', '브랜드 키워드(keyword)', '매니페스토(manifesto)'
브랜드 생성 예시를 보고 JSON("key": "value") 형태의 결과값을 객체로 생성해줘
그리고, 브랜드 생성 예시에 맞춰서 정확히 7가지의 key, value 값들을 생성해줘
브랜드 생성 시 최대한 자세하게 내용 작성해줘
<브랜드 생성 JSON 형식>
{
"name": string,
"reason": string,
"slogan": string,
"vision": string,
"essence": string,
"keyword": string,
"manifesto": string
}
""".formatted(data1, data2, data3);

String user_content = """
생성하고 싶은 브랜드 요소 : %s
분위기 : %s
산업군 : %s
타겟 고객 : %s
유사 서비스 : %s
""".formatted(elements, atmospheres, industries, targets, similarServices);
""".formatted(atmospheres, industries, targets, similarServices);

List<ChatGptMessage> messages = new ArrayList<>();
messages.add(ChatGptMessage.builder()
Expand All @@ -122,7 +169,7 @@ public String postChat(ChatGptRequest chatGptRequest) {
.messages(messages)
.build();

String response = webClient.post()
ChatGptResponse chatGptResponse = objectMapper.readValue(webClient.post()
.uri("")
.body(BodyInserters.fromValue(body))
.retrieve()
Expand All @@ -132,8 +179,42 @@ public String postChat(ChatGptRequest chatGptRequest) {
.get(0)
.get("message")
.get("content")
.asText();
.asText(), ChatGptResponse.class);

return convertResponseToDto(elements, chatGptResponse);
}

return response;
private static ChatGptCreationResultDto convertResponseToDto(String[] elements, ChatGptResponse chatGptResponse) {
Map<String, String> result = new HashMap<>();

for (String element : elements) {
switch (element) {
case "네이밍":
result.put("네이밍", chatGptResponse.getName());
result.put("네이밍 이유", chatGptResponse.getReason());
break;
case "슬로건":
result.put("슬로건", chatGptResponse.getSlogan());
break;
case "비전 미션":
result.put("비전 미션", chatGptResponse.getVision());
break;
case "브랜드 에센스":
result.put("브랜드 에센스", chatGptResponse.getEssence());
break;
case "키워드":
result.put("키워드", chatGptResponse.getKeyword());
break;
case "메니페스토":
result.put("메니페스토", chatGptResponse.getManifesto());
break;
default:
log.info("정해진 브랜드 요소 이외에 다른 것이 들어왔음");
}
}

return ChatGptCreationResultDto.builder()
.result(result)
.build();
}
}

0 comments on commit 32b1744

Please sign in to comment.