brunch

You can make anything
by writing

C.S.Lewis

by 박송이 Oct 02. 2024

프롬프트 엔지니어링 가이드 A to Z (기초편)

프롬프트 엔지니어링 방법들에 대해 알아봐 drill게요

2024.07.01 |  vol. 39  |  구독하기  |  지난호 보기


미래에 할 수 있는 경험을 사전 예약하신 퓨처드릴 구독자, 드릴러  여러분 안녕하세요! AI와 UX의 알쏭달쏭한 점들을 알려 drill 퓨처드릴 에디터 쏭 입니다.       


여러분 이미 프롬프트는 우리 일상에서 떼려야 뗄 수 없는 존재가 되어버렸죠? 프롬프트를 일반 사용자 입장에서 원하는 결과를 얻기 위해서 사용할 수도 있지만 인공지능의 성능을 개선하기 위해서도 이용할 수 있다는 사실! 알고 계셨나요? 오늘은 모델 개선의 관점에서 사용할 수 있는 프롬프팅 엔지니어링 기법들을 알려드리려고 합니다.


헷갈리는 프롬프트 관련 용어 정리부터, 자주 언급되는 엔지니어링 기법 10가지도 함께 정리해 드리고 프롬프팅의 미래는 어떻게 바뀔지, 한 번에 정리해서 알려 drill 게요~!


모두 follow me ~ 



목차

프롬프트는 무엇인가요?

프롬프트의 구성 요소 

헷갈리는 프롬프트 용어 정리 

파트 1 기본 프롬프트 엔지니어링 방법 소개 

파트 2 Chain-of-Thought 계열 방법 소개

DSPy가 제시한 새로운 프롬프팅의 미래




시작하기 - Turning On the Drill



프롬프트는 무엇일까요?... 텍스트? 입력된 내용?



프롬프트란 무엇일까요? 한 달 전쯤에 새로운 사이드 프로젝트를 기획하면서 프롬프트를 사고, 팔 수 있는 온라인 커머스를 팀원들에게 제안한 적이 있었는데요, 프로그래밍을 공부하시는 분들임에도 "프롬프트가 뭔가요?"하고 물어보시더라고요. 막연히 다들 알 거로 생각했는데 막상 물어보니 뭐라고 대답해야 할지 당황스러웠던 기억이 있습니다. 


 아마 제 안에서는 "그거 있잖아. Chat-GPT한테 물어보는 내용 그거" 뭐 요 정도로 정리되었던 것 같습니다. 오늘 뉴스레터의 내용은 프롬프트에 대한 심화 버전을 다뤄보려고 합니다. 프롬프트가 뭐지? 에서 시작했는데 생각보다 진지한 내용을 다루게 되었네요.ㅎㅎ


 일반 사용자를 위한 프롬프트 잘 쓰는 법은 이미 많이 공유되고 있는데요, 오늘 다루는 내용은 일반 사용자를 대상으로 하기보다는 인공지능 서비스를 개발하는 분들을 대상으로 작성되었습니다. 지금까지 저희 뉴스레터를 꾸준히 팔로잉 해오셨다면 오늘 다루는 내용도 무리 없이 소화하실 수 있으리라 생각됩니다! 



프롬프트의 구성요소부터 용어까지 

정리해서 알려 드릴게요




1. 프롬프트는 무엇인가요?


프롬프트는 생성 AI 모델에 입력되는 정보로, 모델의 출력을 안내하는 데 사용됩니다. 프롬프트는 텍스트, 이미지, 소리 또는 기타 미디어로 구성될 수 있습니다. 


2. 프롬프트의 구성 요소  


2.1 지시문 (Directive)

"좋은 책 다섯 권을 추천해 줘."

많은 프롬프트는 지시문 또는 질문의 형태로 지시를 제공합니다. 이는 프롬프트의 핵심 의도이며, 때로는 단순히 "의도"라고도 불립니다.


2.2 예시 (Examples)

"저녁: night
아침: X
X에는 무엇이 들어가야 할까?

예시(또는 shot)는 GenAI가 작업을 수행하도록 안내하는 시연 역할을 합니다. 위의 프롬프트는 OneShot(즉, 하나의 예시) 프롬프트입니다.



2.3 출력 형식 지정 (Output Formatting)

"{입력 텍스트}를 CSV 형식으로 요약해 줘."

GenAI가 특정 형식으로 정보를 출력하는 것이 종종 바람직합니다. 예를 들어, CSV나 마크다운 형식 등이 있을 수 있습니다. 이를 용이하게 하기 위해, 아래와 같이 출력 형식을 지정하는 지시를 추가할 수 있습니다



2.4 스타일 지시문 (Style Instructions)

"라마에 관해 명확하고 간결한 문단을 작성해 줘."

스타일 지시문은 출력을 구조적으로 변경하기보다는 스타일적으로 수정하는 데 사용되는 출력 형식 지정의 일종입니다.



2.5 역할 부여 (Role)

"네가 양치기라고 생각하고 라마에 대한 글을 써줘."

역할(Role), 또는 페르소나(persona)로도 알려진 구성 요소는 작성 및 스타일 텍스트를 개선하는 데 자주 논의되는 요소입니다.



2.6 추가 정보 (Additional Information)

"이메일을 작성해야 하는데 받는 사람의 이름은 박송이고
이메일주소는 songye@hanmail.net 이야.
이 정보를 포함해서 이메일 초안을 작성해 줘."

프롬프트에 추가 정보를 포함하는 것이 종종 필요합니다. 예를 들어, 지시문이 이메일을 작성하라는 것이라면, 이름과 직위와 같은 정보를 포함시켜 GenAI가 이메일을 적절하게 서명할 수 있도록 할 수 있습니다. 추가 정보는 때때로 '콘텍스트(context)'라고도 불리지만, 이 용어는 프롬프트 분야에서 다른 의미로 과부하되어 있기 때문에 사용을 권장하지 않습니다.



2.7 프롬프트 템플릿 (Prompt Template)

" {트윗의 내용}을 긍정적 또는 부정적으로 분류해 줘."

프롬프트는 종종 프롬프트 템플릿을 통해 구성됩니다. 프롬프트 템플릿은 하나 이상의 변수를 포함하는 함수로, 이 변수들은 프롬프트를 생성하기 위해 일부 매체(보통 텍스트)로 대체됩니다. 그런 다음 이 프롬프트는 템플릿의 인스턴스로 간주될 수 있습니다.
트윗의 이진 분류 작업에 프롬프팅을 적용하는 것을 고려해 보겠습니다. 다음은 입력을 분류하는 데 사용할 수 있는 초기 프롬프트 템플릿입니다. 데이터셋의 각 트윗은 템플릿의 개별 인스턴스에 삽입되고, 생성된 프롬프트는 추론을 위해 LLM에게 제공됩니다.




3. 헷갈리는 프롬프트 용어 정리


3.1 프롬프팅 (Prompting)

프롬프트 제공은 GenAI에 프롬프트를 제공하고, 그에 대한 응답을 생성하는 과정입니다. 예를 들어, 텍스트 조각을 전송하거나 이미지를 업로드하는 행위가 프롬프트 제공에 해당합니다.


3.2 프롬프트 체인 (Prompt Chain)

프롬프트 체인은 두 개 이상의 프롬프트 템플릿이 연속적으로 사용되는 것을 의미합니다. 첫 번째 프롬프트 템플릿에서 생성된 출력은 두 번째 템플릿을 매개변수 화하는 데 사용되며, 모든 템플릿이 소진될 때까지 계속됩니다.


3.3 프롬프팅 기법 (Prompting Technique)

프롬프트 기법은 프롬프트, 프롬프트들, 또는 여러 프롬프트의 동적 시퀀싱을 구조화하는 방법을 설명하는 청사진입니다. 프롬프트 기법은 조건부 또는 분기 논리, 병렬 처리, 또는 여러 프롬프트에 걸친 기타 구조적 고려사항을 포함할 수 있습니다.


3.4 프롬프트 엔지니어링 (Prompt Engineering)

프롬프트 엔지니어링은 사용 중인 프롬프트 기법을 수정하거나 변경하여 프롬프트를 개발하는 반복적인 과정입니다.


3.5 프롬프트 엔지니어링 기법 (Prompt Engineering Technique)

프롬프트 엔지니어링 기법은 프롬프트를 개선하기 위해 반복하는 전략입니다. 문헌에서는 이 기법이 자동화된 기술일 때가 많지만, 소비자 환경에서는 사용자가 종종 수동으로 프롬프트 엔지니어링을 수행합니다.


3.6 예시 (Exemplar)

예시(exemplars)는 프롬프트에서 모델에게 보여주는 작업 완료의 사례들입니다




프롬프트 엔지니어링 기법 소개, 

10개의 방법을 알려드릴게요!



이번에는 Prompt Engineering Guide를 바탕으로 10개의 프롬프팅 방법론에 대해 정리하였습니다. 일반 방법론과 Chain-of-Thought 방법론으로 구분하였고 먼저 Chain-of-Thought이 아닌 방법들을 설명한 뒤 Chain-of-Thought의 기본과 그 파생 방법들에 대해 설명해 드릴게요.



파트 1 기본 프롬프트 엔지니어링 방법 소개 




1. Zero-Shot Prompting (논문링크)

인간의 가장 직관적인 추론 방식을 따라 하자.


프롬프트 예시


{Prompt}
한국어를 영어로 번역해 줘.
"Zero-shot 학습이란 무엇인가요?"


{Output}
Zero-shot 학습은 모델이 훈련되지 않은 새로운 작업을 처리하는 기술입니다.



Zero-Shot 방법은 모델에 예시나 추가적인 정보를 제공하지 않고, 단순히 지시문만 주어지는 접근 방식입니다. 이 방법은 모델이 문제를 해결하기 위해 예시를 생성하거나 제공할 필요가 없어 간단하고 빠릅니다. 그러나, 이 방식은 모델이 주어진 지시문을 명확하게 이해하지 못하거나 해석을 잘못할 가능성이 있습니다.



2. Few-Shot Prompting (논문링크)

몇 가지 예시를 제공해 주고 정확도를 높이자.


프롬프트 예시


{Prompt}
한국어를 영어로 번역해 줘.
"몇 가지 예를 들어주고, 다음 문장을 번역해 주세요."


{Example 1}
- 한국어: "안녕하세요"  
- 영어: "Hello"


{Example 2}
- 한국어: "사람들은 어디에 살고 있나요?"  
- 영어: "Where do people live?"


{New Sentence}
- 한국어: "저는 학교에 가고 싶어요."


{Output}
"I want to go to school."


Few-Shot 방법은 모델에게 문제를 해결하기 위해 몇 가지 예시를 제공하는 접근 방식입니다. 이 방법은 모델이 특정 작업이나 질문에 대해 어떤 방식으로 답변을 해야 하는지 예시를 통해 학습할 수 있도록 도와줍니다. 몇 가지 예시를 제공함으로써, 모델은 주어진 지시문을 보다 잘 이해하고, 그에 따른 적절한 출력을 생성할 가능성이 높아집니다.


 Few-Shot 방법은 모델이 다양한 작업을 더 잘 수행할 수 있게 돕지만, 제공된 예시가 충분히 대표적이지 않거나 불완전할 경우, 모델의 결과가 원하는 대로 나오지 않을 수 있습니다. 이 방법은 모델의 성능을 향상하는 데 유용하지만, 예시의 품질과 관련성이 중요한 역할을 합니다.



3. Generated Knowledge Prompting (논문링크)

언어 모델을 활용하여 필요한 지식을 생성하고, 이를 문제 해결에 도움을 주는 추가적인 정보로 사용하자. 


프롬프트 예시


{Prompt}
한국어를 영어로 번역해 줘. 지식을 생성하여 다음 문장을 번역하세요.


Step 1: Generate Knowledge Statement
- 질문: "한국은 어떤 나라인가요?"  
- 생성된 지식: "한국은 동아시아에 위치한 나라입니다."


Step 2: Translate the New Sentence Using Generated Knowledge

- 한국어: "한국은 어떤 나라인가요?"


{Output}
"South Korea is a country located in East Asia


출처 : Generated Knowledge Prompting for Commonsense Reasoning  논문에서 발췌


Generated Knowledge Prompting은 지식을 생성하여 프롬프팅에 활용하는 방법입니다. 이 방법은 모델이 기존의 예시가 아니라 새로운 지식을 생성하여 문제 해결에 활용할 수 있도록 합니다.


Generated Knowledge Prompting은 다음과 같은 두 단계로 진행됩니다:

지식 생성: 첫 번째 단계에서는 주어진 문제에 대한 관련 지식을 생성합니다. 이는 언어 모델이 여러 예제를 바탕으로 질문과 관련된 지식 진술을 생성하는 과정입니다.                                


예측 및 선택: 두 번째 단계에서는 생성된 지식 진술을 바탕으로 또 다른 언어 모델이 예측을 수행합니다. 이 단계에서, 여러 지식 진술로부터 가장 신뢰도가 높은 예측을 선택하여 최종적인 답변을 도출합니다.                                

이 방법은 기존의 Few-Shot 방식에서 제공하는 예시 대신, 모델이 생성한 지식을 사용하여 더 풍부하고 맥락에 맞는 정보를 제공할 수 있습니다. 이를 통해 모델이 더 정확하고 합리적인 추론을 할 수 있도록 돕습니다.



4. Retrieval Augmented Generation (논문링크)

Retrieval-Augmented Generation은 기존의 지식을 검색하고,
이를 활용하여 더 정교한 답변을 생성하자.


프롬프트 예시


1 단계 - 문서 검색을 위한 쿼리

질문: "인류 최초로 달에 착륙한 사람은 누구인가요?"

쿼리 프롬프트: "인류 최초로 달에 착륙한 사람에 대한 정보를 제공하는 문서를 찾으세요."


2 단계 - 생성된 응답을 위한 프롬프트


검색된 문서: ["닐 암스트롱이 아폴로 11호 임무 중 달에 최초로 착륙했습니다.", "아폴로 11호는 1969년 7월에 달에 첫 번째로 두 사람을 착륙시킨 우주 비행이었습니다."]


응답 생성 프롬프트: "다음 문서를 바탕으로 질문에 답하세요: 인류 최초로 달에 착륙한 사람은 누구인가요? 문서: [닐 암스트롱이 아폴로 11호 임무 중 달에 최초로 착륙했습니다. 아폴로 11호는 1969년 7월에 달에 첫 번째로 두 사람을 착륙시킨 우주 비행이었습니다.]"



출처 : Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks  논문에서 발췌

Retrieval-Augmented Generation는 외부 지식 소스를 활용하여 모델의 응답 정확성과 신뢰성을 향상하는 방법입니다. 일반적인 사용 환경에서는 추가적인 배경지식이 필요하지 않을 수 있지만, 보다 정확한 추론이 필요한 상황에서는 외부 지식을 통해 사실적 일관성을 높이고 신뢰성 있는 응답을 생성하는 것이 중요합니다.


RAG는 다음과 같은 과정을 포함합니다:  


문서 검색: 입력 쿼리를 바탕으로 외부 지식 소스(예: 위키피디아)에서 관련 문서나 정보를 검색합니다. 이 과정에서는 주어진 입력과 관련된 지원 문서들을 찾는 것이 핵심입니다.  


정보 통합: 검색된 문서들은 원래 입력 프롬프트와 연결되어, 텍스트 생성기에 공급됩니다. 이 텍스트 생성기는 검색된 정보를 바탕으로 최종 출력을 생성합니다.  


이러한 방식으로 RAG는 언어 모델의 정적 매개변수 지식의 한계를 극복하고, 최신 정보와 사실적 일관성을 보장할 수 있습니다. RAG는 검색 기반 생성을 통해 동적인 정보 업데이트를 가능하게 하며, 재교육 없이도 신뢰할 수 있는 출력물을 생성할 수 있습니다.



5. Directional Stimulus Prompting (논문링크)

언어 모델이 특정 문제를 해결하는 방향이나 접근 방식을 제시하는 힌트를 제공하자. 


프롬프트 예시


{Input Text}

8년 만에 TV 전설 밥 바커가 "The Price Is Right"에 돌아왔습니다. 91세의 나이에도 불구하고 활기차게 게임을 진행했으며, 2007년 하차 후 처음으로 호스트 역할을 맡았습니다. 바커는 첫 게임을 진행한 후, 드류 캐리에게 진행을 넘겼습니다.


{Reference}

밥 바커가 수요일에 "The Price Is Right"의 진행자로 돌아왔습니다. 바커는 91세로, 2007년에 진행자로서 은퇴했습니다.


{Prompt}

위 글을 2~3 문장으로 간략하게 요약해 보세요. 힌트: 밥 바커; TV; 4월 1일; "가격은 적당합니다", 2007, 91.


{Output}

4월 1일, 밥 바커는 8년 만에 TV 쇼 "The Price Is Right"에 돌아왔습니다. 91세의 나이에도 불구하고 여전히 활기찬 모습으로, 바커는 첫 번째 가격 맞추기 게임을 진행했습니다. 바커는 2007년에 호스트직을 내려놓았지만, 전혀 부족함 없이 진행을 이어갔습니다.


출처 : Guiding Large Language Models via Directional Stimulus Prompting  논문에서 발췌

Directional Stimulus Prompting은 대규모 언어 모델을 더욱 효과적으로 안내하여 원하는 요약을 생성하도록 하는 새로운 프롬프팅 기법을 제안합니다. 이 기법은 언어 모델이 자극(stimulus) 또는 힌트(hint)를 생성하도록 훈련되며, 이를 통해 모델이 더 잘 동작하도록 돕습니다.


Directional Stimulus Prompting의 주요 특징은 다음과 같습니다:  

 자극 생성: 이 기법에서는 언어 모델이 특정 작업을 수행하기 위해 자극이나 힌트를 생성합니다. 이러한 힌트는 모델이 문제를 해결하는 데 필요한 방향을 제시하는 역할을 합니다. 


강화 학습(RL) 활용: 대규모 언어 모델을 최적화하기 위해 강화 학습 기법이 적용됩니다. 이를 통해 모델이 제공하는 힌트의 품질을 개선하고, 최적의 결과를 도출하는 데 도움을 줍니다.  


정책 언어 모델: 정책 언어 모델은 '블랙박스' 고정 대규모 언어 모델을 효과적으로 안내하기 위해 작은 규모로 최적화됩니다. 이러한 정책 모델은 제공된 자극을 바탕으로 대규모 모델이 더 나은 출력을 생성할 수 있도록 돕습니다.  



파트 2 Chain-of-Thought 계열 방법 소개



6. Chain-of-Thought Prompting (논문링크)

언어모델에게 단일 중간 단계와 추론 경로를 만들게 하자.


프롬프트 예시


{Prompt}

질문 : 로저는 테니스 공을 5개 가지고 있습니다. 그는 테니스 공이 3개 들어 있는 캔 2개를 추가로 구매합니다. 현재 로저는 총 몇 개의 테니스 공을 가지고 있나요?


답: 로저는 처음에 5개의 테니스 공을 가지고 있었습니다. 3개의 테니스 공이 들어 있는 캔 2개를 추가로 구매하므로 총 6개의 테니스 공이 됩니다. 5 + 6 = 11. 답은 11입니다.


질문: 식당에는 23개의 사과가 있었습니다. 점심을 만들기 위해 20개의 사과를 사용하고, 6개의 사과를 더 구입했습니다. 현재 사과는 몇 개가 남았나요?


{Output}

답: 식당에는 원래 23개의 사과가 있었습니다. 점심을 만들기 위해 20개의 사과를 사용했으므로, 남은 사과는 23 - 20 = 3개입니다. 여기에 6개의 사과를 더 구입했으므로, 현재 사과는 3 + 6 = 9개입니다. 정답은 9입니다.



Chain-of-Thought (CoT)는 복잡한 추론 작업을 효과적으로 수행하기 위해 중간 추론 단계를 활용하는 기법입니다. 이 접근법은 단답형 프롬프트와 결합하여, 문제 해결 과정에서 단계적인 사고를 유도하고 최종적으로 더 나은 결과를 도출할 수 있게 합니다.


예를 들어, 사람이 복잡한 수학 문제를 풀 때는 문제를 중간 단계로 나누어 각 단계를 해결한 후 최종 답을 도출하는 방식으로 접근합니다. Chain-of-Thought 프롬프트는 이와 유사하게 작동하며, 모델에게 문제를 여러 단계로 나누어 접근하도록 합니다. 이를 통해 모델은 논리적이고 체계적인 방식으로 문제를 해결할 수 있습니다.


이 방법은 복잡한 추론을 요구하는 작업에서 언어 모델의 성능을 향상하는 데 유용하며, 체계적이고 단계적인 접근 방식을 제공합니다.



7. Self-Consistency (논문링크)

언어모델에게 여러 중간 단계와 추론 경로를 만들게 하자.


프롬프트 예시


{Prompt}

질문: 수완이는 58개의 골프공을 가지고 있었어. 화요일에 그는 23개의 골프공을 잃어버렸어. 수요일에 2개를 더 잃어버렸어. 수요일이 끝났을 때 그가 가지고 있던 골프공은 몇 개였을까?

답: 수완이는 처음에 58개의 공을 가지고 있었습니다. 화요일에 23개를 잃어버렸으므로 그 이후에는 58 - 23 = 35개의 공을 가지고 있습니다. 수요일에 2개를 더 잃어버렸으므로 이제 35 - 2 = 33개의 공을 가지고 있습니다. 정답은 33입니다.


질문: 한얼이는 23달러를 가지고 있어. 그녀는 각각 3달러에 베이글 5개를 샀어. 한얼이에게 남은 돈은 얼마일까?

답: 한얼이는 각각 3달러에 베이글 5개를 샀습니다. 이것은 그녀가 5 * 3 = 15달러를 썼다는 것을 의미합니다.


질문: 내가 6살이었을 때 내 여동생은 내 나이의 절반인 나이였어. 지금 나는 70살이고 내 여동생은 몇 살일까?

답:


{Output}

제가 6살이었을 때 여동생은 제 나이의 절반이었으므로 3살이었어요. 이제 저는 70살이므로 여동생은 70 - 3 = 67살입니다. 정답은 67입니다.



출처 : SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS  논문에서 발췌

Self-Consistency는 프롬프트 엔지니어링의 진보된 기법 중 하나로, Chain-of-Thought (CoT) 프롬프트의 성능을 향상하기 위해 개발되었습니다. Self-Consistency는 다양한 추론 경로를 샘플링하고, 여러 번의 프롬프트 생성 과정을 거쳐 가장 일관된 답을 선택하는 접근 방식을 채택합니다. 이를 통해 산술 및 상식적인 추론과 관련된 작업에서 Chain-of-Thought 프롬프트의 성능을 더욱 향상할 수 있습니다.

Self-Consistency는 다음과 같은 절차로 작동합니다:


    샘플링: 언어 모델을 사용하여 다양한 추론 경로를 생성하기 위해 샘플링을 수행합니다. 이 과정에서 각 추론 경로는 서로 다른 최종 답을 초래할 수 있습니다.  


    마진화: 생성된 다양한 추론 경로에서 최종 답변을 마진 화하여 가장 일관된 답을 선택합니다. 이는 여러 다른 사고방식이 동일한 답에 도달할 때, 최종 답이 올바를 확신할 수 있는 인간의 경험과 유사한 접근 방식입니다.  


이 기법은 탐욕적 디코딩에서 발생할 수 있는 반복성과 지역 최적화 문제를 피하며, 단일 샘플링 생성의 확률적 문제를 완화합니다. Self-Consistency는 Chain-of-Thought 프롬프트의 성능을 향상하기 위한 유용한 방법으로, 복잡한 추론 문제를 해결하는 데 효과적입니다.




8. Tree of Thoughts (논문링크)

언어모델에게 여러 중간 단계와 추론 경로를 만들게 하고, 체계적으로 탐색하자.


프롬프트 예시


{Prompt}

세 명의 다른 전문가들이 이 질문에 답하고 있다고 상상해 보도록 해.

모든 전문가들은 자신의 생각의 한 단계를 적어내고, 그것을 그룹과 공유할 거야.

그런 다음 모든 전문가들은 다음 단계로 넘어가.

만약 어떤 전문가가 어떤 시점에서든 자신이 틀렸다는 것을 깨닫게 되면 그들은 떠나.

자 질문은!



출처 : Tree of Thoughts: Deliberate Problem Solving with Large Language Models  논문에서 발췌


Tree of Thoughts (ToT)는 '생각의 사슬 (Chain-of-Thought, CoT)' 프롬프팅 기법을 일반화한 접근 방식입니다. ToT는 언어 모델을 활용하여 문제 해결을 위한 중간 단계 역할을 하는 생각에 대한 탐색을 촉진합니다. 이 기법은 다음과 같은 방식으로 작동합니다:


    중간 단계의 일관된 언어 시퀀스: ToT는 문제 해결을 위한 중간 단계를 일관된 언어 시퀀스로 표현하는 Tree of Thoughts를 유지합니다. 이는 문제를 해결하는 과정에서 생성되는 각 중간 단계를 체계적으로 정리하고, 각 단계 간의 관계를 명확히 하는 데 도움을 줍니다.  


    신중한 추론 과정: 이 접근법은 언어 모델이 신중한 추론 과정을 통해 문제를 해결하도록 지원합니다. 각 중간 단계는 문제 해결 과정의 일환으로 생성되고, 평가되며, 전체 문제를 해결하기 위해 필요한 모든 중간 단계를 고려할 수 있도록 합니다.  


    탐색 알고리즘의 결합: ToT는 너비 우선 탐색(BFS)과 깊이 우선 탐색(DFS) 등의 탐색 알고리즘과 결합되어 있습니다. 이를 통해 모델은 다양한 추론 경로를 체계적으로 탐색하고, 필요에 따라 선제적 탐색과 백트래킹을 통해 최적의 해결책을 찾을 수 있습니다.  


이러한 방식으로 ToT는 문제를 해결하기 위한 중간 단계를 생성하고 평가하는 능력을 향상합니다. 결과적으로, 복잡한 문제를 해결하기 위해 더 정교하고 체계적인 접근을 가능하게 합니다.




9. Active-Prompt (논문링크)

각 문제에 맞는 맞춤형 중간 단계를 생성하고 불확실성을 계산해서,
보완이 필요한 문제에는 인간이 주석을 달자.


프롬프트 예시


{Input Text}
질문 : 스미스는 15개의 사과를 가지고 있습니다. 그는 5개를 친구에게 주었고, 2개를 더 주었습니다. 스미스는 몇 개의 사과를 가지고 있나요?


{Prompt}
다음 문제를 해결하기 위해 Active Prompting 방법을 적용하여 프롬프트 예시를 생성하고, 이를 기반으로 최종 답변을 도출하십시오. 이 과정에서 불확실성이 높은 질문을 선택하여 주석을 다는 방식으로 진행합니다.


{Output}

1. 예시 생성
   - 초기 예시 1: 스미스가 15개의 사과를 가지고 있습니다. 그는 5개를 친구에게 줬습니다. 남은 사과는 15 - 5 = 10개입니다. 그는 추가로 2개를 더 주었습니다. 최종적으로 남은 사과는 10 - 2 = 8개입니다. 따라서, 스미스는 현재 8개의 사과를 가지고 있습니다.
   - 초기 예시 2: 스미스가 15개의 사과를 가지고 있으며, 5개를 먼저 주었습니다. 이로 인해 15 - 5 = 10개가 남습니다. 이후 2개를 더 주었습니다. 최종적으로 남은 사과는 10 - 2 = 8개입니다. 결론적으로 스미스는 8개의 사과를 가지고 있습니다.


2. 불확실성 추정
   - 불확실성 평가: 위의 예시들에서 불확실성이 낮다고 판단되면, 추가적인 주석 작업 없이 해당 예시들을 채택합니다. 


3. 주석 추가:
   - 주석 1: 처음에 주어진 문제를 바르게 해석했는지 확인합니다. 예를 들어, "스미스가 5개를 주고 2개를 더 주었다"는 문장이 명확하게 이해되는지 검토합니다.


4. 최종 추론:
   - 최종 답변: 스미스는 15개의 사과에서 5개와 2개를 차례로 주었으므로, 남은 사과는 8개입니다.


출처 : Active Prompting with Chain-of-Thought for Large Language Models  논문에서 발췌

Chain-of-thought (CoT) 방법은 사람이 만든 고정된 규범에 의존적입니다. 합리적인 중간 추론 단계를 제안할 수 있다면 추론과정에 도움이 되지만 만약 이 규범이 여러 작업에 가장 효과적인 예시가 아니라면 어떨까요? 이러한 문제를 해결하기 위해 Active-Prompt방법이 제안되었습니다. 여기서는 LLMs(거대언어모델)를 이용하여 다양한 작업별 예시 프롬프트(사람이 설계한 CoT 추론으로 라벨링)에 적용했습니다.  


Active Prompt는 네 단계로 진행됩니다. 


(1) 불확실성 추정: 몇 개의 인간이 작성한 Chain-of-Thought이 있거나 없거나 관계없이, LLMd에 K번 질의하여 일련의 훈련 질문에 대한 가능한 답변과 중간 단계를 생성합니다. 그런 다음, k개의 답변을 기반으로 불확실성을 계산합니다.


(2) 선택: 불확실성에 따라 가장 불확실한 질문을 선택하여 주석을 달도록 합니다. (위의 그림에서 보시면 Q72번의 불확실성이 0.2로 가장 낮고 Q101, Q42는 불확실성이 1이므로 가장 높은 값을 갖습니다.)


(3) 주석: 선택된 질문에 대해 인간이 주석을 다는 작업을 진행합니다. (이 단계에서 인간이 추가적인 규범을 추가합니다.)


(4) 추론: 새로운 주석 예제를 사용하여 각 질문을 추론합니다.




10. Multimodal CoT Prompting (논문링크)

언어모델에게 이미지와 텍스트를 함께 사용해 단일 중간 단계와 추론 경로를 만들게 하자.


프롬프트 예시


{Prompt}

질문 : 이 자석들은 서로 끌어당길까요, 아니면 밀어낼까요?


맥락 : 두 개의 자석이 그림과 같이 배치되어 있습니다. 힌트: 자석이 서로 끌어당기면 가까워지고, 자석이 서로 밀어내면 멀어집니다.


옵션 : (A) 끌어당긴다. (B) 밀어낸다.


{Output}

근거 : 이 자석들이 서로 끌어당길지 밀어낼지 판단하려면, 서로 가까운 극을 확인하세요. 한 자석의 북극이 다른 자석의 남극에 가까이 있습니다. 서로 다른 극은 끌어당기므로, 이 자석들은 서로 끌어당길 것입니다.


답: 정답은 (A)



출처 : Multimodal Chain-of-Thought Reasoning in Language Models  논문에서 발췌


멀티모달 Chain-of-Thought (CoT)는 기존의 Chain-of-Thought (CoT) 기법을 텍스트와 이미지와 같은 다양한 데이터 형식으로 확장한 접근 방식입니다. 이 방법은 복잡한 추론 작업에서 텍스트와 이미지를 동시에 활용하여 보다 풍부한 정보를 제공합니다. 멀티모달 CoT의 주요 단계는 다음과 같습니다:


    근거 생성 (Rationale Generation): 첫 번째 단계에서는 멀티모달 정보를 기반으로 근거를 생성합니다. 즉, 텍스트와 이미지를 결합하여 문제를 해결하기 위한 정보적 근거를 생성합니다. 이 단계에서는 멀티모달 데이터의 통합과 분석을 통해 문제를 이해하고 관련된 정보를 추출합니다.  


    답변 추론 (Answer Inference): 두 번째 단계에서는 생성된 정보적 근거들을 활용하여 최종 답변을 도출합니다. 이 단계에서는 첫 번째 단계에서 생성된 근거들을 바탕으로 문제에 대한 답변을 추론하고 생성합니다.  


이러한 접근 방식은 멀티모달 CoT 모델이 텍스트와 이미지를 통합적으로 활용하여 보다 정확하고 풍부한 추론을 가능하게 합니다. 




DSPy가 제시한 새로운 프롬프팅의 미래



기존 프롬프트 엔지니어링의 한계


제일 처음 다뤘던 Zero-Shot 방법에 비하면 엄청 복잡해졌죠? 앞으로 이보다 더 복잡한 엔지니어링 방법도 나올 수 있습니다..

위의 이미지는 방법론에서 설명해 드렸던 Chain -of-Thought의 개량 버전인 Symbolic Chain-of-Thought의 진행 단계를 설명하고 있습니다. 물론 기본 CoT보다 성능은 개선되었지만, 과정이 상당히 복잡한데요, 위와 같은 프롬프팅 기법을 이용해 언어모델에 적용한다면 아무리 코딩한다고 해도 많은 과정들을 거칠 수밖에 없습니다.


 그 과정에서 여러 문제가 발생할 수 있습니다. 예를 들어 프롬프트의 설계에서 인간의 주관적인 판단이 개입된다면 프롬프트의 일관성이 훼손될 수도 있습니다. 또 사람이 일일이 설계하고 테스트한다면 시간도 오래 걸리겠죠? 다양한 프롬프트를 만들고 테스트해 봐야 하는데 특정 작업에만 적합한 프롬프트라면 이것을 다른 작업에 재사용하기 어렵다는 한계도 있습니다. 평가에서는 어떨까요? 품질을 평가하는 기준이 인간의 판단에 맡겨진다면 어떤 점을 개선해야 할지 기준점이 모호할 수 있습니다. 


 프롬프트 엔지니어링을 통해서 인공지능의 성능을 개선할 수 있다는 가능성도 있지만 위의 방법들에서 보셨다시피 너무 많은 방법과 너무 복잡한 과정들로 인해서 적용의 어려움이 있는데요, 새로 나온 논문 DSPy에서는 이러한 번거로움을 쉽게 해결하고 효율적으로 프롬프트를 엔지니어링 할 수 있는 새로운 프레임워크를 제안했습니다. 


DSPy : 프롬프트 엔지니어링을 위한 새로운 프레임워크

출처 : https://github.com/stanfordnlp/dspy 공식 github 페이지에서 발췌


DSPy는 언어 모델의 성능을 극대화하고, 다양한 작업에 효과적으로 적용할 수 있는 프롬프트를 생성하는 데 도움을 주는 도구입니다. DSPy의 주요 목표는 언어 모델이 최상의 결과를 도출할 수 있도록 프롬프트를 자동으로 설계하고 최적화하는 것입니다.


DSPy의 주요 요소는 다음과 같습니다.


1. 서명 (Signature)
   - 서명은 특정 작업의 기본 구조와 틀을 제공합니다. 즉, 문제를 정의하고, 필요한 정보를 명시하며, 프롬프트가 어떻게 구성되어야 하는지에 대한 청사진을 제시합니다. 서명은 모델이 작업을 이해하고 수행하기 위한 방향을 제시하는 핵심 역할을 합니다.


2. 모듈 (Module)
   - 모듈은 서명을 기반으로 구체적인 프롬프트를 생성합니다. 서명이 제공하는 구조를 바탕으로, 모듈은 실제로 언어 모델이 작업을 수행할 수 있도록 프롬프트를 설계하고 구현합니다. 모듈은 특정 작업이나 문제에 맞춰 프롬프트를 맞춤화합니다.


3. 부트스트래핑 (Bootstrapping)
   - 부트스트래핑은 초기 예제를 자동으로 생성하는 과정입니다. 이 단계에서는 모델이 작업을 수행하기 위한 예제나 샘플을 생성하여, 프롬프트의 품질을 높이고, 모델의 이해도를 개선합니다. 초기 예제는 프롬프트를 구성하는 데 필요한 기본 데이터를 제공합니다.


4. 텔레프롬프터 (Teleprompter)
   - 텔레프롬프터는 생성된 예제를 활용하여 프롬프트를 최적화하는 역할을 합니다. 이 단계에서는 부트스트래핑 단계에서 생성된 예제를 기반으로, 프롬프트를 세밀하게 조정하고 개선하여 모델의 성능을 최대화합니다. 텔레프롬프터는 프롬프트의 정확성, 명확성, 효과성을 높이는 데 중점을 둡니다.



설명만 봐서는 잘 와닿지 않으시죠? 쉽게 설명해 드리면, 원래는 위에서 예시로 보여드렸던 프롬프트 지시문들을 일일이 넣어서 테스트했다면 DSPy에서는 위의 네 가지 요소를 이용해 아주 간단한 방식으로 프롬프트를 자동 생성 해줍니다. 예전 방식에서는 "이 질문에 대한 답변을 작성해 줘"와 같이 자연어로 적었다면 DSPy에서는 {"question" -> "answer"}과 같이 매우 단순하면서 직관적인 방식으로 프롬프트를 표현합니다. 여러 단계로 이루어지면 프롬프팅 과정도 함수로 정의한 후 함수 호출 방식으로 편하게 이용할 수 있습니다. 


한때는 더 이상 프로그래밍도 필요 없고 모든 것은 다 프롬프팅으로 대체될 것이다.라는 이야기도 있었는데요, 그런 점에서 DSPy가 내세우는 "Not Prompting"이라는 표현이 의미심장하게 다가옵니다. 이젠 프롬프팅도 아니고 그 자체가 모델이 된다니 일련의 과정들이 앞으로 어디까지 단순해질지 감조차 오지 않네요. 어쩌면 어렵고 복잡한 것이 남아있는 것이 인간에게는 더 좋은 일인지도 모르겠네요. 




여러분들이 보시는 프롬프팅의 미래는 무엇이 될 것 같나요?





DSPy는 논문뿐만 아니라 사용할 수 있는 프레임워크도 오픈소스로 Github에 공개해 놓았습니다. 아래 링크를 첨부해 놓을게요

Github 링크 : https://github.com/stanfordnlp/dspy
바로 따라 해 볼 수 있는 Colab 파일 : https://colab.research.google.com/github/stanfordnlp/dspy/blob/main/intro.ipynb
DSPy Tutorial : https://dspy-docs.vercel.app/docs/category/tutorials




마무리하기 - Turning Off the Drill



오늘 내용 어떠셨나요? 사실 저는 국비교육을 통해 인공지능 교육을 들었음에도 불구하고, Few-Shot과 같은 프롬프팅 엔지니어링 방법에 대해서 잘 알지 못했는데요, 대충 알 것도 같은데 이대로 넘어갈 수는 없겠다는 생각이 들어서 오늘 뉴스레터 내용으로 다루게 되었습니다. RAG 같은 것도 인공지능 논문을 보면 심심치 않게 등장하는데 오늘에서야 비로소 어떻게 동작하는지 알게 되었네요.


많은 분이 Chat-GPT에서 프롬프트를 입력해 본 경험이 있으시겠지만, 본격적인 엔지니어링을 위한 기법들은 낯서실 분도 있겠다는 생각이 드네요. 어떻게 보면 나와는 너무 먼 내용이라고 생각하실 수도 있겠지만 인공지능의 서비스 개발에서 UX를 통해 개선해야 하는 부분과 위와 같은 프롬프트 엔지니어링을 통해 개선해야 하는 부분이 나뉘는 만큼 기본적인 지식을 알고 계신다면 더욱더 효율적인 접근이 가능하리라 생각됩니다. 오늘 내용을 바탕으로 이제부터는 구체적인 인공지능 서비스 개발 과정을 다뤄보려고 하니 많은 관심 부탁드립니다.


오늘도 긴 글 읽어주셔서 감사합니다.




오늘의 단어: 문맥 기반 학습 (In Context Learning)


문맥 기반 학습은 대규모 언어 모델이 주어진 입력 문맥을 활용하여 즉시 학습하고 적절한 응답을 생성하는 방식을 의미합니다. 이 방법에서는 모델이 특정 문제나 질문을 처리하기 위해 제공된 문맥 내의 예시나 정보를 기반으로 즉시 학습하여 답변을 생성합니다. 



1. 문맥 제공: 모델에게 특정 문제를 제시할 때, 문제와 관련된 예시나 정보를 함께 제공하여 모델이 그 문제를 이해하고 적절한 응답을 생성할 수 있도록 돕습니다.


2. 즉시 학습: 모델은 주어진 문맥(문제와 예시)을 통해 즉시 학습하여 문제를 해결하는 방법을 파악합니다. 이 과정에서 별도의 추가 학습 없이 문맥을 기반으로 응답을 생성합니다.


3. 프롬프트의 역할: 프롬프트는 모델이 특정 작업을 수행하도록 유도하는 데 사용됩니다. 문맥을 포함한 프롬프트는 모델이 문제를 해결하기 위해 필요한 정보를 제공하며, 문맥 내에서 학습할 수 있도록 돕습니다.


문맥 기반 학습은 모델이 제공된 문맥을 즉시 활용하여 적절한 응답을 생성할 수 있게 하며, 다양한 형태의 프롬프트를 사용하여 여러 문제를 해결하는 데 유용합니다.


문맥 기반 학습의 반대되는 학습에는 사전학습과 파인튜닝 방식이 있습니다.


문맥 기반 학습에서는 추가적인 사전 학습이나 파인튜닝 없이도 즉시 학습하고 적용할 수 있습니다.

사전 학습과 파인튜닝은 문맥 기반 학습과 달리 추가적인 학습 과정을 필요로 합니다.


따라서, 문맥 기반 학습은 주어진 문맥을 활용하여 즉시 적절한 응답을 생성하는 반면, 사전 학습과 파인튜닝은 모델이 사전 학습과 추가 학습을 통해 성능을 조정하고 향상하는 방식입니다.






AI Experience (AIX)의 이모저모를 전해드리는 '퓨처드릴'입니다!

퓨쳐드릴은 네 명의 에디터가 매주 돌아가면서 글을 작성하고 있습니다. 


퓨쳐드릴 뉴스레터는 월요일 아침 8시에 발송됩니다. 

새로운 뉴스레터를 받아보고 싶으시다면 https://futuredrill.stibee.com/ 여기서 구독해 주세요:)

매거진의 이전글 노코드로 인공지능 서비스 프로토타입 만들어보기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari