개요

17편은 모델이 준 확률을 어떻게 고를 것인가의 이야기였다. 이번 글은 그 앞단이다.

애초에 모델에게 무엇을 넣을 것인가.

같은 모델에 같은 질문을 해도 어떻게 물어보느냐에 따라 답이 완전히 달라진다. 그래서 이게 하나의 기술 분야가 됐다.

프롬프트 엔지니어링 = 원하는 답을 얻기 위해 모델에 주어지는 입력(프롬프트)을 설계·조정하는 기법

교육 자료는 대외비라 슬라이드 이미지나 예제 데이터는 싣지 않는다. 개념 흐름만 내가 이해한 방식으로 재구성했고, 그림은 전부 생성했다.


1. 프롬프트의 해부

프롬프트를 뜯어보면 두 조각으로 나뉜다.

프롬프트의 구조

입력 프롬프트 = (1) 지시(instruction) + (2) 예시(few-shot examples)

Translate English to French:        ← 지시 (task description)

sea otter => loutre de mer          ┐
peppermint => menthe poivrée        │ 예시 (few-shot examples)
plush girafe => girafe peluche      ┘

cheese =>                           ← 실제 질문

여기서 예시 부분이 14편에서 다룬 인-컨텍스트 학습이다. 모델은 학습을 새로 하지 않고, 프롬프트 안의 예시를 보고 패턴을 따라 한다.

그리고 지시 부분은 다시 두 조각으로 나뉜다.

지시 = 시스템 프롬프트(system prompt) + 유저 쿼리(user query)


2. 시스템 프롬프트 — 보이지 않는 기본값

시스템 프롬프트 = 유저 쿼리와 무관하게 “기본값”으로 주어지는 모델 입력

우리가 챗봇 창에 뭘 입력하기 전부터 이미 들어가 있는 지시다. 경우에 따라 사용자가 수정할 수 있기도, 없기도 하다.

예시를 보면 감이 온다.

System: 당신은 도움이 되는 어시스턴트입니다. 단, 우리 경쟁사인
        Google, Yahoo, Microsoft를 언급해서는 안 됩니다.

User:   경쟁사 중 어디가 더 좋은 가격을 제공하나요?

Assistant: 죄송하지만 답변드릴 수 없습니다. 대신 저희 가격
           정보를 안내해 드릴 수 있습니다.

사용자는 시스템 프롬프트를 못 봤지만, 답변은 그 규칙 안에서 나온다.

왜 필요한가

학습이 끝난 뒤에도 모델의 답변을 “추가로” 통제하기 위해서다.

16편의 정렬(Alignment)은 학습 단계에서 이뤄진다. 한번 학습하면 바꾸기 어렵고 비용도 크다. 시스템 프롬프트는 학습 이후에, 입력만으로 행동을 조정한다.

실제 상용 모델의 시스템 프롬프트는 꽤 길다. 안전 규칙, 말투, 실수했을 때의 태도까지 문단 단위로 적혀 있다. 어떤 회사는 이걸 공개하기도 한다.

주의할 점

시스템 프롬프트 내 제약 사항들이 답변에 반영되지 않을 수 있다.

지시했다고 반드시 지켜지는 게 아니다. 이건 20편에서 다룰 환각·탈옥 문제와 이어진다.

시스템 프롬프트는 법이 아니라 사규에 가깝다. 대부분 지켜지지만, 강제력이 코드 수준으로 보장되지는 않는다. 그래서 보안이 중요한 제약을 시스템 프롬프트에만 맡기면 안 된다.

활용 ① 개인화 (Personalization)

사용자에 대한 정보를 시스템 프롬프트에 넣어두면 매번 설명하지 않아도 맥락을 유지한다. ChatGPT의 메모리 기능이 이 방식이다.

활용 ② 페르소나 (Persona)

캐릭터의 성격·말투·설정을 시스템 프롬프트로 정의하면, 같은 모델이 다른 인물처럼 행동한다. AI 캐릭터 대화 서비스들이 이 구조로 만들어진다.


3. 유저 쿼리 — 어려운 문제로 옮겨간 관심

초기에는 감정 분류 같은 쉬운 문제가 주된 관심사였다. 지금은 수학·코딩 같은 어려운 문제를 얼마나 푸는지에 관심이 쏠려 있다.

대표적인 벤치마크가 GSM8K다. 미국 초등학교 고학년 수준의 수학 문장제 문제다.

[질문] Josh는 쿠키 한 상자를 사려고 돈을 모으고 있어요. 돈을 벌기 위해
       팔찌를 만들어 팔기로 했습니다. 팔찌 하나를 만들 때 재료비로 $1이
       들고, 팔찌는 하나당 $1.5에 판매합니다. Josh가 팔찌를 12개 만들고
       쿠키를 산 뒤에도 $3가 남아있다면, 쿠키 한 상자의 가격은 얼마일까요?

[정답] 팔찌 하나당 $1.5 - $1 = $0.5의 이익. 12개를 만들면 총 이익은
       12 × $0.5 = $6. 쿠키를 산 뒤에도 $3가 남았으므로
       $6 - $3 = $3을 쿠키 한 상자에 썼습니다. 정답은 $3입니다.

문제 자체는 초등학교 수준이다. 그런데 여러 단계를 순서대로 밟아야 풀린다. 이런 문제에서 모델의 성능 차이가 크게 벌어진다.


4. Chain-of-Thought — 규모가 있어야 통한다

14편에서 Chain-of-Thought(CoT) 프롬프팅을 다뤘다. 답만 요구하지 말고 풀이 과정을 거치게 유도하는 방법이었고, “차근차근 단계별로 생각해보자” 한 줄만 붙여도 되는 0-shot CoT까지 봤다.

이번 강의에서 새로 짚은 건 왜 이게 아무 데서나 안 통하는가다.

모델이 커야 한다

PaLM에서 모델 크기를 키우며 측정한 결과가 명확했다.

모델 크기 표준 프롬프팅 대비 CoT
작을 때 차이 거의 없음
커질수록 격차가 벌어진다

가장 큰 모델(540B)에서는 CoT가 파인튜닝한 기존 최고 성능(Finetuned SOTA)마저 넘어섰다.

0-shot CoT도 마찬가지였다.

모델 zero-shot zero-shot CoT
0.3B ~ 1.3B 거의 차이 없음 거의 차이 없음
6.7B 조금 오름 조금 오름
175B 10.4 40.7

GSM8K에서 10.4 → 40.7이다. 문장 한 줄 추가했을 뿐인데 네 배다. 단, 그 문장이 통할 만큼 모델이 커야 한다.

추론 능력은 거대 언어 모델의 창발성 중 하나라고 볼 수 있다는 뜻이다. 15편에서 본 창발성이 여기서 다시 나온다.

작은 모델에게 “차근차근 생각해봐”라고 해도 소용이 없다. 없는 능력을 프롬프트로 끌어낼 수는 없다.


5. 어떤 예시를 주느냐가 성능을 좌우한다

프롬프트의 나머지 절반, 예시(few-shot examples) 로 넘어간다.

여기서 놀라운 실험 결과가 하나 있다. 감정 분석에서 학습 데이터에서 예시를 무작위로 5번 골라 각각 정확도를 재봤다.

시도 1 2 3 4 5
정확도 94.6 95.0 95.8 93.9 86.9

같은 모델, 같은 방법인데 86.9에서 95.8까지 벌어진다. 바꾼 것은 예시로 어떤 문장을 골랐는가뿐이다.

프롬프트에 예시를 넣는 것이 공짜로 성능을 올려주는 마법이 아니다. 잘못 고르면 오히려 떨어진다.

해결책 — 비슷한 예시를 골라준다

아이디어는 단순하다.

풀고 싶은 질문과 유사한 예시를 골라서 넣는다. (거리 기반 선택)

동작 방식은 이렇다.

1. 테스트 질문을 문장 인코더로 벡터로 바꾼다
   "What county is Frederick, MD in?"  →  [0.2, -0.5, ...]

2. 학습 데이터의 문장들도 전부 벡터로 바꾼다

3. 벡터 사이 거리를 재서 가장 가까운 k개를 고른다
   → "What county is Duluth Minnesota in?"  (가깝다)
   → "What Olympic athlete has won the most medals?"  (멀다)

4. 가까운 것들만 예시로 붙여 모델에 넣는다

효과가 확실했다.

예시 선택 방식 정확도
가장 가까운 10개 46.0
가장 먼 10개 31.0

15점 차이다. 같은 개수의 예시인데 무엇을 고르느냐로 이만큼 갈린다.

시험 직전에 문제집을 푼다고 하자. 이번 시험 범위와 비슷한 문제를 푸는 것과 전혀 다른 단원 문제를 푸는 것은 효과가 다르다. 예시 선택이 딱 이 이야기다.

이 방식은 RAG(검색 증강 생성) 와 발상이 같다. “필요한 것을 찾아서 프롬프트에 넣는다”는 구조가 그대로 반복된다. RAG는 20편에서 다시 나온다.


6. 2026년의 프롬프트 엔지니어링 — Skill.md

강의에서 흥미로웠던 마지막 조각이다.

프롬프트를 잘 쓰는 게 중요해지자, 잘 만든 프롬프트를 파일로 저장하고 공유하는 흐름이 생겼다.

Skill = 특정 작업을 위해 엔지니어링된 프롬프트. 공유 가능하고 사용자 정의 가능하다.

문제의식은 이렇다.

스킬 없이 스킬로
매번 긴 지시와 가이드 문서를 첨부해야 한다 한 번 등록해두면 자동으로 불러온다
같은 설명을 반복한다 정해진 절차에 따라 교정·출력

형식은 마크다운 파일 하나다.

---
name: your-skill-name
description: 이 Skill이 무엇을 하고 언제 써야 하는지에 대한 간단한 설명
---

# 스킬 이름

## Instructions
[모델이 따를 명확한 단계별 지침]

## Examples
[이 Skill을 사용하는 구체적인 예제]

동작 구조가 영리하다. 모든 스킬의 전체 내용을 항상 들고 있지 않는다.

1. 각 스킬의 짧은 요약(description)만 시스템 프롬프트에 붙여둔다
2. 사용자가 요청을 보낸다
3. 모델이 "이건 PDF 스킬이 필요하겠다"고 판단한다
4. 그때서야 해당 SKILL.md 파일을 읽어온다
5. 필요하면 그 안에서 참조하는 다른 파일도 읽는다

필요할 때만 꺼내 읽는다. 요약본만 책상에 두고, 필요한 순간에 서랍에서 매뉴얼을 꺼내는 것과 같다. 컨텍스트 윈도우(모델이 한 번에 볼 수 있는 입력 길이)는 한정되어 있으니 이렇게 아껴 쓴다.

개인적으로는 이 부분이 이번 강의에서 가장 실감났다. 프롬프트를 매번 다시 쓰는 것에서 자산으로 쌓는 것으로 바뀌는 지점이기 때문이다. 코드에서 함수를 만들어 재사용하는 것과 성격이 같다.


정리

  • 프롬프트 = 지시(instruction) + 예시(few-shot examples)
  • 지시 = 시스템 프롬프트 + 유저 쿼리
  • 시스템 프롬프트 — 유저 쿼리와 무관하게 기본값으로 주어지는 입력
    • 학습 이후에 추가로 행동을 통제하기 위한 장치
    • 단, 지시가 반드시 지켜지지는 않는다. 보안을 여기에만 의존하면 안 된다
    • 활용 — 개인화(메모리), 페르소나(캐릭터)
  • 유저 쿼리 — 관심이 쉬운 분류에서 수학·코딩 같은 다단계 문제로 옮겨갔다
  • Chain-of-Thought — 14편에서 다룬 그 방법. 이번에 새로 짚은 건 규모 의존성
    • 작은 모델에서는 효과가 거의 없다. 175B에서 GSM8K 10.4 → 40.7
    • 추론 능력 자체가 창발성이라는 근거
  • 예시 선택이 성능을 좌우한다 — 무작위 선택만으로 86.9 ~ 95.8까지 벌어졌다
    • 해결책은 질문과 비슷한 예시를 골라 넣기. 가까운 10개 46.0 vs 먼 10개 31.0
    • RAG와 발상이 같다
  • Skill.md — 잘 만든 프롬프트를 파일로 저장하고 공유한다
    • 요약만 상주시키고 필요할 때만 본문을 읽어 컨텍스트를 아낀다

다음 글에서

여기까지가 거대 언어 모델을 잘 쓰는 법이었다. 그럼 잘 쓰고 있는지는 어떻게 알까?

다음 글에서는 거대 언어 모델의 평가 — 정답이 없는 작업을 채점하는 방법과, 그 방법들이 가진 편향을 다룬다.

참고 자료

한줄 평

  • 이전에 기본적인 프롬프트 엔지니어링에 배웠는데, 이에 대한 구체적인 성능 평가 및 제약사항을 확인하는게 나름 뜻 깊었다.