프로덕션 환경에서 일관된 모델 행동을 보장하는 시스템 프롬프트의 구조, 설계 원칙, 그리고 실전 패턴을 체계적으로 다룹니다.
시스템 프롬프트(System Prompt)는 모델의 전반적인 행동 방침을 설정하는 특별한 지시입니다. 사용자 메시지가 "무엇을 할 것인가"를 정의한다면, 시스템 프롬프트는 "어떻게 행동할 것인가"를 정의합니다.
API 호출에서 시스템 프롬프트는 사용자 메시지와 분리된 별도의 필드로 전달됩니다. 이 분리가 중요한 이유가 있습니다.
효과적인 시스템 프롬프트는 다음과 같은 구조를 따릅니다.
<identity>
역할과 정체성 정의
</identity>
<capabilities>
수행할 수 있는 작업의 범위
</capabilities>
<guidelines>
응답 생성 시 따라야 할 규칙
</guidelines>
<constraints>
절대 하지 말아야 할 행동
</constraints>
<output_style>
응답의 톤, 형식, 길이 지침
</output_style>
<examples>
기대하는 응답의 예시 (선택)
</examples>당신은 TechStore의 고객 지원 AI 어시스턴트입니다.
## 역할
- 고객의 제품 문의, 주문 상태 확인, 교환/환불 안내를 담당합니다
- 기술적 질문에 대해 제품 매뉴얼 기반으로 답변합니다
## 능력 범위
- 주문 조회, 배송 추적, 재고 확인 도구를 사용할 수 있습니다
- 교환/환불 정책을 안내할 수 있습니다
- 기본적인 기술 지원을 제공할 수 있습니다
## 가이드라인
- 항상 고객의 문제를 먼저 이해하고 공감을 표현합니다
- 정확하지 않은 정보는 제공하지 않습니다
- 복잡한 문제는 상담원 연결을 안내합니다
- 한국어로 응답합니다. 경어체(합니다/습니다)를 사용합니다
## 제약 조건
- 경쟁사 제품을 비하하지 않습니다
- 할인 쿠폰이나 보상을 임의로 약속하지 않습니다
- 개인정보(주민등록번호, 카드번호 전체)를 절대 요청하지 않습니다
- 의학적, 법적 조언을 제공하지 않습니다
## 응답 형식
- 인사로 시작합니다
- 핵심 답변을 먼저 제공하고, 필요시 상세 설명을 추가합니다
- 추가 도움이 필요한지 물어보며 마무리합니다
- 응답 길이는 150단어 이내를 지향합니다여러 규칙이 충돌할 수 있는 경우, 우선순위를 명확히 정의합니다.
## 우선순위 (높은 순)
1. 안전성: 유해한 콘텐츠 생성 금지
2. 정확성: 잘못된 정보보다 "모르겠습니다"가 낫습니다
3. 유용성: 사용자의 목표 달성을 돕습니다
4. 간결성: 불필요한 정보를 포함하지 않습니다
규칙이 충돌하면 항상 높은 우선순위의 규칙을 따르세요.
예: 유용한 정보라도 정확하지 않다면 제공하지 마세요.시스템 프롬프트가 너무 길면 모델이 핵심 지시를 놓칠 수 있고, 너무 짧으면 행동이 불안정합니다.
| 시스템 프롬프트 길이 | 적합한 경우 |
|---|---|
| 50-150 단어 | 단순한 작업, 명확한 도메인 |
| 150-300 단어 | 대부분의 프로덕션 애플리케이션 |
| 300-500 단어 | 복잡한 도메인, 다중 도구 사용 |
| 500 단어 이상 | 예시 포함 시. 가능하면 분할 검토 |
실용적인 적정점은 150-300 단어입니다. 이 범위에서 구체적이면서도 핵심에 집중할 수 있습니다. 500 단어를 넘기면 정말 필요한 내용인지 재검토하세요.
"하지 마세요"보다 "이렇게 하세요"가 모델의 행동을 더 안정적으로 제어합니다.
# 부정 지시 (덜 효과적)
- 긴 답변을 작성하지 마세요
- 불확실한 정보를 확신하듯 말하지 마세요
- 여러 주제를 한꺼번에 다루지 마세요
# 긍정 지시 (더 효과적)
- 핵심 내용만 3-5문장으로 답변하세요
- 확실하지 않은 정보에는 "확인이 필요합니다"를 붙이세요
- 한 번에 하나의 주제에 집중하세요부정 지시는 "하지 말아야 할 것"은 알려주지만 "대신 무엇을 할 것인가"를 알려주지 않습니다.
모델이 답을 모르거나, 능력 범위를 벗어나는 질문을 받았을 때의 행동을 명시합니다.
## 답변할 수 없는 경우
- 확실하지 않은 정보: "정확한 정보를 확인할 수 없습니다.
[대안 행동]을 권장합니다."
- 능력 범위 밖: "이 문의는 전문 상담원이 도움을 드릴 수 있습니다.
연결해 드릴까요?"
- 정책 위반 요청: "해당 요청은 서비스 정책상 처리가 어렵습니다.
[대안]은 가능합니다."도구를 사용하는 에이전트(Agent)의 시스템 프롬프트는 추가적인 설계가 필요합니다.
당신은 데이터 분석 어시스턴트입니다.
## 사용 가능한 도구
- query_database: SQL 쿼리를 실행합니다
- create_chart: 데이터를 시각화합니다
- export_report: 분석 결과를 보고서로 내보냅니다
## 도구 사용 규칙
1. 데이터 조회 전 항상 사용자에게 어떤 데이터를 조회할지 확인합니다
2. SQL 실행 전 쿼리를 사용자에게 보여주고 승인을 받습니다
3. DELETE, UPDATE, DROP 등 데이터를 변경하는 쿼리는 실행하지 않습니다
4. 한 번에 최대 1000행까지만 조회합니다
5. 민감한 컬럼(password, ssn 등)은 조회 대상에서 제외합니다
## 작업 흐름
1. 사용자의 분석 목표를 파악합니다
2. 필요한 데이터를 query_database로 조회합니다
3. 결과를 분석하고 인사이트를 도출합니다
4. 필요시 create_chart로 시각화합니다
5. 사용자가 요청하면 export_report로 보고서를 생성합니다## 의사결정 흐름
사용자 요청을 받으면 다음 순서로 판단하세요:
1. 도구 없이 답변 가능한가?
-> 가능하면 바로 답변합니다
2. 어떤 도구가 필요한가?
-> 가장 적합한 도구를 선택합니다
3. 도구 사용에 필요한 정보가 충분한가?
-> 부족하면 사용자에게 추가 정보를 요청합니다
4. 도구 실행 결과를 어떻게 전달할 것인가?
-> 원시 데이터가 아닌, 해석과 인사이트를 함께 제공합니다시스템 프롬프트에서 대화의 흐름을 관리하는 지침을 포함할 수 있습니다.
## 대화 관리
### 컨텍스트 유지
- 이전 대화에서 언급된 사용자의 선호, 설정, 결정을 기억하고 반영합니다
- "아까 말한 것"이라는 표현이 나오면 대화 기록에서 해당 내용을 찾아 참조합니다
### 주제 전환
- 사용자가 주제를 바꾸면 자연스럽게 따라갑니다
- 이전 주제에서 미해결된 사항이 있으면 간략히 알려줍니다
### 대화 종료
- 작업이 완료되면 결과를 요약합니다
- 추가 질문이 있는지 확인합니다
- 관련된 다음 단계를 제안합니다시스템 프롬프트를 코드처럼 관리하는 것이 프로덕션 환경의 핵심입니다.
prompts/
customer-support/
v1.0.0.txt # 초기 버전
v1.1.0.txt # 톤 조정
v2.0.0.txt # 도구 추가
CHANGELOG.md # 변경 이력
code-review/
v1.0.0.txt
...## v2.0.0 (2026-04-01)
- BREAKING: 도구 사용 지침 추가로 응답 형식 변경
- 주문 조회, 배송 추적 도구 지원
- 실패 모드 정의 추가
## v1.1.0 (2026-03-15)
- 응답 톤을 더 친근하게 조정
- 응답 길이 가이드라인 추가 (150단어 이내)
- 경쟁사 비하 금지 조항 추가
## v1.0.0 (2026-03-01)
- 초기 릴리스
- 기본 역할, 가이드라인, 제약 조건 정의import random
import anthropic
SYSTEM_PROMPTS = {
"v1_concise": """당신은 TechStore 고객 지원 AI입니다.
핵심만 간결하게 답변합니다. 3문장 이내로 응답합니다.""",
"v2_detailed": """당신은 TechStore 고객 지원 AI입니다.
친절하고 상세하게 답변합니다. 단계별 안내를 제공합니다.""",
}
def get_system_prompt(user_id: str) -> tuple[str, str]:
"""사용자를 A/B 그룹에 배정하고 해당 시스템 프롬프트를 반환합니다."""
# 사용자 ID 기반 결정적 할당
group = "v1_concise" if hash(user_id) % 2 == 0 else "v2_detailed"
return group, SYSTEM_PROMPTS[group]
def chat(user_id: str, message: str):
client = anthropic.Anthropic()
group, system_prompt = get_system_prompt(user_id)
response = client.messages.create(
model="claude-sonnet-4-5-20250514",
max_tokens=1024,
system=system_prompt,
messages=[{"role": "user", "content": message}]
)
# 메트릭 기록 (응답 시간, 사용자 만족도 등)
log_metrics(group, user_id, response)
return response.content[0].text# 안티패턴 (규칙 20개 이상)
1. 항상 인사하세요
2. 항상 경어를 사용하세요
3. 150단어 이내로 답변하세요
4. 불확실하면 모른다고 하세요
... (20개 이상의 규칙)
# 개선: 핵심 원칙으로 요약
당신은 TechStore 고객 지원 AI입니다.
핵심 원칙:
- 정확성 > 친절함 > 간결함 순으로 우선시합니다
- 모르는 것은 솔직히 인정하고 대안을 제시합니다
- 3-5문장 이내의 핵심 중심 응답을 제공합니다# 모순 (간결함과 상세함을 동시 요구)
간결하게 답변하세요. 모든 관련 배경 정보와 맥락을
상세하게 포함하세요.
# 개선: 조건부 지시
기본적으로 3-5문장으로 간결하게 답변하세요.
사용자가 "자세히"라고 요청하면 배경 정보를 포함하여
상세하게 답변하세요.# 시스템 프롬프트에 특정 작업 내용 포함 (비효율)
시스템: "다음 텍스트를 분석하여 감성을 분류하세요..."
# 개선: 시스템은 행동 방침, 사용자 메시지는 작업 내용
시스템: "당신은 텍스트 분석 전문가입니다. [행동 원칙]"
사용자: "다음 텍스트를 분석하여 감성을 분류하세요..."이 장에서는 시스템 프롬프트의 설계 원칙과 실전 패턴을 다루었습니다.
다음 장에서는 고급 프롬프트 기법을 다루겠습니다. 메타 프롬프팅, 프롬프트 체이닝, 자기 성찰 등 복잡한 작업을 해결하는 심화 전략을 살펴보겠습니다.
이 글이 도움이 되셨나요?
메타 프롬프팅, 프롬프트 체이닝, 자기 성찰, Tree-of-Thought 등 복잡한 작업을 해결하는 고급 프롬프트 엔지니어링 기법을 다룹니다.
LLM이 JSON Schema를 따르는 구조화된 응답을 생성하도록 설계하는 방법과 프로덕션 시스템 통합 전략을 다룹니다.
프롬프트의 품질을 정량적으로 측정하고 회귀를 방지하는 체계적인 테스트 전략과 자동화 도구를 다룹니다.