쉽고 빠르게 익히는 실전 LLM
- Few-shot Learning: 퓨샷 학습은 특정한 어조, 구문 또는 스타일이 필요한 작업과 특정 도메인에 특화된 언어를 다룰 때 특히 유용하다. (일반적인 LLM에서 원하는 답변셋을 추론하도록 학습진행)
ex) 주관적인지 아닌지 분류하는 작업
zero-shot:
리뷰: 그 책은 놀랍지 않았다.
주관적: 이 책은 재미가 없었다. <-- 주관적인지 아닌지를 판별하지 않는 답변
few-shot:
리뷰: 이 영화는 거지같아.
주관적: 얘.
###
리뷰: 이 tv 드라마는 바다에 대해 말한다.
주관적: 아니오.
###
리뷰: 그 책은 대단하지 않았었다.
주관적: 예. <-- 위 few-shot learning을 기반으로 주관적 답변으로 예/아니오를 추론함
- Persona: LLM에게 페르소나를 지정하여 답변하도록 하면 출력 스타일을 제어할 수 있으며 때로 더 나은 결과물을 가져오기도 한다.

- Q/A 챗봇을 만들기 위한 준비 사항
- ChatGPT를 위한 시스템 프롬프트 디자인
- 사용자 메시지 마다 저장된 지식에서 의미 검색 (vector database)
- DB에서 찾은 지식을 시스템 프롬프트에 삽입
- ChatGPT가 지식을 기반으로 알아서 질문에 답변
- Finetuning 과정
- 레이블이 지정된 데이터 수집
- 하이퍼 파라미터 선택
- 학습률: 모델에 가중치
- 배치 사이즈: 단일 업데이트에 사용되는 훈련셋
- 에포크: 전체 훈련셋 반혹 횟수
- 모델 적응: 아키텍처 일부를 수정해서 목표 작업에 적합하게 만드는 작업
- 평가와 반복: 검증셋, F1, Mean Absolute Error(MAE)와 같은 성능 지표를 이용해서 성능 측정 후 모델 재훈련
- 모델 구현 및 추가 학습: 테스트셋으로 모델 평가 후 결과에 만족하면 기존인프라와 통합 (이후 추가 파인튜닝 필요시 진행)
- OpenAI로 LLM Finetuning
- Requirement
- Python 3.6 >
- pip install opeanai
- Dataset preparation
```python=
from datasets import load_dataset
import pandas as pd
def prepare_df_for_openai(df):
# \n\n###\n\n 접미사를 추가하여 추론 시점을 모델에 알림
df['prompt'] = df['review_title'] + '\n\n' + df['review_body'] + '\n\n###\n\n'
# 별점 앞에 공백을 추가해서 레이블 열 생성
df['completion'] = ' ' + df[stars]
english_df = df[df['language'] = 'en'] # 영문 리뷰만 필터
english_df.drop_dupliacates(subset=['prompt'], inplace=True) # 중복 리뷰 제거
return english_df[['prompt', 'completion']].sample(len(english_df)) # prompt와 completion만 포함한 뒤섞인 DF 반환
dataset = load_dataset("amazon_reviews_multi", "all_languages")
training_df = pd.DataFrame(dataset['train'])
english_training_df = prepare_df_for_openai(training_df)
# jsonl 파일로 저장
english_training_df.to_json("amazon-english-full-train-sentiment.jsonl", orient='records', lines=True)
```
- OpenAI API finetune
```python=
!openai api fine_tunes.create \
-t "amazon-english-full-train-sentiment.jsonl" \
-v "amazon-english-full-val-sentiment.jsonl" \
--compute_classification_metrics \
--classification_n_classes 5 \
-m ada \ # base model
--n_epochs 1
```
- Prompt Injection: Prompt Injection을 통해 우리가 LLM에 사전 등록해 두었던 프롬프트나 LLM이 알고있는 지식 기반으로 유출해서는 안되는 데이터가 추론에 사용될 수 있다.
- NLI 이용해서 유효성 검사 파이프라인 구축
- LLM에서 추론된 결과가 공격적인지 안전한지 판별하기 위한 label("offensive", "safe")를 사용
```python=
from transformers import pipeline
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
candidate_labels = ['offensive', 'safe']
classifier(llm_response, candidate_labels, multi_label=True)
```
- Batch Prompting: 한번에 여러개의 프롬프트를 일괄적으로 추론하는 방식 (추론시간 단축)
- Prompt Chaining: 하나의 LLM 출력을 다른 LLM의 입력으로 사용하는 방식