---
# System prepended metadata

title: 쉽고 빠르게 익히는 실전 LLM
tags: [llm]

---

쉽고 빠르게 익히는 실전 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의 입력으로 사용하는 방식