Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AI를 통한 해설 수정 #43

Merged
merged 13 commits into from
Nov 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ bin/
/pinpoint-agent-2.2.3-NCP/logs/ComSsa-local-Id/pinpoint.log
/src/main/resources/templates/normal-question-update.html
/src/main/resources/static/js/updateQuestion.js

/uploadData.json
/uploadData.jsonl
### IntelliJ IDEA ###
.idea
*.iws
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.server.computerscience.chatbot.config;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class RestTemplateService {
private final RestTemplate restTemplate;

// 공통화된 sendPostRequest 메서드
public <T> ResponseEntity<T> sendPostRequest(
String url,
String bearerToken,
MediaType contentType,
Object body,
Class<T> responseType
) {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + bearerToken);
headers.setContentType(contentType);
HttpEntity<Object> requestEntity = new HttpEntity<>(body, headers);

return restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.server.computerscience.chatbot.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import com.server.computerscience.chatbot.dto.request.ChatGptBatchRequestDto;
import com.server.computerscience.chatbot.dto.response.ChatGptBatchResponseDto;
import com.server.computerscience.chatbot.dto.response.ChatGptFileUploadResponseDto;
import com.server.computerscience.chatbot.service.implement.ChatGptService;
import com.server.computerscience.question.common.dto.request.RequestQuestionCommandDto;
import com.server.computerscience.question.common.service.ExternalQuestionService;

import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;

@Controller
@Api(tags = {"AI 문제 수정 - ADMIN"})
@RequestMapping("/admin")
@RequiredArgsConstructor
public class ExternalQuestionController {

private final ExternalQuestionService externalQuestionService;

private final ChatGptService chatGptService;

@PostMapping("/chat-gpt/file/question")
public ResponseEntity<ChatGptFileUploadResponseDto> updateQuestionToChatGpt(
@RequestBody RequestQuestionCommandDto requestQuestionCommandDto
) {
return ResponseEntity.ok(externalQuestionService.sendQuestionToExternal(requestQuestionCommandDto));
}

@PostMapping("/chat-gpt/batch")
public ResponseEntity<ChatGptBatchResponseDto> createBatchToChatGpt(
@RequestBody ChatGptBatchRequestDto requestBatchDto
) {
return ResponseEntity.ok(chatGptService.sendBatchMessage(requestBatchDto));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.server.computerscience.chatbot.domain;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import com.server.computerscience.chatbot.dto.request.ChatContentDto;
import com.server.computerscience.question.common.domain.Question;
import com.server.computerscience.question.license.domain.LicenseMultipleChoiceQuestion;
import com.server.computerscience.question.major.common.domain.MajorMultipleChoiceQuestion;

@Service
public class QuestionToChatGptContentMapper {

public List<ChatContentDto> getContentsFromQuestion(List<? extends Question> questions) {
List<ChatContentDto> chatContentDtos = new ArrayList<>();
for (Question question : questions) {
ChatContentDto chatContentDto = createChatContentDtoForChatGpt(question);
if (chatContentDto != null) {
chatContentDtos.add(chatContentDto);
}
}
return chatContentDtos;
}

private ChatContentDto createChatContentDtoForChatGpt(Question question) {
if (question instanceof LicenseMultipleChoiceQuestion) {
LicenseMultipleChoiceQuestion licenseQuestion = (LicenseMultipleChoiceQuestion)question;
return ChatContentDto.from(
ChatContentType.TEXT,
licenseQuestion.toString()
);
} else if (question instanceof MajorMultipleChoiceQuestion) {
MajorMultipleChoiceQuestion majorQuestion = (MajorMultipleChoiceQuestion)question;
return ChatContentDto.from(
ChatContentType.TEXT,
majorQuestion.toString()
);
}
return null; // 지원되지 않는 Question 타입인 경우 null 반환
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.server.computerscience.chatbot.dto.request;

import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@ToString
public class ChatGptBatchRequestDto {
@JsonProperty("input_file_id")
private String inputFileId;

@JsonProperty("endpoint")
private String endpoint;

@JsonProperty("completion_window")
private String completionWindow;

public static ChatGptBatchRequestDto from(String inputFileId, String endpoint, String completionWindow) {
return ChatGptBatchRequestDto.builder()
.inputFileId(inputFileId)
.endpoint(endpoint)
.completionWindow(completionWindow)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.server.computerscience.chatbot.dto.request;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Builder
@ToString
public class ChatGptRequestFileUploadDto {
private String customId;
private String method;
private String url;
private ChatGptRestRequestDto body;

public static ChatGptRequestFileUploadDto from(ChatGptRestRequestDto body,
String customId,
String method,
String url) {
return ChatGptRequestFileUploadDto.builder()
.body(body)
.customId(customId)
.method(method)
.url(url)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,17 @@ public class ChatMessageDto {
private List<ChatContentDto> content;

public static ChatMessageDto from(String text, ChatRole role) {

return ChatMessageDto.builder()
.role(role.getLower())
.content(Collections.singletonList(ChatContentDto.from(ChatContentType.TEXT, text)))
.build();
}

public static ChatMessageDto from(List<ChatContentDto> chatContents, ChatRole role) {
return ChatMessageDto.builder()
.role(role.getLower())
.content(chatContents)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.server.computerscience.chatbot.dto.response;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@NoArgsConstructor
@ToString
public class ChatGptBatchResponseDto {
private String id;
private String object;
private String endpoint;
private String errors;
private String inputFileId;
private String completionWindow;
private String status;
private String outputFileId;
private String errorFileId;
private Long createdAt;
private Long inProgressAt;
private Long expiresAt;
private Long finalizingAt;
private Long completedAt;
private Long failedAt;
private Long expiredAt;
private Long cancellingAt;
private Long cancelledAt;
private RequestCounts requestCounts;
private Object metadata;

@Getter
@NoArgsConstructor
@ToString
public static class RequestCounts {
private int total;
private int completed;
private int failed;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.server.computerscience.chatbot.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ChatGptFileUploadResponseDto {
private String id;
private String object;
private int bytes;
private long createdAt;
private String filename;
private String purpose;
private String status;
private String statusDetails;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ public class ChatGptResponseDto {
private Usage usage;
private List<Choice> choices;

public String getFirstChoiceContent() {
return this.getChoices().get(0).getMessage().getContent();
}

@NoArgsConstructor
@AllArgsConstructor
@Getter
Expand Down
Loading
Loading