같은 모델, 같은 질문이라도 "어떻게 묻느냐"에 따라 답의 질이 천차만별이다. "글 좀 써줘"와 "초등학교 4학년이 이해할 수 있게, 5문장으로, 친근한 말투로 광합성을 설명해줘"는 완전히 다른 결과를 낳는다. 이 "모델에게 잘 묻는 기술"이 프롬프트 엔지니어링(prompt engineering) 이다.
생성형 AI 는 모델을 새로 학습시키지 않아도 프롬프트만 잘 쓰면 원하는 결과의 상당 부분을 얻을 수 있다.
학습·파인튜닝은 비싸고 느린 데 비해, 프롬프트는 즉시 바꿀 수 있고 추가 학습 비용이 없다. 그래서 AIF 시험에서 "가장 빠르고 비용이 적게 드는 개선 방법"을 물으면 프롬프트 엔지니어링이 답이 된다.
좋은 프롬프트는 운이 아니라 구조에서 나온다. 보통 다음 요소들을 명확히 담는다.
요소
설명
예시
지시(Instruction)
무엇을 해야 하는지
"다음 리뷰의 감정을 분류하라"
맥락(Context)
배경 정보
"우리는 가전 쇼핑몰이다"
입력 데이터(Input)
처리할 대상
"리뷰: '배송이 너무 느렸다'"
출력 형식(Output format)
답의 형태
"긍정/부정/중립 중 한 단어로만"
막연한 "이거 분석해줘"보다, 위 요소를 채운 프롬프트가 훨씬 안정적인 결과를 낸다. 핵심 원칙은 네 가지다.
구체적이고 명확하게: "짧게"보다 "3문장 이내로".
역할 부여(persona): "너는 친절한 고객 상담원이다"처럼 역할을 주면 톤이 잡힌다.
출력 형식 지정: JSON, 표, 불릿 등 원하는 형태를 명시하면 후처리가 쉽다.
예시 제공: 원하는 답의 본보기를 보여주면 적중률이 올라간다(Few-shot).
프롬프트 엔지니어링이 효과적인 이유는 LLM 이 "지시를 따르도록(instruction-tuned)" 추가 학습돼 있기 때문이다. 사전학습만 한 raw 모델은 단순히 다음 토큰만 이어붙이지만, 사람의 피드백으로 정렬(RLHF, 인간 피드백 기반 강화학습)된 모델은 "요청을 이해하고 따르는" 행동을 학습했다. 그래서 명확한 지시와 형식을 줄수록 모델이 그 패턴에 맞춰 응답을 정렬한다. 프롬프트는 모델의 가중치를 바꾸지 않고, 단지 "어떤 출력 분포를 끌어낼지" 조건을 거는 행위다.
네 요소가 실제로 무엇을 바꾸는지 한 프롬프트를 단계별로 고치며 본다. 상황은 쇼핑몰 리뷰를 분류해 담당 부서로 넘기는 일이다.
단계
프롬프트
무엇이 나아졌나
0. 막연함
"이 리뷰 좀 봐줘: 배송이 일주일 걸렸고 상자가 찌그러져 왔어요"
무엇을 하라는지 없어 감상문·요약·사과문 중 무엇이 나올지 모른다
1. 지시 추가
"다음 리뷰의 불만 유형을 분류하라"
할 일은 정해졌지만 유형 이름이 매번 달라진다
2. 맥락 추가
"우리는 가전 쇼핑몰이고 부서는 배송·제품·결제·기타다"
선택지가 고정돼 부서 이름과 맞는다
3. 출력 형식
"배송/제품/결제/기타 중 한 단어로만 답하라"
프로그램이 그대로 받아 쓸 수 있다
4. 예외 처리
"판단할 수 없으면 '기타'라고 답하라"
억지로 지어내는 답이 줄어든다
3단계의 "한 단어로만"은 출력 토큰도 줄인다. 형식을 좁히면 품질과 비용이 함께 좋아지는 경우가 많다.
4단계처럼 모를 때의 기본 답을 정해 주는 것은 환각을 줄이는 대표적인 프롬프트 기법이다.
"~하지 마라"를 명시하는 것을 네거티브 프롬프트(negative prompt) 라고 한다. "가격은 언급하지 마라", 이미지 생성에서 "글자·워터마크는 넣지 마라"처럼 원치 않는 요소를 빼는 지시다. 시험 가이드는 맥락·지시와 함께 이것을 프롬프트의 구성 개념으로 든다.
실제 서비스에서는 사용자가 프롬프트 전체를 쓰지 않는다. 개발자가 틀을 만들어 두고 사용자 입력만 끼워 넣는다.
다음 {{문서 종류}} 의 감정을 {{선택지}} 중 하나로 분류하라.
텍스트: {{사용자 입력}}
답:
이렇게 바뀌는 자리만 비워 둔 틀이 프롬프트 템플릿이다. 지시·맥락·예시·형식은 고정하고 입력만 갈아 끼우므로 결과가 일관된다.
템플릿도 코드처럼 고치면 결과가 달라진다. 그래서 버전을 남기고 비교해야 한다. Amazon Bedrock 의 Prompt Management(프롬프트 관리) 는 프롬프트를 만들어 저장하고, 변수(자리 표시자)를 넣고, 여러 변형(variant)의 출력을 나란히 비교하고, 버전을 남겨 애플리케이션에 배포하는 기능이다.
시험에서 "프롬프트를 팀이 재사용하고 변경 이력을 관리하고 싶다"가 나오면 Prompt Management 다.
프롬프트 기법 중 AIF 시험이 다루는 대표적인 분류가 "예시(shot)를 몇 개 주느냐"다. 여기서 shot 하나는 "입력 예와 그에 대한 바람직한 출력"의 한 쌍을 뜻한다.
Zero-shot(제로샷): 예시 없이 지시만 준다. 모델이 사전학습 지식만으로 푼다.
다음 문장의 감정을 긍정/부정 중 하나로 답하라.
문장: "이 영화 정말 최고였어!"
감정:
Few-shot(퓨샷): 답의 본보기 몇 개를 먼저 보여준 뒤 진짜 질문을 한다. 모델이 패턴을 보고 따라 한다.
문장: "음식이 형편없었다" → 부정
문장: "서비스가 친절했다" → 긍정
문장: "이 영화 정말 최고였어!" →
One-shot(원샷) 은 예시를 정확히 1개만 주는 경우다. 시험 가이드는 이것을 single-shot 이라고 적는다.
기법
예시 개수
언제 쓰나
Zero-shot
0개
작업이 단순/일반적이고 모델이 이미 잘 아는 경우
One-shot
1개
출력 형식을 한 번 보여주면 되는 경우
Few-shot
보통 2~5개
형식이 특수하거나, Zero-shot 정확도가 낮을 때
Few-shot 은 모델 가중치를 바꾸지 않는다. 단지 프롬프트 안에서 예시를 보여줄 뿐이라 In-Context Learning(맥락 내 학습) 이라고도 부른다. 진짜 학습(파인튜닝)과 헷갈리면 안 된다.
예시는 대화가 끝나면 사라진다. 다음 요청에서 같은 효과를 내려면 예시를 다시 넣어야 하고, 그때마다 입력 토큰으로 과금된다.
예시는 고르게 준다. 긍정 예만 세 개 보여 주면 모델이 긍정 쪽으로 기운다.
예시의 형식이 곧 출력 형식이 된다. 예시를 "→ 부정"으로 끝냈다면 답도 그 모양으로 나온다.
🔍 더 깊이: 한 단계 더 나아간 기법이 Chain-of-Thought(CoT, 사고의 연쇄) 프롬프팅이다. "단계별로 생각해봐(Let's think step by step)"처럼 모델이 추론 과정을 글로 풀어내게 유도하면, 특히 수학·논리 문제의 정답률이 크게 오른다. 모델이 중간 추론을 토큰으로 "내뱉으면서" 다음 단계 예측의 근거로 삼기 때문이다. AIF 시험에서 "복잡한 다단계 추론 문제의 정확도를 프롬프트만으로 높이고 싶다"가 나오면 CoT 를 떠올리면 된다. 대가도 있다. 풀이 과정만큼 출력 토큰이 늘어 비용과 지연이 커진다.
모델 동작을 바꾸는 방법은 여러 층이 있다. 비용·난이도가 낮은 순서로 시도하는 게 정석이다.
방법
비용/난이도
모델 가중치 변경
적합한 상황
프롬프트 엔지니어링
가장 낮음
없음
출력 형식·톤·간단한 작업 조정
RAG (검색 증강 생성)
중간
없음
최신/사내 지식을 답에 반영해야 할 때
파인튜닝(Fine-tuning)
높음
있음
특정 도메인 말투/전문성을 깊이 내재화할 때
핵심 판단:
모델이 모르는 "정보"가 필요하다 → 프롬프트로 안 됨. RAG(또는 파인튜닝)로 지식을 공급해야 한다.
출력의 "형식·톤·행동"만 바꾸면 된다 → 프롬프트 엔지니어링으로 충분.
방대한 도메인 패턴을 영구 내재화하고 싶다 → 파인튜닝.
비유하면 이렇다. 프롬프트는 신입 사원에게 업무 지시서를 잘 써 주는 일, RAG 는 참고 자료철을 책상에 펴 주는 일, 파인튜닝은 연수를 보내 사람 자체를 바꾸는 일이다. 지시서와 자료철은 오늘 바로 바꿀 수 있지만 연수는 시간과 돈이 든다.
비용이 드는 지점
프롬프트 엔지니어링
RAG
파인튜닝
시작할 때
거의 없음(사람의 시행착오)
문서 임베딩·벡터 저장소 구축
학습 데이터 준비 + 학습 비용
호출할 때마다
긴 지시·예시만큼 입력 토큰
검색해 붙인 문서만큼 입력 토큰
맞춤 모델 호스팅·사용 비용
내용이 바뀔 때
문장만 고치면 됨
문서만 다시 색인
다시 학습
가상의 사례로, 한 법률 자문 스타트업은 처음에 "더 정확한 답"을 위해 곧장 모델 파인튜닝을 검토했다. 비용 견적이 수천만 원에 달했다. 컨설턴트의 권유로 먼저 프롬프트 엔지니어링(역할 부여 + 출력 형식 고정 + Few-shot 예시)과 사내 판례를 활용한 RAG 를 적용해봤더니, 목표 품질의 대부분이 충족됐다. 파인튜닝은 끝내 필요하지 않았다. "싼 방법부터, 비싼 방법은 나중에"가 생성형 AI 실무의 황금률이다.
모르는 정보는 만들어낼 수 없다(혹은 지어낸다): 모델이 학습하지 않은 최신 정보나 사내 비공개 데이터는 프롬프트를 아무리 잘 써도 정확히 나오지 않는다. 오히려 그럴듯하게 지어내는 환각(hallucination) 이 생긴다(내일 자세히).
컨텍스트 윈도우 한도: 예시를 너무 많이 넣으면 토큰 한도에 부딪히고 비용도 커진다.
비결정성: 같은 프롬프트라도 매번 답이 조금씩 다를 수 있어, 100% 일관성이 필요한 작업엔 한계가 있다.
프롬프트 주입(prompt injection) 취약성: 사용자 입력에 "이전 지시를 무시하고…" 같은 악의적 문구가 섞이면 모델이 의도와 다르게 행동할 수 있다(보안 이슈).
민감하거나 깊은 도메인 전문성: 일관된 전문 말투/규정 준수가 핵심이면 프롬프트만으론 한계가 있어 파인튜닝이 필요할 수 있다.
⚠️ 함정: "프롬프트를 길고 자세하게 쓸수록 무조건 좋다"는 흔한 오해다. 지나치게 길면 토큰 비용과 지연이 커지고, 핵심 지시가 묻혀 오히려 모델이 헷갈릴 수 있다. 또 모순된 지시("짧게 쓰되 모든 것을 담아라")를 주면 결과가 불안정해진다. 좋은 프롬프트는 긴 게 아니라 명확하고 일관된 것이다.