프롬프트 엔지니어링 초보자 가이드: 모든 LLM에서 작동하는 7가지 패턴
요약
LLM의 성능을 극대화하기 위해 마법 같은 문구 대신 구조적 패턴을 사용하는 방법을 설명합니다. 역할 부여, 문맥과 제약 사항의 분리, 퓨샷 예시 활용 등 7가지 핵심 패턴을 통해 어떤 모델에서도 효과적인 프롬프트를 작성하는 가이드를 제공합니다.
핵심 포인트
- 단순한 단어 선택보다 프롬프트의 구조적 설계가 더 중요함
- 모델에게 구체적인 역할을 부여하여 관련 문맥을 로드할 것
- 문맥과 제약 사항을 시각적으로 분리하여 모델의 무시를 방지할 것
- 글머리 기호를 사용하여 제약 사항을 명확하게 전달할 것
- 퓨샷 예시를 통해 원하는 입력과 출력 형식을 직접 보여줄 것
온라인상의 대부분의 "프롬프트 엔지니어링 (prompt engineering)" 조언은 누군가가 강력하게 추천하는 마법 같은 문구들의 목록입니다. "'당신은 전문가입니다'로 시작하세요." "'단계별로 생각해보세요'로 끝내세요." "'delve'라는 단어를 사용하세요."와 같은 것들 말이죠.
중요한 점은 이렇습니다. 그 단어들 자체는 중요하지 않습니다. 중요한 것은 구조입니다. GPT, Claude, Gemini, 그리고 오픈 모델 (open models) 전반에 걸쳐 수백 개의 프롬프트를 작성하고 테스트한 결과, 제대로 작동하는 모든 프롬프트는 7가지 패턴 중 하나에 해당한다는 것을 발견했습니다. 이 패턴들을 배우면 마법 같은 문구를 외울 필요 없이, 어떤 모델에서든 어떤 작업에 대해서도 좋은 프롬프트를 작성할 수 있습니다.
이것은 제가 시작했을 때 가졌더라면 좋았을 가이드입니다.
패턴 1: 모델에게 역할을 부여하라
AI에게 자신이 누구여야 하는지 알려주세요. 이것은 단순한 연극이 아닙니다. 응답에 관련 문맥 (context)을 로드하는 역할을 합니다.
약한 예시:
버그 리포트 (bug report)를 작성해줘.
강한 예시:
당신은 500개 이상의 버그 리포트를 제출한 시니어 QA 엔지니어입니다. 이 이슈에 대한 버그 리포트를 작성하세요: [DESCRIBE].
"시니어 QA 엔지니어"라는 역할은 모델이 알고 있는 관례들, 즉 재현 단계 (repro steps), 예상 결과 vs 실제 결과 (expected vs actual), 심각도 수준 (severity levels) 등을 끌어옵니다. 역할이 없다면 일반적인 설명만을 얻게 될 것입니다.
사용 시기: 항상 사용하세요. 이것은 당신이 할 수 있는 가장 비용이 적게 드는 개선 방법입니다.
패턴 2: 문맥 (context)과 제약 사항 (constraints)을 분리하라
가장 흔한 두 가지 실수는 (a) 충분한 문맥을 제공하지 않는 것과, (b) 제약 사항을 문맥 안에 묻어버려 모델이 이를 무시하게 만드는 것입니다.
문맥과 제약 사항이 시각적으로 분리되도록 프롬프트를 구조화하세요:
문맥 (Context): 나는 Series B 스타트업의 엔지니어링 부사장 (VP of Engineering)에게 보낼 콜드 이메일 (cold email)을 작성하고 있어. 우리 제품은 AI 코드 리뷰어 (AI code reviewer)야. 그들은 방금 시니어 엔지니어 5명을 채용한다는 게시물을 올렸어.
제약 사항 (Constraints):
- 제목: 최대 5단어, 대문자 사용 금지 (사람처럼 보이게 함)
- 본문: 최대 90단어
- 느낌표 사용 금지, "revolutionary", "game-changer" 단어 사용 금지
- 미팅 링크가 아닌 질문으로 끝낼 것
출력 (Output): 제목은 별도의 줄에 작성하고, 그 다음 본문을 작성할 것.
제약 사항(constraints)이 글머리 기호(bulleted list)로 작성된 점에 주목하세요. 모델은 문단 속에 파묻힌 제약 사항보다 글머리 기호로 나열된 제약 사항을 훨씬 더 안정적으로 따릅니다.
사용 시점: 출력물이 특정 규칙(길이, 어조, 형식, 금지 단어 등)을 따라야 할 때 언제든 사용하세요.
패턴 3: 퓨샷 예시 (Few-shot examples)
말하지 말고 보여주세요. 모델에게 원하는 '입력(input) → 출력(output)'의 예시를 1~3개 제공한 다음, 새로운 입력을 전달하세요.
각 고객 불만 사항을 구조화된 티켓(ticket)으로 변환하세요.
예시 1:
입력: "사진을 업로드할 때 앱이 계속 충돌합니다."
출력: {"issue": "crash", "trigger": "photo upload", "severity": "high", "area": "mobile"}예시 2:
입력: "로그인을 할 수 없습니다. 유효하지 않은 토큰이라고 나옵니다."
출력: {"issue": "auth_failure", "trigger": "login", "severity": "high", "area": "auth"}이제 다음을 변환하세요:
입력: "오늘 아침 대시보드를 로드하는 데 시간이 너무 오래 걸렸습니다."
퓨샷(Few-shot)은 일관된 형식을 얻을 수 있는 가장 확실한 방법입니다. 모델이 설명(description)보다 예시로부터 패턴을 더 잘 학습하기 때문에 효과적입니다.
사용 시점: 특정 출력 형식이 필요할 때, 특히 구조화된 데이터(JSON, 표, 티켓 등)가 필요할 때 언제든 사용하세요.
패턴 4: 생각의 사슬 (Chain-of-thought, 단 도움이 될 때만 사용)
"단계별로 생각해보세요(Think step by step)"라는 문구는 수학 및 논리 문제의 성능을 향상시키기 때문에 유명해졌습니다. 하지만 단순한 작업에서는 도움이 되지 않으며, 오히려 방해가 될 수도 있습니다.
작업에 **여러 단계의 추론 과정(multiple reasoning steps)**이 포함될 때 생각의 사슬(Chain-of-thought)을 사용하세요:
고객의 주문이 화요일에 발송되었고 영업일 기준 3일 이내에 도착하기로 되어 있었습니다. 오늘은 그다음 주 월요일입니다. 고객이 환불을 요청하고 있습니다. 당사의 정책 [정책 붙여넣기]를 고려하여, 고객이 환불 자격이 있는지 단계별로 검토하세요. 그런 다음 최종 판결을 내리세요.
단순한 작업("이 문단을 요약하세요")의 경우, 이 패턴을 건너뛰세요. 요약 작업에 "단계별로 생각해보세요"를 추가하는 것은 아무런 이득 없이 길기만 하게 만듭니다.
사용 시점: 수학, 자격/논리 확인, 다단계 의사결정, 디버깅(debugging).
패턴 5: 정확한 출력 형식 지정
AI 출력물을 사용하기 어려운 첫 번째 이유는 모델이 스스로 형식을 결정하기 때문입니다. 이를 해결하려면 명시적으로 지시하세요.
다음 열을 포함한 마크다운(markdown) 표를 출력하세요: 도구 | 가격 | 최적 용도 | 제한 사항.
도구당 한 행씩 작성하세요. 서론 문단이나 결론 문단은 넣지 마세요. 오직 표만 출력하세요.
또는 코드를 위한 경우:
함수만 출력하세요. 앞뒤에 설명을 붙이지 마세요. 에디터에 바로 붙여넣을 예정이므로 마크다운 코드 펜스(markdown code fences)도 사용하지 마세요.
"서론과 결론을 생략하라"는 지시 하나만으로도 수백 단어에 달하는 불필요한 미사여구(filler)를 삭제하는 수고를 덜 수 있습니다.
사용 시점: 출력물을 어딘가에 붙여넣어야 하는 경우라면 항상 사용하세요. 모호함은 편집 시간을 낭비하게 만듭니다.
패턴 6: 부정적 제약 조건 (불필요한 미사여구 금지)
모델들은 언어적 습관(verbal tics)을 가지고 있습니다. 이들은 "certainly(물론입니다)", "I'd be happy to(~하게 되어 기쁩니다)", "it's important to note(~를 유의하는 것이 중요합니다)", "in conclusion(결론적으로)"와 같은 표현을 매우 좋아합니다. 당신은 이를 금지할 수 있습니다.
다음 구절 중 어떤 것도 사용하지 마세요: "certainly", "I'd be happy to", "it's important to note", "in conclusion", "feel free to", "delve", "robust", "leverage", "seamless".
시작 문단이나 종료 문단을 추가하지 마세요. 본론부터 바로 시작하세요.
부정적 제약 조건(Negative constraints)은 강력합니다. 모델들이 어떤 미사여구를 사용하는지는 예측 가능하기 때문입니다. 상위 5개 표현만 금지해도 대부분의 출력물이 깔끔해집니다.
사용 시점: 불필요한 미사여구를 반복적으로 편집하고 있다면, 그것은 원천적으로 금지해야 한다는 신호입니다.
패턴 7: 반복(Iterate) — 첫 번째 프롬프트는 초안일 뿐입니다
누구도 첫 시도에 완벽한 프롬프트를 작성하지 못합니다. 과정은 다음과 같습니다:
- 프롬프트를 작성한다
- 실행한다
- 출력물을 보고 질문한다: 무엇이 잘못되었는가?
- 그 특정 문제를 해결할 제약 조건이나 예시를 추가한다
- 다시 실행한다
- 출력물을 사용할 수 있을 때까지 반복한다
저는 보통 프롬프트가 실무에 적용 가능한 수준(production-ready)이 되기까지 3~5회 정도의 반복 과정을 거칩니다. 이 반복 과정이야말로 "프롬프트 엔지니어링 (prompt engineering)"에서 말하는 엔지니어링의 핵심입니다.
전문가 팁: 최종 프롬프트를 문서에 저장해 두세요. 다음에 유사한 작업이 생기면 처음부터 시작하는 대신 저장된 프롬프트에서 시작하세요. 몇 달이 지나면 당신의 작업 속도를 극적으로 높여줄 개인 라이브러리가 구축될 것입니다.
종합하기: 실제 사례
다음은 7가지 패턴을 한 번에 사용하는 프롬프트의 예시입니다:
역할 (Role): 당신은 주니어 개발자를 위해 API 문서를 쉽게 설명하는 기술 작가 (Technical Writer)입니다.
맥락 (Context): 저는 사용자 알림을 반환하는 엔드포인트 (Endpoint)를 문서화하고 있습니다. 현재 문서는 독자가 웹훅 (Webhooks)을 알고 있다고 가정하고 있습니다. 주니어 개발자들은 모릅니다.
제약 사항 (Constraints):
- 설명은 최대 150단어 이내로 작성할 것
- 독자가 웹훅에 대해 들어본 적이 없다고 가정할 것
- JavaScript 코드 예시를 하나 포함할 것
- 다음 단어 사용 금지: "simply", "just", "obviously", "straightforward"
원하는 어조의 예시 (Examples of the tone I want):
출력 (Output): 제목, 설명, 그 다음 코드 블록 순으로 작성할 것. 서론이나 결론은 생략할 것.
이 프롬프트가 효과적인 이유는 각 패턴이 서로 다른 실패 모드 (Failure mode)를 처리하기 때문입니다. 역할 (Role)은 적절한 관습을 불러옵니다. 제약 사항 (Constraints)은 길이와 어조를 제어합니다. 예시 (Example)는 목소리를 보여줍니다. 출력 형식 (Output format)은 편집 시간을 줄여줍니다.
피해야 할 흔한 실수
- 너무 길고, 너무 이른 시작. 간단한 작업을 위해 500단어짜리 프롬프트를 작성하지 마세요. 최소한으로 시작하고, 출력이 만족스럽지 않을 때만 제약 사항을 추가하세요.
- 첫 번째 출력을 맹신하는 것. 항상 확인하세요. 모델은 자신 있게 환각 (Hallucinate)을 일으킵니다.
- 마법의 문구 복사해서 붙여넣기. 프롬프트의 나머지 부분이 모호하다면 "세계적인 전문가처럼 행동하라"는 말은 아무런 도움이 되지 않습니다.
- 출력 형식을 건너뛰는 것. 이것이 시간을 가장 많이 낭비하는 1순위 원인입니다. 모델에게 당신이 원하는 형태를 정확히 알려주세요.
이 7가지 패턴은 기초입니다. 이를 내재화하고 나면, "완벽한 프롬프트"를 찾아 헤매는 대신 실제로 작동하는 프롬프트를 설계 (Engineering)하기 시작할 것입니다. 저는 글쓰기, 코딩, 마케팅, 운영 전반에 걸쳐 가장 자주 사용하는 프롬프트들을 몇 가지 팩으로 모아두었습니다. 검증된 시작점을 원하신다면, Developer Product-Launch Prompt Pack에는 오늘 바로 복사해서 사용할 수 있는 7개의 프롬프트가 있으며, Developer Productivity Prompt Library에는 일상적인 개발 작업을 위한 30개의 프롬프트가 있습니다.
어떤 패턴이 여러분의 프롬프트에 가장 큰 차이를 만들어냈나요? 저는 항상 이 목록을 개선하고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기