목차
- 같은 프롬프트, 완전히 다른 결과
- Claude가 프롬프트를 읽는 방식
- GPT-4가 잘 반응하는 프롬프트 패턴
- 시스템 프롬프트에서 갈리는 지점
- 모델별 최적화를 적용한 결과
- 프롬프트도 버전 관리가 필요하다
"프롬프트 엔지니어링은 모델에 상관없이 원리가 같다"는 말을 꽤 오래 믿었다. Claude 프롬프트든 GPT-4 프롬프트든, 지시를 명확하게 쓰고 예시를 붙이면 어떤 LLM이든 비슷한 결과가 나올 거라 생각했다. 틀렸다.
화요일 저녁, 사내 고객 문의 분류 챗봇의 프롬프트를 GPT-4 Turbo에서 Claude 3.5 Sonnet으로 옮기는 작업을 하고 있었다. M1 MacBook Pro에 VS Code와 iTerm2를 띄워놓고 API 호출 스크립트를 돌렸는데, GPT-4에서 78%까지 올려놓은 분류 정확도가 Claude에서 62%로 곤두박질쳤다. 프롬프트를 그대로 복붙한 것뿐인데 16%p가 빠진 거다. 그날 새벽 3시까지 양쪽 프롬프트를 각각 뜯어고쳤고, 결과적으로 Claude 프롬프트와 GPT-4 프롬프트는 근본적으로 다르게 써야 한다는 걸 체감했다.
같은 프롬프트, 완전히 다른 결과
처음에는 프롬프트 자체가 부실한 줄 알았다. 지시가 모호한가, 출력 형식 지정이 부족한가. 그래서 프롬프트를 더 정교하게 다듬었다. 카테고리 정의를 구체적으로 늘리고, 출력을 JSON으로 고정하고, 분류 기준을 세분화했다.
GPT-4 Turbo에서는 효과가 있었다. 78%에서 82%까지 올라갔다. 그런데 같은 수정본을 Claude 3.5 Sonnet(claude-3-5-sonnet-20241022)에 넣으니 65% 근처를 맴돌았다. 문제는 프롬프트의 "내용"이 아니었다. "구조"였다.
Anthropic 공식 프롬프트 엔지니어링 가이드(출처: Anthropic Docs, 2025년 6월 업데이트)를 제대로 읽고 나서야 원인을 잡았다. Claude와 GPT-4는 프롬프트를 파싱하는 방식 자체가 다르다. 같은 텍스트를 넣어도 각 모델이 주목하는 구조적 단서가 다른 것이다. 이걸 모른 채 프롬프트 내용만 다듬고 있었으니 정확도가 안 올라간 게 당연했다.
Claude가 프롬프트를 읽는 방식
Claude 프롬프트 최적화에서 가장 큰 전환점은 XML 태그였다. Anthropic 문서에서 XML 태그 사용을 권장하길래 "마크다운으로 구분해도 되지 않나" 하고 처음엔 넘겼다. 실제로 써보면 권장 수준이 아니라 거의 필수에 가깝다.
고객 문의 분류 프롬프트를 예로 들겠다. GPT-4용으로 잘 돌아가던 원본은 이랬다:
고객 문의를 다음 카테고리 중 하나로 분류하라: 결제, 배송, 환불, 기타
# 분류 기준
- 결제: 결제 수단, 결제 오류, 카드 등록
- 배송: 배송 조회, 배송 지연, 주소 변경
- 환불: 환불 요청, 환불 상태, 부분 환불
문의 내용: {input}
JSON으로 응답: {"category": "...", "confidence": "..."}
이걸 Claude용으로 바꾸면 이렇게 된다:
<task>고객 문의를 아래 카테고리 중 하나로 분류한다</task>
<categories>
<category name="결제">결제 수단, 결제 오류, 카드 등록 관련 문의</category>
<category name="배송">배송 조회, 배송 지연, 주소 변경 관련 문의</category>
<category name="환불">환불 요청, 환불 상태, 부분 환불 관련 문의</category>
<category name="기타">위 카테고리에 해당하지 않는 문의</category>
</categories>
<rules>
- 배송과 환불이 동시에 해당되면 고객의 최종 요구사항 기준으로 분류
- 욕설/감정 표현은 무시하고 실제 문의 내용만 판단
</rules>
<input>{{customer_message}}</input>
<output_format>
category: 분류 결과
confidence: high / medium / low
reason: 판단 근거 한 줄
</output_format>
정보량은 거의 동일하다. 그런데 Claude에서 XML 버전으로 바꾸자 분류 정확도가 65%에서 84%로 뛰었다. 19%p 차이. Claude는 XML 태그를 구조적 경계로 인식해서 각 섹션의 역할을 구분하는 것으로 보인다. <task> 안에 있으면 "이게 내가 할 일", <categories> 안에 있으면 "이게 선택지", <rules> 안에 있으면 "이게 제약 조건" — 이런 식으로 파악하는 것이다.
규칙 서술이 예제보다 낫더라
Claude 프롬프트를 다루면서 의외였던 건 few-shot 예제에 대한 반응이다. GPT-4에서의 습관대로 분류 예제를 10개 넣었더니 오히려 정확도가 떨어졌다. 예제 수를 줄여가며 테스트했는데, 3개가 적당했고 5개를 넘기면 성능이 빠졌다. 예제에 과적합되는 것과 비슷한 현상이었다.
Claude는 "이런 식으로 해" 하고 보여주는 것보다 "이런 규칙으로 판단해" 하고 기준을 서술하는 쪽이 잘 통한다. 위 프롬프트의 <rules> 섹션이 그 예다. "배송과 환불이 동시에 해당되면 고객의 최종 요구사항 기준으로 분류한다" — 이 규칙 한 줄이 예제 3개를 대체했다. Anthropic에서는 이걸 "role prompting보다 task prompting"이라고 표현하는데, 실무에서 써보면 정확한 말이다. 막연히 "너는 훌륭한 분류 전문가야"라고 쓰는 것보다, 판단 기준을 명시적으로 나열하는 게 낫다.
GPT-4가 잘 반응하는 프롬프트 패턴
GPT-4 계열은 다른 지점에서 강점을 보인다.
GPT-4 Turbo(gpt-4-turbo-2024-04-09)에 few-shot 예제를 3~5개 넣으면 출력 형식과 판단 기준이 예제를 거의 그대로 따라간다. OpenAI 공식 가이드(출처: OpenAI Prompt Engineering, 2025년 업데이트)에서도 few-shot을 핵심 전략으로 소개하는데, 실제 체감 효과가 크다. 규칙을 장황하게 서술하는 것보다 잘 고른 예제 5개가 더 안정적인 출력을 만들어낸다. Claude와 정반대다.
GPT-4o(gpt-4o-2024-08-06)부터 도입된 Structured Outputs도 GPT-4 프롬프트의 강점이다. API 호출 시 response_format에 JSON 스키마를 지정하면 모델이 해당 스키마에 맞는 출력만 생성한다. 프롬프트에 "JSON으로 출력해"라고 쓰는 것과는 신뢰도 자체가 다르다. OpenAI가 모델 레벨에서 보장하는 기능이라 형식 오류가 원천적으로 사라진다. 분류 태스크에서 이 기능을 켜니 파싱 에러가 0건이 됐다.
Claude도 JSON 출력은 가능하다. <output_format> 태그 안에 형식을 명시하거나, 프롬프트 마지막에 {를 미리 넣어서 JSON 시작을 유도하는 트릭이 있다. Anthropic의 tool use 기능을 쓰면 구조화된 출력을 강제할 수도 있긴 한데, 단순 JSON 출력 용도로 tool use를 쓰는 건 좀 과하다는 느낌이 있다. 반면 GPT-4에 XML 태그를 넣어봤더니 태그를 출력에 그대로 포함시키는 경우가 종종 발생했다. GPT-4는 XML을 구조적 메타 정보가 아니라 텍스트의 일부로 해석하는 경향이 있다.
시스템 프롬프트에서 갈리는 지점
두 모델의 시스템 프롬프트 철학이 다르다.
GPT-4는 시스템 메시지에 넣은 제약 조건을 강하게 따른다. 출력 형식, 톤, 금지 사항을 시스템 프롬프트에 몰아넣고, 사용자 메시지에는 실제 입력만 보내는 구조가 잘 통한다. Claude는 시스템 프롬프트와 사용자 메시지의 경계가 상대적으로 유연하다. 어디에 넣든 비슷하게 반응할 때가 있다. 대신 Claude는 프롬프트 내 위치에 민감하다. 핵심 지시를 프롬프트의 맨 앞이나 맨 뒤에 배치하면 중간에 넣는 것보다 잘 따르는 경향이 있고, Anthropic에서도 이 점을 명시한다(출처: Anthropic Docs, Prompt Design Tips). 이 차이 때문에 Claude 프롬프트는 사용자 메시지 자체의 구조 설계가 중요하고, GPT-4는 시스템 메시지 설계에 더 공을 들여야 한다.
모델별 최적화를 적용한 결과
아까 말한 고객 문의 분류 프로젝트로 돌아가자. 테스트 데이터 200건으로 양쪽 모델을 돌린 최종 수치다.
| 조건 | GPT-4 Turbo | Claude 3.5 Sonnet |
|---|---|---|
| GPT-4용 프롬프트 그대로 사용 | 78% | 62% |
| Claude용 프롬프트 그대로 사용 | 65% | 84% |
| 각 모델에 맞춘 최적화 프롬프트 | 85% | 91% |
숫자가 말해준다. 각 모델에 맞는 프롬프트를 따로 만들었을 때 두 모델 모두 성능이 크게 올라간다. Claude는 XML 구조화 + 규칙 서술로 바꾼 것만으로 62%에서 91%까지 뛰었다. GPT-4도 시스템 프롬프트 분리 + few-shot 정교화로 78%에서 85%까지 올렸다.
비용도 달랐다
같은 200건 기준 API 비용을 비교하면 차이가 꽤 난다. GPT-4 Turbo는 입력 $10/1M tokens, 출력 $30/1M tokens이고, Claude 3.5 Sonnet은 입력 $3/1M tokens, 출력 $15/1M tokens이다(2024년 하반기 기준 가격). XML 태그를 많이 쓰는 Claude 프롬프트가 토큰 수는 10~15% 더 나간다. 그래도 단가 차이가 워낙 커서 총 비용은 Claude 쪽이 절반 이하로 나왔다. GPT-4o를 쓰면 비용이 상당히 줄어들긴 하지만, Claude 3.5 Sonnet의 단가를 이기지는 못했다.
다만 이건 텍스트 분류 태스크 하나에서의 결과다. 코드 생성이나 긴 글 요약 같은 태스크에서는 양상이 다를 수 있어서, 이 수치를 모든 상황에 일반화하기는 어렵다.
최적화에 걸린 시간
프롬프트 최적화에 든 시간도 체감상 달랐다. GPT-4 프롬프트는 few-shot 예제를 고르는 과정이 병목이었다. 어떤 예제 조합이 최적인지 찾으려면 여러 조합을 돌려봐야 한다. 예제 풀이 50개만 되어도 5개 조합의 경우의 수가 엄청나서, 결국 직감에 의존하게 된다.
Claude 프롬프트는 규칙을 서술형으로 작성하는 방식이라 수정-테스트 사이클이 빨랐다. 규칙 하나를 바꾸고 다시 돌려보면 된다. 체감상 Claude 프롬프트 최적화가 GPT-4 대비 30~40% 정도 시간이 덜 걸렸는데, 이건 규칙 서술 방식의 장점이지 모델 자체의 우열과는 별개다.
프롬프트도 버전 관리가 필요하다
같은 Claude라도 모델 버전이 바뀌면 프롬프트 성능이 달라진다. Claude 3 Opus에서 잘 되던 프롬프트가 Claude 3.5 Sonnet에서 미묘하게 다르게 동작한 적이 여러 번 있었다. Claude Sonnet 4(claude-sonnet-4-20250514)로 넘어가면서 또 한 번 재조정이 필요했다. GPT-4에서 GPT-4o로 전환할 때도 마찬가지 경험을 했다. 모델 업데이트 후에는 기존 프롬프트를 반드시 재검증해야 한다.
이걸 자동화하려면 프롬프트와 테스트 케이스를 세트로 관리해야 한다. promptfoo(GitHub: promptfoo/promptfoo, v0.92 기준) 같은 오픈소스 eval 도구를 쓰면 프롬프트와 테스트를 YAML로 관리하고, 여러 모델을 한 번에 비교 실행할 수 있다. CI/CD 파이프라인에 붙이면 프롬프트 변경 시 자동으로 성능 체크를 돌리는 것도 가능하다.
Anthropic의 Workbench나 OpenAI Playground에서 간단한 테스트는 가능하지만, 200건 이상 규모의 체계적인 eval을 하려면 별도 도구가 필요하다. 이 영역은 아직 업계 전체적으로 표준이 잡히지 않아서 팀마다 방법이 제각각인 것 같다. 우리 팀도 promptfoo 위에 자체 래퍼를 얹어서 쓰고 있는데, 이 부분은 아직 만족스러운 상태는 아니다.
개인적으로는 Claude 프롬프트 쪽이 작성하기 더 편했다. XML 태그로 구조를 잡으면 프롬프트 자체가 일종의 문서처럼 읽혀서 수정 포인트를 찾기가 빠르다. GPT-4의 few-shot 기반 접근은 예제 선정에 따라 결과가 흔들리는 폭이 커서, 안정적인 품질을 잡기까지 시행착오가 더 많았다.
관련 글
- Claude Code 실전 활용법 — GUI 없이 터미널에서 AI 코딩하는 법 – 다들 AI 코딩 하면 GUI IDE를 떠올린다. Claude Code는 터미널에서 돌아가는데, 이게 오히려 백엔드 작업에선 빠르다. 3주간…
- Claude API Python 연동 가이드 — 첫 호출부터 챗봇 구현까지 – Claude API를 Python에서 처음 연동하면서 겪은 시행착오를 기록했다. .env 파일의 따옴표 하나로 45분을 소모한 인증 에러,…
- GitHub Copilot vs Cursor vs Cline — AI 코딩 어시스턴트 비교 실전 기록 – GitHub Copilot, Cursor, Cline에 동일 프롬프트를 던지면 결과가 전부 다르다. 5인 백엔드 팀에서 3주간 FastAP…