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