개념
시스템 프롬프트(system prompt)는 사용자와의 대화가 시작되기 전에 모델에게 미리 건네는 지시문이다. 너는 어떤 역할이고, 무엇을 해야 하며, 무엇은 하지 말아야 하고, 답변은 어떤 형식으로 내놓아야 하는지를 여기에 적는다. 대규모 언어 모델(LLM)에 보내는 요청은 보통 역할이 붙은 메시지 목록으로 구성되는데, 시스템 프롬프트는 그중 사용자 메시지와 구분되는 별도의 자리를 차지한다.
일반 프롬프트와의 차이는 적용 범위와 지속성에 있다. 사용자 메시지가 그 순간의 요청이라면, 시스템 프롬프트는 대화가 여러 차례 오가는 동안 계속 앞자리에 남아 모든 응답에 영향을 준다. 챗봇의 말투가 대화 내내 일정하게 유지되거나 특정 주제를 계속 거절하는 동작이 이어지는 것은 대개 이 자리에 적힌 내용 때문이다.
제공사에 따라 개발자 메시지나 인스트럭션 같은 다른 이름으로 부르기도 하지만, 대화 앞자리에 놓여 전체를 규정한다는 역할은 같다. 모델은 보통 시스템 프롬프트의 지시를 사용자 메시지보다 우선하도록 학습되어 있다. 다만 이는 강한 경향이지 물리적인 차단 장치가 아니다. 시스템 프롬프트 역시 컨텍스트 윈도우를 차지하는 텍스트이며, 길어질수록 매 요청마다 토큰 비용이 함께 붙는다.
쓰임새
제품에 들어가는 챗봇에서는 서비스 소개, 답변 범위, 말투, 출력 형식, 금지 사항을 시스템 프롬프트에 정리해 둔다. AI 에이전트에서는 여기에 더해 사용할 수 있는 도구의 목록과 호출 규칙, 작업 절차를 함께 적는 경우가 많다.
실무에서는 길게 쓰는 것보다 구조를 잡는 편이 효과적이다. 역할, 지켜야 할 규칙, 출력 형식, 예시를 항목으로 나눠 적고 서로 모순되는 지시를 남기지 않는 쪽이 안정적이다. 여러 지시가 충돌하면 모델은 그중 하나를 임의로 따르게 되어 동작이 들쭉날쭉해진다. 하지 말라는 금지문만 늘어놓기보다 대신 무엇을 하라고 적어 주는 편이 잘 지켜지는 것도 경험적으로 알려진 요령이다.
시스템 프롬프트는 제품 코드와 같은 방식으로 관리하는 편이 좋다. 문구 하나를 고쳤을 뿐인데 답변 전체의 성격이 달라질 수 있으므로, 변경 이력을 남기고 대표 질문 몇 개에 대한 응답을 이전 버전과 비교해 본 뒤 반영한다. 어느 문장이 어떤 동작을 만들고 있는지 기록해 두지 않으면, 시간이 지날수록 아무도 손대지 못하는 덩어리가 된다.
자주 하는 오해
시스템 프롬프트에 적어 두면 모델이 반드시 따르나?
우선순위가 높은 지시일 뿐 강제 장치가 아니다. 반드시 막아야 하는 동작은 프롬프트 문장이 아니라 가드레일처럼 코드 층에 둔 검사로 처리해야 한다.
시스템 프롬프트는 사용자에게 절대 안 보이는 것 아닌가?
대화를 유도해 내용을 유추하거나 그대로 뱉게 만드는 프롬프트 인젝션 시도가 존재한다. API 키나 내부 정보를 시스템 프롬프트에 적어 두어서는 안 된다.
시스템 프롬프트는 길게 쓸수록 통제가 잘 되지 않나?
지시가 많아질수록 서로 충돌하기 쉽고 정작 중요한 규칙이 묻힌다. 문제가 생길 때마다 예외 문장을 덧붙이다 보면 어느 순간 아무도 전체를 읽지 않는 길이가 된다. 규칙 수를 줄이고 하나하나를 명확하게 쓰는 편이 낫다.