54일차 자연어처리8 RAG 파인튜닝

차지예·2025년 8월 4일

생성AI

목록 보기
48/56
post-thumbnail

Retrieval-Augmented Generation (RAG) 파인튜닝

RAG 성능을 높이는 파인튜닝 가이드

  • 네거티브 샘플(Negative Samples)
    모델이 관련 없는 문서를 걸러내도록, 답이 포함되지 않은 검색 결과를 ‘네거티브 샘플’로 학습 데이터에 포함합니다.
    예: “한글을 창제한 조선의 왕은?”에 대해 검색된 ‘장영실’, ‘이순신’, ‘이방원’ 문서는 네거티브 샘플입니다.

  • 생각의 사슬(Chain of Thought) 프롬프트
    답변 전 중간 추론 과정을 작성하도록 유도하여, 모델이 반드시 주어진 문맥만 참조하도록 강제합니다.
    RAFT 논문에서는 ##이유:##인용시작##/##인용종료## 태그로 원문 인용을 명시합니다.[oaicite:15]{index=15}

  • 답변 없음 데이터(No-Answer)
    모든 검색 결과가 비관련일 때는 “검색 결과에는 해당 질문에 대한 내용이 없습니다.”라고 답하도록 학습해 환각(hallucination)을 방지합니다.

  • 출처 인용(Source Citation)
    모델 답변마다 [[ref1]], [[ref2]] 형태로 인용 문서 번호를 남겨, 사용자와 모델 모두 근거를 검증할 수 있도록 합니다.


RAG 학습 데이터셋 구성

  1. 데이터셋 소개
    Hugging Face에 공개된 iamjoon/klue-mrc-ko-rag-dataset은 RAG 시나리오별 5가지 타입을 포함합니다:

    • mrc_question (지엽적 질문, 검색 결과 5개 고정)
    • mrc_question_with_1_to_4_negative (1~4개 검색 결과)
    • paraphrased_question (명사구형 질문)
    • synthetic_question (포괄적 질문, 다중 인용)
    • no_answer (답변 불가, 인용 없음)
  2. 분포 시각화
    각 타입별 search_result_len(검색 문서 수)와 extracted_ref_len(인용 문서 수) 분포를 분석해, 실제 서비스 상황의 다양성을 반영합니다.
    예: mrc_question 491건 중 439건은 1개 문서만 인용합니다.


Qwen2 기반 RAG LLM 파인튜닝 실습

  1. 환경 설정 및 패키지 설치

    • Runpod A100 GPU 환경
    • torch, transformers, datasets, trl, peft 등 설치
  2. 데이터 로드 & 분할

    dataset = load_dataset("iamjoon/klue-mrc-ko-rag-dataset", split="train")

    타입별 80:20 비율로 학습/테스트 데이터 분할 (type 균형 유지)

  3. OpenAI 포맷 변환

def format_data(sample):
    search_res = "\n-----\n".join(f"문서{idx+1}: {text}" for idx, text in enumerate(sample["search_result"]))
    return {
        "messages": [
            {"role": "system",    "content": system_message.format(search_result=search_res)},
            {"role": "user",      "content": sample["question"]},
            {"role": "assistant", "content": sample["answer"]}
        ]
    }
  1. Dataset 객체 변환
    리스트 → datasets.arrow_dataset.Dataset으로 변경:
train_dataset = Dataset.from_list(train_dataset)
test_dataset  = Dataset.from_list(test_dataset)
  1. 파인튜닝
trainer = SFTTrainer(
    model=model,
    args=args,                     # SFTConfig
    peft_config=peft_config,       # LoRA 설정
    train_dataset=train_dataset,
    data_collator=collate_fn
)
trainer.train()
trainer.save_model()
  1. 모델 테스트
    테스트 데이터에서 Prompt/Label 분리 → 성능 비교 및 결과 분석

LoRA 어댑터 병합 & Hugging Face 업로드

  1. LoRA 병합
peft_model   = PeftModel.from_pretrained(base_model, adapter_path)
merged_model = peft_model.merge_and_unload()

베이스 모델에 어댑터 병합

  1. 모델 업로드
  • 커널 종료 후 새 노트북에서 진행 권장
  • model.push_to_hub()로 Hugging Face에 배포

업로드한 hugging face

0개의 댓글