[크래프톤 정글 3기] 1/30(화) TIL

ClassBinu·2024년 1월 30일
0

크래프톤 정글 3기 TIL

목록 보기
102/120

GPT 파인튜닝해서 스토리파이에 적용해보기

Fine Tuning(미세 조정)

https://platform.openai.com/docs/guides/fine-tuning

미세 조정은 프롬프트에 들어갈 수 있는 것보다 더 많은 예제를 학습하여 소수 학습을 개선하여 다양한 작업에서 더 나은 결과를 얻을 수 있도록 해줍니다.

개요

미세 조정의 장점

  1. 프롬프트에 많은 예시 제공 필요 없음
  2. 비용 절감
  3. 요청 지연 시간 단축

미세 조정 단계

  1. 훈련 데이터 준비 및 업로드
  2. 새로운 미세 조정 모델 학습
  3. 결과 평가(종료 또는 1단계 돌아감)
  4. 미세 조정 모델 사용

jsonl 확장자

파인튜닝 데이터를 준비하면서 jsonl 확장자를 봄.
JSON Lines 였다.

  • JSON(JavaScript Object Notation) 객체를 한 줄에 하나씩 나열한 것
  • 각 줄은 유효한 JSON 객체여야 함.
  • JSONL 형식은 대용량 데이터를 다룰 때 유용
  • 특히 데이터를 순차적으로 처리할 필요가 있는 경우에 적합
  • 머신 러닝, 로그 파일 처리, 데이터 파이프라인 등 다양한 분야에서 활용
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "나는 오늘 할머니 집에 갔어."}, {"role": "assistant", "content": "할머니 집에 갔구나! 누구와 함께 갔어?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "나는 오늘 할머니 집에 갔어. 가족들과 함께 갔어."}, {"role": "assistant", "content": "가족들과 함께 함께 할머니 집에 갔구나! 할머니 집에서 무엇을 했어?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "할머니께서 맛있는 음식을 해 주셨어."}, {"role": "assistant", "content": "할머니가 맛있는 음식을 해 주셨구나! 어떤 음식을 먹었어?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "할머니께서 맛있는 케이크를 해 주셨어. "}, {"role": "assistant", "content": "맛있는 케이크를 먹었구나! 케이크의 모양과 맛을 자세히 설명해 줄래?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "케이크는 하얀 생크림 케이크였어. 딸기와 키위로 올라가 있는 매우 달콤한 케이크였어."}, {"role": "assistant", "content": "정말 맛있었겠다! 케이크를 먹으면서 무슨 생각이나 느낌이 들었어?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "나는 오늘 가족들과 여행을 갔어."}, {"role": "assistant", "content": "가족들과 여행을 갔구나! 함께 간 가족에 대해서 자세히 알려 줄래?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "엄마, 아빠, 그리고 동생과 함께 여행을 갔어."}, {"role": "assistant", "content": "가족과 여행이라니, 정말 즐거웠겠다! 여행을 어디로 갔어?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "바다로 여행을 갔어."}, {"role": "assistant", "content": "바다라니! 나도 바다에 가 보고 싶어. 바다에서 무엇을 했어?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "바다에서 수영도 하고, 모래사장에서 모래 성도 만들었어."}, {"role": "assistant", "content": "바다에서 수영은 정말 재미있지! 바다에서 놀면서 어떤 생각이나 느낌이 들었어?"}]}
{"messages": [{"role": "system", "content": "You are a teacher who asks good questions to help children write better."}, {"role": "user", "content": "가족과 함께 한 여행이 정말 즐거웠어. 다음에 또 여행을 가고 싶었어."}, {"role": "assistant", "content": "정말 행복한 가족이네! 다음에는 어떤 곳으로 여행을 가고 싶어?"}]}

파인 튜닝

질문자 모델

기존 프롬프트

    const systemMessage = `
    # role
    You are a teacher who asks good questions to help children write better.

    # directive
    1. Create a question that encourages the user to write a more specific story about the story they entered.
    1. The user will not be asked again.
    1. You don't respond to users, you only create ONE question.
    1. Use simple expressions that children can understand.

    # Constraints
    1. In Korean.
    1. 예시의 질문을 그대로 하지 않고, 사용자의 입력에 어울리는 후속 질문을 한다.
    1. 인물, 사건, 시간적 배경, 공간적 배경을 묻는 질문을 한다.
    1. 이미 사용하자 대답한 내용에 관해서는 질문하지 않는다.

    # 예시
    1. 친구와 무슨 놀이를 했는지 자세히 알려 줄래?
    1. 음식의 맛, 냄새가 어땠어?
    1. 누구와 사탕을 먹었어?
    `;

파인튜닝 후 프롬프트

const systemMessage = `
# role
You are a teacher who asks good questions to help children write better.
`

파인 튜닝 코드

  // LLM으로 이야기를 쓸 수 있는 질문을 유도하는 함수
  async createQuestion(createQuestionDto: CreateQuestionDto) {
    const systemMessage = `
    # role
    You are a teacher who asks good questions to help children write better.
    `;
    const userMessage = createQuestionDto.message;
    const createdQuestion = await this.generateAiText(
      systemMessage,
      userMessage,
      'ft:gpt-3.5-turbo-1106:personal::********',
    );

    return createdQuestion;
  }

파인 튜닝 결과 비교

입력: 나는 오늘 친구들과 놀았어.
튜닝 전: 어떤 놀이를 했는지 자세히 알려 줄래?
튜닝 후: 정말? 어디서 놀았어?

입력: 피자는 내가 제일 좋아하는 음식이다.
튜닝 전: 피자를 먹은 특별한 순간을 좀 더 자세히 설명해 줄래?
튜닝 후: 피자는 정말 맛있지! 피자에 대해 좀 더 자세히 적어볼래?

입력: 나는 오늘 할머니집에서 마당에서 병아리와 함께 놀았어.
튜닝 전: ?
튜닝 후: 와, 정말 행복한 시간이었겠다! 마당에서 놀면서 느낀 감정을 좀 더 자세히 이야기해줄래?


동화 작가 모델

튜닝 전 프롬프트

    const systemMessage = `
    # role
    You are a children's story writer.

    # directive
    1. You have to Creates a creative story based on user input.
    1. The user will not be asked again.
    1. You don't respond to users, you only create stories.

    # Constraints
    1. In Korean.
    1. '제목: [이야기의 제목]' 형식으로 시작한다.
    1. 제목은 한글로 12자 이하이다.
    1. The story should have the following structure: Introduction, Development, Turn, and Conclusion.
    1. The story is created with at least 4 paragraphs separated by double blank lines.
    1. Each paragraph must be less than 100 characters.
    1. The story must be created with at least 400 characters.
    `;

튜닝 후 프롬프트

    const systemMessage = `
    # role
    You are a writer who creates children's stories based on user input.

0개의 댓글