챗봇 서비스를 만들거나 반복 업무를 LLM으로 자동화하다 보면, 매번 같은 규칙을 프롬프트에 붙여 넣는 일이 번거로워집니다. 또 LLM의 답을 프로그램이 받아서 처리해야 한다면 사람이 읽기 좋은 문장보다 정해진 형식의 데이터가 필요합니다.
이번 글에서는 대화 전체에 적용되는 규칙을 정하는 시스템 프롬프트와, LLM이 JSON 같은 정해진 형식으로 답하게 만드는 출력 형식 지정 방법을 정리해 보겠습니다.
1. 시스템 프롬프트란?
대부분의 LLM API는 메시지를 역할(role)별로 나눠서 주고받습니다.
| 역할 | 의미 | 예시 |
|---|---|---|
| system | 대화 전체에 적용되는 기본 설정과 규칙 | 너는 쇼핑몰 고객센터 상담원이야 |
| user | 사용자가 보낸 메시지 | 주문한 상품이 아직 안 왔어요 |
| assistant | 모델이 이전에 한 답변 | 불편을 드려 죄송합니다. 주문번호를 알려 주시겠어요? |
시스템 프롬프트는 이 중 system 역할에 들어가는 내용으로, 사용자와의 대화가 시작되기 전에 모델의 역할, 말투, 지켜야 할 규칙을 정해 둡니다. 사용자가 매번 다시 말하지 않아도 대화 내내 적용되기 때문에, 서비스의 '성격'을 정하는 설정 파일이라고 생각하면 됩니다. ChatGPT의 '맞춤 설정'이나 Claude의 '프로젝트 지침'도 비슷한 역할을 합니다.
2. 좋은 시스템 프롬프트 작성법
시스템 프롬프트에는 보통 다음 내용을 담습니다.
- 역할과 목적: 누구로서, 누구를 위해, 무엇을 하는지
- 말투와 분량: 존댓말 여부, 답변 길이, 전문 용어 수준
- 할 일과 하지 않을 일: 답변 범위, 범위를 벗어난 질문에 대한 대응 방법
- 참고 지식: 영업시간, 환불 규정처럼 자주 필요한 정보
너는 '오늘꽃집' 온라인 쇼핑몰의 고객 상담 도우미야.
[역할]
- 주문, 배송, 교환·환불, 꽃 관리 방법에 대한 질문에 답해.
- 고객은 대부분 선물용으로 꽃을 사는 일반인이야.
[말투]
- 친절한 존댓말로, 한 번에 3~4문장 이내로 답해.
[규칙]
- 주문 조회가 필요하면 주문번호를 먼저 요청해.
- 아래 정책에 없는 내용은 추측하지 말고 "상담원 연결(1588-0000)"을 안내해.
- 꽃과 관계없는 질문에는 정중하게 상담 범위를 안내해.
[정책]
- 생화 특성상 단순 변심 환불은 불가, 배송 중 파손은 사진 확인 후 재발송.
- 당일 배송 주문 마감: 오후 2시
작성할 때는 다음 팁을 기억하세요.
- 항목을 소제목이나 목록으로 나누면 모델도 사람도 읽기 쉽습니다.
- "모르면 추측하지 말고 ○○로 안내해"처럼 예외 상황의 대응 방법을 꼭 넣으세요. 환각을 줄이는 데 효과가 큽니다.
- 시스템 프롬프트는 사용자가 교묘한 질문으로 알아낼 수도 있습니다. 비밀번호나 API 키 같은 민감한 정보는 절대 넣지 마세요.
3. 출력 형식 지정: JSON으로 받기
LLM의 답을 프로그램에서 쓰려면 매번 같은 구조로 나와야 합니다. 예를 들어 고객 문의를 자동 분류해서 데이터베이스에 저장하려면 다음과 같은 JSON이 필요합니다.
{
"category": "배송",
"urgency": "높음",
"summary": "주문 후 5일째 상품 미도착",
"need_human": false
}
원하는 형식을 안정적으로 받는 방법은 세 단계로 나눠 볼 수 있습니다.
| 방법 | 설명 | 안정성 |
|---|---|---|
| 프롬프트로 요청 | "아래 형식의 JSON으로만 답해"라고 쓰고 예시를 보여 줍니다. | 보통 (가끔 설명 문장이 섞이거나 형식이 깨짐) |
| JSON 모드 | API 옵션으로 문법적으로 올바른 JSON만 나오게 합니다. | 높음 (단, 필드 구성은 보장되지 않음) |
| 구조화된 출력 (Structured Outputs) | JSON 스키마를 함께 보내 필드 이름과 타입까지 지키게 합니다. | 가장 높음 |
지원 여부와 옵션 이름은 서비스마다 다르니 사용하는 API의 공식 문서를 확인하세요. 프롬프트로만 요청할 때는 다음 방법이 도움이 됩니다.
- 필드 이름, 타입, 허용 값을 명시하세요. 예:
urgency는 "높음", "보통", "낮음" 중 하나 - 완성된 예시 JSON을 하나 보여 주세요.
- "JSON 외에 다른 문장은 쓰지 마"라고 덧붙이세요.
- 프로그램에서는 받은 결과를 반드시 파싱해 검사하고, 실패하면 다시 요청하도록 처리하세요.
JSON이 아니더라도 표, 마크다운 목록, CSV 등 원하는 형식을 예시와 함께 지정하면 결과를 그대로 문서나 엑셀에 옮기기 쉬워집니다.
정리
시스템 프롬프트는 대화 전체에 적용되는 역할, 말투, 규칙을 정하는 설정이고, 예외 상황의 대응 방법까지 적어 두면 서비스 품질이 안정됩니다. 프로그램에서 LLM의 답을 쓰려면 JSON 같은 형식을 지정하고, 가능하면 JSON 모드나 구조화된 출력 기능을 활용하세요. 다음 글에서는 LLM이 글을 읽고 쓰는 기본 단위인 토큰과, 한국어가 영어보다 토큰을 더 많이 쓰는 이유를 알아보겠습니다.
참고자료
- Anthropic, Giving Claude a role with a system prompt: https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/system-prompts
- OpenAI, Structured Outputs: https://platform.openai.com/docs/guides/structured-outputs
- Google, Structured output (Gemini API): https://ai.google.dev/gemini-api/docs/structured-output
- JSON Schema 공식 사이트: https://json-schema.org/
'AI > LLM' 카테고리의 다른 글
| [LLM] LLM 공부 5편: 컨텍스트 윈도우와 API 비용 (0) | 2026.10.23 |
|---|---|
| [LLM] LLM 공부 4편: 토큰과 토크나이저 쉽게 이해하기 (0) | 2026.10.23 |
| [LLM] LLM 공부 2편: 퓨샷과 Chain-of-Thought, 프롬프트 체이닝 (0) | 2026.10.23 |
| [LLM] LLM 공부 1편: 프롬프트 엔지니어링 기본 원칙 정리 (0) | 2026.10.23 |
| [LLM] LLM 환각을 줄이는 방법, RAG 쉽게 이해하기 (0) | 2026.10.19 |