Coding/TIL & 배운것들
Prompt Engineering 잘 알려진 기법들
코딩짜는 머글
2024. 11. 18. 21:35
▼ 기법들
- 대표적으로는 Few Shot 그리고 Chain of Thought 이렇게 2가지 기법들이 존재함
- 그 외에도 많이 있는데, 대부분이 Chain of Thought를 기반으로 발전한 기법들
- LLM처럼 특정 Prompt 방법론이 다른 방법론보다 무조건 더 우위에 있고 그런 경향은 없다.
(GPT-4가 GPT3.5 대비 모든 지표에서 더 좋음(물론 비용, 속도 제외), 특정 Prompt 기법 A가 보편적으로 기법 B보다 좋은 케이스는 거의 존재하지 않음. - 따라서 각 Prompt Engineeringg 기법의 원리를 잘 이해하고 유즈케이스를 잘 판단하는게 매우 중요함.
▼ 주요 기법들
1. Few-Shot
참고 할 수 있는 정답 사례들을 Prompt에 추가하여 성능을 높이는 방법이다.
▶ 의미 : 5-shot의 경우 참고 할 정답 사례들을 Prompt에 5개를 입력해줬다는 뜻.
LLM 평가지표를 보면 MMLU(5-shot) 이렇게 적혀있는게 바로 Few-Shot을 적용했다는 뜻.
평가에서도 사용될만큼 공인된 Prompt Engineering 방법론(OpenAI에서 GPT-4벤치마크 할 때 모든 Prompt에 Few-Shot 적용.
특징은 모델 사이즈가 어느 정도 커야한다는 점.
▶ Few-Shot이 잘 작동하는 이유
- 모델의 파라미터를 수정하지 않고 (즉, 추가적인 학습을 하지 않고) 단순하게 Prompt에 예시 정답만 추가해도 성능이 급격하게 증가하는 것을 발견
- Pretraining, 즉 사전훈련 단계에서 언어 모델이 패턴을 인지하는 능력을 발달
- 이러한 능력으로 추론 시에 태스크에 빠르게 적응을 한다.
- 이렇게 따로 학습을 하지 않고도 언어 모델이 Prompt을 읽으면서 이해해나가는 과정을 "In-Context Learning"이라고 부름
▶ 장단점
- 말 그대로 정답 예시만 넣어주면 되기 때문에 정답이 존재하는 모든 케이스에 적용이 가능하다.
- Prompt길이가 길어질 수 있는데 속도와 특히 비용에 영향이 존재
Pretraining 과정
1. Pretraining
- 기본적인 언어 능력을 탑재하는 단계
- 엄청나게 많은 텍스트를 쭉 읽고 학습하는 과정
- 모델 성능에 가장 많이 영향을 끼치는 단계
- 큰 모델들은 Pretraining만 거쳐도 일반적인 태스크 수행이 가능
2. Supervised Fine-tuning (SFT)
- 태스크에 맞춰서 추가로 학습하는 단계
- 보통 입력과 정답 쌍이 있어 이 쌍을 학습하는 과정
3. Human Alignment Training (ex. RLHF, DPO, ORPO)
- 사람이 선호하는 답변이 무엇인지 학습하는 단계
- 방법은 여러 가지가 있는데 가장 단순하게는 좋은 답변 A, 좋지 않은 답변 B 쌍을 두고 학습하는 과정
▼ 사용 예시
prompt = """Answer these questions:
Q: who sang my way?
A: Frank Sinatra
Q: who wrote the book the origin of species?
A: Charles Darwin
Q: who wrote the book the wuthering heights?
A: """
completion = client.chat.completions.create(
model='gpt-3.5-turbo-0125',
messages=[{'role': 'user', 'content': prompt}],
temperature=0.0
)
print(completion.choices[0].message.content)
# 출력
Emily Bronte
2. Chain-of-Thought
- Few-Shot이 참고 할 수 있는 정답 사례들을 Prompt에 추가하여 성능을 높이는 방법이라면 Chain of Thought는 거기에 추가로 문제 해결 과정도 같이 Prompt에 추가하는 방식.
- 대부분의 Prompt Engineering 기법은 Chain-of-Thought의 후속작
- 안타깝게도 Chain-of-Thought 논문에 있는 모든 예시들은 gpt3.5-turbo-0125로는 재현되지 않음
- CoT 없이 못 푸는 문제들 없이 이미 다 잘 해결함(따라서 예시를 입력한는 것보다는 원리를 잘 이해하는게 중요)
prompt = """Lisa has 5 bananas, throws 3 bananas, gives 2 to Bart and Bart gives one back, how many bananas does Lisa have?"""
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.0
)
print(completion.choices[0].message.content)
# 출력
Lisa would have 5 bananas - 3 thrown + 2 given to Bart - 1 given back = 3 bananas.
Therefore, Lisa would have 3 bananas.
CoT없이 문제를 줬을때, 답을 틀리는 것을 알 수 있다.
▼이제 CoT를 적용해보자.
prompt = """Lisa has 7 bananas, throws 1 banana, gives 4 bananas to Bart and Bart gives one back:
7 - 1 = 6
6 - 4 = 2
2 + 1 = 3
Tom has 10 bananas, throws 3 bananas, gives 5 bananas to Bart and Bart gives two back:
10 - 3 = 7
7 - 5 = 2
2 + 2 = 4
Lisa has 5 bananas, throws 3 bananas, gives 2 to Bart and Bart gives one back, how many bananas does Lisa have?"""
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.0
)
print(completion.choices[0].message.content)
# 출력
5 - 3 = 2
2 - 2 = 0
0 + 1 = 1
Lisa has 1 apple left.
정답을 잘 맞추게 되는것을 알 수 있다.
▼ 주요 기법들을 응용한 케이스들 소개
Self-Consistency
- CoT한 번이 아니라 여러 번의 다양한 CoT 과정을 거쳐 그 중 베스트를 선정하는 방법
- 더 다양하게 그리고 각 CoT 과정들을 연결한 Tree of Thought 논문도 존재
Generated Knowledge
- 질문을 통해 상식을 끄집어내어 더 정확하게 대답하는 방법
- 해당 상식을 어느 정도 알고 있다는 전제 하에 작동시킬만한 방법
- Retrieval Augmented Generation(RAG)은 상식을 직접 주입하는 방법
- 별도의 RAG 로직이 필요하지만 이게 실제로 많이 활용되는 방법
Least-to-Most
- 질문 A를 바로 물어보지 않고 질문 a,b로 쪼개서 물어보는 분할 정복 방법
- 비용 증가로 이어지긴 하나 상대적으로 사용하기 쉬운 방법
Prompt Chaining
- Prompt A의 Output A를 Prompt B에 사용하는 방법
- 주로 전처릴 또는 답변을 하기 쉽게 만드는 Prompt A와 실제 답변을 유도하는 Prompt B로 구성
- Least-to-Most처럼 분할 정복 계열
ReAct
- Chain-of-Thought 에서 Reasoning 과정을 추가한다면 여기서는 Reasoning 외에도 Action까지 추가하는 방법
- 실제로 환경과 interact 해야하는 상황을 가정한 방법론
여러가지 다양한 방법론이 있지만 Input토큰이 몇 배씩 증가하여 비용 이슈로 이어질 수 있기 때문에 실용적이지는 않다.