Introduction
Prompting 스킬 중에서 간편하면서도 큰 효과를 볼 수 있는 Chain-of-Thought (COT) 그리고 Tree of Thoughts (TOT) 방법에 대해 알아보겠습니다. 상당히 간단한 방법만으로도 LLM의 결과물이 매우 정교하게 손질되는 것을 볼 수 있는데요, 가장 유명하면서도 쉽게 사용할 수 있는 방법들이니 prompt를 수정할 일이 생긴다면 한 번쯤 시도해보면 좋을 것 같습니다.
Chain-of-Thought(COT)
COT
2022년 1월에 처음 나온 논문입니다. ChatGPT가 22년 11월에 나왔으니 논문에서는 그 전에 존재하던 LLM들을 대상으로 주로 실험하였습니다. 기존 LLM들이 잘 풀지 못하던 수학 문제 등에서 COT 방법론을 적용하면 SOTA 이상의 결과를 낼 수 있다는 것을 실험을 통해 보여주었습니다. 논문에서는 COT를 사용한다면 복잡한 추론 문제에서 상당한 강점을 가질 수 있다고 이야기를 하고 있습니다.
위 그림이 COT prompting의 한 예시입니다. 복잡할 것 없이 매우 간단하게 이루어져 있는데요, 모델에 few-shot learning을 시킬 때 추론 과정을 명확하게 보여주면 됩니다. 예시에서는 나름 순서가 있는 수학 문제에 대한 답을 few-shot으로 학습시키고 바로 이어서 비슷한 문제를 질문하고 있습니다. COT를 적용하지 않은 prompting에서는 단순히 ‘11’이라고 답을 알려줬고, COT를 적용했을땐 사람이 생각하는 것처럼 어떻게 답이 11이 나오는지 추론 과정을 명확하게 입력해주었습니다.
위 이미지에서 하이라이트 된 부분이 COT 입니다. 이런식으로 추론 과정을 명확하게 설명해준다면, 일반적인 prompt보다 훨씬 더 좋은 결과가 나옴을 계속 강조하고 있습니다. 재미있는건 여러번 실험해보면, ChatGPT 기준로 굳이 여러 개의 예시를 넣어 줄 필요 없이 하나의 예시만 넣어줘도 충분히 COT가 잘 작동하는걸 확인할 수 있습니다.
Zero-shot COT Prompting
이후에는 zero-shot COT 라는 이름의 논문도 나왔습니다. 위 이미지의 4사분면을 보면, 정말 단순하게 Let’s think step by step이라는 문구만 추가해줬는데도 모델이 제대로 된 정답을 내뱉는 것을 확인할 수 있습니다. 모든 딥러닝 모델들이 블랙박스 모델인 만큼 내부에서 어떻게 작동하는지 전혀 알 수가 없지만, 뭔가 사람의 언어 체계를 학습을 해서 작동하는 것처럼 보이는 흥미로은 결과입니다.
논문에서는 이런식으로 한 문장을 추가하여 추론된 결과를 가지고 다시 두 번째 결과를 추론하는식으로 prompt를 구성하면 모델이 더 좋은 결과를 뽑아낼 수 있다고 주장하고 있습니다. 사실 실험 대상이 ChatGPT가 아니라 이전 모델인만큼 제가 실제로 사용하면서 크게 필요를 느낀 적은 없었지만 그래도 알아둔다면 좋은 prompt engineering 기법 중 하나로 쓸 수 있을 것 같습니다.
개인적으로 저는 처음 이 결과를 봤을 때부터 딥러닝 모델이 단순히 확률적 결과만을 내뱉는 복잡한 모델이라는 관점이 조금씩 바뀌었던 것 같습니다.
Auto-CoT
Zero-shot COT 이후에는 Automatic Chain-of-Thought (Auto-CoT) 라는 방법론도 등장했습니다. Zero-shot에서 한 문장을 추가하여 좋은 결과를 내주는 것을 보여주었지만, 이런 방법으로는 chain이 생성될 때 잘못 추론하는 위험성이 존재한다고 합니다. 그래서 Auto-COT 에서는 다음 두 단계로 나눠서 답변을 유도합니다.
- Question clustering : partition questions of a given dataset into a few clusters
- Demonstration sampling : select a representative question from each cluster and generate its reasoning chain using Zero-Shot-CoT with simple heuristics
Question clustering은 주어진 question들을 클러스터링 하는 작업입니다. 일단 question 데이터셋을 많이 가지고 있다고 가정했을 때, question들을 sentence-bert로 임베딩을 합니다. 임베딩 값을 가지고 clustering을 진행한 뒤, 각 클러스터마다 중심점에서 가까운 순서대로 문장들을 정렬합니다. 그리고 가장 가까운 문장부터 zero-shot COT로 (Let’s think step by step) 답을 추론합니다. 특정 기준에 만족하게 되면 여태까지 나왔던 모든 질문 - 답 쌍을 하나로 합치고 이제 진짜 물어보고 싶은 질문을 제일 마지막에 추가해서 prompt를 구성합니다.
Clustering으로 비슷한 질문을 최대한 묶어서 안정성을 더했다는게 큰 장점인 것 같습니다. 다만 한 번에 해결되는게 아니라 sentence-bert처럼 문장을 임베딩 하고 다시 클러스터링 하는 번거로운 작업이 필요한건 단점으로 보입니다. 또한 다양한 질문셋이 처음부터 여러개 존재해야 하는데, 하나의 질문만 해야하는 상황이라면 쓰기 어려운 기법입니다.
Tree of Thoughts (TOT)
TOT는 COT가 풀기에 더 복잡한 문제들에 적용하기 좋은 기법입니다. CoT는 추론과정을 알려줬다면 ToT는 생각하는 과정을 확장시켜가면서 스스로 thoughts를 확장해나가는 느낌이라고 보면 될 것 같습니다. 모델이 스스로 중간 단계에서 추론 과정을 평가하는게 가장 큰 차이점 입니다. 또한 검색 알고리즘(BFS, DFS)를 사용하여 결과를 도출할때까지 계속 스스로 이어가게 구성되어 있습니다.
논문에서는 Game of 24(4개의 숫자와 사칙연산을 사용하여 24를 만드는 게임)를 가지고 실험을 진행합니다. 1362개의 game of 24 데이터를 가지고 학습을 진행했으며 실험 과정은 이렇습니다. 일단 LLM이 여러 개의 생각을 만들고 해당 생각의 후보들이 24에 도달할 수 있는지에 대해 확실함의 정도를 “sure/maybe/impossible”로 평가하도록 합니다. 하나의 생각마다 세 개의 값을 샘플링하도록 하며 진행 과정은 아래 이미지와 같습니다.
아래 결과를 보면 ToT를 사용했을 때 game of 24처럼 기존 LLM들이 풀기 어려웠던 문제들에서 엄청나게 좋은 성능이 나오는걸 확인할 수 있습니다.
CoT, ToT 모두 LLM이 추론하는 과정을 어떻게 더해주느냐의 차이만 있을 뿐 기본적인 개념은 같은 것으로 보입니다. 실제 prompt를 작성할 때 이번 포스트에 나왔던 기법들을 다양하게 활용해보면 좋을 것 같습니다.
Reference
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
- Tree of Thoughts: Deliberate Problem Solving with Large Language Models
- Large Language Models are Zero-Shot Reasoners
- Automatic Chain of Thought Prompting in Large Language Models
- Tree of Thoughts: Deliberate Problem Solving with Large Language Models