Prompt 를 만들 때 제일 중요한 3가지 요소는 이거라고 한다:
- 답변을 위한 컨택스트
- 명확한 지시
- 결과물의 형식
Prompt 를 설계할 때는 내가 어떤 결과를 얻고 싶은지 부터 시작한다. 원하는 결과를 구체화하고, 원하는 형식을 지정해보고, 평가할 수 있는 기준을 만들어야한다.
평가할 수 있는 기준으로는 내가 이렇게 질문 헀을 때 "이런 내용이 포함되어야 해" 가 될 수 있겠다. 그러니까 내가 알고 있는 사실이어야 함. LLM 의 답변을 내가 평가해야하니까.
그리고 역으로 함정를 파놓고 이렇게 질문했을 때는 이런식으로 답변하면 안돼. 이런식으로도 평가 요소를 준비하면 될 듯하다.
또 프롬포트가 사실에 기반해서 대답을 하는지 평가하기 위해서 정확하고 객관적인 사실들을 준비해놓아야한다.
이런식으로 준비해놓고 앞의 Prompt 3가지 기준에 따라서 가공해서 원하는 결과가 나올 때까지 프롬포트를 설계하면 된다.
프롬포트 설계가 끝난 후에는 내가 프롬포트를 개발할 때 사용했던 예시들과 만족했던 결과들은 그래도 가지고 있는게 나을듯하다. 나중에 다른 LLM 에서도 써볼 수 있을거니까. (예시가 더 많아도 좋을듯 함)
그러나 이렇게만 제시하면 어떻게 프롬포트를 시작해야 할 지 막막할 수 있음. 그래서 프롬포트 디자인 프레임워크라는 것도 있다.
프롬포트 디자인 프레임워크:
- Role (역할)
- Audience (독자)
- Knowledge/Information (지식/정보)
- Task/Goal (작업/목표)
- Policy/Rule, Style, Constraint (정책/규칙, 스타일, 제한조건)
- Format/Structure (형식/구조)
- Example (예시)
이런 디자인 프레임워크를 제공해 준 건 인간에게도 이런 식으로 주면 훨씬 더 대답 잘할 것 같다.
역할부터 하나씩 보자. 역할은 페르소나를 씌우는 건데 실제로 너가 이런 사람이라고 생각해달라고 하는거임. 메소드 연기 같은 걸 부탁하는 것.
예시로는 다음과 같다:
당신은 법률 전문가입니다. 법률 관련 질문에 답하십시오.
당신문 신문 기자입니다. 주요 뉴스 이벤트에 대한 보고를 작성하세요.
독자를 명시하는 건 LLM 이 누구에게 설명할 지 아는 것과 같다. 우리가 글을 쓰는 것도 누구에게 말을 하느냐에 따라 결과가 달라질 것이기 때문에 독자 명시도 필요함.
예시로는 다음과 같다:
초등학생에게 태양계의 행성에 대해 설명하세요.
트럼펫 초보자들을 위해 연습 팁을 제공해주세요.
지식과 정보를 제공하는 건 LLM 에게 대답을 하는데 필요한 팩트 정보들을 제공해주는 걸 말한다. 이런 정보들을 제공해주지 않늗나면 학습에서 사용했던 정보들을 기반으로 대답할거임.
데이터는 시간에 따라서 변화하기도 하니까 필요한 컨택스트 데이터를 제공해주면 훨씬 더 대답을 잘할거임.
예시로는 다음과 같다:
위키피디아의 내용에 따라서 나폴레옹에게 설명해주세요.
수행해야 할 명확한 작업이나 목표 제시는 너무나 당연한 것. 지시를 해야 행동을 하겠지. 중요한 건 한번에 하나의 지시만 하는게 헐씬 좋음.
그리고 명확한 지시를 하는게 중요하다.
그리고 작업을 위한 구체적인 하위 목표를 제시하는 것도 도움이 될 수 있다.
예시:
다음 하위 작업을 고려해서 자기소개서를 작성해주세요.
- 서론, 본론, 결론으로 나누어서 작성해주세요.
- 경험, 성과, 개인적 성장 등 구체적 사례를 들어서 설명력을 높여주세요.
정책 및 규칙 스타일 가이드나 제약 사항은 일관된 응답을 만들 때, 주의해야할 것들을 명시하는데 사용할 수 있음.
건설적인 피드백을 제공하면서 에세이를 평가해주세요.
사실 기반의 정보만을 사용해서 뉴스 보고서를 작성해주세요.
여기서 특정 톤이나 유머, 감정 등의 스타일을 지정할 수 도 있음.
유머러스한 톤으로 생일 축하 메시지를 작성해주세요.
마지막으로 예시를 제공해주면 예시에 맞춰서 훨씬 대답을 잘해줄거임.
그럼 이 모든 것들을 고려해서 작성한 프롬포트 예시를 하나 보자. 이 예시는 영어 선생님으로 빙의해서 학승들에게 나폴레옹에 대해 알려줄거임.
당신은 친근한 영어 선생님입니다.
다음 내용을 참고해서 학생들에게 나폴레옹 보나파르트에 대해 설명해주세요.
<나폴레옹에 대한 정보>
</나폴레옹에 대한 정보>
<답변을 할 때 참고해야하는 규칙>
- 친근하고 교육적인 톤으로 작성
- 단순하고 이해하기 쉬운 영어로 작성
- 3분 안에 읽을 수 있는 길이로 작성
</답변을 할 때 참고해야하는 규칙>
<답변 결과 포맷>
User: 나폴레옹이 누구야?
Assistant: 나폴레옹 보나파르트는 18세기 말과 19세기 초에 프랑스를 지배한 역사적 인물이에요.
...
</답변 결과 포맷>
그리고 이런 프롬포트 디자인 프레임워크는 칼 웨이크 (Karl Weick) 가 작성한 효과적인 의사소통을 위한 규칙과도 많은 연관이 있다고 함.
칼 웨이크의 의사소통 원칙:
- 상황 (Situation)
- 과제/작업 (Task)
- 의도 (Intent)
- 우려/고려사항 (Concerns)
- 조정 (Calibrate)
보면 조정은 두 사람의 작업을 맞추기 위해서 균형을 찾는 거라서 제외해보면 상황과 의도 그리고 우려와 고려사항은 어떻게 보면 맥락에 대한 정보라고 보인다.
Context 에는 이런 정보를 좀 더 생각해보면 될 듯.
- 상황에는 현재 상황에 대해 말해주고, 이 일이 필요한 배경에 대해 말해주고
- 의도는 바라는 것들을 좀 더 말해주면 되고
- 우려사항이나 고려사항도 말해주면 훨씬 더 잘하지 않을까?
Prompt Technique Top 8
여기서는 Prompting 을 만드는 방법에 대해 자주 사용되는 기술들에 대해서 소개함:
- 예시를 제공하는 기법:
- Zero-shot
- One-shot
- Few-shot
- COT (Chain-of Thought):
- Self Consistency
- Sampling and voting
- Generated Knowledge Prompting
- Selection Inference
- Least to Most
- ReAct
- Self Evaluation
- Tree of Thoughts (ToT)
- Plan and Solve Prompting
예시 제공은 생략하고, 하나씩 보자.
COT
모델에게 생각하는 시간, 생각하는 방법을 제공해주는 기법임.
이렇게하면 복잡한 추론이나 작업에 더 잘 대답하게 됨. 당연하다. 사람에게 세자리 수 곱하기를 묻는 것과 유사함. 사람에게도 시간을 주면
잘 대답하듯이 LLM 에게도 시간을 주고, 논리 과정을 주면 훨씬 더 대답을 잘한다.
대표적인 COT 예시로는 다음과 같다.
Q: 로저는 5개의 테니스 공이 있습니다. 그는 테니스 공이 들어간 두 개의 캔을 샀고, 각각의 캔에는 3개의 공이 들어있습니다. 이때 테니스 공의 총 개수는?
A: (여기서 어떻게 계산하는지 알려주는 것입니다.) 로저는 5개의 공으로 시작했고, 2개의 캔에는 각각 3개의 공이 들어있으니 총 6개의 공이 있습니다. 그러므로 5 + 6 = 11 입니다.
Q: (이제 내가 물어보고 싶은 문제를 작성합니다.) 카페에는 23개의 사과가 있습니다. 20개는 점심에 사용했고, 6개를 추가로 샀습니다. 이때 사과의 총 개수는?
생각 과정을 제공해주면 좋겠지만 제공할 수 없는 경우에는 Zero shot 으로 주는 방법도 있다. Let's think step by step
를 쓰는 것 만으로도 성능이 많이 올라간다고 함.
Self-Consistency
이 방법은 COT 의 확장형인데, 다양한 추론을 해보고 가장 좋은 답변을 선택하는 방법임.
기존의 COT 는 모델은 하나의 경로를 따라가며 답변을 생성하는 반면에 이 방법은 다양한 경로를 탐색한 이후에 답변을 완료짓는다.
Self-Consistency 프롬포트 예시는 다음과 같다:
이거는 다양한 추론 경로를 탐색해보고 나서 가장 일관적인 답변 (the most consistent answer) 을 고르는 거라고 하는데 다수결로 투표를 내리는 것 같음.
근데 다수결이 항상 정확하지는 않다고 생각하기도 한다.
이 프롬포트를 좀 더 응용해볼 수도 있곘다라고 생각함.
여러 추론 경로를 탐색하고, 각자만의 답변을 내보고 중재자가 최종적으로 여러 의견을 들어보고 선택하는거지. 이 경우에는 여러 LLM 을 써봐야할듯.
그리고 논문에 따르면 다양한 추론 탐색 경로는 20개 정도 넣었을 때가 가성비 있게 성능이 좋았다고 함.
Sampling and voting
이 방법은 Self-Consistency 방법인 다양한 추론 경로를 여러 LLM 으로 확장시키는 방법임.
같은 질문에 대해서 여러 LLM 의 답변을 보고나서 가장 좋다고 생각하는 답변을 고르는 방식이다. 앙상블 접근 방법임.
최종 결과를 고를 때는 작업 유형에 따라 다를 수 있겠지만 일반 텍스트 생성 같은 경우는 유사도를 기준으로 결정한다.
1번 LLM 의 답변이 다른 LLM 들과 유사도를 비교했을 때 큰 차이가 난다면 고르지 않는거임. 유사도 비교했을 때 제일 답변이 좋은 애가 선택되는 것.
이것도 논문을 봤을 떄 앙상블의 개수가 20개 정도에 도달하면 그 이후부터는 성능이 크게 개선되지 않다고 함.
5개 정도가 적합하지 않을까 생각된다.
Generated Knowledge Prompting
LLM 이 더 정확한 예측을 하기 위해서 답변을 하기 전에 먼저 지식을 생성한 이후에 답변을 하는 과정을 말한다.
이렇게 하면서 생각하는 시간을 버는 거긴 하다. 다만 모델이 학습한 데이터에 의존적인 경향이 있다고 생각함.
Selection Inference
복잡한 질문이 주어질 경우에 바로 답하면 틀리므로, 일단 주어진 맥락 속에서 답할 수 있는 부분을 먼저 선택 (Selection) 하고 추론을 한다.
그 다음에 추론한 내용을 바탕으로 한번 더 이어서 추론 할 수 있는지 보거나, 그걸 바탕으로 답변으로 작성하는 기법을 말함.
연쇄적으로 이어서 깊은 사고가 필요한 경우에는 이런 방식의 프롬포팅이 도움이 될 수 있을듯.
프롬포트 예시는 다음과 같다:
Context:
- 만약 누군가가 조용하다면 그들은 흰색이다.
- 만약 누군가가 젊고 빨갛다면 그들은 흰색이다.
- 젊은 사람들은 친절하다.
- 만약 누군가가 친절하다면 그들은 둥글다.
- 모든 조용한 사람들은 젋다.
- 빨갛고, 큰 사람들은 친절하다.
- 둥근, 빨간 사람들은 흰색이다.
- 만약 누군가가 둥글다면 그들은 조용하다.
- 해리는 젊다.
- 밥은 빨강이다.
- 밥은 크다.
Question: 이것은 "해리가 조용하지 않다" 라는 문장이 참인건가?
질문의 답에 필요한 내용을 Context 에서 추출해서 나열하세요.
이렇게 프롬포트가 온다면 추론할 수 있는 부분만 선택한다.
해리는 젊다.
젊은 사람은 친절하다.
모든 조용한 사람들은 젊다.
만약 누군가가 조용하다면 그들은 흰색이다.
이제 여기서 답변을 작성한다. 물론 완전히 추론이 끝난게 아니겠지만 이 정도에서 답변을 작성해도 올바르게 답한다.
Least to Most
이 방법은 하나의 복잡한 문제를 풀기 위해서는 이 작업들은 순서대로 먼저 해결해야한다는 걸로 명시해서 답변을 작성하는 프롬포트 기법임.
순서대로 문제를 해결해서 최종적인 답변을 만들어내는 방식이라서 복잡한 추론 문제에 특히 강하다.
다음 예시 프롬포트가 있다고 가정해보자.
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
Question: 그녀가 문이 닫히기 전까지 몇 번 미끄럼틀을 탈 수 있을까요?
이런 문제가 있다면 Least to Most 프롬포트 기법은 바로 답변을 작성하도록 만드는 것이 아니라 한 번 올라갔다 내려오는데는 몇 분 걸리는지를 먼저 생각하도록 만드는 거임. 그리고 답변을 작성하도록 하는 것.
Least to Most 프롬포트는 이 예시를 이렇게 바꿀 것이다.
1) 문제를 풀기 위해 하위 문제를 생성한다.
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
Question: 그녀가 문이 닫히기 전까지 몇 번 미끄럼틀을 탈 수 있을까요?
이 문제의 답을 하기 위해 먼저 풀어야 하는 하위 질문을 만들어주세요.
Answer:
영희가 미끄럼틀을 한 번 오르고 내려오는 데는 총 몇분이 걸리나요?
2) 하위 문제에 대한 답을 생성한다.
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
Question: 영희가 미끄럼틀을 한 번 오르고 내려오는 데는 총 몇분이 걸리나요?
Answer:
영희가 미끄럼틍를 한 번 오르고 내려오는 데에는 총 5분이 걸립니다.
3) 이제 문제에 대한 질문을 보낸다.
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
Question: 영희가 미끄럼틀을 한 번 오르고 내려오는 데는 총 몇분이 걸리나요?
Answer: 영희가 미끄럼틍를 한 번 오르고 내려오는 데에는 총 5분이 걸립니다.
Question: 그녀가 문이 닫히기 전까지 몇 번 미끄럼틀을 탈 수 있을까요?
Answer:
문이 닫히기까지 남은 시간은 총 15분입니다. 영희가 미끄럼틀을 오르고 내려오는 데에는 5분이 걸리므로 총 3번 탈 수 있습니다.
이런식으로 Least to Most 프롬포트를 이용할 수도 있지만 좀 더 일반화하면 다음 방식으로도 할 수 있음.
To solve {question}, we need to first solve:
ReAct
ReAct 방법은 Agent 에서 주로 사용하는 방법으로 LLM 에게 도구를 주었을 때, 해당 문제를 해결하기 위해 무엇을 해야하는지 생각해보게 하고, 주어진 도구를 통해서 행동을 한 후 이어서 다시 문제를 해결해보기 위해서 무엇을 해야하는지 생각해보는 식으로 처리하는 방법을 말한다.
LLM 에게 실행 계획을 세우도록 하고, 주어진 도구로 행동하게 만들어서 답변을 작성하는 방법이다.
도구로는 계산기, 검색 엔진, 위키 피디아 검색 등을 제공해줌.
ReAct 의 언어 자체는 Reasoning + Act 임. 이것처럼 문제를 해결해보기 위해 추론하고, 행동하고 하는 걸 말한다.
ReAct 예시 처리하는 프롬포트는 이렇게 진행될 것이다.
- 마지막 5번째 단계는 Finish 단계로 답변을 생성하는 단계임. 이정도면 이제 답변을 생성할 수 있다고 추론하면 Finish 라는 도구를 선택해서 답변을 작성하게 된다.
- 밑의 예시 프롬포트를 보면 Thought 1
5 그리고 Action 15 까지 모두 있는데, 처리되는 과정을 생각해보면 Question 을 보고 Thought 1을 생각한 후 Action 을 하게 되고 Action 의 결과를 가져오고 다시 생각해보기 위해 Observation 1 이 프롬포트에 추가된다. 그리고 이제 이 단계에서 LLM 에게 이 프롬포트를 전닳해주면 다음으로 Thought 2 를 생각해보고, Action 2 를 실제로 해보고 해당 결과인 Observation 2 를 추가하는 식으로 처리가 이어짐.
Question What is the elevation range for the area that the eastern sector of the
Colorado orogeny extends into?
Thought 1 I need to search Colorado orogeny, find the area that the eastern sector
of the Colorado orogeny extends into, then find the elevation range of the
area.
Action 1 Search[Colorado orogeny]
Observation 1 The Colorado orogeny was an episode of mountain building (an orogeny) in
Colorado and surrounding areas.
Thought 2 It does not mention the eastern sector. So I need to look up eastern
sector.
Action 2 Lookup[eastern sector]
Observation 2 (Result 1 / 1) The eastern sector extends into the High Plains and is called
the Central Plains orogeny.
Thought 3 The eastern sector of Colorado orogeny extends into the High Plains. So I
need to search High Plains and find its elevation range.
Action 3 Search[High Plains]
Observation 3 High Plains refers to one of two distinct land regions
Thought 4 I need to instead search High Plains (United States).
Action 4 Search[High Plains (United States)]
Observation 4 The High Plains are a subregion of the Great Plains. From east to west, the
High Plains rise in elevation from around 1,800 to 7,000 ft (550 to 2,130
m).[3]
Thought 5 High Plains rise in elevation from around 1,800 to 7,000 ft, so the answer
is 1,800 to 7,000 ft.
Action 5 Finish[1,800 to 7,000 ft]
...
Self Evaluation
이 방법은 LLM 이 생성된 답안에 대해서 스스로 평가해보고 올바르게 작성했는지 생각해보게 하고 개선해나가는 과정임.
어떤 명확한 프레임워크는 없음.
작업의 종류마다 Evaulation 하는 방법은 약간씩 다를 것.
수학 문제라고 한다면 이 답이 맞는지 단계적으로 풀이 과정을 작성해보고 맞는지 틀린지 검토해보게 만들 수 있을 것이고
LLM 이 질문에 대해서 유용한 답변을 했는지 평가하기 위해서라면 Honest, Helpful, Harmless 하게 답변했는지 검토하게 만들 수 있을거임.
Tree of Thoughts (ToT)
ToT 는 트리 구조로 다양한 추론 경로를 탐색해보고, 평가해보고 더 나아갈지 생각도 해보는 식으로 동작하는 프롬포트 기법임.
Hulbert 가 제안한 ToT 프롬포트 예시로 보면 좀 더 이해하기 쉬움.
Imagine three different experts are answering this question.
All experts will write down 1 step of their thinking,
then share it with the group.
Then all experts will go on to the next step, etc.
If any expert realises they're wrong at any point then they leave.
The question is...
그러니까 3명의 전문가가 있다고 생각해보고 각 질문에 대해서 단계별로 답변을 작성하도록 한다. Step 1의 단계에서 전문가들이 답변을 작성했다면 이제 Step 2 로 넘어간다.
Step 2 에서 각 전문가들은 이전에 자신을 포함한 전문가들이 답변했던 내용을 가지고 이어서 답변을 작성하도록 한다.
이런식으로 깊은 사고를 해보는 거임. 만약 이 추론이 잘못되었다고 판단한다면 해당 탐색 경로는 그만둔다.
트리 구조에서 여러 분기가 생기므로 답변의 개수 자체는 여러개가 생길 수 있다.
논문을 보면 해당 탐색 과정의 매커니즘에 대해서 좀 더 자세하게 나와있음.
Plan and Solve Prompting
답변을 작성하기 전에 먼저 풀어야되는 사전 과제들을 모두 명시해놓고 하나씩 해결한 뒤에 답변을 작성하는 매커니즘임.
Least to Most 방법이 하위 문제를 생각하고 풀도록 하고 답변을 생성해나간 방식인데 이것과 유사한 점이 많음.
다음 프롬포트 처럼 사용하면 된다.
Perform the following actions: step1: … , step2: … step3: … 이렇게 step을 명시하는 방법
Prompt 작성 Tips
이외의 프롬포트 작성 팁
- 같은 종류의 프롬포트라고 했을 때 지시문의 위치에 따라서도 응답이 달라질 수 있다고 함. 그래서 지시문의 위치를 변경해보는 것도 도움이 될 수 있다.
- 지시문을 명확하게 반복적으로 작성하는 것도 도움이 될 수 있음.
- 보다 명확한 단어로 바꾸는 것도 도움이 될 수 있다.
- 전문가 Role 을 주면 훨씬 더 대답을 잘한다.
- 원하는 결과가 나올 때까지 반복하는게 중요하다.
References:
- 개념 이해로 시작하기 좋은 최고의 프롬프트 엔지니어링 강의
- https://www.promptingguide.ai/techniques
'Generative AI > Prompt Engineering' 카테고리의 다른 글
Prompt Evaluation 가이드 (0) | 2024.09.06 |
---|---|
The Prompt Report: A Systematic Survey of Prompting Techniques (0) | 2024.08.28 |
Flow Engineering is all you need (0) | 2024.06.22 |
Prompt Engineering with Llama 2 & 3 (0) | 2024.06.19 |
Prompt Engineering 이란? (0) | 2024.06.04 |