AI

미세 조정이란 무엇인가? 데이터로 AI 모델을 맞춤 설정하는 가이드

머신 러닝에서 미세 조정이 무엇을 의미하는지, 그리고 정확도를 향상시켜 특정 작업에 맞게 모델을 맞춤화하는 데 어떻게 도움이 되는지 알아보세요.
4 분 읽기
What is Fine-Tuning

특정 분야를 이해하는 전문 모델을 구축하려면 프롬프트 엔지니어링이나 검색 강화 생성 (RAG)만으로는 부족합니다. 공개 모델은 강력하지만 최신 지식이나 사용 사례에 필요한 특정 취향을 갖추지 못합니다. 기사, 문서, 제품 목록, 영상 대본 등 웹 데이터를 활용하면 미세 조정으로 이 격차를 해소할 수 있습니다.

이 블로그 글에서 다음을 배울 수 있습니다:

  • Bright Data의 스크레이퍼와 데이터셋을 활용하여 도메인 특화 웹 데이터를 수집하고 준비하는 방법.
  • 수집한 데이터로 오픈소스 GPT 모델을 파인 튜닝하는 방법
  • 실제 작업에 적용하기 위해 미세 조정된 모델을 평가하고 배포하는 방법.

자, 시작해 보겠습니다!

미세 조정(Fine-Tuning)이란?

간단히 말해, 파인 튜닝은 대규모 일반 데이터셋으로 사전 훈련된 모델을 가져와 새로운(종종 더 구체적인) 데이터셋이나 작업에서 잘 수행하도록 적응시키는 과정입니다. 파인 튜닝을 수행할 때, 내부적으로는 모델을 처음부터 구축하는 대신 가중치를 변경합니다. 가중치를 변경함으로써 모델이 다르게 또는 원하는 방식으로 동작하게 됩니다.

웹 데이터는 다음과 같은 장점으로 파인 튜닝에 유용합니다:

  • 신선함: 최신 트렌드, 사건, 기술을 포착하기 위해 지속적으로 업데이트됩니다.
  • 다양성: 다양한 글쓰기 스타일, 출처, 사고방식에 접근할 수 있어 좁은 데이터셋에서 발생하는 편향을 줄입니다.

미세 조정 과정은 다음과 같이 진행됩니다:

fine tuning diagram

파인 튜닝은 프롬프트 엔지니어링이나 검색 강화 생성(RAG) 같은 다른 적응 방식과 다릅니다. 프롬프트 엔지니어링은 모델에 질문하는 방식을 바꾸지만 모델 자체는 변경하지 않습니다. RAG는 런타임에 외부 지식 소스를 추가하여 새로운 맥락을 제공하는 방식입니다. 반면 파인 튜닝은 모델의 매개변수를 직접 업데이트하므로 매번 추가 맥락 없이도 도메인 특화 출력을 생성하는 데 더 신뢰할 수 있습니다.

런타임에 외부 컨텍스트로 모델을 강화하는 검색 강화 생성(RAG)과 달리, 파인 튜닝은 모델 자체를 적응시킵니다. 장단점에 대한 심층 분석은 RAG 대 파인 튜닝을 참조하세요.

웹 데이터를 파인 튜닝에 활용하는 이유

웹 데이터는 풍부하고 최신 형식(기사, 제품 목록, 포럼 게시물, 동영상 대본, 심지어 동영상에서 추출한 텍스트까지)으로 제공되어 정적 또는 합성 데이터셋이 따라잡을 수 없는 이점을 제공합니다. 이러한 다양성은 모델이 다양한 입력 유형을 더 효과적으로 처리하는 데 도움이 됩니다.

웹 데이터가 빛을 발하는 다양한 컨텍스트의 예는 다음과 같습니다:

  • 소셜 미디어 데이터: 소셜 플랫폼의 토큰은 모델이 비공식적 언어, 속어, 실시간 트렌드를 이해하는 데 도움을 주며, 이는 감정 분석이나 챗봇과 같은 애플리케이션에 필수적입니다.
  • 구조화된 데이터셋: 제품 카탈로그나 재무 보고서 같은 구조화된 출처의 토큰은 추천 시스템이나 금융 예측에 중요한, 정확하고 도메인 특화된 이해를 가능하게 합니다.
  • 니치 컨텍스트: 법률 기술 분야의 법률 문서나 의료 AI를 위한 의학 저널처럼, 특정 사용 사례에 맞춤화된 관련 데이터셋에서 추출된 토큰은 스타트업과 전문 애플리케이션에 이점을 제공합니다.

웹 데이터는 자연스러운 다양성과 컨텍스트를 도입하여 미세 조정된 모델의 현실성과 견고성을 향상시킵니다.

데이터 수집 전략

Bright Data와 같은 대규모 스크레이퍼 및 데이터셋 공급자를 통해 방대한 양의 웹 콘텐츠를 빠르고 안정적으로 수집할 수 있습니다. 이를 통해 수개월에 걸친 수동 수집 없이도 도메인 특화 데이터셋을 구축할 수 있습니다.

Bright Data는 여러 네트워크 출구와 소스로 구성된 업계에서 가장 다양하고 신뢰할 수 있는 웹 데이터 수집 인프라를 구축했습니다. 웹 데이터는 단순 텍스트에 국한되지 않습니다. Bright Data는 메타데이터, 제품 속성, 동영상 대본과 같은 다중 모달 입력을 캡처할 수 있어 모델이 더 풍부한 컨텍스트를 학습하는 데 도움이 됩니다.

원시 스크래핑을 통한 데이터 수집은 거의 항상 노이즈, 관련 없는 콘텐츠 또는 서식 오류가 포함되므로 피해야 합니다. 필터링, 중복 제거 및 구조화된 정제는 훈련 데이터셋이 혼란을 유발하기보다 성능을 향상시키도록 보장하는 중요한 단계입니다.

웹 데이터의 파인 튜닝 준비

  1. 원시 스크래핑 데이터를 구조화된 입력/출력 쌍으로 변환. 처리되지 않은 데이터는 거의 그대로 훈련에 사용할 수 없습니다. 첫 단계는 데이터를 구조화된 입력/출력 쌍으로 변환하는 것입니다. 예를 들어, 파인 튜닝에 관한 문서는 “파인 튜닝이란 무엇인가?”와 같은 프롬프트로 형식화하고 원본 답변을 목표 출력으로 설정할 수 있습니다. 이러한 구조는 모델이 체계화되지 않은 텍스트 대신 명확히 정의된 예시로부터 학습하도록 보장합니다.
  2. 다양한 형식 처리: JSON, CSV, 대본, 웹 페이지. 웹 데이터는 일반적으로 API의 JSON, CSV 내보내기, 원시 HTML, 동영상 대본 등 다양한 형식으로 제공됩니다. 웹 데이터를 JSONL과 같은 일관된 형식으로 표준화하면 관리 및 훈련 파이프라인에 공급하기가 더 쉬워집니다.
  3. 효율적인 훈련을 위한 데이터셋 압축. 훈련 결과와 프로세스 개선을 위해 데이터셋은 종종 “정렬”됩니다. 즉, 여러 개의 짧은 예시를 하나의 시퀀스로 결합하여 파인 튜닝 중 낭비되는 토큰을 줄이고 GPU 메모리 사용을 최적화합니다.
  4. 도메인 특화 데이터와 일반 웹 데이터의 균형. 적절한 균형이 중요합니다. 단일 도메인 데이터가 과도하면 모델이 좁고 얕아질 수 있으며, 일반 데이터가 지나치게 많으면 목표로 한 전문 지식이 희석될 수 있습니다. 최상의 결과는 일반적으로 강력한 일반 웹 데이터 기반에 도메인 특화 예시를 선별하여 혼합할 때 나옵니다.

베이스 모델 선택

적절한 베이스 모델 선택은 파인튜닝 시스템의 성능에 직접적인 영향을 미칩니다. 특히 각 모델 계열 내 다양한 옵션들을 고려할 때, 만능 해결책은 존재하지 않습니다. 데이터 유형, 원하는 결과, 예산에 따라 특정 모델이 다른 모델보다 더 적합할 수 있습니다.

시작하기에 적합한 모델을 선택하려면 다음 체크리스트를 따르세요:

  1. 모델에 필요한 모달리티는 무엇인가요?
  2. 입력 및 출력 데이터의 규모는 어느 정도인가요?
  3. 수행하려는 작업의 복잡도는 어느 정도인가요?
  4. 성능과 예산 중 어느 쪽이 더 중요합니까?
  5. 사용 사례에서 AI 어시스턴트 안전성은 얼마나 중요합니까?
  6. 귀사는 Azure 또는 GCP와 기존 계약이 있습니까?

예를 들어, 매우 긴 동영상이나 텍스트(수 시간 분량 또는 수십만 단어)를 다루는 경우, 최대 100만 토큰의 컨텍스트 창을 제공하는 Gemini 1.5 pro가 최적의 선택이 될 수 있습니다.

웹 데이터 미세 조정에 적합한 오픈소스 모델로는 Gemma 3, Llama 3.1, Mistral 7B 또는 Falcon 모델 등이 있습니다. 대부분의 미세 조정 프로젝트에는 소형 버전이 실용적이며, 도메인에 높은 커버리지와 정밀도가 필요한 경우 대형 모델이 효과적입니다. Gemma 3을 미세 조정하기 위한 가이드도 확인해 보세요.

Bright Data를 활용한 파인 튜닝

웹 데이터가 미세 조정에 어떻게 활용되는지 보여주기 위해 Bright Data를 소스로 사용하는 예시를 살펴보겠습니다. 본 예시에서는 Bright Data의 Scraper API를 활용해 Amazon에서 제품 정보를 수집한 후, Hugging Face에서 Llama 4 모델을 미세 조정할 것입니다.

1단계: 데이터셋 수집

Bright Data의 웹 스크레이퍼 API를 사용하면 몇 줄의 Python 코드만으로 구조화된 제품 데이터(제목, 제품, 설명, 리뷰 등)를 가져올 수 있습니다.

이 단계의 목표는 다음과 같은 소규모 프로젝트를 만드는 것입니다:

  • 파이썬 가상 환경 활성화
  • Bright Data의 웹 스크레이퍼 API 호출
  • 결과를 amazon-data.json에 저장

필수 조건

  • Python 3.10 이상
  • Bright Data API 토큰
  • Bright Data 수집기 ID (Bright Data 대시보드에서 확인) /cp/scrapers
  • GPT-4 모델을 미세 조정할 예정이므로 OPENAI_API_KEY가 필요합니다.

프로젝트 폴더 생성

mkdir web-scraper && cd web-scrapper

가상 환경 생성 및 활성화

가상 환경을 활성화하면 셸 프롬프트 시작 부분에 (venv) 가 표시됩니다.

//macOS/Linux (bash 또는 zsh):
python3 -m venv venv
source venv/bin/activate

Windows
python -m venv venv
.venvScriptsActivate.ps1

의존성 설치

HTTP 웹 요청을 생성하기 위한 라이브러리입니다.

pip install requests

설치가 완료되면 Bright Data의 스크레이퍼 API를 사용하여 관심 있는 데이터를 가져올 준비가 된 것입니다.

스크래핑 로직 정의

다음 스니펫은 Bright Data 수집기(예: Amazon 제품)를 트리거하고, 스크래핑이 완료될 때까지 폴링한 후 결과를 로컬 JSON 파일에 저장합니다.
여기서 API 키 문자열을 자신의 API 키로 대체하세요

import requests
import json
import time

def trigger_amazon_products_scraping(api_key, urls):
    url = "https://api.brightdata.com/datasets/v3/trigger"

    params = {
        "dataset_id": "gd_l7q7dkf244hwjntr0",
        "include_errors": "true",
        "type": "discover_new",
        "discover_by": "best_sellers_url",
    }
    data = [{"category_url": url} for url in urls]

    headers = {
      "Authorization": f"Bearer {api_key}",
      "Content-Type": "application/json",
    }

    response = requests.post(url, headers=headers, params=params, json=data)

    if response.status_code == 200:
        snapshot_id = response.json()["snapshot_id"]
        print(f"요청 성공! 응답: {snapshot_id}")
        return response.json()["snapshot_id"]
    else:
        print(f"요청 실패! 오류: {response.status_code}")
        print(response.text)

def poll_and_retrieve_snapshot(api_key, snapshot_id, output_file, polling_timeout=20):
    snapshot_url = f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json"
    headers = {
        "Authorization": f"Bearer {api_key}"
    }

    print(f"ID: {snapshot_id} 스냅샷 폴링 중...")

    while True:
        response = requests.get(snapshot_url, headers=headers)

        if response.status_code == 200:
            print("스냅샷 준비 완료. 다운로드 중...")
            snapshot_data = response.json()

            with open(output_file, "w", encoding="utf-8") as file:
                json.dump(snapshot_data, file, indent=4)

            print(f"스냅샷 저장됨: {output_file}")
            return
        elif response.status_code == 202:
            print(F"스냅샷이 아직 준비되지 않았습니다. {polling_timeout} 초 후에 재시도 중...")
            time.sleep(polling_timeout)
        else:
            print(f"요청 실패! 오류: {response.status_code}")
            print(response.text)
            break

if __name__ == "__main__":
    BRIGHT_DATA_API_KEY = "your_api_key"
    urls = [
        "https://www.amazon.com/gp/bestsellers/office-products/ref=pd_zg_ts_office-products"
    ]
    snapshot_id = trigger_amazon_products_scraping(BRIGHT_DATA_API_KEY, urls)
    poll_and_retrieve_snapshot(BRIGHT_DATA_API_KEY, snapshot_id, "amazon-data.json")

코드를 실행하세요

python3 web_scraper.py

다음과 같은 결과가 표시됩니다:

  • 스냅샷 ID 출력됨
  • 스크래핑 완료.
  • amazon-data.json에 저장됨 (…개 항목)

프로세스는 스크랩된 데이터를 포함하는 데이터를 자동으로 생성합니다. 데이터의 예상 구조는 다음과 같습니다:

The expected data structure

2단계: JSON을 훈련용 페어로 변환

프로젝트 루트에 prepare_pair.py 파일을 생성하고, 다음 코드 스니펫을 사용하여 데이터를 JSONL 형식으로 구조화하여 파인 튜닝 단계에 대비합니다.

import json, random, os

INPUT = "amazon-data.json"
OUTPUT = "pairs.jsonl"
SYSTEM = "당신은 전문 카피라이터입니다. 간결하고 정확한 제품 설명을 생성하세요."

def make_example(item):
    title = item.get("title") or item.get("name") or "알 수 없는 제품"
    brand = item.get("brand") or "Unknown brand"
    features = item.get("features") or item.get("bullets") or []
    features_str = ", ".join(features) if isinstance(features, list) else str(features)
    target = item.get("description") or item.get("about") or ""
    user = f"간결한 제품 설명을 작성하세요.n제목: {title}n브랜드: {brand}n특징: {features_str}n설명:"
    assistant = target.strip()[:1200]  # 간결하게 유지
    return {"system": SYSTEM, "user": user, "assistant": assistant}

def main():
    if not os.path.exists(INPUT):
        raise SystemExit(f"{INPUT}이(가) 없습니다")
    data = json.load(open(INPUT, "r", encoding="utf-8"))
    pairs = [make_example(x) for x in data if isinstance(x, dict)]
    random.shuffle(pairs)
    with open(OUTPUT, "w", encoding="utf-8") as out:
        for ex in pairs:
            out.write(json.dumps(ex, ensure_ascii=False) + "n")
    print(f"{len(pairs)}개의 예제를 {OUTPUT}에 작성했습니다")

if __name__ == "__main__":
    main()

다음 명령어를 실행하세요:

python3 prepare_pairs.py

그러면 파일에 다음과 같은 출력이 생성됩니다:

the final output in the file

이 객체 내 각 메시지는 세 가지 역할을 포함합니다:

  • 시스템: 어시스턴트에 대한 초기 컨텍스트를 제공합니다.
  • 사용자: 사용자의 입력입니다.
  • 보조: 보조의 응답.

단계 #3: 파인 튜닝용 파일 업로드

파일이 준비되면 다음 단계는 OpenAI 미세 조정 파이프라인에 연결하는 것입니다.

OpenAI 종속성 설치

pip install openai

데이터셋 업로드용 upload.py 생성

이 스크립트는 기존 pairs.jsonl 파일을 읽습니다

from openai import OpenAI
client = OpenAI(api_key="your_api_key_here")

with open("pairs.jsonl", "rb") as f:
    uploaded = client.files.create(file=f, purpose="fine-tune")

print(uploaded)

다음 명령어를 실행하세요:

python3 upload.py

다음과 같은 응답이 표시됩니다:

Terminal with processed file upload status

모델 미세 조정

fine-tune.py 파일을 생성하고, 위 응답에서 얻은 업로드된 파일 ID로 FILE_ID를 대체한 후 파일을 실행하세요:

from openai import OpenAI
client = OpenAI()

# 업로드한 파일 ID로 대체
FILE_ID = "file-xxxxxx"

job = client.fine_tuning.jobs.create(
    training_file=FILE_ID,
    model="gpt-4o-mini-2024-07-18")


print(job)

그러면 다음과 같은 응답을 받을 수 있습니다:

Terminal showing fine-tuning job validating files

훈련 완료까지 모니터링

미세 조정 작업을 시작한 후 모델이 데이터셋으로 학습하는 데 시간이 필요합니다. 데이터셋 크기에 따라 몇 분에서 몇 시간이 소요될 수 있습니다.

하지만 완료 시점을 추측하지 마십시오. 대신 monitor.py에 다음 코드를 작성하여 실행하세요:

from openai import OpenAI
client = OpenAI()

jobs = client.fine_tuning.jobs.list(limit=1)
print(jobs)

터미널에서 python3 [manage.py](http://manage.py) 로 파일을 실행하면 다음과 같은 세부 정보가 표시됩니다:

  • 훈련 성공 여부
  • 훈련된 토큰 수
  • 새로 미세 조정된 모델의 ID.

이 섹션에서는 상태 필드에

"성공(succeeded)"

최적화된 모델과 대화하기

작업이 완료되면 이제 사용자 지정 GPT 모델을 보유하게 됩니다. 사용하려면 chat.py를 열고, MODEL_ID를 미세 조정 작업에서 반환된 ID로 업데이트한 후 파일을 실행하세요:

from openai import OpenAI
client = OpenAI()

# 파인 튜닝된 모델 ID로 대체하세요
MODEL_ID = "ft:gpt-4o-mini-2024-07-18:your-org::custom123"

while True:
    user_input = input("사용자: ")
    if user_input.lower() in ["quit", "q"]:
        break

    response = client.chat.completions.create(
        model=MODEL_ID,
        messages=[
            {"role": "system", "content": "당신은 도메인 데이터로 튜닝된 유용한 어시스턴트입니다."},
            {"role": "user", "content": user_input}
        ]
    )
    print("보조 프로그램:", response.choices[0].message.content)

이 단계는 튜닝이 성공했음을 증명합니다. 범용 기본 모델 대신, 이제 여러분의 데이터로 특별히 훈련된 모델과 대화하게 됩니다.

여기서 여러분의 결과가 실제로 구현되는 모습을 확인할 수 있습니다.

예상되는 결과는 다음과 같습니다:

--- 합성 테스트 데이터를 활용한 미세 조정 모델로 설명 생성 ---

프롬프트 항목: ErgoPro-EL100
생성 결과 (미세 조정):
**ErgoPro-EL100 소개: 궁극의 경영진용 인체공학적 사무용 의자**

ComfortLuxe ErgoPro-EL100으로 최상의 편안함과 지지력을 경험하세요. 업무 환경을 한 단계 업그레이드하도록 설계된 이 프리미엄 사무용 의자는 상체를 감싸는 하이백 디자인으로 탁월한 요추 지지력과 건강한 자세를 제공합니다.

통기성 메쉬 소재가 시원하고 쾌적한 착석감을 보장하며, 동기화된 틸트 메커니즘으로 선호하는 작업 자세로 원활하게 조절할 수 있습니다. 충전된 팔걸이는 추가적인 지지력과 편안함을 제공하여 어깨와 손목의 피로를 줄여줍니다.

오래도록 견딜 수 있도록 제작된 ErgoPro-EL100은 안정성과 내구성을 보장하는 고강도 나일론 베이스가 특징입니다. 장시간 작업하거나 단순히
--------------------------------------------------

PROMPT for item: HeightRise-FD20
GENERATED (Fine-tuned):
**플렉시데스크의 HeightRise-FD20 조절식 스탠딩 데스크 컨버터로 생산성을 높이세요**

플렉시데스크의 HeightRise-FD20, 궁극의 조절식 스탠딩 데스크 컨버터로 업무를 새로운 차원으로 끌어올리세요. 작업 공간에 혁신을 가져다주는 이 혁신적인 컨버터는 어떤 책상도 편안하고 인체공학적인 스탠딩 작업 공간으로 변신시킵니다.

**스탠딩의 이점을 경험하세요**

HeightRise-FD20은 노트북, 모니터 및 기타 필수 작업 도구를 놓기에 완벽한 넓은 이중 층 표면을 자랑합니다. 부드러운 가스 스프링 리프트는 6인치에서 17인치까지 손쉬운 높이 조절을 가능하게 하여 필요에 맞는 편안한 스탠딩 자세를 보장합니다.

**내구성과 신뢰성**

견고한 구조와 미끄럼 방지 고무 받침으로
--------------------------------------------------

결론

웹 규모로 미세 조정을 수행할 때는 제약 조건과 워크플로우에 대해 현실적으로 접근하는 것이 중요합니다:

  • 자원 요구 사항: 방대하고 다양한 데이터셋으로 훈련하려면 컴퓨팅 및 저장 공간이 필요합니다. 실험 단계라면 데이터의 작은 부분부터 시작하여 점진적으로 확장하세요.
  • 점진적 반복: 첫 시도에서 수백만 건의 레코드를 무작정 투입하기보다 소규모 데이터셋으로 정교화하세요. 결과를 활용해 전처리 파이프라인의 누락이나 오류를 발견하세요.
  • 배포 워크플로: 미세 조정된 모델을 다른 소프트웨어 아티팩트와 동일하게 취급하세요. 버전 관리를 수행하고, 가능한 경우 CI/CD에 통합하며, 새 모델의 성능이 저하될 경우를 대비해 롤백 옵션을 유지하세요.

다행히 Bright Data는 데이터셋 획득 또는 생성을 위한 다양한AI 지원 서비스를제공합니다:

  • 스크래핑 브라우저: 내장된 잠금 해제 기능을 갖춘 Playwright, Selenium, Puppeteer 호환 브라우저.
  • 웹 스크레이퍼 API: 100개 이상의 주요 도메인에서 구조화된 데이터를 추출하기 위한 사전 구성된 API입니다.
  • 웹 언락커: 봇 방지 기능이 적용된 사이트의 잠금 해제를 처리하는 올인원 API.
  • SERP API: 검색 엔진 결과를 잠금 해제하고 완전한 SERP 데이터를 추출하는 전문 API.
  • 파운데이션 모델용 데이터: 사전 훈련, 평가 및 미세 조정을 위한 규정 준수 웹 규모 데이터셋 접근.
  • 데이터 공급자: 신뢰할 수 있는 공급자와 연결하여 대규모로 고품질의 AI 사용 준비가 된 데이터 세트를 확보하세요.
  • 데이터 패키지: 선별되고 즉시 사용 가능한 데이터 세트를 구조화, 보강 및 주석 처리된 형태로 제공합니다.

웹 데이터로 대규모 언어 모델을 미세 조정하면 강력한 도메인 전문화가 가능해집니다. 웹은 기사, 리뷰부터 대본 및 구조화된 메타데이터에 이르기까지 선별된 데이터 세트만으로는 따라잡을 수 없는 신선하고 다양하며 다중 모드 콘텐츠를 제공합니다.

Bright Data 계정을 무료로 생성하여 AI 활용 가능한 데이터 인프라를 테스트해 보세요!