Few-shot 예시 설계 — 형식은 맞는데 판단이 흔들릴 때
시리즈 프롬프트를 코드처럼 다루기의 네 번째 글.
터진 문제
스키마로 형식을 고정하고 나니 파싱은 안 깨졌다. 대신 다른 게 보이기 시작했다. 형식은 완벽한데 판단이 매번 달랐다.
같은 수준의 생활기록부인데 한 번은 활동 하나를 근거로 쓰고, 한 번은 같은 활동을 무시했다. 규칙을 더 쓰면 될 줄 알았다. “의미 있는 활동을 근거로 삼아라.” 그런데 “의미 있는”을 문장으로 정의하는 게 불가능했다.
이게 예시가 필요한 지점이다. 말로 정의할 수 있는 건 규칙으로 쓰고, 말로 정의 못 하는 건 예시로 보여준다.
Before — 좋은 예시만 보여주기
예시:
입력: "교내 토론대회 참가, 모의유엔 동아리 2년 활동, 정치 관련 도서 5권 독서"
출력: { "major": "정치외교학과", "reason": "토론·모의유엔·독서가 모두 정치 영역으로 수렴" }
이 예시는 거의 쓸모가 없었다. 이유는 하나다. 너무 쉬운 입력이기 때문이다.
모델은 이런 입력에서는 원래도 틀리지 않는다. 예시가 가르쳐주는 게 없다. 토큰만 쓴다.
After — 경계 사례와 오답을 보여주기
예시를 고르는 기준을 바꿨다. 내가 헷갈렸던 입력만 예시로 썼다.
<예시 1 — 활동이 흩어져 있는 경우>
입력: "교내 봉사 30시간, 수학 교과 우수상, 밴드부 3년, 심리학 도서 2권"
출력:
{
"major": "심리학과",
"reason": "독서 2권이 유일한 학문적 관심 신호다. 봉사·밴드부는 학과 연결 근거로 쓰지 않았다.",
"evidence": "심리학 도서 2권"
}
해설: 활동이 많아도 학과와 연결되는 건 일부다. 수가 아니라 방향으로 판단한다.
<예시 2 — 근거가 부족한 경우>
입력: "출결 양호, 교과 성적 상위권, 특기사항 기재 없음"
출력:
{
"major": null,
"reason": "학과를 추론할 근거가 생활기록부에 없다.",
"evidence": ""
}
해설: 근거가 없으면 추천하지 않는다. 성적만으로 학과를 역산하지 않는다.
예시 2가 핵심이다. “하지 않는 것”의 예시가 있어야 모델이 멈출 줄 안다. 금지 규칙을 열 줄 쓰는 것보다 “이럴 땐 null을 낸다”는 예시 하나가 잘 들었다.
예시를 고른 기준
- 내가 실제로 헷갈린 입력에서 고른다. 쉬운 입력은 예시가 아니라 낭비다.
- 거절·보류 사례를 최소 하나 넣는다.
- 예시마다 해설 한 줄을 붙인다. 판단 근거를 명시하면 모델이 패턴이 아니라 기준을 가져간다.
- 예시 간 형식을 완전히 동일하게 맞춘다. 형식이 흔들리면 모델이 그 흔들림까지 따라한다.
개수
(예시를 몇 개까지 늘려봤고, 어디서 효과가 꺾였는지 적는다.)
무엇이 좋아졌는가
(일관성 측정 방법과 before/after를 적는다.)
이 기법이 안 통하는 경우
- 예시가 입력 분포를 대표하지 못할 때. 내가 고른 예시가 특정 유형에 쏠려 있으면 모델이 그쪽으로 과적합된다. 실제로 예시를 이과 계열로 몰아 넣었더니 문과 입력에서도 비슷한 논리를 끌어왔다.
- 입력이 길 때. 예시가 길어지면 실제 입력이 뒤로 밀린다. 이때는 예시를 줄이거나 태스크 분해로 넘어가는 게 맞았다.
- 판단 기준이 아직 안 정해졌을 때. 예시는 기준을 전달하는 도구지 만드는 도구가 아니다. 내가 기준을 모르면 예시도 못 고른다.
정리
예시를 넣으라는 조언은 흔한데, 어떤 예시를 넣으라는 조언은 드물다. 내 경우 답은 “내가 틀렸던 입력”이었다. 그래서 Few-shot 예시를 고르는 작업은 결국 내 판단 기준을 글로 꺼내는 작업이었다.
다음 글: 태스크 분해 — 긴 입력에서 앞부분이 통째로 무시되는 문제.