
프롬프트 엔지니어링(Prompt Engineering)
NLP 모델이 내가 원하는 작업을 하도록 최적의 프롬프트를 설계하는 방법론.
박상언, 강주영. (2023). ChatGPT 및 거대언어모델의 추론 능력 향상을 위한 프롬프트 엔지니어링 방법론 및 연구 현황 분석. 지능정보연구, 29(4), 287-308.
| 프롬프팅 기법 | 내용 | 문제점 | 자동 여부 |
|---|---|---|---|
| Few-shot Learning | 다수 예제를 통해 간단한 추론 가능 | 복잡한 추론 불가 | No |
| Generated Knowledge Prompting(GKP) | 추론을 위해 필요한 지식을 생성하는 단계를 중간에 추가 | 복잡한 추론 불가 | Yes |
| Chain of Thought(CoT) | 추론 단계를 답변에 추가함으로써 비교적 복잡한 추론 가능 | 사람이 추론 단계를 추가해야 한다. | No |
| Self-Consistency | CoT에서 다양한 답변을 생성하고 일관성이 높은 답변을 선택함으로써 CoT보다 높은 성능을 보인다. | 사람이 추론 단계를 추가해야한다. | No |
| Zero-shot CoT | Zero-shot으로 추론 과정예제를 언어모델이 생성하게 함으로써 추론 단계 추가가 불필요 하다. | CoT 보다 낮은 성능 | Yes |
| Auto-CoT | Few-Shot + Zero-shot CoT. 문제 집합을 군집화하고 주어진 문제에 대해 각 군집에서 하나씩의 문제를 선별해서 예제 집합을 구성. 선별 과정에서 Zero-shot CoT 적용. | 답변과 추론 과정이 잘못된 예제 추가 가능성 | Yes |
| Active | Self-Consistency + Zero-shot CoT. Zero-shot Learning으로 추론과정 예제를 다양하게 생성하고, 답변의 불확실성이 높은 예제를 사람이 만든 예제로 교체. 답변 선택에도 자기 일관성을 적용한다. | 일부 문제에 대해 사람이 추론 단계를 추가해야한다. | Mix |
| Tree of Thought(ToT) | 트리 형태의 단계적 자기 일관성 + 상태 평가를 통한 휴리스틱 탐색. 문제 해결 과정을 여러 개의 사고로 분해하고 트리 형태로 사고를 생성하여 평가한 후 문제 해결까지의 다양한 경로를 탐색. 가장 높은 수준의 추론 성능을 달성. | 문제 유형에 따라 사람이 적절한 프레임워크를 설계해야한다. | No |

언어 모델이 하나의 입력 시퀀스를 읽어 들이는 동안 그 안에 있는 서브 테스크들에 대해서도 학습이 일어나는 것을 발견하고, 이와 같이 입력 시퀀스의 내부 루프에서 발생하는 학습이다.
문맥 내 학습은 사용되는 예제의 수에 따라 퓨샷러닝, 원샷러닝, 제로샷 러닝으로 구분된다.
퓨삿 러닝(Few-shot Learning)
질문-대답 쌍의 여러 개의 예제를 통한 패턴을 학습시키고 마지막에 질문을 하는 형태이다.
원샷 러닝(One-shot Learning)
한 개의 예제와 자연어로 기술된 작업 설명을 입력을 사용한다.
제로샷 러닝(Zero-shot Learning)
원샷 러닝에서 예제를 빼고 작업에 대한 자연어 설명만을 입력으로 사용한다.
하나의 예제만을 사용하는 원샷 프롬프팅과 다수의 예제를 사용하는 퓨샷 프롬프팅은, 정확도가 각각 45% 정도와 65% 정도로 20%p 가량의 차이가 났다.
퓨샷 러닝, 원샷 러닝, 제로 샷 러닝에서 답변을 이끌어 내기 위한 텍스트 입력 전체를 의미한다.
어떤 식으로 프롬프트를 작성하는가에 따라 답변의 정확도가 바뀔 수 있으며, 보다 정확한 답변을 얻기 위해 프롬프트를 설계하는 것이다.
LLM에서 일반적인 상식 추론의 성능을 높이기 위해 제안한 방법이다.
Few-shot Learning을 통해 문제 해결을 위한 지식 생성 → 생성된 지식과 문제를 다시 LLM에 입력

상식 추론 문제에서 지식을 사용한 경우(지식 생성) 81%, 사용하지 않은 경우(Few-shot) 72%로 9%p 높은 정확도를 보였다.
Few-shot Learning의 상식 추론 문제점을 개선하기 위한 목적으로 제안되었다.
답을 도출하는 추론 과정을 예제에 추가한다.


Few-shot Learning 이라면 그냥 '답은 11이다.' 이런 식의 답을 구성해야 하는데, '로저는 5개의 공으로 시작했고, ...' 같은 추론 과정 자체를 넣어준 것이다. 따라서 다음과 같이 답도 추론 과정을 포함해서 출력한다.

Few-shot Learning이 그리디 방식을 이용해 가장 확률이 높은 하나의 답만을 사용하는 것을 보완하기 위해 제안되었다.
CoT 방식에서 다양한 추론 과정을 거치는 여러 개의 답을 샘플링하고, 그 중에서 다수결을 하거나 일관성이 높은 답을 선택한다. Temperature Sampling이나 Top-k Sampling 같은 방법을 사용한다.


위의 답변들은 추론 실행시 Temperature Sampling 값을 조절하면서 3개의 답변을 뽑았다. 여기서 답변 1, 2는 18달러, 답변 3은 24달러인 결과이다. 따라서, 다수결 혹은 일관성 기준에 따라 18달러로 답을 선택한다.
CoT 프롬프팅은 문제 해결 방법을 사용자가 설명해줘야 한다.
즉, 사용자가 풀 수 없는 유형의 문제는 답을 구할 수 없다.
Zero-shot CoT 프롬프팅은 문제의 추론 과정을 사용자가 입력하는게 아닌 LLM이 단계적으로 문제를 해결하는 방식이다.


위의 예제에서 질문과 함께 '단계적으로 생각해보자.'는 추론 트리거를 삽입해 답변을 이끌어 냈다. 이 이끌어낸 답변은 추론 과정이다. 질문이랑 추론 과정을 합치고, 응답 트리거인 '그래서 답(아라비아 숫자)은?'을 같이 줘서 올바른 답을 받았다.
Zero-shot CoT가 추론 과정을 직접 입력해야하는 수작업을 없앴다. 하지만 Zero-shot CoT에서의 1단계 추론과정이 항상 정답이 아니다. 그래서 잘못된 예제를 제시함으로써 틀린 답을 유도할 수 있다. 따라서, 성능이 Few-shot CoT에 비해 떨어질 수 밖에 없다.
Auto-CoT 프롬프팅은 답안의 추론 과정을 자동으로 생성하는 방안을 제시했다.

Few-shot CoT에 근접하거나 더 나은 성능을 보였다.
*제로플러스퓨샷 CoT: 제로플러스퓨샷 CoT는 Few-shot CoT에서 사용하는 각각의 예제에 대해 추론과정 앞에 추론 트리거 문장을 추가하여 학습한 방식이다.
“질문 + 추론과정 + 답” → “질문 + 추론 트리거 + 추론과정 + 답”
*Few-shot CoT: “질문 + 추론과정 + 답”
Zero-shot CoT에 의해 생성되는 추론 과정이 사람이 만든 추론과정보다 정확하지 않을 가능성은 항상 있다. 이는 사람이 추론과정을 생성하는 것이 높은 비용을 요구하기 때문이다. 액티브 프롬프팅은 Auto-CoT와 사람이 예제를 작성하는 Few-shot 프롬프팅의 절충안과 같은 방법이다.
액티브 프롬프팅은 학습을 위한 문제 집합과 평가를 위한 문제 집합이 나눠져 있는 환경에서 학습용 문제 집합을 이용해 평가용 문제 집합에서 사용할 예제들을 개발한다.

학습용 문제 집합에 있는 문제들에 대해 Few-shot CoT 프롬프트를 적용하거나, 예제가 없다면 Zero-shot CoT를 이용해 각 문제 별로 k개의 다양한 추론 과정 예제를 생성한다.
생성된 예제들에 대해 다른 예제들과의 불일치 정도를 기반으로 불확실성(Uncertainty)을 수치로 측정하고, 불확실성이 높은 상위 n개 예제들을 추출한다.
추출된 예제들에 대해 사람이 직접 정확한 예제를 생성해서 교체한다. 이것이 평가용 문제 집합에 대해 사용할 예제 집합이다.
완성된 예제 집합을 사용해 평가용 문제 집합에 대한 추론을 한다.
즉, Zero-shot CoT를 적용했을 때 다른 예제들 대비 불확실성이 높은 예제만 사람이 직접 교체해준다. 따라서, 안좋은 예제만 수정해줘서 적은 노력으로 높은 성능을 기대할 수 있을 것이다.
(부분 자동화)
복잡한 추론 문제를 해결하기 위해 제안되었다.
사람의 의사 결정 방식은 다음의 두가지로 나뉜다.
빠르고 자동적이고 무의식적인 방식
느리고, 심사숙고하고, 의식적인 방식.
현재 선택에 대한 다양한 대안 탐색, 현재의 상황을 주의 깊게 평가하고 전체적인 관점에서 더 나은 의사결정을 하기 위해 미리 다음 상태를 들여다보거나 다시 이전으로 돌아가 생각하는 특징이 있다.
여기서 두번째 방식을 반영한 프롬프팅 기법이다.
입력으로부터 다양한 사고를 생성하고, 트리 형태로 다음 단계 사고들을 생성하면서 그 중 가장 적합한 사고를 따라가 출력을 만들어낸다.
사고 분해(Thought Decomposition)
주어진 문제를 유형에 따라 적절하게 작은 사고의 단위로 분해한다.
사고 생성기(Thought Generator)
현재 트리 상태에서 다음 사고 단계를 생성한다. 사고의 생성에는 샘플(Sample)과 제안(Propose) 방식이 있다.
샘플(Sample)
현재까지의 트리 상태를 입력으로 한 CoT 프롬프트를 독립적으로 k번 반복하여 다양한 사고를 생성한다.
제안(Propose)
제안 프롬프트를 사용해 k개의 사고를 한 번에 생성한다. 샘플 방식은 다양성을 높일 수 있고, 제안은 사고가 단순할 때나 중복을 피하기 위해 사용할 수 있다.
상태 평가기(State Evaluator)
휴리스틱을 이용해 현재 상태를 평가해 트리에서 최적의 경로를 찾는다.
탐색 알고리즘
DFS, BFS
논문에서는 24 게임을 예시로 제시했다. 24 게임은 주어진 4개의 숫자로 사칙 연산을 해서 24를 만드는 게임이다.
예를 들어, "4, 9, 10, 13" 이 입력이면

위와 같이 3단계로 사고 분해된다.
다음은 사고 생성의 예제이다.
숫자가 4개 있는 초기 단계에서 프롬프트를 이용해 다음과 같이 후보들을 생성한다.

생성된 후보들에 대해 3단계인 사고 평가를 실시한다.

이는 Few-shot 프롬프트를 사용해 판별했다. 평가 결과를 이용해 트리에서 해를 찾기 위한 휴리스틱 기반 탐색이 이루어진다.
ToT를 공부하면서 햇갈렸던 부분은 사고 분해, 사고 생성, 상태 평가, 탐색이 독립적으로 이루어진다는 착각 때문이었다. 사고 분해를 하고, 사고 생성을 한다는게 무언가 연결이 잘 되지 않았었다. 하지만, 정리하자면 모두 병렬적으로 이루어지는 과정이다.
ToT 과정은 전반적으로 탐색 과정이다. 이 과정에서 문제를 해결하기 위해 사고를 분해하고, 분해된 각 사고에 대해 사고 생성을 하여 가능한 해결 방법을 제시한다. 그런 다음 각 사고를 평가하여 목표에 얼마나 가까운지 확인하고, 평가 결과를 바탕으로 다음 탐색을 진행한다. 이 과정을 반복적으로 수행하여 최적의 해결책을 찾아간다.
논문에 따르면 GPT-4를 사용해 실험했을때 CoT 프롬프팅과 자기 일관성 CoT 프롬프팅이 각각 4%와 9%의 성공률을 보인 반면 ToT 프롬프팅은 무려 74% 성공률을 보였다.
따라서, 프롬프팅 구조 혹은 단계의 설계에 따라 LLM이 매우 복잡한 문제도 풀 수 있음을 시사한다.