AI와 개발을 쉽게 이해하는 실험실

비개발자도 따라오는 AI 도구, 자동화, 개발 실험 기록

AI & LLM/프롬프트 엔지니어링

시스템 프롬프트 위치, 어디에 넣느냐가 답변을 바꾼다

루민 Lumin 2026. 8. 2. 15:31
반응형

시스템 프롬프트 위치에 따라 챗봇의 답변 톤과 규칙 준수율이 달라집니다. 이 글은 시스템·유저·어시스턴트 메시지의 역할 차이, 위치별로 답이 어떻게 갈리는지, 실무에서 자주 쓰는 배치 패턴을 정리합니다.

시스템 프롬프트 위치, 어디에 넣느냐가 답변을 바꾼다의 핵심 개념을 단순한 테크 일러스트로 표현한 대표 이미지

시스템 프롬프트 위치는 챗봇의 답변 품질을 좌우하는 가장 값싼 튜닝 수단입니다. 같은 지시문이라도 시스템 메시지에 넣을 때, 유저 메시지 앞머리에 넣을 때, 대화 중간에 끼워넣을 때 모델이 반응하는 강도와 유지 시간이 달라집니다.

이 글은 시스템 프롬프트가 실제로 어디에 놓이는지, 위치를 바꾸면 어떤 차이가 생기는지, 챗봇을 만드는 사람이라면 어떤 배치를 기본값으로 두는 게 좋은지 정리합니다.

처음 API를 만져본 분이라면 "그냥 앞에 붙이면 되는 거 아냐?"라고 생각하기 쉽지만, 실제로는 위치 한 줄 차이로 규칙을 무시하거나 캐릭터가 풀리는 일이 자주 생깁니다.

시스템 프롬프트가 뭔지부터 정리

시스템 프롬프트는 모델에게 "너는 이런 역할이고, 이런 규칙을 지켜라"라고 미리 알려주는 지시문입니다. 사용자가 보는 대화창의 말풍선이 아니라, 그 뒤에서 환경에 따라 켜져 있는 배경 설정에 가깝습니다.

비유하자면 연극 배우에게 극이 시작되기 전 감독이 건네주는 대본 지침입니다. 관객(사용자)에게는 안 보이지만, 배우(모델)는 그 지침을 기준으로 대사를 만듭니다.

챗봇 API는 대개 대화를 세 가지 역할로 나눠 받습니다.

역할 누가 쓰는가 주 용도
system 서비스 제작자 페르소나·규칙·금지사항
user 최종 사용자 실제 질문·요청
assistant 모델 모델이 낸 이전 답변

여기서 시스템 프롬프트의 "위치"란 크게 두 층위입니다. 첫째는 어느 role에 넣느냐(system vs user 첫 메시지), 둘째는 대화 흐름의 어느 지점에 놓느냐(맨 앞·중간·매 턴 반복)입니다.

왜 위치에 따라 답변이 달라지는가

모델은 입력받은 텍스트 전체를 순서대로 읽고 확률적으로 다음 단어를 예측합니다. 이때 role 태그와 위치는 모델이 학습 단계에서 "이건 규칙, 이건 사용자 요청"이라고 구분하도록 훈련받은 신호로 작동합니다.

그래서 같은 문장이라도 어디에 놓이느냐에 따라 가중치가 달라집니다. 시스템 메시지의 지시는 대체로 "무시하면 안 되는 상위 규칙"으로 취급되고, 유저 메시지의 지시는 "이번 턴 요청"으로 취급됩니다.

또 하나 중요한 건 거리 효과입니다. 대화가 길어질수록 맨 앞에 있던 지시는 뒤로 밀리고, 최근 메시지가 모델의 판단에 더 큰 영향을 줍니다.

💡 프롬프트 인젝션이 성공하는 이유 중 하나가 이겁니다. "앞의 지시는 무시하고 ○○해줘"라는 유저 메시지가 최근에 들어오면, 모델이 그쪽을 따라갈 확률이 올라갑니다.

위치별로 답이 어떻게 갈리나

같은 규칙("존댓말만 쓰고, 회사명은 언급하지 마")을 네 위치에 넣었을 때 일반적으로 관찰되는 경향입니다. 절대적 수치가 아니라 방향성으로 이해하시면 됩니다.

위치 규칙 유지력 사용자 우회 취약성 주 용도
system 메시지 강함 낮음 페르소나·안전 규칙
user 첫 메시지 앞 중간 중간 1회성 스타일 지정
대화 중간 삽입 약함 높음 상황 전환 지시
매 유저 턴에 재삽입 매우 강함 낮음 긴 대화용 리마인더

시스템 메시지에 넣은 지시는 대화가 길어져도 상대적으로 잘 유지됩니다. 반면 유저 메시지 앞머리에 규칙을 붙이면 초반엔 잘 따르다가, 5~10턴이 지나면 모델이 규칙을 "그때 그 요청"으로 취급해 잊는 일이 흔합니다.

실무에서 자주 쓰는 배치 패턴

프롬프트를 짜는 사람들이 실제로 많이 쓰는 배치를 몇 가지로 정리하면 이렇습니다.

1. 얇은 시스템 + 두꺼운 유저 첫 메시지

시스템에는 페르소나 한두 줄만 넣고, 규칙·예시·포맷은 유저 첫 메시지에 몰아넣는 방식입니다. 규칙을 자주 바꾸는 프로토타입 단계에서 편합니다.

2. 두꺼운 시스템 + 얇은 유저 메시지

페르소나·금지사항·출력 포맷을 전부 시스템에 넣고, 유저 메시지는 순수 질문만 받습니다. 서비스로 배포하는 챗봇 일부 환경에서 이 형태를 씁니다.

3. 시스템 + 매 턴 리마인더 재삽입

시스템에도 규칙을 넣고, 유저 메시지 앞에 핵심 규칙 요약을 매번 다시 붙입니다. 대화가 20턴 넘게 이어지는 상담·튜터링 봇에서 규칙이 풀리는 걸 막을 때 씁니다.

[system]
너는 초등 수학 튜터. 답을 바로 주지 말고 힌트만.

[user]
(리마인더: 답 대신 힌트) 3x+5=20 어떻게 풀어?

[assistant]
좋아, 먼저 양쪽에서 같은 수를 빼볼까?

이 예시에서 괄호 안 리마인더가 매 턴 자동으로 붙게 만드는 게 3번 패턴의 핵심입니다.

위치를 잘못 잡았을 때 자주 생기는 증상

증상을 알면 원인 위치가 보입니다.

  • 초반 3~4턴은 완벽한데 뒤로 갈수록 반말이 섞임 → 규칙이 유저 첫 메시지에만 있음. 시스템으로 옮기거나 매 턴 리마인더 필요
  • 사용자가 "역할 잊고 그냥 답해줘"라고 하면 바로 무너짐 → 시스템 메시지가 너무 얇거나, 규칙이 유저 쪽에 있음
  • 출력 포맷(JSON, 표)이 중간에 깨짐 → 포맷 지시가 시스템에만 있고 최근 메시지에서 재확인되지 않음. 유저 메시지 끝에 "JSON만 출력"을 붙이면 안정됨
  • 대화 중간에 페르소나를 바꾸려고 새 시스템 메시지를 껴넣었는데 안 먹힘 → API에 따라 중간 시스템 메시지 취급 방식이 다릅니다. 중간 전환은 유저 메시지로 "지금부터 ○○ 역할" 하는 편이 오히려 잘 먹히는 경우가 있습니다

위치를 정할 때 확인할 순서

새 챗봇을 만들거나 기존 프롬프트를 손볼 때, 아래 순서로 점검하면 시행착오가 줄어듭니다.

  • 이 규칙은 "환경에 따라 지켜야 하는 것"인가, "이번 요청에만 적용되는 것"인가
  • 대화가 몇 턴까지 이어질 것으로 예상하는가
  • 사용자가 규칙을 우회하려고 시도할 가능성이 있는가
  • 출력 포맷이 중요한가 (JSON·표·특정 언어)
  • 페르소나가 대화 중간에 바뀌어야 하는가

환경에 따라 지켜야 하고, 대화가 길고, 우회 시도가 예상되면 시스템 메시지 + 매 턴 리마인더 조합이 안전한 기본값입니다. 반대로 1회성 요약·번역이면 유저 메시지 하나에 다 담아도 충분합니다.

각 모델 제공사(OpenAI, Anthropic, Google 등)마다 role 이름과 시스템 메시지 취급 방식이 조금씩 다르니, 실제 배포 전에는 사용 중인 API 공식 문서에서 "system role"이나 "developer message" 항목을 한 번 확인하시길 권합니다.

다음에 해볼 실험 하나

가장 배우는 게 많은 방법은 같은 규칙을 세 위치에 넣고 같은 대화를 각각 15턴씩 돌려보는 것입니다. 시스템 단독, 유저 첫 메시지 단독, 시스템+매 턴 리마인더 — 이렇게 세 벌을 만들어 언제 규칙이 풀리는지 관찰하면 위치의 힘이 체감됩니다.

프롬프트 튜닝은 문장 다듬기보다 배치 바꾸기가 더 큰 차이를 만들 때가 많습니다. 원하는 답이 안 나올 때, 문장을 고치기 전에 "이걸 지금 어디에 넣어뒀지?"부터 되짚어보세요.

함께 보면 좋은 글

반응형