학습자료: 최고의 프롬프트 엔지니어링 강의(김진중)
프롬프팅 테크닉
프롬프팅이란? 원하는 결과를 더 정확하게 잘 이끌어내는 것을 목표로 프롬프트를 디자인하는 것
1. 예시 제공
모든 프롬프팅 기법 중 가장 기본이 되는 기법
- Zero-Shot(제로샷): 예제를 제공하지 않음
- One-Shot(원샷): 한 개의 예제를 제공
- Few-Shot(퓨샷): 두 개 이상의 예제를 제공
퓨샷은 간단하게는 2~3개, 본격적으로 사용할 때는 10개 이상의 예제를 제공
번역 같은 태스크의 경우에는 예제를 제공하는 것과 제공하지 않는 것의 성능 차이가 크지 않지만, 번역 스타일을 변경하는 등의 경우에는 퓨샷을 사용하는 것이 효과적
Prompt
고양이: 동물
오렌지: 과일
토마토: 식물
비둘기:
Output
조류
퓨샷은 파라미터(모델의 크기) 크기가 큰 LLM에서 훨씬 성능이 좋게 나옴
GPT-3.5 이상의 파라미터 크기를 가진 모델에서는 예제를 2~3개만 줘도 성능이 크게 향상됨
퓨샷은 정확한 답을 말해야 하는 산술 추론 문제에서는 적합하지 않음
대신 랜덤하게 분포되어 있는 레이블에서 가장 확률이 높은 답변을 골라내는 일에 적합
(예시: 패턴 인식을 통한 카테고리 분류, 감정 분석과 같은 간단한 언어 이해 작업)
예제는 최대한 다양한 종류로 제공할 필요가 있음
2. 생각 사슬(Chain of Thought, CoT)
LLM이 문제의 이유 혹은 추론 과정에 대해 직접 설명하도록 만들어 답변을 더 정확하게 생성하는 기술
기초적인 수학 문제일수록, 그리고 모델의 크기가 커질수록 CoT에 따른 문제 해결 성능이 크게 향상
제로샷 CoT는 다음과 같은 문구를 마지막에 추가함으로써 마치 CoT 예제를 제공하는 것과 같은 효과를 내어 성능을 향상시키는 방법
Let’s think step by step
차근차근 생각해 봅시다.
ChatGPT와 같이 OpenAI LLM 모델들 중 채팅 형식으로 답변하도록 학습된 모델에는 제로샷 CoT로 대답하는 것이 기본으로 적용되어 있음
단, 어떤 경우에는 오히려 성능이 떨어질 수도 있으므로 해당 문제를 풀기 위한 적절한 방법이 맞는지 여러 샘플을 통해 확인하는 과정이 반드시 필요
3. 자기 일관성(Self-Consistency)
CoT를 한 단계 더 발전시켜 동일한 문제에 대해 여러 가지 다른 추론 경로를 고려한 후 가장 일관되게 나온 답을 선택. 마치 여러 사람에게 각자 해결 방안을 생각해 보라고 한 뒤 가장 반복적으로 나온 답을 선택하는 과정과 유사
a. 간단한 사칙 연산을 계산하는 여러 가지 방법의 예제를 다양하게 제시(Q와 A가 한 세트)
b. 질문을 하면 LLM이 그 중 하나의 방식을 선택해서 답변
c. 답변을 여러 번 반복하게 하여 여러 개의 결과 도출
d. 가장 많이 나온 결과를 선택
각 CoT 경로는 문제 해결을 위한 하나의 독립적인 추론 과정
자기 일관성 기법에서 가장 중요한 것은 다양성. 즉, 하나의 문제에 대해 여러 가지 방식으로 접근하고 해결
논문 실험 결과에 따르면 자기 일관성은 약 20개 정도의 예제를 주는 것이 가장 효과적
- T: 온도. T값이 낮을수록 높은 확률을 가진 경로를 위주로 선택할 가능성이 커지며, T값이 높을수록 더 다양한 경로를 탐색할 가능성이 높음
- k: ‘top-k 샘플링’. 모델이 다음 단계에서 고려할 수 있는 가능한 경로의 최대 수를 제한.
- Greedy Decode: 매 단계에서 가장 확률이 높은 선택을 하는 방식. 다양성을 고려하지 않고 오직 가능성이 높은 결과만을 추구하기 때문에 때로는 전체적으로 최적이 아닌 선택을 할 가능성이 있음. 따라서 다른 방법들에 비해 정확도가 가장 낮게 나타남
파라미터 수가 많은 모델일수록 가장 효과적인 성능을 냄
작은 모델에서는 사용해도 큰 효과를 보지 못하기도 함
추론 경로를 최대한 다양하게 제공해야 하므로 토큰 수(프롬프트 길이)를 굉장히 많이 사용. 그리고 여러 번 실행한 결과를 취합하기 위한 후처리 작업도 필요하기 때문에 아주 정확한 결과가 필요한 경우에만 사용하는 것을 권장
4. 샘플링 투표(Sampling-and-Voting)
자기 일관성과 개념적으로 유사하지만 몇 가지 차이점 존재
- 복잡한 CoT 프롬프팅 대신 기본적인 지시를 사용하고 출력을 가공 없이 활용
- 단순히 출력 간 유사도를 계산하여 다수결로 답안을 선정
- 추론 작업뿐만 아니라 코드 생성 등 다양한 작업에 대해 일반화된 접근법
- 자기 일관성과 결합하여 상호 보완적으로 활용 가능
즉, 자기 일관성은 CoT 기반의 추론 작업 전용 방법인 반면, 샘플링 투표 방식은 더 일반화되고 단순화된 개념
샘플링 단계
작업에 대한 질의 혹은 지시를 LLM에게 N번 반복하여 출력 샘플을 다양하게 생성
이 때 다양한 출력을 얻기 위해 별도의 페르소나를 설정하거나 서로 다른 LLM 모델을 사용할 수도 있지만, 별도의 페르소나 설정 없이도 동일한 입력에 대해 같은 LLM을 단순히 반복 실행하는 방식을 사용해도 됨
투표 단계
각각의 샘플에 대한 다른 모든 샘플과의 유사도를 계산하여 누적된 유사도 점수 계산
유사도는 임베딩 벡터로 계산하거나 BLEU 점수(기계 번역 성능을 평가하기 위해 사용되는 지표) 등을 사용
객관식 문제에서는 답안의 출현 빈도수로 유사도 누적 점수를 계산
이를 통해 가장 높은 누적 유사도를 얻은 샘플을 최종 답변으로 선택
5. 선택 추론(Selection-Inference)
복잡한 문제를 해결하기 위해 여러 추론 단계를 연결하는 기술
선택과 추론 사이를 번갈아가면서 해석 가능한 원인-결과의 추론 단계를 생성하여 최종 답변을 이끌어 냄. 즉, 컨텍스트에서 답할 수 있는 정보를 먼저 선택한 다음 그 정보를 기반으로 답변하도록 만듦
여러 개의 컨텍스트를 먼저 주고 질문. 다만 질문에 바로 답변하게 하면 정확한 답변을 하지 않을 가능성이 높으므로, 질문과 관련된 내용을 컨텍스트에서 추출해 먼저 나열하고, 이 추출한 내용을 기반으로 답변하라고 지시.
Q: 이것은 “해리는 조용하지 않다”라는 문장이 참인지를 암시하나요?
질문의 답에 필요한 내용을 Context에서 추출해서 나열하세요.
→ Selection: 해리는 젊습니다. 모든 조용한 사람들은 젊습니다. 만약 누군가가 조용하다면 그들은 흰색입니다.
→ Selection의 내용에 기반해 Question에 대해 답하세요.
A: 아니오. 해리는 조용하지 않다는 문장은 참이 아닙니다.
선택 추론은 추론 흔적이 남기 때문에 답변의 인과관계를 해석할 수 있어 오류 원인을 분석해야 하는 디버깅에도 유용.
다만, 실제 케이스에 구현하려면 추론 단계를 생성하고 종료하는 프레임워크를 굉장히 세심하게 구성해야 함
6. 최소에서 최대로(Least-to-Most)
하나의 문제를 더 작은 여러 개의 하위 작업으로 분할하는 기법
‘{주어진 문제}를 풀려면 먼저 다음 문제를 풀어야 합니다.’라는 프롬프트로 다음 문제(질문)를 생성하고, 해당 질문을 통해 답을 생성하는 과정을 최종 답변이 생성될 때까지 반복
하위 작업들은 한 번에 하나씩 해결되며, 이전에 생성한 답은 다음 문제를 해결하는 데 사용
1)
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
Question: 그녀가 문이 닫히기 전에 몇 번 미끄러질 수 있을까요?
이 문제의 답을 하기 위해 먼저 풀어야 할 하위 질문을 하나 만들어 주세요.
→ 영희가 미끄럼틀을 한 번 오르고 내려오는 데에는 총 몇 분이 걸리나요?
2)
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
Question: 영희가 미끄럼틀을 한 번 오르고 내려오는 데에는 총 몇 분이 걸리나요?
→ 영희가 미끄럼틀을 한 번 오르고 내려오는 데에는 총 5분이 걸립니다. (4분 오르기 + 1분 내려오기 = 5분)
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
3)
Question: 영희가 미끄럼틀을 한 번 오르고 내려오는 데에는 총 몇 분이 걸리나요?
Answer: 영희가 미끄럼틀을 한 번 오르고 내려오는 데에는 총 5분이 걸립니다. (4분 오르기 + 1분 내려오기 = 5분)
여기에 추가로 ‘단계적으로 생각해 보세요.’라는 제로샷 CoT까지 접목 가능
4)
Context: 영희가 미끄럼틀 꼭대기까지 올라가는 데 4분이 걸립니다. 그녀가 내려오는 데는 1분이 걸립니다. 미끄럼틀이 15분 후에 문을 닫습니다.
Question: 영희가 미끄럼틀을 한 번 오르고 내려오는 데에는 총 몇 분이 걸리나요?
Answer: 영희가 미끄럼틀을 한 번 오르고 내려오는 데에는 총 5분이 걸립니다. (4분 오르기 + 1분 내려오기 = 5분)
Question: 그녀가 문이 닫히기 전에 몇 번 미끄러질 수 있을까요? 단계적으로 생각해 보세요.
→ 문이 닫히기까지 남은 시간은 15분입니다. 영희가 미끄럼틀을 오르고 내려오는 데에는 5분이 걸리므로 15분을 5분으로 나누면 3번 미끄러질 수 있습니다.
최소에서 최대로 기법은 CoT와 선택 추론을 결합한 방법
이런 접근 방식은 자율 실행 에이전트(Autonomous Agent) 개발에도 중요한 의미를 지님. 에이전트가 복잡한 환경에서도 독립적으로 작업을 수행하고 문제를 해결할 수 있도록 함.
7. 리액트(ReAct)
실행 계획을 유도하고 추적하여 작업별로 실행할 액션을 선택해 실행하는 방법
외부 API와 상호 작용하여 검색 엔진을 통해 신뢰할 수 있는 정보를 사용하거나, 계산기나 이미지 생성 도구 등을 사용하기도 함
a와 b의 프롬프트를 조합해서 제작
1) 어떤 상황에서 어떤 도구를 사용할지(어떤 행동을 할지) 알려주는 프롬프트
2) 주어진 도구를 사용하는 예시
a. 생각, 행동, 관찰 단계를 번갈아가며 질문 응답 작업을 해결합니다. 생각은 현재 상황에 대해 추론할 수 있고, 행동은 세 가지 유형이 있습니다.
(1) Search[entity], 이는 위키백과에서 정확한 엔티티를 검색하고 존재하는 경우 첫 번째 문단을 반환합니다. 존재하지 않는 경우 검색할 수 있는 유사한 엔티티를 반환합니다.
(2) Lookup[keyword], 이는 현재 문단에서 키워드를 포함하는 다음 문장을 반환합니다.
(3) Finish[answer], 이는 답을 반환하고 작업을 마칩니다.
b. 다음은 몇 가지 예입니다.
-
질문: 콜로라도주 오로제니의 동쪽 부분이 확장되는 지역의 고도 범위는 어떻게 되나요?
생각 1: 콜로라도주 오로제니를 검색하고, 콜로라도주 오로제니의 동쪽 부분이 확장되는 지역을 찾은 다음, 그 지역의 고도 범위를 찾아야 합니다.
행동 1: Search[콜로라도주 오로제니]
관찰 1: 콜로라도주 오로제니는 콜로라도주와 주변 지역에서 산맥 형성(오로제니)의 한 단계였습니다.
생각 2: 동쪽 부분에 대해 언급하지 않았습니다. 그래서 동쪽 부분을 찾아봐야 합니다..
행동 2: Lookup[동쪽 부분]
관찰 2: (결과 1/1) 동쪽 부분은 고원 지대로 확장되며 이를 중앙 평원 오로제니라고 합니다…
생각 3: 콜로라도 오로제니의 동쪽 부분은 고원 지대로 확장됩니다. 따라서 고원 지대를 검색하고 그 고도 범위를 찾아야 합니다.
행동 3: Search[고원 지대]
관찰 3: 고원 지대는 두 가지 명확한 땅의 지역 중 하나를 가리킵니다:
생각 4: 대신 고원 지대 (미국)을 검색해야 합니다..
행동 4: Search[고원 지대 (미국)]
관찰 4: 고원 지대는 대평원의 부분 지역입니다. 동쪽에서 서쪽으로, 고원 지대의 고도는 약 1,800ft에서 7,000ft(550m에서 2,130m)로 상승합니다.
생각 5: 고원 지대는 고도가 약 1,800ft에서 7,000ft로 상승하므로 답은 1,800ft에서 7,000ft입니다.
행동 5: Finish[1,800ft에서 7,000ft]
실제 서비스에서 검색 엔진을 사용할 때는 프롬프트를 분할해서 실행
a. 행동까지의 부분을 LLM에게 요청
b. LLM이 행동 부분에 있는 Search 부분을 출력하면 키워드를 실제 위키피디아에서 검색(이 기능은 별도 프로그램으로 만들어 실행)
c. 해당 기능을 실행해 검색 결과를 가져옴
d. 관찰 부분에 해당 결과를 넣어주고 최종 결과 생성
단, 리액트는 정보를 반복적으로 생성하거나 수집하여 프롬프트에 추가하는 방법이기 때문에 프롬프트가 길어질 수 있어 토큰 제어에 유의해야 함
8. 자기 평가(Self Evaluation)
LLM이 생성한 결과를 LLM이 스스로 평가하게 하여 오류를 잡거나 결과를 향상시키는 기법
데이터 생성 자동화, RLHF의 AI 피드백, 프롬프트 평가 자동화 등에서 데이터셋이나 LLM의 결과를 스스로 조정하여 향상시킬 수 있음
a. 질문을 통해 답변 생성
b. LLM에게 생성한 답이 맞는지 단계적으로 생각하게 하고, 답변이 틀렸다면 그 이유를 설명하도록 함
c. 처음 질문과 답변, 그리고 자기 평가 프롬프트와 처음 답변을 검토한 내용을 모두 넣고 스스로 평가한 답변을 기반으로 질문에 다시 답변하도록 함
1)
9+10x3을 계산하세요. 다음 포맷으로 답변하세요.
Answer: {number}
→ Answer: 27
2)
답변을 맞게 했는지 단계적으로 생각해 보세요.
당신의 답변이 틀렸다면 틀린 이유를 설명하세요.
설명만 작성하세요. 그 외의 부가적인 말은 하지 마세요.
→ 9+10x3을 계산하는 과정은 다음과 같습니다.
1. 곱셈을 먼저 계산합니다. 10x3=30
2. 덧셈을 계산합니다. 9+30=39
따라서 정답은 39입니다.
3)
당신의 평가를 참고하여 처음 질문에 대한 답변을 다시 하세요.
다음 포맷으로 답변하세요.
Answer: {number}
→ Answer: 39
자기 평가 기법은 어떤 고정된 형태의 프레임워크가 존재하는 것은 아님
스스로 평가한다는 개념으로 자기 비판, 원칙 기반 AI 등 다양한 방식으로 응용될 수 있음
'프롬프트 엔지니어링' 카테고리의 다른 글
[프롬프트 엔지니어링 기초] 프롬프트 엔지니어링 테크닉(2) (0) | 2025.04.07 |
---|---|
[프롬프트 엔지니어링 기초] 프롬프트 엔지니어링 과정 (0) | 2025.03.30 |
[프롬프트 엔지니어링 기초] LLM, 프롬프트 엔지니어링 (0) | 2025.03.28 |