목차
1. 프롬프트 엔지니어링(Prompt Engineering)
AI에게 그때그때 일들을 잘 요청하는 기술 — 소통의 기술
-
GPT에게 질문 던지기
-
모델에게 묘사 전달
-
매번 맥락을 새로 설명
-
일관된 결과를 얻기 어려움
-
모델이 가진 잠재력을 최대로 끌어내는 ‘질문과 지시의 최적화’
-
단순히 말을 잘 거는 것을 넘어, 페르소나 설정, Few-shot 학습, Chain-of-Thought(사고의 사슬) 유도 등을 통해 모델의 추론 능력을 극대화
-
아무리 데이터(Context)가 좋아도 지시(Prompt)가 모호하면 결과물은 엉뚱하게 나옴
- 그래서 모델의 추론 경로를 가이드하고 출력의 품질을 결정하는 ‘구조 설계’를 잘 해야한다.
프롬프트 구조
페르소나(Persona)
LLM에게 역할을 지정한다. 숙련된 마케팅 관리자, 수상 경력이 있는 SF 작가, 컴퓨터 잡지의 유능한 카피 에디터 등 어떤 역할이든 기대 수준을 분명히 높게 설정한다.
문맥(Context)
요청을 둘러싼 문맥을 LLM이 이해할 수 있도록 자세한 배경 정보를 제공한다. 구체적일수록 기대에 부합할 가능성도 커진다.
지시문(Instruction)
입력 텍스트에 대해 LLM이 수행해야 할 작업을 명확히 정의한다. 번역, 작성, 재작성, 개선, 분류, 정렬, 탐색 등 무엇을 원하는지 분명하게 적는다.
입력(Input)
구체적인 문맥정보를 뜻하며 문단, 질문, 핵심 사항 목록 등 형태가 될 수 있다. 필요하다면 ‘텍스트’, ‘질문’과 같은 이름을 붙여 표시할 수 있다.
단계(Steps)
출력을 생성하기 위해 LLM이 따라야 할 처리 단계를 제시한다.
어조(Tone)
원하는 LLM 답변의 어조를 지정한다. 격식 있는 어조, 격식 없는 어조, 재치 있는 어조, 열정적인 어조, 차분한 어조, 친근한 어조 등이 가능하며 여러 어조를 조합할 수도 있다.
출력 형식(Output format)
원하는 출력 형식을 지정할 수도 있다. 지정하지 않으면 LLM은 일반 텍스트 답변을 기본값으로 가정한다. 그러나 표, CSV 파일(열 이름 포함), JSON(속성 이름 포함), 그 밖의 구조화된 형식을 요청할 수도 있다.
예시(Examples)
특정 작업에 대해 LLM의 학습이 충분하지 않을 수 있는 경우, 특히 텍스트 분류나 추론과 같은 작업에서는 예시를 통해 간단한 문맥 내 학습을 제공한다. 몇개의 예시만으로도 답변의 품질을 크게 향상시킬 수 있다.
구조화한 프롬프트 예시
Persona: 경험 많은 거대 언어 모델 개발자이자 저명한 연사
Context: LLM 관련 행사에서 기조연설을 하도록 초청 받았다.
Instruction: 연설의 핵심 문장을 작성하라.
Input: 다음 사실을 포함하라.
- LLM은 2022년 11월 ChatGPT 출시 이후 대중화됐다.
- 이후 LLAMA-2, Falcon180B, Bard와 같은 다양한 LLM과 LLM 기반 챗봇이 등장했다.
- LLM은 검색 엔진만큼 보편적인 기술이 돼가고 있다.
- 많은 기업이 자사 애플리케이션에 LLM을 통합하려 한다.
Tone : 재치 있으면서도 흥미로운 어조를 사용하라.
Output Format: 각 5줄로 구성된 2개의 문단으로 작성하라.
결과
아래는 위 요청의 가상 출력 예시다. 실제 모델 실행 기록이 아니며, 내용의 사실 관계를 검증한 기조연설문도 아니다. 형식 요구를 어떻게 점검할지 보는 자료로 사용한다.
## 기조연설 핵심 문장: LLM 시대의 서막
**(첫 번째 문단)**
여러분, 잠시 숨을 고르며 질문 하나 던지겠습니다.
우리는 과연 'AI 혁명'이라는 단어를 언제부터 체감하기 시작했습니까?
2022년 11월, ChatGPT라는 작은 불꽃이 꺼졌을 때, 그저 놀라운 기술적 성과로 치부되었을지도 모릅니다.
하지만 그때 이후, LLM은 단순한 연구실의 장난감이 아니라 전 세계를 뒤흔드는 거대한 파도가 되었습니다.
Llama-2부터 Falcon180B까지 수많은 천재들이 쏟아내고 있는 모델들과 Bard와 같은 인터페이스들은
이제 선택이 아닌 필수가 되었습니다. 이 놀라운 속도는 우리가 상상했던 것보다 훨씬 빠르며,
LLM은 더 이상 실험 영역에 머물지 않고 주류 기술의 심장이 되어가고 있습니다.
**(두 번째 문단)**
이제 우리는 거창한 수사를 멈추고 현실을 직시해야 합니다. 과거 검색 엔진이 인터넷이라는 바다를
항해하는 보편적인 항해술이었다면, 오늘날 LLM은 그 자체로 웹 전체를 이해하고 맥락을 해석하는
'지능형 항해술' 그 자체가 되고 있습니다. 이제 구글이나 네이버 같은 전통적 기업들은 LLM이라는
강력한 엔진을 자사의 모든 애플리케이션에 쉴 새 없이 통합하기 시작했습니다.
이는 단순한 기능 추가가 아닙니다. 이것은 산업의 근본적인 패러다임 전환이며,
LLM이 검색만큼 보편적이고 필수적인 기술로 자리매김했다는 가장 명확한 증거입니다.
우리는 이제 더 이상 'AI 도입 여부'를 논하는 시대가 아니라,
이 강력한 인공지능 엔진을 어떻게 활용해 다음 세대의 가치를 창출할 것인가에 집중해야 할 때입니다.
주요 기법들 (Techniques)
단순히 질문을 잘하는 것을 넘어, AI의 사고 능력을 극대화하는 몇 가지 전문 기법들이 있다.
1. 기본 지시 기법 (The Foundations)
가장 기초적이면서도 강력한 기법
양자역학의 개념을 초등학생도 이해할 수 있게 한 문장으로 설명해줘.
다음 문장의 감정을 분류해줘.
- 오늘 날씨가 정말 좋다: 긍정
- 배송이 너무 늦어서 짜증 나요: 부정
- 그럭저럭 볼만하네요: 중립
- 이 영화는 내 인생 최고의 작품이다:
너는 20년차 배드민턴 전문 코치야. 이제 막 배드민턴을 시작하는 사람에게 따뜻하면서도 현실적인 조언을 해줘
-
Zero-shot 기법 : 예시 없이 바로 명령을 내리는 것으로, 모델의 성능이 좋을 때 주로 사용(모델의 내장 지식에만 의존)
양자역학의 개념을 초등학생도 이해할 수 있게 한 문장으로 설명해줘. -
Few-shot 기법 : AI에게 지시사항과 함께 몇 가지의 입출력 예시를 제공하여 미리 보여주어 패턴을 학습시키는 방법(모델이 문맥과 형식을 빠르게 파악하도록 도와줌)
다음 문장의 감정을 분류해줘. 1. 오늘 날씨가 정말 좋다: 긍정 2. 배송이 너무 늦어서 짜증 나요: 부정 3. 그럭저럭 볼만하네요: 중립 4. 이 영화는 내 인생 최고의 작품이다: -
Persona (페르소나) 기법 : “너는 20년 경력의 시니어 소프트웨어 엔지니어다”와 같이 특정 페르소나를 부여하여 답변의 톤과 전문성을 조절
너는 20년차 배드민턴 전문 코치야. 이제 막 배드민턴을 시작하는 사람에게 따뜻하면서도 현실적인 조언을 해줘
2. 논리적 추론 기법 (Reasoning)
AI가 복잡한 문제를 풀 때 ‘생각의 단계’를 밟게 만드는 기술
철수는 사과 5개를 가지고 있었어. 영희에게 2개를 주고, 시장에서 10개를 더 산 뒤, 그중 절반을 동생에게 줬어. 철수에게 남은 사과는 몇 개일까? 단계별로 차근차근 생각해서 답해줘.
파이썬으로 웹 크롤러를 만들고 싶어.
- 먼저 웹 크롤링을 위해 필요한 라이브러리가 무엇인지 알려줘.
- 그 라이브러리들을 설치하는 코드를 작성해줘.
- 특정 뉴스 사이트의 제목만 가져오는 간단한 코드를 짜줘.
초콜릿 3박스가 있어. 각 박스에는 초콜릿이 12개씩 들어있고, 나는 친구 4명에게 똑같이 나눠주려고 해. 이 문제를 해결하기 위한 서로 다른 3가지 논리적 경로를 제시하고, 가장 일관된 최종 답을 도출해줘.
-
Chain-of-Thought (CoT, 사고의 사슬): 문제를 작은 단계로 풀도록 유도하는 기법. “단계별로 생각해”라는 문장만으로 정답을 보장하지 않으므로, 계산은 코드나 정답 데이터로 검증
철수는 사과 5개를 가지고 있었어. 영희에게 2개를 주고, 시장에서 10개를 더 산 뒤, 그중 절반을 동생에게 줬어. 철수에게 남은 사과는 몇 개일까? 단계별로 차근차근 생각해서 답해줘. -
Least-to-Most : 큰 문제를 작고 해결 가능한 하위 문제(Sub-problems)로 먼저 분해한 뒤, 하나씩 순차적으로 해결하도록 유도
파이썬으로 웹 크롤러를 만들고 싶어. 1. 먼저 웹 크롤링을 위해 필요한 라이브러리가 무엇인지 알려줘. 2. 그 라이브러리들을 설치하는 코드를 작성해줘. 3. 특정 뉴스 사이트의 제목만 가져오는 간단한 코드를 짜줘. -
Self-Consistency (자기 일관성): 동일한 질문에 대해 여러 개의 추론 경로를 생성하게 한 뒤, 가장 많이 공통으로 나온 답을 최종 결과로 선택하는 다수결 방식
초콜릿 3박스가 있어. 각 박스에는 초콜릿이 12개씩 들어있고, 나는 친구 4명에게 똑같이 나눠주려고 해. 이 문제를 해결하기 위한 서로 다른 3가지 논리적 경로를 제시하고, 가장 일관된 최종 답을 도출해줘.
3. 구조화 및 명확화 기법 (Structuring)
모델이 지시사항과 데이터를 혼동하지 않게 만드는 ‘형식의 기술’
- Delimiters (구분자) 활용: ###, —, """ 같은 기호를 사용하여 지시문, 참고 문헌, 사용자 입력을 명확히 분리
다음 [본문]의 내용을 아래의 ###형식###에 맞춰 요약해줘
서울의 주요 관광지 3곳을 추천해주고, 결과는 반드시 JSON 형식으로 출력해줘. 키값은 ‘name’, ‘location’, ‘description’으로 해줘
인공지능의 미래에 대해 에세이를 써줘. 단, ‘인공지능’, ‘AI’, ‘딥러닝’이라는 단어는 절대 사용하지 말고 설명해줘.
-
Delimiters (구분자) 활용:
###,--,"""같은 기호를 사용하여 지시문, 참고 문헌, 사용자 입력을 명확히 분리예:
다음 [본문]의 내용을 아래의 ###형식###에 맞춰 요약해줘. -
Output Structuring: 답변 형식을 JSON, Markdown, Table 등으로 강제. 이는 나중에 코드가 답변을 파싱(Parsing)하기 쉽게 만들어 준다.
서울의 주요 관광지 3곳을 추천해주고, 결과는 반드시 JSON 형식으로 출력해줘. 키값은 'name', 'location', 'description'으로 해줘 -
Negative Prompting: “~는 포함하지 마”, “설명은 생략하고 결과만 말해”와 같이 하지 말아야 할 행동을 명시하여 출력을 제어
인공지능의 미래에 대해 에세이를 써줘. 단, '인공지능', 'AI', '딥러닝'이라는 단어는 절대 사용하지 말고 설명해줘.
4. 고도화 기법 (Advanced)
최근 연구되고 있는 더 정교한 프롬프트 전략
- 먼저 ‘간헐적 단식’의 과학적 원리와 부작용에 대한 지식을 요약해줘.
- 위에서 생성한 지식을 바탕으로, 평소 위장이 약한 사람을 위한 식단 가이드를 작성해줘
강아지에 대한 짧은 동화를 써줘. [힌트: 우주선, 뼈다귀 모양 행성, 그리움]이 키워드들이 반드시 이야기의 핵심 요소로 포함되어야 해.
- 17세기 유명한 화가 3명과 그들의 대표작을 알려줘.
- 방금 네가 답변한 내용 중 사실과 다른 부분이 있는지 스스로 검증하는 질문 3개를 던져봐.
- 그 질문에 답하면서 오류가 있다면 최종적으로 수정된 답변을 줘.
-
Generated Knowledge Prompting: 질문에 바로 답하게 하지 않고, 모델이 관련 지식을 먼저 스스로 생성하게 한 뒤, 그 지식을 바탕으로 최종 답변을 내게 하는 방식
1. 먼저 '간헐적 단식'의 과학적 원리와 부작용에 대한 지식을 요약해줘. 2. 위에서 생성한 지식을 바탕으로, 평소 위장이 약한 사람을 위한 식단 가이드를 작성해줘 -
Directional Stimulus Prompting (방향성 자극): 답변에 포함되어야 할 핵심 키워드나 힌트를 프롬프트에 슬쩍 던져주어 모델이 원하는 방향으로 답변하게 유도
강아지에 대한 짧은 동화를 써줘. [힌트: 우주선, 뼈다귀 모양 행성, 그리움]이 키워드들이 반드시 이야기의 핵심 요소로 포함되어야 해. -
Chain-of-Verification (CoVe): 답변을 생성한 후, 모델 스스로가 답변의 사실 관계를 검증하기 위한 질문을 던지고 다시 확인하게 하는 자기 검증 루프
1. 17세기 유명한 화가 3명과 그들의 대표작을 알려줘. 2. 방금 네가 답변한 내용 중 사실과 다른 부분이 있는지 스스로 검증하는 질문 3개를 던져봐. 3. 그 질문에 답하면서 오류가 있다면 최종적으로 수정된 답변을 줘.
프롬프트 엔지니어링의 핵심
| 구분 | 전략 | 효과 |
|---|---|---|
| 구체성 | ”짧게 써줘” 대신 “100자 이내로 요약해줘” | 모호함 제거 및 의도 반영 |
| 순서 | 중요한 지시는 프롬프트의 맨 끝에 한 번 더 강조 | 최신 편향(Recency Bias) 활용 |
| 반복 | ”반드시 JSON으로 답해”를 반복 명시 | 출력 형식 강제력 강화 |
좋은 프롬프트의 조건
명확성, 구체성, 맥락 제공 이 세가지 요소를 충족하면 AI는 훨씬 더 높은 품질의 결과를 도출할 수 있다.
명확성
모호한 표현을 피하고, 원하는 결과를 구체적으로 전달
구체성
결과물에 필요한 기능이나 조건을 세부적으로 지시
맥락 제공
왜 필요한지, 어떤 상황에서 활용되는지를 알려야 AI가 더 정밀한 답변을 할 수 있다.
효과적인 프롬프트를 위한 기본 질문 템플릿
제품기획서 PRD 작성 프롬프트(5W1H 기법활용))
[무엇]을 만들려고 해.
주요 기능은 [구체적인 기능 설명]이야.
[누구]를 위한 것이고,
[왜/어떤 문제를 해결]하기 위해 필요해.
어떻게 구현하면 좋을지 기술적인 방향과 함께 구체적인 PRD를 작성해줘
실제 작업으로 옮기기: 문의 분류 프롬프트
자유로운 글쓰기와 달리 문의 분류는 프로그램이 결과를 사용한다. 목표를 결제, 배송, 기타 중 하나로 분류하는 것으로 정하자. 이때 페르소나보다 허용 라벨, 애매한 사례 처리, 출력 형식이 중요하다. 다음 표처럼 입력과 기대 행동을 먼저 만든다.
| 문의 | 기대 라벨 | 이유 |
|---|---|---|
| “카드 결제가 두 번 됐어요” | 결제 | 청구 문제 |
| “주문한 물건이 아직 안 왔어요” | 배송 | 배송 상태 |
| “주소 변경과 환불을 같이 요청해요” | 기타 또는 사람에게 전달 | 둘 이상의 부서가 필요 |
| 빈 문자열 | 모델 호출 전 거절 | 처리할 내용이 없음 |
프롬프트는 서버 코드에 버전이 있는 템플릿으로 보관한다. 다음 코드는 모델 호출 전 입력을 검사하고 지시와 입력을 분리한다. 출력은 모델이 만든 문자열이므로 다시 검증해야 한다.
import json
LABELS = {"결제", "배송", "기타"}
def build_prompt(message: str) -> list[dict[str, str]]:
cleaned = message.strip()
if not cleaned or len(cleaned) > 1000:
raise ValueError("문의는 1자 이상 1000자 이하로 입력하세요.")
return [
{
"role": "system",
"content": (
"고객 문의를 결제, 배송, 기타 중 하나로 분류하세요. "
"둘 이상에 걸치거나 판단할 정보가 부족하면 기타를 선택하세요. "
"JSON 객체 {\"label\":\"...\"}만 반환하세요."
),
},
{"role": "user", "content": cleaned},
]
def parse_label(model_text: str) -> str:
value = json.loads(model_text)
if not isinstance(value, dict) or value.get("label") not in LABELS:
raise ValueError("허용된 분류 라벨이 아닙니다.")
return value["label"]
build_prompt는 지시문과 사용자 입력을 별도 역할로 전달한다. 그렇다고 사용자 입력 안의 “이전 지시 무시”를 무조건 막는 것은 아니다. parse_label은 형식과 라벨만 확인한다. 실제 문의 내용에 맞게 분류했는지는 위처럼 정답이 붙은 사례로 평가한다. 모델별 구조화 출력 기능을 사용할 수 있다면 JSON 문자열 파싱 오류를 줄이는 데 도움이 되지만, 허용 라벨과 업무 규칙 검사는 서버에 남긴다.
프롬프트를 바꿀 때의 검사 순서
- 위 네 사례와 실제 실패 사례를 데이터셋에 고정하고 현재 프롬프트의 결과를 기록한다.
기타가 과도하게 나온다면 “둘 이상에 걸친다”의 기준을 더 구체적으로 쓴다. 애매한 입력을 무조건결제로 보내는 편향이 생기지 않는지 함께 본다.- 새 프롬프트를 같은 모델·같은 데이터셋으로 실행해 라벨별 오류를 비교한다. 문구 하나를 바꿨는데 정답률이 떨어지면 이전 버전으로 되돌린다.
- 실제 서비스에는 입력 길이 제한, 개인정보 처리, 요청량 제한, 재시도 가능 오류와 잘못된 입력 오류의 구분을 추가한다.
출력 형식이 맞는 비율과 업무상 정답인 비율은 다른 지표다. JSON이 모두 파싱되어도 결제 문의가 배송으로 분류되면 실패다. 반대로 프롬프트만으로 해결되지 않는 정보 부족 사례는 문서 검색이나 사용자에게 추가 질문하는 흐름이 필요하다. 이 지점부터는 다음 장의 컨텍스트 설계가 중요해진다(LangSmith 평가 가이드).