5️⃣Fine-tuning

LLM Fine-tuning 개요

LLM Fine-tuning은 데이터 세트에 대해 모델 자체를 업데이트하여 다양한 방식으로 모델을 개선하는 것을 의미합니다. 여기에는 출력 품질 개선, 오차 감소, 더 많은 데이터의 총체적 기억, 지연 시간/비용 감소 등이 포함될 수 있습니다.

Fine-tuning 핵심은 모델 자체를 학습시키지 않고 추론 모드에서 모델을 사용하는 상황에 맞는 learning/retrieval agmentation을 중심으로 이루어집니다.

Fine-tuning은 외부 데이터로 모델을 'agument'하는 데에도 사용할 수 있지만, 미세 조정은 다양한 방식으로 검색 증강을 보완할 수 있습니다:

Embedding Finetuning의 이점

  • 임베딩 모델을 미세 조정하면 데이터의 학습 분포에 대해 보다 의미 있는 임베딩 표현을 할 수 있습니다 --> retrieval의 성능 향상으로 이어집니다.

LLM Finetuning의 이점

  • 주어진 데이터 세트에 대한 스타일 학습 허용

  • 학습 데이터에서 덜 표현될 수 있는 DSL(예: SQL)을 학습할 수 있습니다.

  • 즉각적인 엔지니어링을 통해 수정하기 어려운 환각/오류를 수정할 수 있습니다.

  • 더 나은 모델(예: GPT-4)을 더 간단하고 저렴한 모델(예: gpt-3.5, Llama 2)로 증류할 수 있도록 허용합니다.

LlamaIndex로 Fine-tuning 하는 방법

  1. Retrieval 성능 향상을 위한 임베딩 미세 조정하기

  2. 더 나은 Text-SQL 변환을 위한 Llama2 미세 조정하기

  3. gpt-3.5-turbo를 gpt-4 distill로 미세 조정하기

GPT-3.5-turbo를 GPT-4로 distill하는 미세조정과 Retrieval 성능 향상을 위한 Embedding Fine-tuning 2개의 예시를 실습해 보겠습니다.


사례 1. Fine-Tuning gpt-3.5-turbo distill GPT-4

Fine-tuning을 통해 gpt-3.5-turbogpt-4 학습 데이터에 대한 fine-turned를 통해 더 나은 반응을 출력할 수 있습니다.

Fine-tuning 단계:

  1. DatasetGenerator를 사용하여 평가 데이터세트와 학습 데이터세트 모두에 대한 데이터 생성 자동화.

  2. 1단계에서 생성된 평가 데이터 세트를 사용하여 fine-tuning 전에 기본 모델 gpt-3.5-turbo를 평가합니다.

  3. 벡터 인덱스 쿼리 엔진을 구성하고 gpt-4를 호출하여 학습 데이터 세트를 기반으로 학습 데이터를 수집합니다.

  4. 콜백 핸들러인 OpenAIFineTuningHandler는 gpt-4로 전송된 모든 메시지를 응답과 함께 수집하고, 이러한 메시지를 OpenAI API 엔드포인트에서 미세 조정을 위해 사용할 수 있는 .jsonl(JSON 라인) 포맷으로 저장합니다.

  5. gpt-3.5-turbo와 4단계에서 생성된 jsonl 파일을 전달하여 OpenAIFinetuneEngine이 구성되고, OpenAI에 미세 조정 호출을 전송하여 OpenAI에 미세 조정 작업 요청을 시작합니다.

  6. OpenAI는 요청에 따라 미세 조정된 gpt-3.5-turbo 모델을 생성합니다.

  7. 1단계에서 생성된 평가 데이터 세트를 사용하여 fine-tuned 모델을 평가합니다.

Setup Environments

예제 데이터셋을 다운로드 하겠습니다.

Generate datasets

먼저 학습용 데이터 세트와 평가용 데이터 세트 두 개를 생성해 보겠습니다.

Training dataset

생성한 질문을 저장한 train_questions.txt 파일을 확인해 보겠습니다.

Eval Generation

이제 평가 데이터 세트를 만들기 위해 완전히 다른 문서 세트에 대한 질문을 생성해 보겠습니다.

Baseline eval for gpt-3.5-turbo

LLM Evaluation 라이브러리인 RAGAS와 Evaluate Module을 모두 사용하여 기본 모델을 평가해 보겠습니다.

Eval with ragas

다음 두 가지 지표를 사용할 것입니다:

answer_relevancy(답변 관련성) - 생성된 답변이 프롬프트와 얼마나 관련성이 있는지 측정합니다. 생성된 답변이 불완전하거나 중복 정보가 포함되어 있으면 점수가 낮아집니다. 이는 생성된 답변을 사용하여 LLM이 주어진 문제를 생성할 확률을 계산하여 정량화됩니다. 값 범위는 (0,1)이며, 높을수록 좋습니다.

faithfulness(충실도) - 주어진 문맥에 대해 생성된 답변의 사실적 일관성을 측정합니다. 이는 생성된 답변에서 문장을 생성한 다음 각 문장을 문맥과 대조하여 검증하는 다단계 패러다임을 사용하여 수행됩니다. 답변은 (0,1) 범위로 스케일링됩니다. 높을수록 좋습니다.

pandas 데이터프레임으로 출력하여 각 질문에 대하여 확인해보겠습니다.

GPT4 to collect training data

여기서는 GPT-4와 OpenAIFineTuningHandler를 사용하여 학습할 데이터를 수집합니다.

Create OpenAIFinetuneEngine

FinetuneEngine은 fine-tune 작업을 시작하고 나머지 LlamaIndex 워크플로에 직접 플러그인할 수 있는 LLM 모델을 반환하는 작업을 처리합니다.기본 생성자를 사용하지만 from_finetuning_handler 클래스 메서드를 사용하여 이 엔진에 finetuning_handler를 직접 전달할 수도 있습니다.

OpenAI에서 미세 조정 작업이 성공적으로 완료될 때까지 여기서 몇 분 정도 기다리면 OpenAI에서 미세 조정된 모델을 사용할 준비가 되었음을 알리는 이메일이 발송됩니다.

Evaluation for fine-tuned model

Eval with ragas

evaluating with [answer_relevancy] {'ragas_score': 0.8680, 'answer_relevancy': 0.9607, 'faithfulness': 0.7917}

Eval with evaluation module

Exploring difference

Baseline model

Fine-tuned model


사례 2. Fine-tune Embedding Model

임베딩 모델을 미세 조정함으로써 가장 관련성이 높은 문서를 retrieval하는 시스템의 기능을 향상시켜 RAG 파이프라인이 최상의 성능을 발휘할 수 있도록 합니다.

세 가지 주요 섹션으로 구성됩니다:

  1. 데이터 준비하기(generate_qa_embedding_pairs 함수를 사용하면 이 작업을 쉽게 수행할 수 있습니다.)

  2. 모델 미세 조정(SentenceTransformersFinetuneEngine 사용)

  3. Validation knowledge corpus에서 모델 평가하기

자세한 단계:

  1. EmbeddingQAFinetuneDatasetEmbeddingQA_embedding_pairs 함수를 호출하여 평가 및 훈련 데이터 세트에 대한 데이터 생성을 자동화합니다.

  2. 기본 모델과 훈련 데이터 세트를 전달하여 SentenceTransformersFinetuneEngine을 구축한 다음, 그 미세 조정 함수를 호출하여 기본 모델을 훈련합니다.

  3. 미세 조정된 모델을 생성합니다.

  4. 벡터 저장소 인덱스 검색기를 호출하여 관련 노드를 검색하고 기본 모델의 적중률을 평가합니다.

  5. InformationRetrievalEvaluator를 호출하여 기본 모델을 평가합니다.

  6. 벡터 저장소 인덱스 검색기를 호출하여 관련 노드를 검색하고 미세 조정된 모델의 적중률을 평가합니다.

  7. InformationRetrievalEvaluator를 호출하여 미세 조정된 모델을 평가합니다.

Installation and Configuration

Generate dataset

Load corpus

먼저, LlamaIndex를 활용하여 일부 재무 PDF를 로드하고 일반 텍스트 청크로 구문 분석/청크화하여 텍스트 청크의 말뭉치를 생성합니다.

Generate synthetic queries

이제 LLM(gpt-3.5-turbo)을 사용하여 말뭉치의 각 텍스트 청크를 문맥으로 사용하여 질문을 생성합니다.각 쌍(생성된 질문, 문맥으로 사용된 텍스트 청크)은 (훈련 또는 평가용) 미세 조정 데이터 세트의 데이터 포인트가 됩니다.

Fine-tune embedding model

Evaluate fine-tuned model

이 섹션에서는 3가지 임베딩 모델을 평가합니다:

  1. 독점적인 OpenAI 임베딩,

  2. 오픈 소스 BAAI/bge-small-en, 그리고

  3. 미세 조정된 임베딩 모델.

두 가지 평가 접근 방식을 고려합니다:

  1. 간단한 사용자 지정 적중률 메트릭

  2. 간단한 사용자 정의 적중률 메트릭과 문장_변환기의 정보 검색 평가기 사용

합성(LLM 생성) 데이터 세트에 대한 미세 조정이 오픈소스 임베딩 모델을 크게 개선한다는 것을 보여줍니다.

Run Evals

OpenAI

BAAI/bge-small-en

이 단계에서 오류가 발생하면 프로젝트 루트에 "results" 폴더가 생성되었는지 확인하고, 생성되지 않은 경우 폴더를 생성한 후 이 단계를 다시 실행하세요.

Fine-tuned model

Summary of results

Hit rate

작은 오픈소스 임베딩 모델을 미세 조정하면 검색 품질이 크게 향상되는 것을 볼 수 있습니다(심지어 독점적인 OpenAI 임베딩의 품질에 근접할 정도)!

InformationRetrievalEvaluator

미세 조정을 포함하면 평가 지표 모음에서 일관되게 지표가 개선되는 것을 확인할 수 있습니다.

Last updated