본문 바로가기

공부/AI

[Prompt] 프롬프트 엔지니어링 테크닉 기초 정리

 

Prompt Engineering Techniques (Basic)  

GPT와 같은 LLM을 사용할 때의 기초적인 프롬프트 엔지니어링 테크닉에 대하여 정리해보고자 한다. 

 

📌 목차 

1. Few-Shot Prompting
2. CoT (Chain of Thoughts)
3. Zero-Shot CoT
4. Self Consistency
5. Least-to-Most

6. ReAct

7. ToT (Tree of Thoughts) 

 

 

📌 Few-Shot Prompting

모델에게 실제로 원하는 작업을 수행하도록 요청하기 전에, 작업의 성공적인 실행 예시를 제공(few-shot)하여 모델의 출력을 원하는 방향으로 유도하는 기법이다. 
 
 
Few-Shot Prompting 예시

당신의 임무는 일관된 스타일로 답변하는 것입니다.
<요청> : 환경보호 행사에서의 연설문 주제를 2개 알려주세요.
<답변> : 1. 지속 가능한 개발과 환경보호에 대한 국제적 노력 필요성 
2. 우리나라의 저탄소 녹색성장 전략 및 환경정책 추진현황 
<요청> : 동물 보호 행사에서의 연설문 주제를 5개 알려주세요.

 
Output 

1. 야생 동물 보호와 지속 가능한 생태계 유지의 중요성
2. 멸종 위기 동물 보호를 위한 글로벌 전략과 협력
3. 동물 실험의 대안적 방법과 윤리적 책임
4. 동물복지 향상을 위한 국내 법률 및 정책의 필요성
5. 인간과 동물 간의 공존: 도시 환경에서의 동물 보호 전략

 
 

📌 Chain of Thoughts Prompting 

Chain-of-Thought (CoT), 즉 생각의 사슬 프롬프트란, 답을 도출하기 위해 필요한 '중간 추론 단계'를 설명하도록 하여 복잡한 추론을 가능하게 하는 기법이다. 이 기법은 특히 복잡한 논리적, 수학적 문제나 추론이 필요한 질문에 유용하게 사용된다.
 
 
일반적인 프롬프팅과 CoT 프롬프팅 비교

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (2022)

 
일반적인 프롬프팅 : 'Roger는 테니스공 5개를 가지고 있습니다. 그는 테니스공이 3개 들어 있는 캔을 2개 더 삽니다. Roger는 지금 총 몇개의 테니스공을 가지고 있나요?'라는 질문과 '답은 11개입니다'라는 답변의 실행 예시를 제공한 뒤, '카페에는 원래 23개의 사과가 있었습니다. 그들이 점심을 만들기 위해 20개를 사용하고 6개를 더 구입하였다면 현재 그들은 몇개의 사과를 갖고 있나요?'라는 새로운 질문을 하고 있다. 정확한 답변은 9개이지만, 여기에서 모델은 27개라는 틀린 답변을 내놓고 있다.  
 
CoT 프롬프팅 : 일반적인 프롬프팅과 다르게 CoT 프롬프팅에서는 문제의 해결과정을 단계별로 설명하여 답변에 이르게끔 하고 있다. 'Roger는 테니스공 5개를 가지고 있습니다. 그는 테니스공이 3개 들어 있는 캔을 2개 더 삽니다. Roger는 지금 총 몇개의 테니스공을 가지고 있나요?'라는 질문과 'Roger는 처음에 5개의 공을 가지고 있었습니다. 3개의 테니스공이 들어있는 2개의 캔은 총 6개의 테니스공을 의미합니다. 5+6=11이므로 답은 11개입니다.'라는 추론 과정과 답변의 실행 예시를 제공한 뒤, '카페에는 원래 23개의 사과가 있었습니다. 그들이 점심을 만들기 위해 20개를 사용하고 6개를 더 구입하였다면 현재 그들은 몇개의 사과를 갖고 있나요?'라는 새로운 질문을 하고 있다. 그 결과 모델은 '카페테리아에는 원래 사과가 23개 있었습니다. 그들은 점심을 만들기 위해 20개를 사용했습니다. 그래서 그들은 23 - 20 = 3개가 있었습니다. 그들은 6개의 사과를 더 샀으니, 그들은 3 + 6 = 9개를 가지고 있습니다. 답은 9개입니다.'라는 추론 과정을 통해 정확한 답변을 내놓게 된다. 
 
 
다양한 태스크에서의 CoT Prompting 예시

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (2022)

 
 

📌 Zero-Shot CoT Prompting 

제로샷 CoT 프롬프팅은 질문에 대한 ‘중간 추론 단계’의 예시를 직접 제공해주지 않더라도 간단하게 ‘Let’s think step by step’, 즉 ‘단계별로 생각해보자’, ‘차근차근 생각해보자’와 같은 프롬프트를 추가해주는 것만으로도 모델의 출력 결과를 개선하는 기법이다. 
 
 
Zero-Shot CoT Prompting 예시 

Large Language Models are Zero-Shot Reasoners (2022)

 
 

📌 Self Consistency

자기 일관성(Self Consistency) 기법은 기존의 CoT 프롬프팅 방식을 개선한 것으로, 복잡한 추론 문제에 대하여 모델이 다양한 추론 경로를 탐색하고 그 중 가장 일관된 답을 찾는 기법이다. 모델이 단순히 첫 번째로 도달한 결론을 내놓는 것이 아니라, 다양한 가능성을 고려하여 더 신뢰할 수 있는 정보를 제공하게 하는데 목적이 있다. 즉 이를 통해 모델은 더 복잡하고 다차원적인 문제를 해결하는 데 있어서 인간과 유사한 방식으로 접근할 수 있게 된다. 
 
 
Self Consistency 기법 예시

Self-Consistency Improves Chain of Thought Reasoning in Language Models (2022)

 
1. 예시 추론 경로를 포함한 프롬프트 : 우선 모델에 특정 문제를 제시하면서, 문제를 해결하는 방법에 대한 예시를 함께 제공한다. 이는 모델에게 문제 해결에 접근하는 방식을 유도하기 위함이다. 

질문: 주차장에 차가 3대 있고 2대가 더 도착하면, 주차장에는 총 몇 대의 차가 있나요?
답변: 주차장에 이미 차가 3대 있습니다. 2대가 더 도착합니다. 이제 총 3 + 2 = 5대의 차가 있습니다. 답은 5대입니다.

 
2. 다양한 추론 경로 생성 : 프롬프트를 모델에게 독립적으로 여러개 입력하여 다양한 추론 경로를 생성한다. 이는 동일한 문제에 대해 여러 가지 다른 해석과 해결 방식을 탐색하게 한다.
 
3. 가장 일관된 답변 선택: 생성된 다양한 답변 중에서, 가장 대다수가 선택한 답변(일관성은 다수결 말고도 다른 기준으로 측정될 수 있음)을 최종적인 답으로 결정한다. 

 

📌 Least-to-Most

Least-to-Most 기법은 복잡한 문제를 더 쉬운 여러 부분 문제로 나누어 해결하는 프롬프팅 기법이다. 이 방법은 복잡한 문제를 먼저 간단한 여러 하위 문제로 분해하고 이 문제들을 차례로 해결하면서, 이전 하위 문제의 해결책을 다음 문제를 해결하는데 사용한다. Least-to-Most 기법은 인간이 문제를 푸는 방법(큰 문제를 작은 부분으로 나누어 각 부분을 차례대로 해결하는 방식)과 유사한 방식으로 AI가 문제를 해결할 수 있게끔 한다. 

 

 Least-to-Most 기법 예시 

Least-to-Most Prompting Enables Complex Reasoning in Large Language Models (2022)

 

1. 문제를 하위 질문으로 분해 : 'Amy가 워터 슬라이드로 올라가는데에 4분이 걸리고 내려오는데 1분이 걸립니다. 워터 슬라이드는 15분 뒤에 닫힙니다. Amy가 워터 슬라이드가 닫히기 전에 총 몇번을 탈 수 있을까요?'라는 문제를 풀기 위해서, 언어 모델은 먼저 '워터 슬라이드를 한 번 타려면 시간이 얼마나 걸리나요?'라는 하위 질문1에 답해야 한다.   

 

2. 하위 질문을 순차적으로 해결 : 언어 모델은 하위 질문1을 해결하기 위하여, Amy가 워터 슬라이드에 올라가는데 4분, 내려오는데 1분이 걸린다는 것을 통해 4+1=5라는 것을 계산하여 '워터 슬라이드를 한 번 타려면 5분이 걸린다'라는 답변을 얻는다. 이에 따라 'Amy가 워터 슬라이드가 닫히기 전에 총 몇 번을 탈 수 있을까요?'라는 하위 질문2를 해결하기 위하여 하위 질문1의 답변을 사용한다. 워터 슬라이드가 15분 후에 닫힌다고 하였으므로 워터 슬라이드를 한 번 타기 위해 소요되는 5분으로 15을 나누어 Amy가 워터 슬라이드를 3번 탈 수 있다는 결론을 내린다. 

 

 

📌 ReAct

ReAct 기법은 모델에게 생각하고 행동하는 방식을 제공하는 기법이다. 'Reasoning(추론)' 부분에서는 문제를 작은 단계로 나누고 각 단계에 필요한 체크리스트를 만드는 식으로 작동한다. 'Acting(행동)' 부분에서 모델은 추론에 기반하여 행동을 수행한다. 

 

ReAct 기법 예시 

ReAct: Synergizing reasoning and acting in language models (2022)

 

1. 문제 : "Colorado orogeny"의 동쪽 구역이 확장되는 지역의 표고 범위는 얼마입니까? 

2. 생각1 : "Colorado orogeny"를 검색해야 하며, Colorado orogeny의 동부 지역이 확장되는 영역을 찾은 다음, 그 지역의 해발 높이 범위를 찾아야 합니다.

3. 행동1 : [Colorado orogeny] 검색

- 관찰1 : Colorado orogeny는 콜로라도와 주변 지역에서 일어난 산맥 형성 과정(조산 운동)이었습니다.

4. 생각2 : 동부 지역에 대한 언급이 없습니다. 따라서 동부 지역에 대해 더 찾아봐야 합니다.

5. 행동2 : [동부 지역] 검색

- 관찰2 : 동부 지역은 'High Plains'로 확장되며 'Central Plains orogeny'라고 불립니다.

6. 생각3 : Colorado orogeny의 동부 지역은 'High Plains'로 확장됩니다. 그러므로 'High Plains'를 검색하고 그 해발 높이 범위를 찾아야 합니다.

7. 행동3 : [High Plains] 검색

- 관찰3 : High Plains는 두 개의 구별되는 지대 중 하나를 가리킵니다.

8. 생각4 : 대신 [High Plains (United States)]를 검색해야 합니다.

9. 행동4 : [High Plains (United States)] 검색

- 관찰4 : High Plains는 대평원의 하위 지역입니다. 동쪽에서 서쪽으로, High Plains는 대략 1,800피트에서 7,000피트(550에서 2,130미터)의 높이로 고도가 상승합니다.

10. 생각5 : High Plains의 해발 고도가 대략 1,800피트에서 7,000피트이므로, 답은 1,800피트에서 7,000피트입니다.

11. 행동5 : [1,800피트에서 7,000피트]로 결론 내림

 

이 예시에서 ReAct 모델은 단계적으로 질문을 해석하고 관련 정보를 검색하여 복잡한 문제에 대한 답을 찾아낸다. 각 단계에서 모델은 관찰을 바탕으로 다음 행동을 결정하며, 이 과정을 통해 최종적으로 정확한 해발 높이 범위를 도출하고 있다. 이러한 접근 방식을 통하여, 모델은 단순한 검색을 넘어서 관련 정보를 효과적으로 연결하고 해석하여 복잡한 문제를 해결할 수 있게 된다.

 

 

📌 Tree of Thoughts 

사고의 트리(Tree of Thoughts) 기법은 복잡한 문제에 대하여 다양한 추론 경로를 탐색하고 자체적으로 평가하여 최적의 해결책을 찾는 기법이다. 문제를 다양한 단계로 분해하고, 각 단계에서 가능한 해결책을 생성하며, 이러한 해결책들을 평가하여 가장 유망한 경로를 선택한다.
 
 
Tree of Thoughts와 다른 프롬프팅 방법 비교 

Tree of Thoughts: Deliberate Problem Solving with Large Language Models (2023)

 

1. Input-output (IO) Prompting: 가장 흔한 방법으로, 문제의 입력(x)을 언어 모델에 제공하고, 모델이 출력(y)을 생성하는 방식. 주로 문제의 입력에 대한 지시사항을 포함한 프롬프트를 사용한다.

2. Chain-of-Thought (CoT) Prompting: 더 복잡한 문제에서 사용되며, 입력(x)에서 최종 출력(y)까지 이르는 과정을 '생각의 사슬'이라는 중간 단계들로 나눈다. 예를 들어, 수학 문제의 경우 중간 단계에는 각각의 계산 과정이 포함될 수 있다.

3. Self-consistency with CoT (CoT-SC): CoT의 확장된 형태로, 다양한 생각의 사슬을 생성하고 그 중 가장 일반적인 결과를 선택하는 방식이다. 
 
 
Tree of Thoughts 방식
1. Thought Decomposition: 문제를 여러 '생각' 단계로 나누는 것이다. 각 생각은 문제 해결을 향한 중간 단계를 나타낸다. 생각의 단위는 몇글자(Crosswords)가 될 수도 있고 수식 한줄(Game of 24)이 될 수도 있고 한 문단(Creative writing)이 될 수도 있다. 이 생각들은 LM이 생성하고 평가할 수 있을 정도로 충분히 작지만, 동시에 충분히 커야 한다.
 
2. Thought Generator: 현재 상태에서 가능한 다음 생각을 생성하는데, 이 때 두 가지 전략을 사용할 수 있다.
(a) CoT(Chain of Thought) 프롬프트에서 독립적으로 동일하게 분포한(i.i.d.) 생각들을 생성. 이는 생각 공간이 다양할 때 작동함.
(b) 제한된 상황에서 다양한 생각을 생성하기 위해 propose prompt를 사용하여 순차적으로 생각을 제안.
 
3. State Evaluator: 현재 상태를 평가하여 문제 해결에 얼마나 가까운지 판단한다. 이는 독립적으로 각 상태를 평가(현재 상태를 숫자 값이나 클래스로 평가)하거나, 여러 상태를 비교(vote prompt를 사용하여 상태 간 비교 및 투표)하여 선택하는 방식으로 이루어질 수 있다. 

4. Search Algorithm: 문제 해결 과정에서 다양한 옵션을 탐색하고 평가하기 위해 사용된다. 대표적인 방법으로는 넓이 우선 탐색(BFS)과 깊이 우선 탐색(DFS)이 있는데 BFS 방식의 경우 각 단계의 가장 유망한 상태를 유지하고, DFS 방식의 경우엔 가장 유망한 상태를 탐색하고 최종 출력이 나올 때까지 계속한다.
 
 
Tree of Thoughts 기법 예시 

Tree of Thoughts: Deliberate Problem Solving with Large Language Models (2023)

ToT를 사용한 BFS의 예시로 ‘Game of 24’가 있다. 이 게임에서는 네 개의 숫자를 사용하여 기본 산술 연산을 통해 24를 만드는 것이 목표이다.
예를 들어, 입력이 "4 9 10 13"인 경우, 초기 사고 후보는 "13 - 9 = 4", "10 + 4 = 14", "9 * 4 = 36" 등이 될 수 있다. 그리고 생성된 각 사고 후보를 "확실함/아마도/불가능함"으로 평가한다. 예를 들어, "13 - 9 = 4"는 '아마도' 유망한 후보로 평가될 수 있고, "9 * 4 = 36"은 결과가 너무 커서 '불가능함'으로 평가될 수 있다. 각 사고 후보가 24에 도달할 수 있는지 빠르게 시험해보고, '너무 크거나 작은' 결과를 초래하는 후보는 제거한다. 예를 들어, "10 + 4 = 14"는 24에 도달하기에는 숫자가 너무 작으므로 제거될 수 있다.
유망한 후보들 중에서 최종적으로 24에 도달할 수 있는 경로를 찾아낸다. 이 과정에서 여러 후보들 사이에서 가장 좋은 결과를 제공하는 사고 경로를 선택하게 된다. 
 
 

📌 참고 

1. OpenAI 쿡북 : https://cookbook.openai.com/articles/techniques_to_improve_reliability
2. 프롬프트 엔지니어링 가이드 https://www.promptingguide.ai/ 
3. 각 기법과 연관된 논문들
 - Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (2022)
 - Large Language Models are Zero-Shot Reasoners (2022)
 - Self-Consistency Improves Chain of Thought Reasoning in Language Models (2022)
 - Least-to-Most Prompting Enables Complex Reasoning in Large Language Models (2022)
 - ReAct: Synergizing reasoning and acting in language models (2022)
 - Tree of Thoughts: Deliberate Problem Solving with Large Language Models (2023)

반응형