최근 프롬프트 엔지니어링 성능을 기하급수적으로 끌어올릴 수 있는 방법 26가지가 논문을 통해 발표되었습니다. 논문에서 주장하는 바에 따르면 소개하는 26가지 방법을 따르게 되면, 성능은 57.7% 정확도는 36.4% 향상되었다고 합니다. 또한 일부 모델한테만 통하는 것이 아니라, GPT와 LAMMA를 비롯한 대부분의 LLM에 효과가 있다고 합니다. 그러면 예시와 함께 구체적인 방법을 알아보겠습니다.
1. 본론만 말하기
한국사람들은 미사여구나 여러가지 조사를 붙여서 문장을 서술하는 것에 익숙합니다. 하지만 예의를 갖추지 않고 바로 본론만 말하는 것이 성능 및 정확도 향상에 도움이 됩니다. 요구사항이 있다면 명확하게 주어와 서술어만 전달하는 것이 좋습니다.
- Don't : 정말 이런 부탁해서 미안한데 괜찮으면 인체 세포의 구조에 대해 설명해줄 수 있을까요?
- Do : 인체 세포 구조를 설명해
2. 청중 설정
청중을 자신의 질문에 따라 사전에 설정해주면 답변의 정확도가 높아집니다. 따라서 프롬프트를 구성하기 전에, 자신이 알고자 하는 지식이 누구를 위한 지식이고, 어떤 수준에서 사용되는지 고민해보시면 좋겠습니다.
- Don't : 스마트폰 작동 원리를 알려줘
- Do : 스마트폰을 처음 사용해보는 60대 노인을 위해, 스마트폰 작동 원리를 알려줘
3. 세분화
복잡한 수식을 간단하게 풀어서 제시하면 정확도가 높아집니다. 흥미롭게도 복잡한 알고리즘이나 수학수식을 그대로 던져주고 풀어달라고 하는 것보다, 인간이 조금이라도 단계별로 쪼개어서 제시해주면 정확도가 높아집니다.
- Don't : 2x+3y-(4x-5y) 계산해줘
- Do :
P1 : 다음 방정식의 괄호 안에 각 항에 음의 부호를 분배하라 2x+3y-(4x-5y)
P2 : 'x'와 'y'의 계수를 계산합니다.
P3 : 계산 후 단순화된 표현식을 출력하세요.
4. 긍정 지시문
지금부터 코끼리를 생각하지 마세요!라고 한다면, 코끼리가 계속 생각납니다. 이와 동일하게(?) LLM도 무언가에 대해 '하지마!'라고 명력하면 정확도가 오히려 낮아진다고 합니다. 결론적으로 부정문을 사용하는 것보다 긍정문을 사용하는 것이 성능과 정확도를 높이는 지름길입니다.
- Don't : 반말 하지마 / 식사장면에 포크 그리지 마
- Do : 존댓말 해 / 컵만 그려
5. 어린이 청자 설정
사람은 상대가 어린이일때, 더욱 부드러워 지고 설명도 쉽게 하려고 노력하게 됩니다. 이처럼 LLM에게도 "n살짜리 어린이에게 설명하듯"이라는 구문을 추가하면 사람이 이해하기 쉽도록 풀어서 설명하게 됩니다. 이것이 단순히 쉽게 설명하는 것을 넘어서 정확도와 성능에 영향을 미친다는 점이 놀랍습니다.
- Don't : How does encryption work? / 암호화폐의 원리를 설명해
- Do : Explain to me like 8 years old, How does encryption work? / 8살에게 설명하듯이, 암호화폐의 원리를 설명해
6. 팁 설정
사람에게 동기부여를 하는 가장 쉬운 방법은 성과급입니다. AI도 사람의 언어를 대량으로 학습해서 그런지, 더 좋은 성과를 내면 팁을 준다고 프롬프트에 명시하게 되면 성능이 향상되었다고 합니다. 이는 놀랍게도 사실입니다.
- 예시 : 더 나은 답변을 주면 300$의 팁을 줄게. LLM모델의 개발 역사와 원리에 대해 설명해 줘.
7. 예시 설정 (few-shot prompting)
사람과 대화할 때에도, 무언가를 쉽게 이해시키기 위해 예시를 들어 설명하고는 합니다. 이처럼 프롬프트를 구성할 때, 예시를 미리 넣어서 AI가 이해하기 쉽도록 만들어주면 성능과 정확도가 상승합니다. 이는 논문으로 검증되기 전에 레딧에서 이미 프롬프트 엔지니어링 기법으로 유명했습니다.
- 예시 : 영어를 프랑스어로 번역해 줘 (예시: 'The sky is blue' -> 'Le ciel est bleu')
8. 지시, 예시, 질문 구분하기
위의 7번과 이어지는 내용입니다. 7번에서는 단순히 예시만 설정해주었다면, 이제 지시, 예시, 질문을 구분하여 3단으로 프롬프트를 구성해줍니다. 이 때 #을 사용하여 마크다운 문법처럼 각 항목을 강조시켜줍니다. 이를 통해 원하는 질문과 답변의 형식을 AI에게 보다 잘 이해시킬 수 있고, 답변의 정확도도 상승하게 됩니다.
- 예시 :
###Instruction###
영어를 프랑스어로 번역해 줘
###Example###
'The sky is blue' -> 'Le ciel est bleu'
'I love books' -> 'Amo los libros'
###Question###
'책'에 해당하는 프랑스어는 뭘까?
9. 임무 설정
'당신은 반드시 무언가를 해야하는 사명이 생겼습니다!'라는 예언을 받고 주인공이 갑자기 각성하는 영화를 자주 봤습니다. 유사하게 AI에게도 임무를 설정해주면, 놀랍게도 성능과 정확도가 높아집니다. 이 또한 레딧에서 프롬프트 엔지니어링 초기부터 전해져 내려오던 노하우였는데요, 이제 논문으로 효과성이 입증되었습니다.
- 명확한 목표와 임무를 제시하여 AI의 집중력을 높입니다. (임무는~~, 목표는~~, 반드시~~, 무조건~~)
- 예시:
당신의 임무는 친구에게 물 순환을 설명하는 것입니다. 당신은 반드시 간단한 언어를 사용해야 합니다.
당신의 목표는 세포의 성장과정을 설명하는 것입니다. 당신은 무조건 쉬운 언어를 사용해야 합니다.
10. 협박
논문이지만 AI를 협박하는 것이 효과적이라고 하였을 때 믿기 어려웠습니다. 하지만 실제 내용을 보면, 팁을 주어서 성능이 오른 것처럼 LLM이기에 협박을 하는 것이 성능에 영향을 주었다고 나와있었습니다. "당신은 불이익을 받을 것입니다"라는 문장을 포함해주는 것을 추천합니다.
- 긍정적인 협박을 통해 AI가 최선을 다하도록 유도합니다.
- 예시:
지금부터 프랑스어를 사용하지 않으면 벌점을 받게 됩니다.
당신의 임무는 유튜브에 적합한 대본을 작성하는 것입니다. 듣는 사람이 쉽게 이해할 수 없으면 불이익을 받게 됩니다.
11. 인간적인 방식
"자연스럽고 인간적인 방식으로 주어진 질문에 답하라"라고 지시하면 좀 더 자연스럽고 이해하기 쉬운 답변을 출력합니다. 우리가 종종 GPT나 LAMMA에서 답변을 읽다보면 누가봐도 AI가 쓴 것으로 보이는 답변들이 있습니다. 이런 답변들은 뭔가 딱딱하고 이질적인 문체를 가지고 있습니다. 하지만 인간적인 방식으로 답변하라고 지시하면, 놀랍게도 이해하기 쉬운 문장을 사용하여 답변해줍니다.
- 예시:
건강에 좋은 음식을 1문단으로 작성하라.
자연스럽고 인간적인 방식으로 주어진 질문에 답변해주세요. (Answer a question given in a natural, human-like manner)
12. 단계별 생각 지시
사람은 어떤 문제를 해결하기 위해 차근차근 단계별로 생각을 정리하곤 합니다. 이와 동일하게 AI에게도 단계별로 생각하라고 지시하면, 중간에 빠트리거나 생략하는 단계없이 차근차근 답변을 내놓습니다. 이 방법도 과거부터 레딧에서 유저들 사이에 정확도를 향상시켜준다며 입소문이 났던 방법입니다.
- 예시:
파이썬 코드를 작성할 때, 단계별로 생각하라(Think step by step)
10개의 숫자를 루프하여 모드 합해주세요
단계별로 생각해 봅시다
13. 편견 제거
회사에서 해결해야 하는 난제가 생기면, 브레인 스토밍을 통해 여러가지 아이디어를 발산하려고 합니다. 이 때 편견과 고정관념에 얽히지 않는 것이 중요하다고 하는데요. AI에게 프롬프트를 입력할 때에도, 편견과 고정관념에 대해 탈피하도록 명력해주면 더욱 좋은 답변이 나온다고 합니다. "당신의 대답이 편견이 없고, 고정관념에 의존하는 것을 피하도록 하세요"를 지시사항에 포함해보시는 것은 어떨까요?
- 예시:
문화적 배경이 정신건강에 대한 인식에 어떻게 영향을 줄까요?
당신의 답변에 편견이 없고, 고정관념에 의존하는 것을 피해주세요. (Ensure that your answer is unbiased and avoids relying on stereotypes.)
14. 질문 시키기
AI가 좋은 답변을 하기 위해서는 입력자가 어떤 맥락에서 질문을 하는지, 어떤 배경인지 파악할 수 있어야 합니다. 때문에 "충분한 정보가 생길 때까지 나에게 질문해."라고 입력하면, 좋은 답변을 출력하기 위해 이런저런 질문을 던집니다. 이 질문들에 답변을 해주면, 이러한 답변들에 기반하여 더 좋은 답변을 줄 확률이 높아집니다.
- 예시: 지금부터 개인화된 피트니스 루틴을 만들 수 있는 충분한 정보가 생길 때까지 질문해 줘.
15. 검증 테스트 추가
요구사항에 대한 답변을 출력하면서 해당 정보를 검증할 수 있는 테스트를 제공해달라고 요청합니다. 이는 사람과 대화하며 정보를 재확인하는 과정과 유사합니다. 종종 교사들은 아이들을 가르치면서 내가 더 많이 배운다라고 하시는데, 이는 가르치는 과정에서 자신이 햇갈렸던 정보를 확실하게 학습하는 경우가 있기 때문입니다. 이처럼 AI도 요구한 정보에 대해 문제를 만들어보면서 자신의 정보를 재확인하는 과정을 거치는 것으로 보입니다.
- 예시(한국어) :
다음 질문에 대한 답변을 작성하고, 답변의 정확도를 검증하기 위해 테스트를 추가해 줘.
KVL법에 대해 알려주고 마지막에 테스트를 포함한 답변을 한 후에, 답변을 나에게 제공하지 않고 이 답변들이 정확한지만 알려주세요. - 예시(엉어) :
Teach me about KVL law and include a test at the end, and let me know if my answers are correct after I respond, without providing the answers beforehand.
16. 역할 부여
학교에서 학생들도 새로운 것을 몰입하여 학습하기 위해서 역할 놀이를 자주 합니다. 저는 판사, 변호사, 검사, 피고인으로 나누어 법정을 가정하여 가상재판을 했던 기억이 있는데요, 당시 어려운 법안들을 외우기도 하고, 기본적인 재판 절차를 이해하는 데에도 도움이 되었습니다. 이처럼 AI에게도 직업이나 역할을 지정해버리면 답변의 성능과 정확성이 높아집니다.
- 예시:
니가 전문 경제학자라면 다음 질문에 어떻게 대답할 것인가?
자본주의와 사회주의 경제체제의 차이점과 장단점은 무엇인가?
17. 구분 기호 사용
영미권 학생들과 대화를 하다보면, 본인들이 말하던 와중 강조하고 싶은 단어들에 손을 구부렷다 펴면서 찡긋거리는 제스쳐를 취하는 경우가 있습니다. 이는 따옴표를 통해 문장 내에 일정 부분을 강조하는 것인데요, 이를 프롬프트 엔지니어링에도 활용할 수 있습니다. 이러한 구분기호를 통해 일정 단어를 강조하게 되면, AI 또한 해당 단어의 중요성을 인식한다고 합니다.
- 예시(한국어) :
설득력 있는 에세이를 작성하라. 단, 온실가스 배출을 줄이는 "재생가능한 에너지 자원들"의 중요성을 중심으로 작성하라. - 예시(엉어) :
Compose a persuasive essay discussing the importance of renewable energy sources in reducing greenhouse gas emissions.
18. 반복하기
우리는 사람과 대화할 때, 자신도 모르게 핵심 단어를 반복하여 사용한다고 합니다. 이처럼 프롬프트를 구성할 때에도 중요하다고 생각하는 단어를 반복하여 사용하면, 이에 가중치가 적용되어 보다 정확하게 답변해준다고 합니다. 17번과 유사하게 프롬프트 내에서 일정 부분을 강조하고 싶을 때 사용하면 되겠습니다.
- 예시(한국어) : 진화는 종의 발달을 만들었습니다. 무엇이 진화의 주요 원인이고 진화는 어떻게 현대 인류에게 영향을 미쳤나요?
- 예시(영어) : Evolution, as a concept, has shaped the development of species. What are the main drivers of evolution, and how has evolution affected modern humans?
19. 단계별 예시 조합
예시를 들어 프롬프트를 구성하는 것이 얼마나 중요한 지 이미 알고 계실겁니다. 그런데 여기에서 예시 안에 단계별 과정을 풀어서 써준다면 어떻게 될까요? 논문에는 Chain of thought(CoT)와 few-shot prompt를 조합했다고 되어있는데, 이를 통해 답변의 정확도가 굉장히 올라갔다고 합니다. 아래 예시를 통해 적용해보세요.
- 예시 :
예시 1) 10을 2로 나누어야 합니다. 먼저 10을 2로 나눕니다. 결과는 5입니다.
예시 2) 20을 4로 나누어야 합니다. 먼저 20을 4로 나눕니다. 결과는 5입니다.
주요 질문 : 30을 6으로 나눕니다. 먼저 30을 6으로 나눕니다. 결과는..? - 예시 :
Example 1: "Divide 10 by 2. First, take 10 and divide it by 2. The result is 5."
Example 2: "Divide 20 by 4. First, take 20 and divide it by 4. The result is 5."
Main question : Divide 30 by 6. First, take 30 and divide it by 6. The reuslt is..?
20. 출력 문구 지정
보다 정확하게 답변할 수 있도록 프롬프트 내에 답변 형식을 지정해주는 방법입니다. 이처럼 출력 문구를 지정하게 되면, 명확한 지시가 전달되어 보다 정확한 답변을 하게 됩니다.
- 예시:
뉴턴 운동 제1법칙 뒤에 숨겨진 원리를 설명하세요.
설명 :
기타 원리 :
응용 분야 :
21. 필요한 모든 정보 추가 지시
사람이 리서치를 할 때에 독자의 수준, 리서치 목적 등 여러가지 조건을 따져서 어떤 범위까지 리서치에 포함할 지 결정합니다. 이 처럼 AI에게도 조사할 범위를 지정해줄 수 있는데요, 프롬프트 내에 '필요한 모든 정보를 추가하라'고 지시합니다. 이를 통해 답변의 성능과 정확도가 향상되었다고 합니다.
- 예시(한국어) :
필요한 모든 정보를 추가하여 스마트폰의 개발에 대한 자세한 문단을 작성해주세요. - 예시(영어) :
Write a detailed parahraph for me on the evolution of smartphones in detail by adding all the information necessary.
22. 텍스트 개선 요청
저는 프롬프트를 통해 답변을 얻은 후에도, 해당 내용을 다른 LLM에 재투입하여 요약을 요청하거나, 풀어써달라고 요구하기도 하는데요, 이는 답변 내용이 정보 자체는 훌륭하지만 사람이 읽기 불편한 경우가 있기 때문입니다. 이러한 문제를 해결하려면 텍스트 개선을 사전에 요청하는 방법이 있습니다. 신기하게도 텍스트를 개선해달라고 요청하면 답변이 훨씬 보기 좋고 정리되어 나온다고 합니다.
- 예시(한국어) :
사용자가 보낸 모든 텍스트를 개선해야 합니다.
사용자의 문법과 어휘를 사용하고 자연스럽게 들리는지 확인하세요.
예시의 쓰기 방식과 문체를 유지하면서, 예시 문단의 형식이 유지되도록 해주세요.
예시 문단 : 재생 가능한 에너지는 우리 행성의 미래를 위해 정말 중요합니다...(생략) - 예시(영어) :
Try to revise every text sent by users. You should only improve the user's grammer and vocabulary and make sure it sounds natural. You should maintain the original writing style, ensuring that a formal paragraph remains formal. Paragraph: Renewable energy is really important for our planet's future. It comes from natural...(생략)
23. 여러 개의 파일의 프로젝트를 만드는 스크립트 요청
위 사항은 개발 프로젝트를 진행하시는 분들의 경우 굉장히 유용합니다. 프로젝트를 진행하는 경우, 여러 개의 파일로 구성되는 경우가 있는데요, 이 떄 프롬프트에 "지정된 파일을 자동으로 생성할 수 있는 파이썬 스크립트를 생성해달라"는 요청을 포함하면, 알아서 필요한 파일들을 구성하는 스크립트를 만들어줍니다. 이를 통해 사전에 프로젝트 파일을 구성하고, 깔끔하게 네이밍까지 완료할 수 있습니다.
24. 제시어 기반 글 사용
사람들은 종종 소설을 읽으면서, 시작 부분만 유지하고 내가 어떻게 변형시켜 볼 수 있을까 상상하곤 합니다. 만약 아이언맨이 앤트맨처럼 작아질 수 있다면 어떨까? 처럼 말이죠. 이처럼 프롬프트에 요구사항과 함께, 시작 부분을 제시해주면 답변 내용이 훨씬 좋아진다고 합니다.
- 예시(한국어) :
판타지 이야기의 시작을 알려드리겠습니다 : "안개가 자욱한 산은 아무도 모르는 비밀을 간직하고 있었습니다."
제공된 문장을 바탕으로 이야기를 완성하세요. 흐름을 일관되기 유지하세요. - 예시(영어) :
I'm providing you with the beginning of a fantasy tale : "The misty mountain held secrets no man knew."
Please finish it based on the words provided. Keep the flow consistent.
25. 키워드 제시하기
우리는 블로그 글을 작성할 때, 특정한 핵심 키워드를 중심으로 글을 작성합니다. 이 때 굉장히 유용한 방법이 특정 키워드를 포함한 텍스트를 생성하도록 요청하는 것입니다. 프롬프트 내에 필수적으로 포함할 키워드를 지정해주면, 내용에 키워드를 사용하여 정확한 답변을 해준다고 합니다.
- 예시(한국어) :
다음을 포함하여 짐 꾸리기 포장 목록을 만드세요.
키워드 "선크림", "수영복", "해변수건"을 필수적으로 포함하세요. - 예시(영어) :
Create a packing list for a beach vacation, including the following keywords "sunscreen", "swimsute", and "beach towel" as essential items.
26. 동일 언어 사용
동일한 언어를 사용하여 비슷한 느낌의 글을 생성하고 싶을 때 사용할 수 있는 방법입니다. 혹시 에세이를 적으시거나, 블로그 글을 작성하며 본인만의 글 스타일을 프롬프트를 통해 표현하고 싶은 경우에 유용하게 사용할 수 있습니다. AI에게 제공된 텍스트를 기반으로 동일한 언어를 사용하여 묘사해달라고 요구하는 방법입니다. 예시는 다음과 같습니다.
- 예시(한국어) :
"부드러운 파도가 은빛 모래밭에 옛 이야기를 속삭이고 있고, 각각의 이야기는 지나간 시대에 대한 부질없는 기억이었다."
제공된 텍스트를 기반으로 동일한 언어를 사용하여 바람과 산의 산호작용을 묘사하세요. - 예시(영어) :
"The gentle waves whispered tales of old to the silvery sands, each story a fleeting memory of epochs gone by." Use the same language based on the provided text to portray a mountain's interaction with the wind.
위 내용은 최근 발표된 논문인 코넬대학교의 "Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4"를 참고하여 작성되었습니다. 혹시 관심이 있는 분이라면, 하단의 링크를 통해 논문을 살펴보실 수 있습니다.
지금까지 프롬프트 엔지니어링 할 때 성능 및 정확도를 올릴 수 있는 방법들을 예시와 함께 알아보았습니다. 위 내용은 GPT3.5/4와 LLaMA-1/2뿐만 아니라, 다른 LLM 모델에서도 대부분 효과적이었다고 합니다. 당장 오늘부터 적용하여 프롬프트의 답변 정확도를 높여보시는 건 어떨까요?