Zero-Shot Prompting
Zero-shot prompting은 모델에 예제를 주지 않고 "이 작업을 수행해라"와 같은 지시(instruction)을 주어 답변을 생성하게 하는 방식이다.
GPT-3.5, GPT-4, Claude 3과 같은 최신 LLM들은 거대한 데이터로 사전학습되고 추가로 Instruction 학습과 RLHF 기법을 통해 일반 사용자의 지시를 이해하는 학습을 하였다.
이로 인해 예시를 주지 않아도 모델이 이미 학습과정에서 축적한 지식을 통해 많은 작업을 바로 수행할 수 있게 되었으며, 이것이 Zero-shot이 가능한 이유이다.
# Prompt
"Classify the text into neutral, negative or positive.
Text: I think the vacation is okay.
Sentiment:"
# Output
Neutral
위는 간단한 감정분석(sentiment analysis)를 프롬프팅한 예시이다.
별도의 예제 없이 텍스트와 그에 대한 sentiment labeling을 요구했는데도 모델이 "Neutral"이라는 적절한 답을 생성한다.
모델이 이미 학습을 통해 알고 있는 주제나 비교적 간단한 문제라면 Zero-shot으로도 충분히 정확도가 높다.
하지만 데이터 분포가 생소하거나 복잡한 추론 문제에서는 Zero-shot이 적절한 답변을 내기는 부족하다.
그럴 경우에 Few-shot Prompting을 사용한다.
Few-shot Prompting
Few-shot Prompting은 Zero-shot과 달리 모델에 샘플, 예제 등을 몇 개 제공함으로써 프롬프트의 맥락을 잡아주는 기법이다.
예시가 제공됨으로써 모델은 주어진 문제에 대해 어떤 식으로 답변해야 하는지 더 명확히 학습하게 된다.
이것을 In-context Learning이라고 한다.
출처: Brown, T. et al. (2020). Language Models are Few-Shot Learners.
# Prompt
A "whatpu" is a small, furry animal native to Tanzania.
An example of a sentence that uses the word whatpu is:
We were traveling in Africa and we saw these very cute whatpus.
To do a "farduddle" means to jump up and down really fast.
An example of a sentence that uses the word farduddle is:
# Output
"When we won the game, we all started to farduddle in celebration."
위 예시는 "새 단어를 문장에 사용하기"라는 예시로 One-shot Prompting이다. (예제가 1개)
"whatpu"라는 작은 동물에 대한 단어설명과 문장 생성 예시를 주고
"farduddle"이라는 행동을 의미하는 단어를 줬을 때 문장 생성을 해달라는 요청도 in-context learning으로 잘 학습한다.
Few-shot을 사용할 때 주의해야할 점은, 예시를 구성할 때 텍스트 분포와 label 공간이 최소한 비슷해야 한다.
심지어 예시에 틀린 label을 주더라도 맥락과 형식만 제대로 맞추면 zero-shot 보다 나은 결과를 얻을 수 있다.
즉 "형식 통일"이 중요하며 이를 잘 지키면 모델이 예시를 참고하여 높은 정확도를 낼 수 있다.
하지만 복잡한 추론이 필요한 문제에서는 여전히 Few-shot 만으로 오답을 내는 경우가 많다.
예를 들어 아래 프롬프트 예제와 같이 "홀수끼리의 합이 짝수인지 판별하라"와 같은 산술적 reasoning이 필요한 문제에서는 few-shot 예시를 여러개 제공해도 오답이 나올 수 있다.
이런 경우 추론 과정을 직접 보여주는 Chain-of-Thought Prompting이 더 효과적인 접근일 수 있다.
# Prompt
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: The answer is False.
The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.
A: The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A:
# Output
The answer is True.
Chain-of-Thought(CoT) Prompting
Chain-of-Thought prompting은 중간 추론 단계가 명시적으로 드러나도록 프롬프트를 작성해주는 기법이다.
예를 들어 "모든 계산 과정을 하나씩 적은 뒤 결론을 도출해라" 라는 형태로 모델에게 output format을 지정하여 답안을 생성하게 함으로써 복잡하거나 단계별 계산이 필요한 문제에서도 정확도가 크게 향상된다.
# Prompt
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.
The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.
A: Adding all the odd numbers (17, 19) gives 36. The answer is True.
The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.
A: Adding all the odd numbers (11, 13) gives 24. The answer is True.
The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.
A: Adding all the odd numbers (17, 9, 13) gives 39. The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A:
# Output
Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.
위 예시처럼 "홀수들의 합이 짝수인지" 묻는 문제에 앞서, 각 few-shot 예제에 대해 중간 계산, 즉 홀수 항목을 골라서 더하는 계산과정을 단계별로 추가해주었다. 그러자 계산 과정을 명시하지 않았던 few-shot 예제에서의 오답을 극복하고 정확한 답을 유도해냈다.
Zero-Shot CoT는 별도의 중간계산을 명시하지 않고 그저 "Let's think step by step" 같은 문구를 넣어줬을 때
모델이 스스로 단계별 추론을 쓰도록 유도하는 방법이다. 위 예제에서 Zero-shot으로 답변을 요구했을 때는 틀린 답이 나왔지만 "Let's think step by step"라는 문구를 추가하는것 만으로도 스스로 중간 계산과정을 적어가며 정답을 찾아가는것을 확인할 수 있다.
Auto-CoT(Automatic Chain-of-Thought)
CoT의 가장 큰 문제는 '데모 예시를 사람이 일일히 작성'해야 하는 수고가 든다는 점이다.
Auto-CoT는 이 데모 작성을 자동화하고 동시에 다양한 형태의 질문을 밸런스있게 샘플링하여 모델이 실수할 가능성을 줄이려는 시도를 제안한다.
핵심 아이디어는 다음과 같다.
- 질문 클러스터링: 주어진 데이터셋의 질문을 유사도나 특징에 따라 여러 그룹으로 클러스터링한다.
- 대표 질문 및 체인 생성: 각 클러스터에서 대표가 될 만한 질문 하나씩을 뽑고, Zero-shot CoT 방식("Let's think step by step")으로 모델이 reasoning chain(추론 과정)을 자동으로 생성하게 한다.
- 다양성과 정확도를 고려: 질문과 reasoning chain을 다양하게 구성하여 특정 유형의 편향된 예시만 들어가는 것을 피한다.
Auto CoT는 두 과정을 통해 이루어진다.
Question Clustering
- 질문의 Clustering은 먼저 question set에 대하여 각 question에 대해 Sentence-BERT로 인코딩한다. 해당 결과는 입력 문장을 토큰 단위로 나눈 뒤 문맥 속에서 해석한 벡터 값이며 이를 contextualized embedding이라 한다.
- 문장 전체, 즉 질문에 대해 하나의 고정된 크기의 벡터로 요약하기 위해 각 토큰 임베딩을 mean-pooling 하여 질문에 대한 representation을 도출한다.
- 이후 해당 벡터들에 대해 k-means clustering 알고리즘을 통해 k개의 질문 클러스터를 생성한다
- 각 질문 벡터 q에 대하여 center of cluster에 가까운 순서대로 sorting한다.
Demonstration Sampling
앞선 Cluster 알고리즘의 결과로 각 클러스터 i에 대해 정렬된 질문 리스트 q(i)가 만들어진다.
두 번째 알고리즘인 Construct가 시작되면 각 클러스터 i에 대해 준비된 질문 리스트 q(i)를 앞에서 부터 차례대로 살펴본다.
예를 들어 q_j(i)가 현재 후보라면 프롬프트를 zero-shot CoT 방식의 요청으로 만든다. 예시는 아래와 같다.
Q: <q_j(i)의 내용>
A: Let's think step by step
해당 프롬프트를 LLM에 전달하면 모델이 q_j(i)에 대한 추론 과정 r_j(i)와 최종 답면 a_j(i)를 단계별로 생성한다.
이렇게 얻은 [q_j(i), r_j(i), a_j(i)] 3종 세트가 논문에서 말하는 선택 기준(selection criteria)를 만족하는지 검사한다.
논문에서는 다음 기준을 따른다
- 질문 길이(토큰 수)가 60 이하
- CoT 추론 과정 단계가 5 이하 (너무 복잡하지 않은 예시를 우선적으로 선택)
만약 기준을 만족하면 해당 질문을 그 클러스터를 대표하는 demonstration d_j(i)로 채택한다.
d_j(i)는 즉 클러스터 i를 대표하는 [Q:질문 A:추론과정-정답] 형태의 프롬프트를 의미한다.
한 클러스터당 한 개의 데모만 뽑기 때문에 기준에 부합하는 순간 루프를 종료하고 다음 클러스터에 대한 demonstration을 이어서 생성한다. 기준을 충족하지 못하면 해당 클러스터 질문 리스트의 다음 질문으로 넘어가 다시 시도한다.
모든 클러스터에 대해 위 과정을 반복하면 총 k개의 demonstration, 즉 k-shot CoT 형태의 프롬프트를 산출할 수 있다.
이 완성된 데모 셋이 Auto CoT의 최종 산출물로 어떠한 테스트 질문 q^test 에 대해 in-context learning에 활용된다.
즉 [d(1),…,d(k),Q: q^test, A: (CoT reasoning + answer)] 와 같이 데모들을 모두 이어붙인 뒤 마지막에 새로운 질문을 배치하여 CoT 방식으로 추론하고 답을 내도록 유도할 수 있다.