프롬프트 엔지니어링

Prompt Engineering Guide

생성형 AI를 효과적으로 사용하는 능력은 이제 중요한 경쟁력이 되었습니다. AI에게 무엇을, 어떻게 요청하느냐에 따라 결과물의 품질은 극적으로 달라집니다. 이 가이드는 여러분이 AI와 더 명확하게 소통하고, 원하는 결과를 정확하게 얻어낼 수 있도록 돕기 위해 제작되었습니다.

1. AI와 대화하는 기술, 프롬프트

1-1. 프롬프트란 무엇인가?

프롬프트는 AI에게 원하는 작업을 수행하도록 내리는 구체적인 지시 또는 질문입니다. 단순히 키워드를 나열하는 검색과 달리, 프롬프트는 AI가 여러분의 의도와 맥락을 이해하고 창의적인 결과물을 생성하도록 유도하는 ‘대화의 시작점’입니다.

좋은 프롬프트는 AI를 단순한 정보 검색 도구가 아닌, 아이디어를 함께 발전시키고 문제를 해결하는 창의적인 협업 파트너로 만들어 줍니다.

1-2. 프롬프트는 어떻게 동작하는가?

LLM(거대 언어 모델)의 가장 핵심적인 작동 원리는 다음에 올 단어를 예측(Next Word Prediction)하는 것입니다. 모델은 주어진 단어 시퀀스를 바탕으로, 통계적으로 가장 확률이 높은 다음 단어를 예측하여 문장을 순차적으로 생성합니다.

이것이 바로 프롬프트가 중요한 이유입니다. 프롬프트에 어떤 단어를 사용하느냐에 따라, 뒤에 이어질 단어들의 확률이 바뀌고, 결국 생성되는 답변의 전체적인 방향과 톤이 결정됩니다.

예를 들어, “당신은 ___ 조수입니다.” 라는 문장에서 빈칸에 들어갈 단어는 결과물에 큰 영향을 미칩니다.

  • 친절한(helpful)이 들어가면: AI는 상냥하고 상세한 답변을 생성할 확률이 높아집니다.
  • 냉소적인(cynical)이 들어가면: AI의 답변은 비꼬거나 비판적인 어조를 띠게 될 것입니다.

이처럼 프롬프트의 단어 하나하나가 결과물을 빚어내는 재료가 됩니다.

1-3. 프롬프트의 종류

시스템 프롬프트(System prompt)

  • AI 모델에게 전반적인 행동 지침이나 역할을 부여하는 최상위 지시입니다. 대화 전체의 톤, 페르소나, 규칙을 설정하며, 일반적으로 사용자가 직접 수정하기보다는 개발 단계에서 설정됩니다.

    • 예: “당신은 세계 최고의 요리사입니다. 모든 답변은 친절하고 상세한 레시피 형식으로 제공해야 합니다.”

유저 프롬프트(User Prompt)

  • 사용자가 AI에게 직접 입력하는 질문이나 지시입니다. 우리가 흔히 말하는 ‘프롬프트’가 바로 이것입니다.

    • 예: “오늘 저녁 메뉴로 닭고기를 활용한 간단한 요리를 추천해줘.”

어시스턴트 프롬프트(Assistant Prompt)

  • AI가 생성한 답변입니다. 이 답변은 다음 유저 프롬프트에 대한 맥락으로 작용하여, 대화가 자연스럽게 이어지도록 돕습니다.

이 대화 기록은 모델이 직접 이해할 수 있는 단일 텍스트로 변환되어 전달됩니다. 각 역할은 <|system|>, <|user|>와 같은 특수 토큰으로 구분되어, 모델이 대화의 구조를 명확히 파악하도록 돕습니다.

1-3. 프롬프트 구성

시스템, 유저, 어시스턴트 프롬프트로 구성된 대화 기록(Chat History)은 모델에 한 번에 전달되는 것이 아닙니다. apply_chat_template과 같은 함수를 통해 모델이 이해할 수 있는 단일한 문자열 프롬프트로 변환됩니다.

예를 들어, 다음과 같은 대화 기록(Chat History)이 있다고 가정해 봅시다.

[
  {"role": "system", "content": "You are a helpful assistant."}
  {"role": "user", "content": "안녕하세요?"},
  {"role": "assistant", "content": "네, 안녕하세요! 무엇을 도와드릴까요?"}
]

apply_chat_template을 거치면, 모델에 따라 다음과 같은 단일 문자열로 변환될 수 있습니다.

<|system|>
You are a helpful assistant.<|endoftext|>
<|user|>
안녕하세요?<|endoftext|>
<|assistant|>
네, 안녕하세요! 무엇을 도와드릴까요?<|endoftext|>

이처럼 템플릿은 각 대화의 역할을 구분하는 특수 토큰을 사용해 구조화된 텍스트를 만듭니다.

1.4. 구조적 프롬프팅: 명확한 신호 보내기

프롬프트를 작성할 때, 지시사항, 맥락, 예시 등을 명확히 구분해주면 AI의 이해도를 크게 높일 수 있습니다. 이때 다음과 같은 기법을 활용하여 AI에게 명확한 신호를 보낼 수 있습니다.

  • 구분자 선택 가이드 (Markdown, XML, JSON)

    • 마크다운 (Markdown): 프롬프트 작성을 시작하기에 가장 좋은 형식입니다. 주요 섹션과 하위 섹션에 헤더(#, ## 등)를 사용하고, 코드는 백틱(`)으로 감싸는 등 명확한 구조화가 가능합니다.

    • XML: <tag></tag> 형식으로 섹션의 시작과 끝을 명확히 감쌀 수 있어 매우 효과적입니다. 특히 여러 예시를 중첩하거나 태그에 메타데이터를 추가할 때 유용합니다.

    • JSON: 매우 구조화되어 있어 특히 코딩 관련 작업에서 모델이 잘 이해하지만, 다른 형식에 비해 장황할 수 있습니다. (더 자세한 내용은 구조적 출력 및 제약된 생성 참고)

    • 롱 컨텍스트 문서 처리 팁: 다수의 문서를 컨텍스트로 제공할 때는 ...와 같은 XML 형식이나, ID: 1 TITLE: … CONTENT: …와 같은 명확한 구분자가 있는 텍스트 형식이 JSON 형식보다 효과적인 경향이 있습니다.
    • 상황에 맞는 판단: 모델은 다양한 형식을 이해하도록 훈련되었습니다. 제공할 컨텍스트 데이터에 특정 형식(예: XML)이 많이 포함되어 있다면, 그것과 다른 형식의 구분자(예: 마크다운)를 사용하는 것이 모델에게 더 눈에 띄고 효과적일 수 있습니다.
  • 강조 기법 활용
    • LLM 학습 데이터에는 사람들이 문장을 작성할 때 중요한 내용을 강조하는 방법들이 들어간 데이터로 학습되어 있습니다. 중요한 지시사항을 AI가 놓치지 않도록 만들고 싶다면, 대문자(ALL CAPS)를 사용하거나 문장 끝에 여러 개의 느낌표(!!!)를 붙여 강조할 수 있습니다.
  • 영어로 프롬프팅
    • 대부분의 고성능 LLM은 주로 영어 데이터를 기반으로 훈련됩니다. 따라서 모델은 영어의 미묘한 뉘앙스, 문법, 전문 용어에 대해 더 깊이 이해하고 있습니다.
    • 만약 한글 프롬프트로 원하는 결과를 얻지 못했다면, 프롬프트를 영어로 번역하여 시도해 보세요. 종종 훨씬 더 정교하고 만족스러운 결과물을 얻을 수 있습니다.

2. 프롬프트 기본 작성 원칙

좋은 프롬프트는 감에 의존하는 것이 아니라, 체계적인 엔지니어링 프로세스를 통해 만들어집니다. 성공적인 프롬프트 엔지니어링을 위한 3단계 프로세스는 다음과 같습니다.

1단계: 성공 기준 정의 (Define Success Criteria)

  • 무엇이 ‘좋은’ 결과물인지 명확하게 정의하는 것이 가장 중요합니다. 어떤 결과가 나와야 성공적인지를 알아야 프롬프트를 개선할 수 있습니다.
  • 많은 사람들이 프롬프트 수정에만 집중하지만, 무엇이 성공인지 정의하고 객관적으로 측정하지 않으면 개선의 방향을 잃기 쉽습니다. 감에 의존한 수정이 아닌, 데이터 기반의 체계적인 개선을 위해 이 단계는 무엇보다 중요합니다.”

    • 예: ‘고객 문의에 대한 답변 생성’이라는 목표가 있다면, 성공 기준은 ‘24시간 내 답변’, ‘고객 만족도 90% 이상’, ‘정중한 어조 유지’ 등으로 구체화할 수 있습니다.

2단계: 테스트셋 구축 및 평가 (Empirical Testing)

  • 프롬프트 변경이 실제로 성능 향상으로 이어졌는지 확인하려면 객관적인 평가가 필요합니다. 이를 위해 테스트셋(Test Set)을 구축해야 합니다. 테스트셋은 다양한 시나리오를 포함하는 질의응답 쌍으로 구성될 수 있습니다.

  • 이 테스트셋을 통해 프롬프트 수정 전과 후의 결과를 수치적으로 비교하고, 개선 여부를 경험적으로 판단할 수 있습니다.

    • 예: 100개의 다양한 고객 문의 시나리오를 테스트셋으로 만들고, 각 프롬프트 버전의 답변 정확도나 고객 만족도 점수를 측정합니다.

3단계: 초기 프롬프트 작성 및 반복 개선 (Draft and Iterate)

  • 초기 프롬프트(First Draft Prompt)를 작성하는 것부터 시작합니다. 처음부터 완벽할 필요는 없습니다. 아래의 P-T-C-F 원칙을 활용하여 최대한 상세하게 작성하는 것이 중요합니다.
    • *Tip: 초기 프롬프트를 작성할 때, 한국어로 먼저 작성한 후 영어로 번역하여 사용하시면 작성하는 속도를 높일 수 있습니다.
  • 작성된 초기 프롬프트를 테스트셋으로 평가한 후, 결과가 만족스럽지 않다면 지속적인 반복(Iteration)을 통해 프롬프트를 개선합니다. 해당 분야(Domain)에 대한 지식이 부족하더라도, 테스트 결과를 바탕으로 어떤 부분을 수정해야 할지 힌트를 얻을 수 있습니다.

프롬프트 템플릿: P-T-C-F

  • P - 페르소나 (Persona): AI에게 역할을 부여하세요.
    • AI가 특정 전문가의 관점에서 답변하도록 역할을 지정하면 모델은 단어의 선택을 특정 전문가와 관련된 단어들을 선택할 확률이 높아집니다.
    • 나쁜 예: “새로운 커피 브랜드 슬로건 추천해줘.” - 페르소나 X
    • 좋은 예: “당신은 20년 경력의 베테랑 카피라이터입니다. 새로운 커피 브랜드 슬로건 5가지를 제안해주세요.”
  • T - 과업 (Task): 수행할 작업을 명확히 지시하세요.
    • AI가 무엇을 해야 하는지 명확하고 구체적인 동사로 작업을 지시해야 합니다.
    • 나쁜 예: 이 기사에 대해 알려줘.
    • 좋은 예: “아래 기사의 핵심 내용을 3개의 글머리 기호로 요약하고, 이 내용이 국내 IT 산업에 미칠 영향을 분석해주세요.”
  • C - 맥락 (Context): 필요한 배경 정보를 충분히 제공하세요.
    • 작업에 필요한 중요한 배경지식, 목표, 대상 고객 등의 맥락을 상세히 설명할수록 결과물의 품질이 높아집니다.
    • 나쁜 예: “… 마케팅 문구 좀 써줘.”
    • 좋은 예: “…주요 타겟은 20대 대학생이며, ‘활기’와 ‘열정’이라는 키워드를 강조하고 싶습니다.”
  • F - 형식 (Format): 원하는 결과물의 형태를 지정하세요.
    • 최종 결과물을 어떤 형식(표, 목록, JSON, 이메일 등)으로 받고 싶은지 명시하면, 정보를 다시 정리하는 수고를 크게 줄일 수 있습니다.
    • 나쁜 예: 장점과 단점 알려줘.
    • 좋은 예: “…제안된 슬로건들을 각각의 장단점과 함께 표 형식으로 정리해 주세요.”
    • 더 좋은 예: …결과를 JSON 형식으로 반환해줘. 각 슬로건은 ‘slogan’ 키에, 장점은 ‘pros’ 키에, 단점은 ‘cons’ 키에 넣어줘.

Table of contents


This site uses Just the Docs, a documentation theme for Jekyll.