역할·제약 구조화 — 모델이 지시를 일부만 따를 때

시리즈 프롬프트를 코드처럼 다루기의 두 번째 글.

발생한 문제

보고서 생성 프롬프트에 요구사항을 하나씩 추가했다. 분량 제한, 어투, 근거 표기, 금지 표현… 그런데 네 번째 요구사항을 넣는 순간부터 첫 번째 요구사항이 무시되기 시작했다.

지시가 길어서 못 읽는 게 아니었다. 지시들이 같은 층위에 섞여 있어서 모델이 우선순위를 못 잡는 것이었다.

Before — 한 덩어리로 쓴 프롬프트

너는 입시 상담 전문가야. 생활기록부를 보고 학과에 맞는 보고서 주제를 추천해줘.
추천은 3개만 하고, 근거를 꼭 적어줘. 학생이 제출할 보고서니까 너무 딱딱하지 않게,
그리고 고등학교 범위에 없는 내용은 절대 추측하지 마. 분량은 각 추천당 3~4문장.
단정적인 표현은 쓰지 말고 전공 이름은 정확하게 써줘.

문제는 문장력이 아니었다.

  • 역할(입시 상담 전문가)과 작업(학과 추천)과 출력 규칙(3개, 3~4문장)과 금지사항(추측, 단정)이 전부 뒤섞여 있었다.
  • “절대”, “꼭” 같은 강조어가 여러 개라 무엇이 더 중요한지 구분되지 않았다.
  • 나중에 규칙 하나를 수정할 때, 어느 문장을 건드려야 하는지 찾기 어려웠다.

After — 역할 / 입력 / 규칙 / 금지로 분리

<역할>
대입 진학 상담관. 생활기록부 근거만으로 보고서 주제를 추천한다.

<입력>
학생이 가고자 하는 학과, 어떤 세부특기사항 항목인지, 생활기록부는 사용자가 첨부해서 업로드할 예정

<작업>
1. 업로드한 생활기록부에서 반복 등장하는 관심 영역을 찾는다.
2. 그 영역과 연결되는 학과를 3개 선정한다.
3. 각 학과마다 근거가 된 생활기록부 문구를 인용한다.

<출력 규칙>
- 학과 3개. 더 많거나 적으면 안 된다.
- 분량은 각 학과당 3~4문장.
- 근거는 생활기록부 원문을 그대로 인용한다.
- 전공명은 대학 공식 명칭을 사용한다.

<금지>
- 생활기록부에 없는 활동·성향을 추측하지 않는다.
- 합격 가능성, 유리함 등 결과를 단정하지 않는다.

바뀐 건 내용이 아니라 구조였다. <tag>들을 생성해 넣어줬더니 같은 요구사항인데 섹션으로 나눴을 뿐이다.

왜 이게 통하는가

  • 섹션 제목이 우선순위 신호가 된다. <금지>는 <출력 규칙>보다 강하게 작동했다.
  • 규칙이 리스트로 분리되면 모델이 체크리스트처럼 처리한다. 문장 속에 묻힌 조건은 빠뜨렸다.
  • 수정이 국소화되었다. 분량 규칙을 바꿀 때 <출력 규칙>만 건드리면 되었다.
  • 이건 모델 성능이 아니라 내 유지보수 문제였다.

무엇이 좋아졌는가

(before / after를 같은 입력으로 돌려 비교한 결과를 적는다.)

이 기법이 안 통하는 경우

  • 규칙이 서로 모순될 때. 구조화는 모순을 해결하지 못하고, 오히려 모순을 또렷하게 드러낸다. “짧게 써라”와 “근거를 모두 인용하라”가 같이 있으면 모델은 둘 중 하나를 버린다. 이건 프롬프트 문제가 아니라 요구사항 정의 문제다.
  • 규칙이 10개를 넘어갈 때. 섹션을 나눠도 뒤쪽 규칙의 준수율이 떨어진다. 이때는 구조화가 아니라 태스크 분해가 답이다.
  • 짧은 단발 작업. 요구사항이 두세 개뿐이면 구조화는 토큰만 늘린다.

정리

지시를 안 듣는다고 느껴질 때 제일 먼저 하게 되는 일은 문장을 더 강하게 쓰는 것이다. “반드시”, “절대로”, 대문자. 내 경험상 그건 거의 효과가 없었다. 효과가 있었던 건 같은 말을 구조로 바꾸는 것이었다.

다음 글: 출력 스키마 고정 — 형식은 맞는데 파싱이 간헐적으로 깨지는 문제.