멀티턴과 궁극의 무기 CoT
이곳은 우주선 내부입니다. 우리는 새로운 행성으로 날아가고 있습니다. 새로운 행성으로 날아가는 동안 멀티턴에 대해 이야기를 해볼까요?
멀티턴 (Multi turn)
우리가 ChatGPT와 같은 LLM과 대화를 나눌 때 어떤 일이 일어날까요? 한 번의 메시지만 보내고 끝나는 것이 아니라, 응답을 받고 추가적으로 메시지를 보내게 됩니다. 이렇게 여러 턴에 걸쳐서 보내는 것을 멀티턴이라고 합니다.
추가 메시지를 보낼 때 챗봇 내부에서는 어떤 일이 일어나게 될까요? 바로 이전 대화의 내역을 함께 보내게 됩니다. 그래서 챗봇이 이전의 대화 내역을 기억하고 이를 바탕으로 응답을 할 수 있는 것이지요. 바로 이전 대화의 내역을 컨텍스트로 가지고 있는 것이랍니다.
그런데 만약 100번의 메시지를 보낸다면 모든 메시지를 다 보내게 될까요? 그렇지는 않습니다. LLM에게는 한 번에 입력할 수 있는 토큰의 한계가 있기 때문이죠. 이를 컨텍스트 윈도우 (Context window) 라고 합니다.
이렇게 턴이 늘어날 때 마다 이전 대화의 입력과 출력이 같이 들어가는 것을 볼 수 있습니다. 그리고 컨텍스트 윈도우를 넘게 되면 이전 대화의 내역을 잘려나가 기억을 못하게 됩니다.
이것을 잘 알아야 ChatGPT나 클로드 같은 모델을 잘 쓸 수 있습니다. 일단 이전의 대화 내역을 기억하고 있다는 것을 알아야 합니다. 이걸 안다면 다음 턴에 이전의 대화 내역과 관련된 대화를 보낼 수 있겠죠? 둘째로는 너무 많은 내용의 양이 들어가면 이전 내용이 잘릴 수 도 있다는 것을 알아야 합니다. 요즘 LLM은 컨텍스트 윈도우가 10만~2백만 토큰까지 길어져서 이런 제약이 많이 사라졌습니다. 그래도 컨텍스트 윈도우가 작은 모델들도 있기 때문에 이 한계를 알아두면 유용합니다.
참고로 정말 대략적으로 1토큰 당 영어는 4글자, 한글의 경우 1글자 정도입니다. 10만 토큰이면 영어가 40만 글자가 들어갈 수 있으니 정말 굉장한 양이죠? 그렇기 때문에 책이나 코드 베이스, 텍스트가 많은 파일들을 넣고 활용할 수 도 있습니다. 하지만 토큰이 늘어나면 비용도 늘어나기 때문에 서비스 상 제약을 두는 경우도 있습니다.
그리고 이렇게 이전 대화 내용을 같이 보내기 때문에 대화의 주제가 바뀐다면 새 창을 열어 채팅을 하는 것이 좋아요. 그렇게 하면 내용들이 꼬이지 않고 LLM이 잘 이해할 수 있겠죠?
제 책을 보시는 분들은 컨텍스트 윈도우라는 용어를 아셨으면 좋겠습니다. LLM을 사용할 때 많이 활용하는 개념이니깐 말이죠. LLM 이 이전 대화 내용을 기억하고 있다는 것을 알아 주세요. 그걸 알면 LLM을 더 잘 운전할 수 있을 거에요!
CoT (Chain of thought)
여러분은 체인 오브 소우트라는 말을 들어 보셨나요? 생각의 사슬이라 불리우는 이 기법은 바로 LLM에게 생각 과정을 알려주는 것이에요.
Chain of Thought는 문제를 한 번에 답을 내기보다 단계별로 논리적으로 풀어가는 방법이에요. 마치 수학 문제 풀 때 계산 과정을 적는 것처럼, 하나씩 차근차근 생각을 정리하는 거죠.
예를 들어:
"식당에 사과가 23개 있었어요. 20개를 점심 준비에 쓰고, 6개를 더 샀어요. 이제 몇 개가 남았나요?"라는 질문이 있다면,
Chain of Thought 를 이런 식으로 추가할 수 있어요.
1. 처음에 사과가 23개 있었어요.
2. 20개를 사용했으니 (23 - 20 = 3) 3개가 남았어요.
3. 새로 6개를 샀으니 (3 + 6 = 9) 총 9개가 있어요.
이런 식으로 생각을 하는 과정을 알려줌으로써 LLM이 성급하게 답을 향해 달려가는 것보다 차근 차근 생각하게 해서 실수를 줄이고 답을 정확하게 낼 수 있어요.
이렇게 생각하는 과정을 프롬프트에 적어주고 다른 사물의 수를 세는 문제를 냈을 때 답을 맞추는 확률이 훨씬 올라갔습니다. 그래서 사람들이 놀라워 했었죠.
심지어 차근 차근 생각해봐 (Let's think step by step.) 라는 단어를 추가한 것만으로도 LLM 의 성능이 언어추론 벤치마크인 'Multi-artith' 에서 답변의 정확도가 기존 17.7%에서 78.7%로 올랐다는 연구 결과가 있습니다. 그래서 현재 나오는 LLM에는 이 Let's think step by step.
이 기본 시스템 프롬프트로 들어가 있는 경우가 많습니다.
너희들은 충분히 CoT를 하고 있지 않아.
하지만 이렇게 CoT를 이해하면 활용도가 그렇게 높아지지 않습니다. CoT가 하나의 생각 과정이라는 것을 이해하는 것이 중요합니다. 생각 과정 또는 생각 단계라고 보면 체인 오브 소우트를 유연하게 활용할 수 있습니다.
예를 들어 커피에 대한 글을 AI로 쓴다고 생각해 봅시다. 그냥 커피에 대한 글을 생성해달라고 하면 일반적인 커피에 대한 글 밖에 생성하지 못합니다. 프롬프트는 일반성에서 특수성으로 나아가는 것이라고 했죠. 여기에 우리의 생각을 가미해주면 됩니다.
이건 저의 경우입니다.
커피에 대한 글을 써줘. 어떤 글을 쓰면 좋을까? 나는 저가형 커피를 많이 마시니깐 저가형 커피의 구조에 대해 쓰면 좋겠다. 커피 한잔을 만드는데 들어가는 비용을 원두, 컵, 인건비 등의 요소로 분석해면 좋겠다. 한국의 저가형 프랜차이즈들에 대해 알아보고 사업 구조를 알아보면 재미있을 것 같다.
마치 머릿 속의 독백 같죠? 실제로 인간은 이런 식으로 사고를 합니다. 인공지능에 나의 생각을 더하는 거죠. 이렇게 만든 프롬프트를 입력하면 정말 나에게 맞는 글을 써줍니다.
o1을 통해 생성해 본 결과
마치 인공지능에 나만의 생각 과정의 사인을 더하는 것 같습니다.
많은 사람들은 인공지능이 인간을 대체할 것이라 말합니다. 물론 저도 자동화할 수 있고 반복적인 일들은 대체될 수 있다고 생각해요.
하지만 인간의 고유성을 바탕으로 인공지능이 낼 수 있는 결과는 수 억가지에 달합니다. 왜냐하면 인간은 저마다 여태까지 가졌던 경험, 감정, 지식이 결합하여 지구 상에서 유일한 고유성을 가집니다. 그렇기 때문에 그 결과는 너무나도 다양합니다.
그래서 인공지능이 인간을 대체하는 가지도 있지만 인공지능과 인간이 협업하여 좋은 결과를 내는 가지도 있다고 생각하시면 좋아요.
저는 인공지능이 인간의 협업자나 도우미로 행동할 때 가장 좋은 결과를 낼 수 있다고 생각합니다. 왜냐하면 그렇게 할 때 인간의 목표를 실질적으로 이루면서 활용할 수 있기 때문이죠. 양념 반, 후라이드 반처럼 인간과 인공지능이 협업할 때 정말 좋은 결과들을 만들어 낼 수 있습니다.
멀티 턴에서의 CoT
위에서는 프롬프트 내에서 생각 과정을 더하는 것을 알아보았어요. 하지만 좀 넓게 생각한다면 멀티 턴에서도 사용할 수 있어요.
예를 들어 A라는 프로그램을 만들어 달라고 했다고 생각해 봅시다. 그런데 프로그램이 나왔는데 특정 기능이 잘 작동하지 않았어요. 그래서 그 부분이 작동하지 않는다고 설명하고 고쳐달라고 말했습니다.
이런 경우에는 멀티턴에서 CoT를 사용한 것과 비슷합니다. 해당 부분이 어떻게 작동하지 않는다고 LLM에게 알려줬기 때문이죠. 여기에서 나의 생각 과정을 더해줌으로써 LLM의 방향을 잘 잡아줄 수 있습니다. 마치 배의 방향타를 조종하듯이 멀티 턴에서도 결과들을 나에게 더 잘 맞게 이끌어 갈 수 있습니다.
논리와 논리를 조합하라.
이 세상에 새로운 것은 없다라는 이야기를 들어보신 적 있으신가요? 이 세상의 많은 것들은 사실 여러 가지의 조합들입니다. 예를 들어 스마트폰은 전화기, 컴퓨터, 카메라 그리고 인터넷의 조합이죠. 피아노 음악도 피아노의 여러 음들의 조합이죠. 그리고 새로운 물질을 개발할 때도 원자와 원자를 조합하여 만들어 냅니다.
그렇다면 CoT를 하나의 논리적 프로그램이라고 볼 수도 있지 않을까요? 그렇게 본다면 여러 가지의 생각 과정을 조합하여 다양한 개념의 조합들을 만들어 낼 수 있습니다.
CoT를 조합하라!
이번에는 인공 지능에 나의 생각을 조합하는 것 외에 다른 사람들의 CoT나 논리 과정을 조합해서 프롬프트를 만들어 봅시다.
먼저 아리스토 텔레스의 과학적 사고법과 알렉산더 대왕의 행동력을 결합하여 하나의 프롬프트 만들어 보겠습니다. 이렇게 대략적인 논리를 짠 후 gpt 나 o1 에게 정리를 시켜도 됩니다.
프롬프트 예시 :
나는 아리스토텔레스가 보여준 과학적·논리적 사고법을 기반으로, 가설과 근거를 명확히 세우고 비판적 분석을 통해 문제의 핵심을 파악하겠다. 동시에, 알렉산더 대왕의 결단력과 행동력을 결합하여 주어진 문제에 신속하고 과감하게 접근하고자 한다.
분석(Analysis): 먼저 상황을 다각도로 파악하고, 근거와 증거를 면밀히 조사하라.
정교화(Refinement): 식별된 정보를 논리적으로 재구성하고, 가능한 해결책들의 장단점을 비교·검토하라.
결단(Decision): 이성적 판단을 통해 최적의 전략을 결정하되, 타이밍을 놓치지 않도록 과감하고 분명하게 결론을 내리라.
행동(Action): 결정된 전략을 신속하게 실행에 옮기고, 필요할 경우 즉각적으로 피드백을 받아 조정하라.
이러한 사고방식과 행동 양식을 통해, 어떠한 문제든 실증적 근거와 철저한 분석에 기초하면서도 신속하고 결단력 있게 해결하는 과정을 보여 달라.
사용자에게 문제를 물어본 후 시작.
프롬프트를 입력하면 상황에 대한 면밀한 검토와 행동에 대한 대안들까지 한번에 살펴 보는 것을 볼 수 가 있습니다.
다국어 번역기 만들기
원래 번역기는 하나의 언어를 다른 언어로 번역하는 것이지요? 여기에 조금 더 논리를 추가하여 여러 나라의 언어로 번역하게 할 수 도 있습니다.
"회원 가입"이라는 단어를 영어, 일본어, 중국어, 말레이시아 어로 번역해줘.
이렇게 하면 다국어 번역기를 만들어 활용할 수 가 있겠죠?
그렇다면 계산기와 번역기의 논리를 결합할 수 없을까요? 예를 들어 환율 계산기를 만들어 보겠습니다.
1000원을 달러, 엔화, 위안화로 계산하고, 값을 영어, 일본어, 중국어로 표시해줘.
이렇게 여러 논리를 결합하여 재미있는 것을 만들어 볼 수 있습니다.
이제 궁극의 무기 CoT를 활용해 보세요. CoT는 유연하게 생각한다면 하나의 생각 과정입니다. 생각 과정을 프롬프트에 더하고, 합치고, 빼고, 곱하고 나누어 여러분만의 강력한 도구를 만들어 보세요.