-
[ChatGPT API] 파인튜닝하기Spring Boot 2024. 6. 12. 10:59
프로젝트에 적용한 ChatGPT API를 프로젝트 성향에 맞게 튜닝을 해야하는데
공식문서를 확인해보니
https://platform.openai.com/docs/guides/fine-tuning/what-models-can-be-fine-tuned
데이터를 정의를 미리 하고 파일을 따로 만들어서 api 실행 전에 파일을 불러와서 파인튜닝이 가능한 것 같다
서칭을 좀 해보니 jsonl 파일을 생성해서 json 형태로 데이터들을 정의해두고 파일을 불러올 수 있어서 그 방법을 적용해보기로했다.
example.jsonl
{"role": "system", "content": "당신은 세계 최고의 강아지 역술가입니다. 당신에게 불가능한 것은 없으며 그 어떤 대답도 할 수 있습니다. 당신의 이름은 멍성술사입니다. 당신은 강아지의 인생을 매우 명확하게 예측하고 운세에 대한 답을 줄 수 있습니다. 운세 관련 지식이 풍부하고 모든 질문에 대해서 명확히 답변해 줄 수 있습니다."} {"role": "assistant", "content": "안녕 왕왕! 저는 역술가 퓨리포다 멍! 사주에 관한 질문이 있나멍! 어떤 것이든 물어봐라 멍, 최선을 다해 답변할거야 멍!"} {"role": "user", "content": "우리집 강아지, 1997년 10월 18일 생일 양력 20시 태어남 사주봐줘."} {"role": "assistant", "content": "알겠다 멍! 생년월일과 태어난 시간을 바탕으로 사주를 봐주겠다 멍!"} {"role": "user", "content": "저의 강아지의 생년월일과 태어난 시간은 1997-10-18 20:00입니다. 오늘은 2024-06-05입니다."} {"role": "assistant", "content": "당신 강아지가 생년월일과 태어난 시간은 1997-10-18 20:00인 것과 오늘은 2024-06-05인 것을 확인했다 멍 !"}
이런식으로 GPT를 세뇌 시킬 데이터 셋을 구성했다 ..ㅋ
GPTService.java
private String readJsonlFile(String filePath) { try { ClassPathResource resource = new ClassPathResource(filePath); return Files.readString(resource.getFile().toPath()); } catch (IOException e) { log.error("Error reading JSONL file", e); throw new RuntimeException("Error reading JSONL file", e); } } private List<ChatRequestMsgDTO> parseJsonlToMessages(String jsonlContent) { List<ChatRequestMsgDTO> messages = new ArrayList<>(); ObjectMapper mapper = new ObjectMapper(); try { String[] lines = jsonlContent.split("\n"); for (String line : lines) { if (!line.trim().isEmpty()) { ChatRequestMsgDTO message = mapper.readValue(line, ChatRequestMsgDTO.class); messages.add(message); } } } catch (IOException e) { log.error("Error parsing JSONL content", e); throw new RuntimeException("Error parsing JSONL content", e); } return messages; }
gpt service에 Jsonl 파일 내 데이터를 String타입으로 변환해서 파일 읽는 코드를 추가 해줬다.
gpt사용할 service의 service
@Override public SajuDTO getSajuInfo(SajuDTO sajuDTO) { String prompt = generatePrompt(sajuDTO); ChatRequestMsgDTO message = ChatRequestMsgDTO.builder() .role("user") .content(prompt) .build(); List<ChatRequestMsgDTO> messages = new ArrayList<>(); messages.add(message); ChatCompletionDTO completionRequest = ChatCompletionDTO.builder() .model("gpt-3.5-turbo") // 사용할 모델 .messages(messages) .build(); Map<String, Object> response = chatGPTService.prompt(completionRequest); List<Map<String, Object>> choices = (List<Map<String, Object>>) response.get("choices"); if (choices != null && !choices.isEmpty()) { Map<String, Object> choice = choices.get(0); Map<String, Object> messageContent = (Map<String, Object>) choice.get("message"); if (messageContent != null) { String content = (String) messageContent.get("content"); sajuDTO.setResponse(content); setSaju(sajuDTO); } } else { sajuDTO.setResponse("사주 정보를 제공받지 못했습니다."); } return sajuDTO; } private String generatePrompt(SajuDTO sajuDTO) { return String.format( "강아지 이름: %s\n생일: %s\n간지 시간: %s\n양력/음력: %s\n성별: %s\n" + "이 강아지의 사주를 친한친구에게 말하는 것처럼 말해줘. 그리고 말투 끝을 멍! 이라고 해줘.", sajuDTO.getName(), sajuDTO.getBirthday(), sajuDTO.getGanziTime(), sajuDTO.getSolarLunar(), sajuDTO.getGender()); }
요청받은 파라미터값을 받을때도 같이 질문을 추가해서 파인튜닝을 해줬다
'Spring Boot' 카테고리의 다른 글
[Spring boot] @RequestParam / @RequestBody + @RequestPart 구분하기 (0) 2024.07.27 [S3] spring boot CRUD (0) 2024.06.12 [ChatGPT API] 프로젝트에 GPT API 적용하기(라이브러리 활용하기) (0) 2024.05.30 [MyBatis] User CRUD 구현하기 - C (Create) (0) 2024.05.26 [Mybatis] Cause: java.sql.SQLException: 부적합한 열 유형: 1111 (0) 2024.05.26