02_PromptEngineering

PLO·2023년 5월 11일

01_ChatGptProject

목록 보기
3/3

1. Prompt

  • 기존 : 컴퓨터(PC) 에게 프롬프트를 입력하기 위한 언어
  • 현재 : 컴퓨터(AI) 에게 프롬프트를 입력하기 위한 자연어

2. Prompt Engineering의 기본 원리

  1. 구체성 ( 명확성 )
    AI는 답변을 생성할 때 바로 다음 나올 단어를 예측하며 문장을 생성합니다.
    구체적인 프롬프트를 입력해야 내가 원하는 키워드와 내용에 대한 확률이 올라가며
    원하는 답변을 받을 확률이 올라갑니다.

  2. 데이터 & In-context learning ( 문맥 이해 )
    AI는 입력된 데이터를 기반으로 학습하고 문맥을 이해하여 답변을 생성합니다.
    따라서 프롬프트를 작성할 때도 이를 고려하여 ,
    원하는 답변이 AI의 데이터 베이스에 존재하는지여부를 파악하고 활용해야 합니다.

  3. 알고리즘
    아무리 구체적으로 프롬포트를 입력한다고 하더라도
    한꺼번에 너무 복잡하고 다양한 지시를 하면원하는 답변을 얻을 확률이 매우 낮아집니다.
    따라서 내가 원하는 문제 해결이나 목표를 먼저 알고리즘화하여분석하고 심플하게 다듬어야 합니다.

3. Prompt Engineering 기법

  1. Zero-shot Learning
    아무런 예시 없이 요구사항만 입력한다.예시 여러개를 통한 학습 방식

    ex_1

    Request
    문제집과 과거를 사용해서 문장을 하나 만들어줘

    Response
    문제집을 바라보니 수험시절에 열심히 공부했던 과거가 떠올랐다.

  2. One-shot Learning
    지시사항 및 명확한 요구사항 없이 예시 하나를 통해 학습하여 대답할 수 있도록 유도함
    예시 하나를 통한 학습 방식이며 ( 정확도가 상대적으로 낮음 )

    ex_1

    Request
    질문 : 문제집 , 과거
    답변 : 문제집을 바라보니 수험시절에 열심히 공부했던 과거가 떠올랐다.
    질문 : 재료, 활동
    답변 :

    Response
    오늘 우리는 새로운 재료를 활용하여 캔들 만들기 활동을 할 것이다.

    참고 : Request에서 문제집 , 과거 예제가 One-shot 입니다.

  3. Few-shot Learning
    지시사항 및 명확한 요구사항 없이 예시를 통해 학습하여 대답할 수 있도록 유도함
    예시 여러개를 통한 학습 방식

    ex_1

    Request
    질문 : 문제집 , 과거
    답변 : 문제집을 바라보니 수험시절에 열심히 공부했던 과거가 떠올랐다.
    질문 : 속보 , 로봇
    답변 : 속보 뉴스에서 로봇들이 집단 시위를 벌이는 장면이 방영되고 있다.
    질문 : 재료, 활동
    답변 :

    Response
    오늘 우리는 새로운 재료를 활용하여 캔들 만들기 활동을 할 것이다.

    참고 : Request에서 문제집 , 과거 / 속보 , 로봇이 few-shot 입니다.

  4. CoT(Chain-of-Thought)
    답변을 내놓기 위한 것이 아닌 답변에 도달하는 과정을 학습시키는 것이 목적이다.본 질문 전에 미리 태스크와 추론 과정을 포함한 답변 예제를 AI에게 제공하는 기법이다.

  5. Zero-Shot Cot
    트리거 문장 (“Let’s think step by step“)을 프롬프트에 추가하여
    LLM이 단계에 따라 결과에 도달하게하는 기법이다.
    트리거 문장 하나로 상세한 답변 도출 및 추론 과정을 받아볼 수 있다.

  6. Self-Consistency
    Cot의 심화 버전으로 보다 다양한 추론 과정을 예제로 제공하여
    AI가 보다 일관성 있는 답변을 선택하여 생성할 수 있도록 돕는 기법이다.
    기존에 CoT 프레임워크와의 차이점은 수학적 그리고 상식적인 추론이 요구되는
    테스크 수행 능력이 향상되었다는 점이다.

  7. 정보 제공 및 답변 조건 지정
    정보 제공 및 답변 조건 지정 형식의 프롬프트 설계시 구성요소
    (반드시 아래 언급된 모든 요소가 프롬프트에 포함되어야할 필요는 없다.)

    1. 역할 ( role ) : 모델의 역할을 지정
      ex ) 너는 초등학교 선생님이야

    2. 지시 ( instruction/task ) : 수행해야할 업무
      ex ) 인혁이 1주 동안 학습한 학습 내용을 바탕으로 피드백을 작성해

    3. 질문 ( Question ) : 답을 구하고자 하는 것에 대한 인풋 또는 질문

    4. 문맥 ( Context ) : 참고해서 답변할 데이터
      ex ) 인혁이 1주 동안 학습한 내용은 아래와 같아

    5. 결과물 형식 지정 ( Output Indicator ) [ who , where, how , when ] : 출력 형식 지시사항
      ex ) 답변을 상냥한 선생님처럼 구어체로 생성해줘
  8. Hyper Parameter
    하이퍼파라미터(hyperparameters)는 모델의 동작 방식을 제어하는 매개변수들입니다.
    GPT의 하이퍼파라미터는 다양한 요소들을 설정하고 모델의 성능과 동작을 조정하는 데 사용됩니다. 하이퍼파라미터에는 여러 가지가 있지만, 일반적으로 주요한 하이퍼파라미터들은 다음과 같습니다.

    1. 모델 크기 (Model Size)
      GPT 모델의 크기는 모델이 가지는 매개변수의 수를 나타냅니다.
      일반적으로 더 큰 모델은 더 많은 매개변수를 가지며,
      더 많은 학습 데이터를 처리할 수 있고 더 복잡한 패턴을 학습할 수 있습니다.
      하지만 더 큰 모델은 학습과 추론 시간이 더 오래 걸리고, 계산 리소스가 더 많이 필요합니다.

    2. 레이어 개수 (Number of Layers)
      GPT 모델은 여러 개의 트랜스포머(transformer) 레이어로 구성됩니다.
      레이어 개수는 모델의 깊이를 결정하며, 레이어가 추가될수록 모델은
      더 복잡한 시퀀스 패턴을 학습할 수 있습니다.
      하지만 레이어가 많을수록 모델의 계산 비용이 증가하고,
      학습 데이터가 적을 경우에는 과적합(overfitting)의 위험이 커질 수 있습니다.

    3. 헤드 개수 (Number of Heads)
      트랜스포머의 어텐션(attention) 메커니즘은 여러 개의 어텐션 헤드로 구성됩니다.
      헤드 개수는 모델이 입력의 다양한 부분을 독립적으로 처리하는 능력을 결정합니다.
      일반적으로 헤드 개수가 많을수록 모델의 표현 능력이 향상되지만,
      계산 비용이 더 많이 필요하게 됩니다.

    4. 배치 크기 (Batch Size)
      배치 크기는 모델이 한 번에 처리하는 입력 데이터의 개수를 나타냅니다.
      큰 배치 크기는 계산 효율성을 높일 수 있지만, GPU 메모리에 맞지 않을 수 있습니다.
      또한, 배치 크기가 작을 경우에는 학습 속도가 느려질 수 있습니다.

    5. 학습률 (Learning Rate)
      학습률은 모델의 가중치를 업데이트하는 속도를 제어하는 하이퍼파라미터입니다.
      높은 학습률은 가중치를 빠르게 업데이트할 수 있지만,
      너무 높으면 수렴하지 못하고 발산할 수 있습니다.
      반대로 낮은 학습률은 안정적인 학습을 도모할 수 있지만,
      수렴하는 데 시간이 오래 걸릴 수 있습니다.
      학습률은 주로 경사하강법(gradient descent) 알고리즘과 함께 사용되며,
      최적의 학습률을 찾기 위해서는 실험과 조정이 필요합니다.

    6. 드롭아웃 확률 (Dropout Probability)
      드롭아웃은 학습 중에 일부 뉴런을 무작위로 비활성화시켜 과적합을 줄이는
      정규화(regularization) 기법입니다.
      드롭아웃 확률은 각 뉴런이 활성화되는 확률을 나타내며,
      일반적으로 0.1에서 0.5 사이의 값이 사용됩니다.
      더 높은 드롭아웃 확률은 모델의 일반화 능력을 향상시킬 수 있지만,
      학습 속도가 느려질 수 있습니다.

    7. 훈련 에포크 수 (Number of Training Epochs)
      훈련 에포크 수는 전체 학습 데이터셋을 몇 번 반복하여 학습할지를 결정합니다.
      에포크는 한 번의 전방향 패스와 역전파(backpropagation)로 구성되며,
      많은 에포크를 훈련할수록 모델은 더 많은 학습을 수행합니다.
      그러나 과적합을 피하기 위해 적절한 에포크 수를 선택하는 것이 중요합니다.

    8. 최적화 알고리즘 (Optimization Algorithm)
      최적화 알고리즘은 모델의 가중치를 조정하여 손실 함수를 최소화하는 역할을 합니다.
      일반적으로는 확률적 경사하강법(SGD, Stochastic Gradient Descent)이 사용되지만,
      다른 알고리즘인 Adam, RMSprop 등도 자주 사용됩니다.
      각 알고리즘은 다른 하이퍼파라미터를 가지고 있으며,
      이를 조정하여 최적의 학습을 달성할 수 있습니다.

3. Prompt Engineering 주의점

  1. Few Shot Learning 패턴 파악하기

    나쁜 사례

    Request
    질문 : 쥐와 코끼리 중 어느 것이 더 무겁습니까?
    답변 : 코끼리가 쥐보다 무겁습니다.
    질문 : 쥐와토스터기 중 어느 것이 더 무겁습니까?
    답변 : 토스터기가 쥐보다 무겁습니다.
    질문 : 토스터기와 연필 중 어느 것이 더 무겁습니까?
    답변 :

    Response
    답변 : 연필이 토스터기보다 무겁습니다.

    사례 분석
    1. few-shot의 질문 부분의 대조군을 잘 살펴보자

    1번 few-shot
    질문 : 쥐와 코끼리중 어느 것이 더 무겁습니까?
    답변 : 코끼리가 쥐보다 무겁습니다.

    2번 few-shot
    질문 : 쥐와토스터기 중 어느 것이 더 무겁습니까?
    답변 : 토스터기가 쥐보다 무겁습니다.

    위 두개 few-shot 모두 무거운 것 (코끼리 , 토스터기)가
    대조군의 뒷부분 ( 쥐와 “코끼리“ )에서 언급되는 질문 패턴을 가지고 있다.
    그렇기에 3번 질문인 "토스터기와 연필 중 어느 것이 더 무겁습니까?"

    위 질문에 AI가 대답할 때에 대조군 뒤쪽에 위치한
    ( 토스터기와 “연필“ ) 연필을 더욱 무겁다고 판단하여 연필이 토스터기보다 무겁다는
    잘못된 답변을 하는 것이다.

    옳은 사례

    Request
    질문 : 쥐와 코끼리 중 어느 것이 더 무겁습니까?
    답변 : 코끼리가 쥐보다 무겁습니다.
    질문 : 토스터기와 쥐 중 어느 것이 더 무겁습니까?
    답변 : 토스터기가 쥐보다 무겁습니다.
    질문 : 바다와 먼지 중 어느 것이 더 무겁습니까?
    답변 : 바다가 먼지보다 무겁습니다.
    질문 : 토스터기와 연필 중 어느 것이 더 무겁습니까?

    Response
    답변 : 토스터기가 연필보다 무겁습니다.

    사례 분석

    1. few-shot을 분석해보자.
      few-shot의 갯수가 하나 늘어났으며 나쁜 사례와 같은 패턴이 발견되지 않았으므로AI는 주어진 문장의 패턴이 아닌 단어의 특성을 파악하여 대답해야함을 파악해 답변한다.
      프롬프트 엔지니어링 기본 원리의
      데이터 & In-context learning ( 문맥 이해 )에 해당하는 사례이다.

Reference
1. https://www.youtube.com/watch?v=OLwCy9adrNk&list=PLLBmN1BISt01hGx7UmBDu-eiyLg35v3BU&index=6&t=2592s
2. https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/guides/prompts-advanced-usage.md
3. https://tech.kakaoenterprise.com/188
4. https://sites.google.com/view/automatic-prompt-engineer

profile
주니어 개발자 Plo입니다. 🙇‍♂️

0개의 댓글