[LLM] Prompt Engineering, Chain of Thought (CoT)
Prompt Engineering 방식 중 하나인 CoT에 대한 정리를 하려고 한다.
Chain of Thought (CoT) : 문제 해결의 중단 단계를 Prompt로 제공하여 모델의 최종 output 도출을 돕는 prompting 기법 중 하나
즉, 추론의 reasoning path를 제공하는 것이 핵심적인 부분이다.
조금 더 쉽게 말하자면, '문제-답' 대신에 '문제-풀이-답' 이라는 중간 풀이 과정을 넣어주면 보다 더 정답에 잘 도달할 수 있다는 개념.
기존에는 좌측과 같은 Prompting을 해주었고 이는 정답을 맞추지 못했다.
하지만 오른쪽과 같이 풀이 과정을 예제로 넣었더니 정답을 맞추게 되었다.
이 Chain-of-Thought에 관한 논문에서는 산수(arithmetic)뿐만 아니라 일반 상식(common sense), 기호 추론(symbolic resoning)으로도 테스트를 진행했다고 한다. 그리고 그 성능 또한 다음과 같이 크게 향상이 되었다고 한다.
그런데, 여기서 few shot과 CoT의 차이를 어떻게 설명해야할까 고민해봤었다.
(추론 문제가 아닌 다른 테스크를 생각했을 때, CoT와 few shot의 차이가 조금 모호하다고 느꼈다. 나의 경우 추론 문제가 아니라 텍스트 생성과 같은 테스크를 주로 했기 때문에..prompting 시 제공하는 중간 과정이 결국은 예시가 아닌가 하는 그런 생각..)
일단은 산수와 같은 추론 문제를 예시로 들었을 때를 다시 생각해보면,
few shot은 왜 이런 정답이 나오는지에 대한 구구절절한 풀이 과정이 아닌 단지 여러가지 산수의 문제와 정답을 주는 방향의 예시라면, CoT는 그 풀이과정 자체를 중간에 넣어주는 느낌이다.
*그런데, 여기서 추론 문제가 아니라 번역이나 문법 교정, 텍스트 생성과 같은 비교적 단순한 규칙 기반의 문제의 경우는 어떤 차이가 있을까?
과거형 문장을 현재형 문장으로 바꾸는 테스크라고 했을 때, few shot이라면 원문과 변환된 문장의 예시를 보여주는 것이다. 그런데 CoT라고 하면 패턴을 그저 인식시키는 것에 그치지 않고(원문-변환된 문장을 단순히 보여주는 것에 그치지 않고) 그 패턴이 어떻게 적용되는지 단계별로 설명하는 느낌이다.
예를들어, 먼저 문장에서 동사를 찾아야 하고, 이 문장은 과거형 동사로 이루어져있고, 이를 현재로 바꾸려면 이 동사를 ~식으로 바꿔야 한다. 라고 꽤나 구체적인 과정을 예시로 준다고 생각하면 될 것 같다.
정리하자면, 그냥 패턴만 인식시키는게 few shot, 그 패턴 인식 과정 자체를 구구절절하게 다 알려주는 게 CoT라고 생각하면 될 것 같다!
그럼 few shot보다 CoT가 더 좋은거 아니냐 할 수 있지만 CoT가 모든 테스크에서 만능은 아닐 수 있다.
두 가지 기법은 문제 유형에 따라 조금씩 효과적인 테스크가 다를 수 있다.
구분해보자면,
Few shot의 경우 패턴 인식이 중요한 문제 (번역, 문법 교정, 텍스트 분류, 텍스트 생성과 같은 비교적 단순한 작업이나 규칙 기반의 문제)
CoT의 경우 단계별 추론이 필요한 문제 (산수, 논리 퍼즐, 복잡한 논리적 추론이 요구되는 문제)
굳이 구분해서 이렇다는 것이지 꼭 해당 테스크에 저 방법들만 써야한다는 것은 절대 아니다. 내가 하고자 하는 테스크에서 다양한 Prompting 기술들을 활용해서 이런 저런 실험 결과를 확인해보는 것이 좋다.
또 이렇게 프롬프팅을 해서 할루시네이션 문제가 생길수도 있으니 RAG나 다양한 기법을 활용하는 방안도 고려해보는 것도 좋을 수도 있다.
이렇게 prompt engineering의 방법 중 하나인 CoT의 개념에 대해 간단하게 살펴보았다.