한국어 Prompt Engineering 베스트 프랙티스: Claude 출력 품질 90%까지 (2026)
영어로 작성된 system prompt에 "한국어로 답변" 한 줄만 추가하면 출력 품질은 60-70%대에 머무릅니다. 평어가 섞이고, 영어로 fallback하고, 외래어 표기가 일관되지 않습니다. 7가지 패턴을 적용하면 90%대로 안정화됩니다. 핵심은 (1) Korean-first system prompt 구조, (2) 존댓말 명시, (3) 영문 기술용어는 그대로 유지, (4) 한국 회사 문화 맥락 주입, (5) 응답 평가 자동화, (6) 흔한 함정 회피, (7) 모델 선택입니다. 본 가이드는 12개 한국어 챗봇을 프로덕션 배포하면서 검증한 패턴을 정리합니다.
왜 한국어가 어려운가?
Claude를 포함한 대부분의 LLM은 학습 데이터의 영어 비율이 압도적입니다. 한국어 데이터는 전체의 1-3% 수준으로 추정되며, 이로 인해 다음 세 가지 문제가 반복적으로 발생합니다.
문제 1: 영어 모드로 fallback — 사용자 질문이 짧거나 영문 코드를 포함하면 모델이 영어로 응답합니다. System prompt가 영어로 작성되어 있다면 더 빈번해집니다.
문제 2: 격식체 vs 평어 혼용 — 한국어는 "-합니다", "-해요", "-한다"의 세 가지 종결 어미가 존재합니다. 명시적 강제가 없으면 한 응답 안에서 세 가지가 섞입니다.
문제 3: 외래어 처리 비일관성 — "function"을 "함수", "펑션", "function" 중 어떤 표기로 쓸지 모델이 매번 다르게 결정합니다.
이 세 가지를 해결하면 품질의 80%는 잡힙니다. 나머지는 문화 맥락과 후처리입니다.
패턴 1: Korean-first system prompt 구조
가장 흔한 실수는 "영어로 instructions 작성 + 한국어 examples"입니다. 모델은 instructions를 더 비중 있게 처리하므로, 영어 instructions는 곧바로 영어 모드를 활성화합니다.
잘못된 예시:
system = """You are a friendly Korean code reviewer.
Review code for security, performance, and readability.
Always respond in Korean.
Examples:
사용자: 이 함수 어때요?
어시스턴트: 함수가 잘 작성되었습니다.
"""
개선된 예시:
system = """당신은 친절한 한국어 코드 리뷰어입니다.
보안, 성능, 가독성을 점검합니다.
영문 기술 용어 (function, variable, async, await 등)는
영어 그대로 사용합니다.
모든 응답은 한국어 존댓말 (-합니다, -습니다)로 작성합니다.
# 응답 형식
1. 한 줄 요약 (반드시 한국어 존댓말)
2. 상세 분석 (보안 / 성능 / 가독성 순서)
3. 개선 코드 제안 (코드 블록은 영어 변수명 유지)
# 절대 규칙
- 평어 (-한다, -이다) 사용 금지
- 영어로 응답 금지 (사용자가 영어로 질문해도 한국어로 답변)
- 모르는 내용은 추측하지 않고 "확인이 필요합니다"라고 답변
"""
처음부터 한국어로 작성하면 모델이 한국어 모드에 고정됩니다. 영문 기술 용어만 예외로 허용합니다.
패턴 2: 존댓말 강제 ("합니다체" 우선)
한국어 종결 어미는 비즈니스 챗봇과 친근한 SaaS에서 다르게 선택됩니다.
| 종결 어미 | 예시 | 적합한 용도 |
|---|---|---|
| -합니다 / -습니다 | "함수가 잘 작성되었습니다." | B2B SaaS, 고객 지원, 보고서 |
| -해요 / -이에요 | "함수가 잘 작성되었어요." | 친근한 D2C 챗봇, 학습 콘텐츠 |
| -한다 / -이다 | "함수가 잘 작성되었다." | 뉴스 기사, 기술 문서 (대화 X) |
강제 문구 (system prompt에 추가):
모든 문장 끝은 -합니다, -습니다, -입니다 형태로 끝납니다.
절대 평어 (-한다, -이다, -다)나 해요체 (-해요, -이에요)를 사용하지 않습니다.
예외: 코드 블록 안의 주석은 영어로 작성합니다.
이 한 줄로 평어 혼용 문제의 90%가 해결됩니다.
패턴 3: 영문 기술용어 처리 (3가지 방식)
영문 기술 용어를 어떻게 표기할지 결정하지 않으면 응답마다 다른 표기가 등장합니다.
# 방식 1: 영어 그대로
"function을 호출하면 async가 await을 기다립니다."
# 방식 2: 한국어 번역
"함수를 호출하면 비동기 함수가 대기를 기다립니다."
# 방식 3: 양쪽 병기 (첫 등장 시)
"함수(function)를 호출하면 비동기(async)가 대기(await)를 기다립니다."
권장 패턴: 첫 등장 시 양쪽 병기 → 이후 영어. System prompt에 다음 한 줄을 추가합니다.
영문 기술 용어는 첫 등장 시 "한국어(영어)" 형태로 병기하고,
이후 동일 응답 내에서는 영어 표기만 사용합니다.
예: "함수(function)는 ... 이 function의 ..."
패턴 4: 한국 문화 맥락 주입
서양식 직설 화법을 그대로 번역하면 한국어 사용자에게 무례하게 느껴집니다. System prompt에 문화 맥락을 명시합니다.
# 한국 문화 맥락
- 첫 응답은 인사로 시작합니다 ("안녕하세요", "반갑습니다")
- 결론을 먼저 던지지 않고, 배경 → 분석 → 결론 순서로 설명합니다
- 사용자의 의견을 부정할 때는 "다만", "하지만"을 앞에 둡니다
- "당신"이라는 호칭 대신 "고객님" 또는 생략을 선호합니다
# 한국 IT 용어 (선호 표기)
- 백엔드 / 프론트엔드 / 풀스택 (영어 그대로)
- 개발자 (코더 X)
- 서버 (server X, "서버" 표기)
- 데이터베이스 (DB는 약어로만 사용)
# 한국 회사 환경
- 보고서 작성을 자주 요청받습니다
- 위계 (대리/과장/부장/임원)에 따라 톤이 달라질 수 있습니다
- 야근, 회식 같은 한국 특유 맥락을 자연스럽게 다룹니다
이 영역은 챗봇 페르소나에 따라 조정합니다. B2B 영업 챗봇과 학습 챗봇은 다르게 작성해야 합니다.
Cost Optimization Masterclass — 한국어 챗봇을 프로덕션에 배포하면서 토큰 비용을 50-70% 절감하는 실전 패턴 12가지. Prompt caching, 모델 라우팅, 응답 캐시 계층, 토큰 카운트 최적화. $59 / ₩79,000
패턴 5: 응답 평가 (자동화)
System prompt를 아무리 잘 써도 모델 업데이트나 사용자 패턴 변화로 품질이 흔들립니다. 자동 평가 루프가 필요합니다.
기준 4가지:
- 한국어 자연스러움 (1-10): 어색한 번역체 여부
- 존댓말 일관성 (1-10): 평어 혼용 없음
- 기술 정확도 (1-10): 잘못된 정보 없음
- 사용자 의도 부합 (1-10): 질문에 직접 답변
자동 평가 코드:
import anthropic
import random
client = anthropic.Anthropic()
JUDGE_PROMPT = """당신은 한국어 챗봇 응답 품질 평가자입니다.
다음 4가지 기준으로 1-10점 채점합니다.
1. 한국어 자연스러움: 어색한 번역체 없음
2. 존댓말 일관성: 평어/해요체 혼용 없음
3. 기술 정확도: 잘못된 정보 없음
4. 사용자 의도 부합: 질문에 직접 답변
JSON 형식으로만 응답합니다:
{"natural": 0, "honorific": 0, "accuracy": 0, "intent": 0,
"issues": ["문제점 리스트"]}
"""
def evaluate_response(question: str, answer: str) -> dict:
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=500,
system=JUDGE_PROMPT,
messages=[{
"role": "user",
"content": f"질문: {question}\n\n응답: {answer}"
}]
)
import json
return json.loads(msg.content[0].text)
# 100개 응답마다 1개 샘플 평가
def maybe_evaluate(question, answer, sample_rate=0.01):
if random.random() < sample_rate:
score = evaluate_response(question, answer)
avg = sum([score['natural'], score['honorific'],
score['accuracy'], score['intent']]) / 4
if avg < 7.5:
alert_team(f"품질 저하 감지: {avg:.1f}/10 — {score['issues']}")
log_score(score, avg)
평균 점수가 7.5 미만으로 내려가면 알림을 보내고 system prompt를 재검토합니다.
패턴 6: 흔한 함정 5가지
프로덕션에서 반복적으로 마주친 문제들입니다.
함정 1: 영어로 fallback — 사용자가 "How do I use this function?"처럼 영어로 질문하면 모델이 영어로 답변합니다. System prompt에 "사용자가 영어로 질문해도 한국어로 답변합니다"를 명시합니다.
함정 2: 평어 섞임 — "이 함수는 잘 작성되었다. 다만 이 부분을 수정하시면 좋겠습니다." 같은 혼용. 강제 문구 추가로 해결됩니다.
함정 3: 외래어 표기 비일관성 — "서울/Seoul", "AWS/aws", "JavaScript/자바스크립트" 같은 표기 흔들림. 응답 후처리 정규화로 잡습니다.
import re
EXTERNAL_TERMS = {
r'\b자바스크립트\b': 'JavaScript',
r'\b파이썬\b': 'Python',
r'\baws\b': 'AWS',
r'\bapi\b': 'API',
r'\bsdk\b': 'SDK',
}
def normalize_korean(text: str) -> str:
"""응답 후처리: 외래어 표기 통일."""
for pattern, replacement in EXTERNAL_TERMS.items():
text = re.sub(pattern, replacement, text, flags=re.IGNORECASE)
return text
# 사용 예
raw = "자바스크립트로 aws sdk를 호출합니다."
clean = normalize_korean(raw)
# "JavaScript로 AWS SDK를 호출합니다."
함정 4: 한국어 코드 주석 강제 시 모델 혼란 — "코드 주석도 한국어로 작성"이라고 강제하면 변수명까지 한국어로 시도하다 깨집니다. 코드 안은 영어 유지가 안전합니다.
함정 5: Cultural mismatch — "이 코드는 잘못되었습니다"는 한국 사용자에게 무례하게 들립니다. "이 코드는 다음 부분을 개선하시면 좋겠습니다"가 자연스럽습니다.
패턴 7: 모델 선택
한국어 품질만 놓고 보면 다음과 같은 분포를 보입니다 (12개 챗봇 평균 점수 기준).
| 모델 | 한국어 품질 | 비용 (1M 토큰) | 권장 용도 |
|---|---|---|---|
| claude-haiku-4-5 | ~75% | $1 / $5 | FAQ, 분류, 짧은 응답 |
| claude-sonnet-4-6 | ~90% | $3 / $15 | 일반 챗봇, 분석, 추론 |
| claude-opus-4-7 | ~92% | $15 / $75 | 한국어 품질만 위해선 사용 안 함 |
권장 라우팅 (80/15/5 룰):
- Haiku 80% — FAQ, 분류, 단순 응답
- Sonnet 15% — 복잡한 질문, 추론, 분석
- Opus 5% — 전략 결정, 복잡한 추론 (한국어 품질이 주 이유라면 Sonnet으로 충분)
Opus는 한국어 품질 차이가 2%포인트인데 비용은 5배입니다. 한국어 때문에 Opus를 쓰는 건 비효율입니다. 복잡한 추론이 필요할 때만 Opus를 호출하고, 일반 응답은 Sonnet으로 처리합니다.
자주 묻는 질문
왜 영어 출력으로 fallback 하나요?
System prompt가 영어로 작성되었거나, 사용자 질문이 영어를 포함했거나, 영문 코드 블록이 길게 들어갔을 때입니다. 해결책은 (1) System prompt를 처음부터 한국어로 작성, (2) "사용자가 영어로 질문해도 한국어로 답변" 명시, (3) 코드 블록 외부의 모든 텍스트는 한국어로 강제.
프롬프트 캐싱 사용 시 한국어 품질이 떨어지나요?
아닙니다. Prompt caching은 시스템 프롬프트를 캐시하는 것이고, 출력 품질에 영향을 주지 않습니다. 오히려 캐시된 system prompt가 길어도 비용 부담이 줄어 더 자세한 한국어 instructions를 작성할 수 있어 품질이 올라갑니다. 자세한 패턴은 Prompt caching guide를 참고하세요.
Few-shot examples 한국어로 줘야 하나요?
네. Examples는 출력 형식을 강하게 학습시킵니다. 영어 examples를 주면 모델이 영어로 답변할 확률이 높아집니다. 모든 examples를 한국어 존댓말로 작성하고, 각 example의 assistant 응답은 system prompt가 강제하는 형식과 정확히 일치시킵니다.
한국어 토큰 수가 영어보다 많나요?
네. 같은 의미를 표현할 때 한국어 토큰 수는 영어의 약 1.5-2배입니다. "Hello, how are you?" (4 토큰) vs "안녕하세요, 어떻게 지내세요?" (약 8-10 토큰). 비용 계산 시 영어 기준 토큰 단가에 1.7배를 곱하면 한국어 실비에 가깝습니다. 토큰 비용 절감 패턴은 Cost case study에서 다룹니다.
다국어 사이트는 어떻게 하나요?
언어별 system prompt를 분리하는 것이 안전합니다. 사용자 언어를 탐지 (브라우저 locale 또는 첫 메시지 언어 감지)하고, 각 언어에 맞는 system prompt를 로드합니다. 한 system prompt에 여러 언어를 섞으면 모델이 매번 다른 언어로 fallback합니다.
다음 단계
- Claude API 한국어 입문 — Anthropic SDK 첫 호출부터 한국어 응답까지
- Claude 한국어 챗봇 만들기 — 풀스택 챗봇 구현 가이드
- Claude 챗봇 스타트업 한국어 — 한국 시장 진출 사례
- Prompt caching guide — 캐싱으로 비용 50% 이상 절감
이 가이드는 12개 한국어 챗봇 프로덕션 배포 (May 2026)에서 추출한 패턴을 정리한 것입니다. 모델 버전과 학습 데이터 변화에 따라 권장 사항이 달라질 수 있으니, 자동 평가 루프 (패턴 5)를 반드시 운영하시기 바랍니다.