Skip to content

미세 조정

작업 목적에 맞게 모델을 조정하는 방법을 알아보세요.

개요

미세 조정을 통해 모델이 학습하지 못했던 작업에 대해서 더 나은 결과를 얻을 수 있게 해줍니다. 미세 조정을 하지 않고도 모델에게 몇 가지 예시를 제공해주는 방식(퓨샷 학습)으로 모델이 학습하지 못했던 작업에 대해서 더 좋은 결과를 내보내게 만들 수 있습니다. 그러나 모델이 미세 조정되면 프롬프트에 들어갈 수 있는 것보다 더 많은 예제를 모델이 미리 학습하여(미세 조정) 다양한 작업에 대해서 더 나은 결과를 얻을 수 있도록 해줍니다. 또한 프롬프트에 많은 예시를 사전에 제공할 필요가 없어서 비용 절감과 요청 시간의 단축 효과를 얻을 수 있습니다.

미세 조정을 통해 다음과 같은 효과를 얻을 수 있습니다.

  1. 프롬프트 보다 더 높은 품질의 결과
  2. 짧은 프롬프트로 토큰 절약과 응답 시간 단축

미세 조정이 필요한 경우

코난 LLM을 미세 조정하면 특정 작업에 맞는 더 나은 모델을 만들 수 있지만 시간과 노력이 필요한 작업이므로 신중한 투자가 필요합니다. 미세 조정을 하기 전에 프롬프트 엔지니어링, 프롬프트 체인(복잡한 작업을 여러 프롬프트로 나누는 방법) 등을 통해서 좋은 결과를 얻으려는 시도를 하는 것이 좋습니다.

  • 모델이 처음에는 잘 수행되지 않는 것처럼 보이는 많은 작업이 있지만 올바른 프롬프트를 사용하면 결과가 향상될 수 있으므로 미세 조정이 필요하지 않을 수 있습니다.
  • 학습 데이터셋을 생성하고, 모델 학습을 진행해야 하는 미세 조정으로 반복하는 것 보다, 프롬프트를 수정하는 것이 피드백이 훨씬 빠릅니다.
  • 미세 조정이 필요한 경우 초기 프롬프트 엔지니어링 작업을 활용할 수 있습니다. 일반적으로 미세 조정 데이터에 좋은 프롬프트를 사용할 때 최상의 결과를 얻을 수 있습니다.

미세 조정 사례

미세 조정을 통해 결과를 개선할 수 있는 몇 가지 사례는 다음과 같습니다.

  • 스타일, 톤, 형식 또는 기타 질적 측면 설정

    ✔ 문서 초안 작성

    ✔ 요약

    ✔ 대화

  • 원하는 출력을 생산할 때 신뢰성 향상

    ✔ 질의/응답

  • 복잡한 프롬프트를 모델이 따르지 못하는 경우

    ✔ 참고 문서 기반 질의/응답

    ✔ 참고 문서 기반 문서 초안 작성

  • 고정된 방식으로 많은 엣지 케이스 처리

    ✔ 번역

    ✔ 분류

  • 프롬프트에서 명확하게 표현하기 어려운 새로운 기술이나 작업 수행

대부분의 작업에 대해서 파라미터 수가 많은 모델이 적은 모델 보다 더 나은 성능을 보여주지만, 미세 조정된 적은 모델이 파라미터 수가 더 많은 모델과 비슷한 품질 혹은 더 나은 품질에 도달할 수 있는 경우가 많습니다.

미세 조정 절차

미세 조정은 크게 아래와 같은 단계로 수행합니다.

  1. 데이터셋 준비
  2. 미세 조정 모델 만들기
  3. 미세 조정 모델 사용

데이터셋 준비

미세 조정이 필요하다고 판단되면 모델 학습을 위한 데이터셋을 준비해야 합니다. 실제 사용자들이 사용할 프롬프트와 유사하게 다양한 대화 데이터셋을 만듭니다.

1) 데이터 형식

학습 데이터는 각 라인이 하나의 대화 셋을 의미하는 JSONL, 혹은 CSV 형식을 사용할 수 있습니다.

  • 싱글턴

    ✔ JSONL 형식

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

        ✔ CSV 형식

prompt,completion
<prompt text>,<ideal generated text>
<prompt text>,<ideal generated text>
<prompt text>,<ideal generated text>

각 예제는 모델에 대한 사용자의 지시가 포함된 <prompt text>와, 모델이 생성하기를 기대하는 답변이 포함된 <ideal generated text>로 구성됩니다.

  • 멀티턴

    ✔ JSONL 형식

    아래 예제와 같이 각 라인이 하나의 멀티턴 대화셋을 의미하는 JSONL 형식을 준비하십시오.

{“messages”: [{“role”: “system”, “content”: “너는 냉소적인 사실 기반 챗봇이야.”}, {“role”: “user”, “content”: “프랑스의 수도는 어디야”}, {“role”: “assistant”: “content”, “프랑스의 수도는 파리야.”}, {“role”: “user”, “content”: “더 냉소적으로 답해봐”}, {“role”: “assistant”: “content”, “응, 프랑스의 수도는 파리야. 다른 나라들처럼 수도를 자주 바꾸지 않아서 다행이지.”}]}
{“messages”: [{“role”: “system”, “content”: “너는 냉소적인 사실 기반 챗봇이야.”}, {“role”: “user”, “content”: “로미오와 줄리엣을 쓴 작가는 누구야”}, {“role”: “assistant”: “content”, “로미오와 줄리엣은 윌리엄 셰익스피어가 쓴 희곡입니다.”}, {“role”: “user”, “content”: “더 냉소적으로 말할 수 있어”}, {“role”: “assistant”: “content”, “물론이죠. 로미오와 줄리엣은 윌리엄 셰익스피어가 쓴 희곡입니다. 그분이 아니면 누가 쓸 수 있겠습니까?”}]}

2) 프롬프트 작성하기

미세 조정 예시를 참고하세요.

3) 권장 예제 개수

  • 미세 조정을 위해서는 최소 200개 이상의 학습 데이터가 필요합니다.
  • 일반적으로 200개의 이상의 학습 데이터로 미세 조정을 하면 명확한 개선을 볼 수 있지만, 학습 난이도에 따라서 적절한 권장 데이터 수는 크게 달라질 수 있습니다.
  • 잘 만들어진 200개의 학습 데이터로 시작하여, 모델의 성능을 평가하면서, 추가 데이터 수집을 고려하는 것이 좋습니다.
  • 모델의 개선이 있을 경우, 원하는 품질이 나올 때까지 학습 데이터의 수를 동일한 방법으로 늘려갈 수 있습니다.
  • 모델의 개선이 없을 경우, 개선이 나올 때까지 학습 데이터의 수를 늘려갈 수도 있고, 데이터를 재구성하는 것을 검토할 필요가 있습니다.

4) 토큰 길이 제한

각 학습 데이터는 모델 마다 적용된 토큰 길이 제한을 가집니다. 이 보다 긴 데이터는 모델 마다 적용된 토큰 길이 까지만 잘라서 사용합니다.

미세 조정 모델 만들기

충분한 양의 학습 데이터셋을 업로드하고 나면 모델을 미세 조정할 수 있습니다. 미세 조정은 LLM 스튜디오 UI를 통해서 하거나 REST API를 호출하여 사용할 수 있습니다.

조정 방법

미세 조정 방법은 크게 전체 미세 조정(Full Fine-Tuning)과 매개변수 효율적인 미세 조정(Parameter-Efficient Fine-Tuning)으로 나뉩니다.

전체 미세 조정은 모델의 모든 매개변수를 업데이트하므로, 매우 복잡한 태스크에 맞게 모델을 조정하기에 적합하고 더 높은 품질을 달성할 가능성이 있습니다. 그러나 전체 미세 조정에는 조정 및 서빙을 위해 더 높은 컴퓨팅 리소스가 필요하므로 전체 비용이 증가합니다.

매개변수 효율적인 미세 조정은 모델의 특정 매개변수만 학습시키는 방법으로 전체 미세 조정 보다 적은 장비로 모델을 학습할 수 있습니다.

1) LLM 스튜디오

시작하기 페이지에서 모델 학습 탭을 클릭합니다.
학습 방법 선택 페이지에서 미세 조정 라디오 버튼을 선택합니다.
계속을 클릭합니다.
모델 설정 페이지에서 미세 조정을 위한 옵션을 설정합니다.

  • 모델 기본 정보 설정
    ✔ 모델명: 미세 조정된 모델의 이름을 입력합니다.
    ✔ 기본 모델: 미세 조정하려는 기본 모델을 선택합니다.
    ✔ 설명: 모델에 대한 간략한 설명을 입력합니다. 입력한 설명은 모델 관리 페이지에서 해당 모델을 클릭하여 확인할 수 있습니다.

  • 조정 방법 설정
    ✔ FULL: 전체 미세 조정을 수행합니다.
    ✔ LoRA: 매개변수 효율적인 미세 조정을 수행합니다.

  • 학습 파라미터 설정
    ✔ 배치 크기: 한 스텝 당 처리하는 데이터 수
    ✔ 학습 횟수: 전체 데이터셋을 처리하는 횟수
    ✔ 학습률: 학습 중 매개변수를 변경하는 속도
    ✔ 중간 결과 저장: 각 학습 에포크 마다 전체 모델에 대한 체크포인트를 남깁니다. 학습 취소나 비정상적인 학습 종료 후 다시 학습을 재개할 때 마지막 체크포인트 부터 다시 학습할 수 있습니다.

계속을 클릭합니다.
학습 데이터 설정 페이지에서 미세 조정에 사용할 데이터셋을 설정합니다.

  • JSONL 또는 CSV 파일을 업로드: 로컬 PC에서 업로드할 데이터셋 파일을 선택합니다.
  • 데이터셋의 기존 JSONL 파일: 미세조정 데이터셋에서 JSONL 파일을 선택합니다.

계속을 클릭합니다.
학습 데이터 검증 페이지에서 업로드된 학습 데이터의 이상 여부와 예상 학습 시간을 확인합니다.

계속을 클릭합니다.
GPU선택 페이지에서 학습을 수행할 노드 및 해당 노드 별 GPU를 선택합니다.

조정 시작을 클릭합니다.
모델 학습 상태는 모델 관리 페이지에서 확인할 수 있습니다.

2) REST API

REST API를 통해 미세 조정 작업을 시작하기 위해서는 아래와 같이 요청을 보냅니다.

curl “https://api.konantech.com/v2/training/fine_tune” \
  –X POST \
  –H “Content-Type: application/json” \
  -d ‘{ \
        “base_model”: “konan-llm-pro-10”,
        “suffix”: “custom-name”,
        “training_file”: “URL_OF_DATASET_FILE”,
        “train_method”: “full”,
        “hyperparams”: {
            “epochs”: 3,
            “lr”: 0.0001
        }
      }’

미세 조정된 모델을 적용하기 위해서는 작업이 완료될 때까지 기다려야 하며 데이터세트 크기에 따라 몇 분 혹은 몇 시간이 걸릴 수 있습니다.

미세 조정 모델 사용

미세 조정 작업이 완료되면 모델 상태가 학습 완료로 표시됩니다. 학습 완료 모델은 모델 관리 페이지에서 [로드] 버튼을 클릭하여 로드한 후 플레이그라운드에서 사용해볼 수 있습니다.

미세 조정 모델 평가

완료된 모델을 직접 사용하면서, 모델의 성능을 평가하고, 다음과 같은 방법을 통해서 모델의 성능을 향상시킬 수 있습니다.

1) 학습 데이터의 품질을 높여가며 반복

  • 생성 품질이 낮은 사례를 조사하세요.
    ✔ 해당 사례를 올바르게 수행하는 방법을 학습 데이터에 추가해주세요.
    ✔ 모델에 문법, 논리 또는 스타일 문제가 있는 경우, 학습 데이터에 동일한 문제가 있는 확인한 후 수정해주세요.

  • 학습 데이터의 일관성을 확인하세요.
    ✔ 다양한 사람이 학습 데이터를 생성해, 학습 데이터가 일관되지 않으면, 모델은 일관되지 않은 답변을 할 수 있습니다.

  • 학습 데이터의 형식과 추론을 위해 사용하는 형식이 동일한지 확인하세요.

  • 학습 데이터의 균형과 다양성을 확인하세요.
    ✔ 학습 데이터의 비율 중 약 60%가 “답변을 할 수 없습니다”이고, 원하는 결과가 생성의 5%만 “답변을 할 수 없습니다”라고 답변해야 한다면, 원하는 결과 보다 더 과도하게 “답변을 할 수 없습니다”라고 모델이 답변할 수 있습니다.

2) 학습 데이터의 수를 늘려가며 반복

  • 생성 품질이 만족스러우면, 학습 데이터의 수를 늘리는 것을 고려할 수 있습니다.

  • 다음을 통해서 학습 데이터의 수를 늘려 예상되는 품질 향상을 대략적으로 추정할 수 있습니다.
    ✔ 현재 학습 데이터 세트로 미세 조정
    ✔ 현재 학습 데이터 세트의 절반으로 미세 조정
    ✔ 둘 사이의 품질 격차를 관찰

  • 일반적으로 저품질 학습 데이터를 많이 사용하는 것보다, 고품질 학습 데이터를 적게 사용하는 것이 더 효과적입니다.

3) 모델 학습에 사용하는 하이퍼 파라미터를 조절하며 반복

  • 처음에는 모델 학습에 사용하는 하이퍼 파라미터의 기본 값을 사용하는 것이 좋습니다.
  • 만약 모델의 생성 결과가 훈련 데이터의 양상과 다르다고 판단된다면, Epoch을 1 또는 2만큼 늘립니다.
  • 만약 모델의 생성 결과의 다양성이 떨어진다고 판단된다면, Epoch을 1 또는 2만큼 줄입니다.
  • 만약 모델의 Loss가 수렴하지 않는다면, 학습률을 지수로 높입니다. (ex, 0.002 -> 0.02)

미세 조정 예시

해당 예시는 각 작업에 맞는 최적의 프롬프트는 아닐 수 있으므로, 프롬프트 엔지니어링을 통해서 최적의 프롬프트를 찾는 것을 권장합니다.

⚠️ 아래 JSONL 예제들은 가독성을 높이기 위해 개행 문자를 다음 줄에 표시하고 있습니다. 실제 학습 데이터 구축 시에는 prompt, completion 쌍을 한 줄에 입력하고 개행은 \n 으로 바꾸어야 합니다.

⚠️ 학습 데이터 구축 시 LLM을 활용할 수 있습니다.

미세조정을 위한 데이터 생성을 참조하세요.

작성

1) 문서 초안 작성

{"prompt": "중고차 매매사이트에서, 사용자에게 더욱 다양한 정보 제공을 위한 피드백 기능을 추가할 예정입니다. 피드백 기능에 대한 계획서 초안을 작성해주세요."},    
{"completion": "1. 개요
    - 중고차 매매사이트에서 피드백 기능을 추가하여 사용자에게 더욱 다양한 정보를 제공하고, 사용자들 간의 의견 교류와 신뢰도 향상을 목표로 함.

    ...

    6. 기대효과
    - 사용자들의 다양한 의견 제공으로, 매물 정보의 신뢰도 및 정확도 향상에 기여.
    - 다양한 정보를 제공하는 중고차 매매사이트로 성장함으로써, 사용자 수 및 매출 증대에 기여."}
  • prompt 필드는 문서를 작성하기 위해서 사용자가 입력하는 지시문의 형태입니다.
  • completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 문서의 형태입니다.

질의/응답

{"prompt": "장례를 주관할 수 있는 사람의 범위가 어떻게 되나요?"}, 
{"completion": "장례는 배우자, 자녀 또는 부모 등 법령에서 정하는 연고자가 주관할 수 있습니다."}
  • prompt 필드는 답변을 위해서 사용자가 입력하는 질문의 형태입니다.
  • completion 필드는 사용자가 입력하는 질문에 맞춰 모델이 생성해야 하는 답변의 형태입니다.

요약

1) 보고서 요약

{"prompt": "다음 글을 핵심 단어 위주로 요약해주세요. 다른 부차적인 말 없이 요약 결과만을 출력해주세요.

[요약 대상 글]
청년에게 주거·일자리·교육 등 맞춤형 지원 (국조실·국토부·고용부·중기부·교육부)
□ 과제목표
ㅇ 청년세대의 내 집 마련 기회 확대 등 주거사다리 복원
...

[요약]}, 
{"completion": "국조실 및 국토부, 고용부, 중기부, 교육부는 청년의 주거, 일자리, 교육 지원을 강화하기 위해 내 집 마련 기회 확대, 취·창업 지원, 신기술 인재 양성을 주요 내용으로 제시하였다. 이를 통해 청년들의 주거 안정, 일자리 창출 및 교육 기회 확대를 목표로 한다."}

2) 회의록 요약

{“prompt”: “[문서 시작]
소위원장:성원이 되었으므로 제246회국회(임시회) 문화관광위원회 제1차 법안심사소위원회를 개의하겠습니다.
소위원장:의사일정 제1항 문화예술진흥법중개정법률안을 계속 상정하겠습니다.
...
[문서 종료]

위 국회 회의록의 핵심적인 내용을 간략히 요약해 주세요.”}
{“completion”: “문화관광위원회 제1차 법안심사소위원회에서 문화예술진흥법에 대한 개정법률안이 상정되었습니다...”}
  • prompt 필드는 문서를 요약하기 위해서 사용자가 입력하는 지시문의 형태입니다.
  • completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 요약 결과의 형태입니다.

번역

{"prompt": "다음 문장을 한국어로 번역해주세요.

Wally buys bears at the park. A bear is priced at $4.00 for the first bear and a discount of 50 cents per bear is given after that. How much does Wally pay for 101 bears?"}, 
{"completion": "월리는 공원에서 곰 인형을 사고 있습니다. 첫 번째 곰 인형의 가격은 4.00달러이고, 그 이후부터는 인형 하나당 50센트의 할인이 적용됩니다. 월리는 101마리의 곰 인형에 얼마를 지불하게 될까요?"}
  • prompt 필드는 번역을 위해서 사용자가 입력하는 지시문의 형태입니다.
  • completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 번역 결과의 형태입니다.

분류

1) 뉴스 분류

{"prompt": "'한국과 비공개 평가전' 세네갈의 핵심 선수는?
세네갈 국가 대표팀 에이스 사디오 마네. 사진=뉴스1한국 축구대표팀이...
이 문서를 보고 이 문서가 어떤 카테고리에 속하는지 분류해주세요"}, 
{"completion": "이 문서는 \"스포츠\"로 분류할 수 있습니다."}
  • prompt 필드는 분류를 위해서 사용자가 입력하는 지시문의 형태입니다.
  • completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 답변의 형태입니다.