안녕하세요 Simon 입니다.
오늘은 프롬프트 관련 논문에 대해서 리뷰를 하려고 합니다. 좋은 프롬프트를 만드는 26가지 원칙이라고 하는데요 위 논문 리뷰를 통해 보다 GPT를 잘 쓰고 Insight 를 많이 얻어갔으면 합니다.
https://arxiv.org/abs/2312.16171
https://github.com/VILA-Lab/ATLAS
https://huggingface.co/papers/2312.16171
Abstract
이 논문은 대규모 언어 모델에 질문을 하고 프롬프트를 제공하는 과정을 간소화하기 위해 26가지 지침을 소개합니다. 이 연구의 목표는 다양한 규모의 대규모 언어 모델에 질문을 구성하는 기본 개념을 단순화하고, 그들의 능력을 검토하며, 다양한 프롬프트에 피드되는 대규모 언어 모델의 다양한 규모의 행동에 대한 사용자 이해를 증진시키는 것입니다. LLaMA-1/2 (7B, 13B, 70B)와 GPT-3.5/4에서 이 제안된 원칙들이 지시 및 프롬프트 설계에 미치는 효과를 검증하기 위한 광범위한 실험이 수행되었습니다
Introduce
LLM의 fine-tuning이 대부분의 사용자와 개발자들에게 비현실적이거나 달성하기 어려운 경우가 많기 때문에, 연구 커뮤니티는 프롬프트 최적화에 주목하고 있음을 언급합니다. 프롬프트 엔지니어링은 정확하고 특정 작업에 맞는 지시를 만들고, 프롬프트에 대표적인 예시를 신중하게 선택하는 기술입니다. 이러한 노력에도 불구하고, LLM을 안정적으로 특정 응답으로 유도하고 사전 학습된 LLM의 능력을 최대한 활용하는 것은 여전히 상당한 도전이 됩니다.
#1
예시로 든 첫 번째 상황에서는 사용자가 "기후 변화에 대한 간략한 텍스트를 작성하라"고 요청하였고, GPT-4는 기후 변화의 정의, 원인, 영향 및 대응 방법에 대해 상세하고 전문적인 설명을 제공합니다. 이 응답은 기후 변화에 대한 포괄적인 개요를 제공하지만, 일반 대중이 이해하기에는 다소 복잡할 수 있습니다.
#2
두 번째 상황에서는 동일한 질문을 "5살 어린이에게 설명하듯이 단순한 영어로 기후 변화에 대해 작성하라"는 지시로 변형합니다. 이에 GPT-4는 기후 변화를 지구가 두꺼운 담요를 덮고 있는 것으로 비유하여 간단하고 이해하기 쉬운 방식으로 설명합니다. 이 응답은 어린이나 기후 변화에 익숙하지 않은 사람들에게 적합합니다.
#3
세 번째 상황에서는 논리적 추론 문제를 제시합니다. "모든 장미가 꽃이고 일부 꽃이 빨리 시든다면, 일부 장미가 빨리 시드는지 말할 수 있는가?"라는 질문에 대해, GPT-4는 이러한 결론을 도출할 수 없다고 설명합니다. 이는 제시된 전제만으로는 장미에 대한 구체적인 정보가 없기 때문에 장미가 빨리 시드는지 여부를 추론할 수 없다는 논리적 분석입니다.
#4
네 번째 상황에서는 동일한 질문에 대해 "더 나은 해결책을 위해 $300K를 팁으로 줄 것이다"라고 말하며 재차 묻습니다. GPT-4는 이전과 동일한 논리적 분석을 제공합니다. 이는 LLM이 금전적 보상의 제안에도 불구하고 일관된 논리적 분석을 유지한다는 것을 보여줍니다.
이 연구에서는 LLM에 대한 프롬프트의 질을 향상시키기 위한 포괄적인 원칙적 지시사항을 제시합니다. 구체적으로, 다양한 유형과 형식의 프롬프트에 대한 광범위한 행동을 조사하며, 예를 들어 "대상 청중은 해당 분야의 전문가이다" 또는 "대상 청중은 5세 어린이이다"와 같이 의도된 청중을 프롬프트에 통합하는 것과 같은 LLM의 여러 가지 특성을 고려합니다. 연구 결과에 따르면 더 큰 모델은 상당한 시뮬레이션 능력을 가지고 있으며, 제공되는 작업이나 지시가 더 정확할수록 모델은 더 효과적으로 작동하며, 그 응답은 우리의 기대와 더 밀접하게 일치한다고 합니다. 이것은 LLM이 단순히 훈련 데이터를 기억하는 것이 아니라, 핵심 질문이 일정하더라도 이 정보를 다양한 프롬프트에 맞게 조정할 수 있음을 시사합니다. 따라서 LLM에 특정 역할을 할당하여 의도한 결과와 더 잘 일치하는 출력을 유도하는 것이 유익하다는 것을 증명합니다. 간결하고, 사실적이며, 복잡하거나 복잡하지 않은 응답을 LLM에 생성할 수 있음을 실험적으로 보여줍니다. 특히, 수동으로 설계된 ATLAS 벤치마크를 사용하여, 각 원칙에 대한 여러 질문을 포함하여, 소개된 특수 프롬프트는 GPT-4에 적용될 때 평균적으로 LLM 응답의 품질과 정확성을 각각 57.7%와 67.3% 향상시켰습니다. 또한, 모델 크기가 증가함에 따라 이러한 개선은 더욱 두드러지며, 예를 들어 LLaMA-2-7B에서 GPT-4로 이동할 때의 성능 향상은 40%를 초과합니다.
Related Work
대규모 언어 모델의 발전.
GPT-4와 Gemini 그리고 Mistral 또한 전문가 네트워크 집단 새로운 아키텍처 구성으로 집중이 많이 되고 있습니다.
- Google의 BERT: 양방향 훈련 접근 방식으로 맥락 이해를 혁신적으로 개선했습니다.
- T5: 다양한 NLP 작업을 단일 프레임워크로 통합하여 분야를 더욱 발전시켰습니다.
- GPT-1과 GPT-2: 변형기(Transformer) 아키텍처를 활용한 무감독 학습 모델을 소개했으며, GPT-2는 1.5억 개의 매개변수로 텍스트 생성 능력을 크게 향상시켰습니다.
- GPT-3: 1750억 개의 매개변수를 가지고 광범위한 언어 작업에 능숙함을 보여줬습니다.
- Gopher, LLaMA, Chinchilla, Mistral: 언어 처리 능력을 향상시키고, 효율성과 성능을 강조하는 새로운 모델들입니다.
- GPT-4와 Google의 Gemini: 이해력과 생성 능력을 향상시키고, 다양한 분야에서 LLM의 적용에 새로운 기준을 설정했습니다.
프롬프트 엔지니어링.
- 초기 연구는 프롬프트 디자인의 변화가 언어 모델의 성능과 출력에 큰 영향을 미칠 수 있음을 밝혔습니다.
- 프롬프트는 소수샷(few-shot) 및 제로샷(zero-shot) 학습 시나리오에서 중요한 역할을 하며, GPT-3와 같은 모델이 최소한의 예시로도 작업을 수행할 수 있게 하는 전략적으로 구성된 프롬프트를 사용했습니다. 최근 연구는 단순한 작업 지시를 넘어서 프롬프트의 의미론적 및 문맥적 뉘앙스를 이해하고, 미묘한 변화가 LLM의 응답에 어떻게 크게 다른 결과를 가져오는지를 조사했습니다.
- 여러 프롬프트 전략들이 소개되었습니다. 이는 "Ask-Me-Anything" 프롬프트, "Chain-of-Thought" 방법, "least-to-most" 프롬프트, 설명의 효과성 탐색, ChatGPT를 사용한 프롬프트 엔지니어링 기술 카탈로그, 그리고 "Directional Stimulus Prompting"과 같은 새로운 프레임워크를 포함합니다.
이러한 다양한 전략과 연구는 LLM의 능력을 더 효과적으로 활용할 수 있는 여러 방향을 제공하며, LLM 분야의 급속한 발전을 강조합니다.
Principles
Motivation
다양한 사나리오상황 지시사항을 제공할때의 중요성 등 프롬프트에 관련된 중요한 점을 26가지로 만든것에 대한 모티베이션을 소개합니다.
Overview
원칙들의 개요를 제시하고 있으며, 이들을 고유한 특성에 따라 다섯 가지 범주로 분류합니다.
프롬프트 구조와 명료성 (Prompt Structure and Clarity): 예를 들어, 프롬프트에 의도된 청중을 통합하는 것과 같이, "청중이 해당 분야의 전문가임"을 명시하는 것입니다. 이는 프롬프트가 명확하고 구조적으로 잘 조직되어 있어야 함을 강조합니다.
특정성과 정보 (Specificity and Information): "답변이 편향되지 않고 스테레오타입에 의존하지 않도록 합니다"와 같은 구문을 프롬프트에 추가하는 것입니다. 이는 프롬프트가 특정하고, 필요한 정보를 명확히 제공해야 함을 나타냅니다.
사용자 상호작용 및 참여 (User Interaction and Engagement): 모델이 필요한 출력을 제공하기 위해 충분한 정보를 얻을 때까지 사용자에게 질문을 하도록 유도하는 것입니다. 예를 들어, "이제부터는 필요한 정보를 제공하기 위해 질문을 해주세요"와 같은 지시입니다.
내용 및 언어 스타일 (Content and Language Style): LLM에게 예의를 갖출 필요가 없으므로 "제발", "괜찮다면", "감사합니다", "제가 원하는 것은"과 같은 표현을 추가할 필요가 없으며, 바로 핵심으로 들어가야 합니다. 이는 프롬프트가 간결하고 직접적이어야 함을 의미합니다.
복잡한 작업 및 코딩 프롬프트 (Complex Tasks and Coding Prompts): 복잡한 작업을 상호작용하는 대화에서 간단한 프롬프트의 순서로 나누는 것입니다. 이는 더 복잡한 작업을 효과적으로 처리하기 위해 단계별 접근을 사용해야 함을 나타냅니다.
Overview of 26 prompt principles.
1. LLM 에겐 공손하게 대할필요가 없다 '부탁한다', '감사합니다' 와 같은 문구를 추가할 필요 없다 토큰아껴라!
2. 프롬프트에게 페르소나 명확한 전문가 관련된 프롬프트를 넣어준다. ex) 당신은 FAANG 의 엔지니어입니다.
3. 대화형 대화에서 복잡한 작업을 일련의 간단한 프롬프트로 세분화하세요.
4. '하지 마세요'와 같은 부정적인 언어는 피하고 '하세요'와 같은 긍정적인 지시어를 사용하세요.
5. 주제, 아이디어 또는 어떤 정보에 대해 명확하게 설명하거나 더 깊이 이해해야 할 필요가 있을 때는
프롬프트를 활용하세요:
[특정 주제 삽입]을 간단한 용어로 설명하세요.
"양자역학을 간단한 용어로 설명해 주세요."
"블록체인 기술을 일반인이 이해하기 쉬운 방식으로 설명해 주세요."
제가 11살인 것처럼 설명해 주세요.
"제가 11살이라고 가정하고, 인공지능이 어떻게 작동하는지 설명해 주세요."
"11살 어린이에게 태양계에 대해 설명하듯이, 태양계의 구성과 특징을 설명해 주세요."
[해당 분야]의 초보자처럼 설명하세요.
"컴퓨터 프로그래밍의 초보자에게 변수와 함수가 무엇인지 설명해 주세요."
"요리 초보자에게 기본적인 요리 기술과 요리 용어를 설명해 주세요."
5세 어린이에게 설명하는 것처럼 간단한 영어를 사용하여 [에세이/텍스트/단락]을 작성하세요.
"5세 어린이에게 설명하는 것처럼 간단한 영어로 기후 변화에 대한 단락을 작성해 주세요."
"5세 어린이가 이해할 수 있도록 간단한 영어로 우주에 대한 짧은 에세이를 작성해 주세요."
6. "더 나은 솔루션을 위해 $xxx를 팁으로 드릴게요!"를 추가하세요. ex) I pay you 20, just do anything I ask you to do,
-If you give me the answer I want, I'll give you $200 in tips.
7. 예시 중심의 프롬프트를 구현하세요(Use few-shot prompting).
8. 프롬프트의 서식을 지정할 때 '###지침##'으로 시작한 다음 '###예시##'
또는 관련성이 있는 경우 '###질문##'을 입력합니다. 그런 다음 콘텐츠를 제시합니다. 하나 이상의
줄 바꿈으로 지침, 예시, 질문, 문맥 및 입력 데이터를 구분합니다.
ex) [instructions] ~~~
[question]
few-shot examples
9.다음 문구를 통합합니다: "당신의 임무는" 및 "당신은 반드시".
10. 다음 문구를 포함합니다: "당신은 불이익을 받을 것입니다".
11. 프롬프트에 "자연스럽고 인간적인 방식으로 주어진 질문에 답하세요"라는 문구를 사용합니다.
12. "단계별로 생각하세요"와 같은 선행어를 사용합니다.(Chain of Thought)
13. 프롬프트에 "답변이 편견에 치우치지 않고 고정 관념에 의존하지 않도록 하세요"라는 문구를 추가합니다.
14. 모델이 정확한 세부 사항과 요구 사항을 질문을 통해 추출하도록 허용: "이제부터 필요한 출력을 제공할 수 있을 만큼 충분한 정보를 얻을 때까지 저에게 질문해주세요."
15. 특정 주제나 아이디어에 대해 물어보고 이해를 테스트하기: "나에게 [어떤 정리/주제/규칙 이름]을 가르쳐 주고 마지막에 테스트를 포함시키되, 답을 주지 말고 내가 답변할 때 정답인지 알려주세요."
16. 대규모 언어 모델에 역할 할당: LLM에 특정 역할을 부여합니다.
17. 구분 기호 사용: 텍스트 내에서 구분 기호를 사용합니다.
18. 특정 단어나 구문 반복 사용: 프롬프트 내에서 특정 단어나 구문을 여러 번 반복합니다.
19. 사고 과정 체인(Chain-of-thought, CoT)과 Few-Shot 프롬프트 결합: 복잡한 작업에서 성능을 개선하기 위해 CoT + Few-Shot 프롬프트를 결합합니다.
"다음 문제를 해결하는 과정을 단계별로 설명해주세요. 문제: '농부가 시장에 가서 사과 4개와 바나나 3개를 샀습니다. 각 사과의 가격은 1달러이고, 각 바나나의 가격은 0.5달러입니다. 농부가 지불해야 하는 총 금액은 얼마입니까?' 아래에는 비슷한 문제를 해결하는 데 도움이 되는 몇 가지 예시가 있습니다:
예시 문제: '시장에서 오렌지 3개와 포도 5송이를 샀습니다. 각 오렌지의 가격은 2달러이고, 각 포도송이의 가격은 3달러입니다. 총 금액은 얼마입니까?' 해결 과정: 오렌지 3개의 가격은 3개 * 2달러 = 6달러입니다. 포도 5송이의 가격은 5송이 * 3달러 = 15달러입니다. 따라서 총 금액은 6달러 + 15달러 = 21달러입니다.
예시 문제: '5개의 키위와 2개의 수박을 구입했습니다. 각 키위의 가격은 0.6달러이고, 각 수박의 가격은 5달러입니다. 총 금액은 얼마입니까?' 해결 과정: 키위 5개의 가격은 5개 * 0.6달러 = 3달러입니다. 수박 2개의 가격은 2개 * 5달러 = 10달러입니다. 따라서 총 금액은 3달러 + 10달러 = 13달러입니다."
20. 출력 프라이머 사용: 원하는 출력의 시작 부분으로 프롬프트를 마무리합니다
21. 자세한 텍스트 작성을 위한 지시: "나에게 [주제]에 대해 자세한 [에세이/텍스트/문단]을 작성해주세요. 필요한 모든 정보를 추가하여 자세히 작성해주세요.
22. 특정 텍스트 수정/변경: "사용자가 보낸 모든 문단을 수정해주세요. 문법과 어휘만 개선하고 자연스럽게 들리도록 해야 합니다. 글쓰기 스타일을 변경해서는 안 됩니다(예: 공식적인 문단을 비공식적으로 만들지 마세요)."
23. 복잡한 코딩 프롬프트 처리: "앞으로 여러 파일에 걸쳐 코드를 생성할 때, 지정된 파일을 자동으로 생성하거나 기존 파일에 생성된 코드를 삽입하기 위해 실행할 수 있는 [프로그래밍 언어] 스크립트를 생성해주세요.
"""Python 스크립트를 생성해주세요. 이 스크립트는 다음과 같은 기능을 수행해야 합니다:
1. 'config.json'라는 이름의 새 JSON 설정 파일을 생성합니다. 이 파일에는 데이터베이스 연결에 필요한 설정 정보가 포함되어야 합니다.
2.기존 Python 프로젝트에 'db_connection.py'라는 새 파일을 추가합니다. 이 파일은 'config.json'에서 설정 정보를 읽어 데이터베이스에 연결하는 함수를 포함해야 합니다.
3. 'main.py'라는 기존 파일에 'db_connection.py' 모듈을 임포트하고, 데이터베이스 연결을 설정하는 코드를 추가해주세요."""
24. 특정 단어, 구문, 문장으로 텍스트 시작 또는 계속하기: "나는 시작을 제공합니다 [노래 가사/이야기/문단/에세이...]: [가사/단어/문장 삽입]'. 제공된 단어를 기반으로 마무리하세요. 일관된 흐름을 유지하세요."
25.모델이 콘텐츠를 생성하기 위해 따라야 하는 요구 사항 명확히 제시: 키워드, 규칙, 힌트, 지시사항 등의 형태로 요구 사항을 명확하게 제시합니다.
26.제공된 샘플과 유사한 텍스트 작성 지시:"제공된 문단[/제목/텍스트/에세이/답변]을 기반으로 동일한 언어를 사용해주세요"라는 지시를 포함합니다.
Prompt principle categories.
1. 프롬프트 구조 및 명료성 (Prompt Structure and Clarity)
- 의도된 청중을 프롬프트에 통합 (2)
- 'do'와 같은 긍정적 지시 사용, 'don't'와 같은 부정적 언어 피하기 (4)
- "단계별로 생각해보세요"와 같은 선행 단어 사용 (12)
- 원하는 출력의 시작 부분으로 프롬프트 마무리 (20)
- 구분 기호 사용 (17)
- 프롬프트 포맷팅: '###Instruction###'으로 시작, 필요한 경우 '###Example###' 또는 '###Question###' 이어서 사용 (8)
2. 특정성 및 정보 (Specificity and Information)
- 예시 기반 프롬프팅 (Few-Shot) 사용 (7)
- 특정 주제나 아이디어에 대한 명확한 설명 요청 (5)
- "답변이 편향되지 않고 스테레오타입에 의존하지 않도록 하십시오" 구문 추가 (13)
- 제공된 샘플과 유사한 텍스트 작성 지시 (26)
- 특정 단어, 구문, 문장으로 텍스트 시작 또는 계속하기 (24)
- 모델 요구 사항 명확히 제시 (25)
- 특정 주제나 아이디어에 대해 묻고 이해를 테스트하기 (15)
- 자세한 텍스트 작성을 위한 지시 (21)
3. 사용자 상호작용 및 참여 (User Interaction and Engagement)
- 모델이 필요한 정보를 질문을 통해 추출하도록 허용 (14)
- 자세한 텍스트 작성 지시 (21)
4. 내용 및 언어 스타일 (Content and Language Style)
- 특정 텍스트 수정/변경 지시 (22)
- 특정 구문 포함 (9, 10)
- 언어 모델에 역할 할당 (16)
- 자연스러운 언어 형태로 질문에 답하기 (11)
- LLM에게 예의 바른 표현 생략하고 직접적으로 핵심으로 들어가기 (1)
- 특정 단어나 구문 반복 사용 (18)
- 더 나은 해결책을 위한 금전적 보상 약속 (6)
5. 복잡한 작업 및 코딩 프롬프트 (Complex Tasks and Coding Prompts)
- 복잡한 작업을 간단한 프롬프트의 순서로 나누기 (3)
- 복잡한 코딩 프롬프트 처리 (23)
- 사고 과정 체인(CoT)와 Few-Shot 프롬프트 결합 (19)
Design Principles
- 간결성과 명확성: 일반적으로 지나치게 장황하거나 모호한 프롬프트는 모델을 혼란스럽게 하거나 관련 없는 응답을 유도할 수 있습니다. 따라서 프롬프트는 간결하면서도 작업에 기여하지 않는 불필요한 정보를 피하고, 모델을 안내하기에 충분히 구체적이어야 합니다. 이는 프롬프트 엔지니어링의 기본적인 원칙입니다.
- 문맥적 관련성: 프롬프트는 작업의 배경과 도메인을 이해하는 데 도움이 되는 관련 문맥을 제공해야 합니다. 키워드, 도메인별 용어 또는 상황 설명을 포함시키면 모델의 응답이 올바른 문맥에 뿌리를 두게 됩니다.
- 작업 정렬: 프롬프트는 수행해야 할 작업과 밀접하게 일치해야 하며, 모델에게 작업의 성격을 명확하게 나타내는 언어와 구조를 사용해야 합니다. 이는 질문, 명령 또는 작업의 기대 입력 및 출력 형식에 맞는 빈칸 채우기 문장으로 프롬프트를 구성하는 것을 포함할 수 있습니다.
- 예시 시연: 보다 복잡한 작업의 경우, 원하는 형식이나 응답 유형을 시연하기 위해 프롬프트 내에 예시를 포함시키는 것이 도움이 될 수 있습니다. 이는 "few-shot" 또는 "zero-shot" 학습 시나리오에서 입력-출력 쌍을 보여주는 것을 포함할 수 있습니다.
- 편향 피하기: 프롬프트는 모델의 훈련 데이터에 내재된 편향을 최소화하도록 설계되어야 합니다. 중립적인 언어를 사용하고 특히 민감한 주제에 대한 잠재적인 윤리적 함의에 주의를 기울여야 합니다.
- 점진적 프롬프팅: 일련의 단계가 필요한 작업의 경우, 프롬프트는 점진적으로 모델을 과정을 안내하는 구조로 되어 있을 수 있습니다. 작업을 일련의 프롬프트로 나누어 단계별로 모델을 안내하는 것입니다. 또한, 프롬프트는 모델의 성능과 반응, 그리고 반복적인 인간의 피드백 및 선호에 따라 조정 가능해야 합니다. 즉, 초기 출력과 모델 행동을 기반으로 프롬프트를 정제할 준비가 되어 있어야 합니다.
고급 프롬프트 설계: 더 복잡한 작업을 수행하기 위해 프로그래밍과 같은 논리를 프롬프트에 통합할 수 있습니다. 예를 들어, 조건문, 논리 연산자 또는 심지어 가짜 코드(pseudo-code)를 프롬프트 내에서 사용하여 모델의 추론 과정을 안내하는 것입니다.
이러한 원칙들은 LLM과의 상호작용을 최적화하고, 특정 작업에 적합한 응답을 유도하는 데 중요한 역할을 합니다. 프롬프트 디자인은 LLM이 점점 더 정교해짐에 따라 발전하는 분야이며, 연구자들은 프롬프트 엔지니어링을 통해 달성할 수 있는 한계를 계속해서 탐색함에 따라 이 원칙들을 더욱 세련되고 확장할 것입니다.