LLM에서 최대한을 끌어내려면 좋은 프롬프트가 필요하다. 프롬프트 엔지니어링(prompt engineering)은 더 좋은 결과로 이어지는 여러 프롬프트 기법을 아우르는 말이다. 이번 편은 코드에서 프롬프트를 실제로 어떻게 구성하는지부터, 시스템 프롬프트와 프롬프트 템플릿으로 augmented prompt를 조립하는 법까지 정리한다.

 

1. messages 포맷 (Content · Role)

가장 널리 쓰는 형식은 OpenAI의 messages 포맷이다. 프롬프트를 간단한 JSON 메시지 배열로 구조화한다. 메시지 하나는 content(텍스트)와 role을 갖는다. role은 셋 중 하나다.

  • system — LLM의 전반적 행동에 영향을 주는 상위 지시.
  • user — 사용자가 보낸 프롬프트.
  • assistant — LLM이 앞서 생성한 응답.

그림 1. messages 포맷 — 각 메시지는 content(텍스트) + role(system·user·assistant).

 

 

2. 멀티턴 대화의 실제

LLM과 여러 번 주고받는 멀티턴(multi-turn) 대화에서, LLM이 앞 내용을 기억하는 게 아니다. 뒤에서는 대화 전체가 messages 포맷으로 변환되고 새 user 메시지가 맨 끝에 붙어, 매번 대화 전체가 LLM에 다시 제출된다. 그리고 이 JSON은 LLM이 처리할 하나의 텍스트 문자열로 바뀐다.

그림 2. 멀티턴 — 챗봇은 기억하지 않는다. 매 턴 대화 전체를 messages로 만들어 다시 보낸다.

 

 chat template 문자열은 화살표나 세로 막대 같은 특수 태그로 각 메시지의 시작·끝을 표시한다. LLM은 이 태그를 인식하도록 학습돼 system·user·assistant를 구분한다. 이 포맷은 매우 유연해서, 응답을 통제할 다양한 맥락을 프롬프트에 담을 수 있다.

그림 3. chat template — JSON이 특수 태그가 붙은 단일 문자열로 변환되고, LLM은 태그로 role을 구분한다.

 

 

3. 시스템 프롬프트 (System Prompt)

RAG 프롬프트를 구성할 때 가장 먼저 할 일은 시스템 프롬프트를 쓰는 것이다. LLM에게 어떻게 행동할지 상위 지시를 준다 — 항상 특정 톤으로 말하거나 특정 절차를 따르길 원한다면 그 정보가 여기에 들어간다.

그림 4. 시스템 프롬프트 — 행동 방식을 규정하는 상위 지시. 실제 예시(오른쪽 Anthropic 시스템 프롬프트)는 컷오프·현재 날짜 등을 담아 여러 페이지에 달하기도 한다.

 

실제 챗봇의 시스템 프롬프트를 보면 가장 먼저 눈에 띄는 건 길이다 — 여러 페이지에 달한다. 늘 그렇게 길 필요는 없지만, 그만한 유연성이 있다는 점은 기억할 만하다. 프롬프트 앞부분엔 모델의 학습 컷오프와 현재 날짜 정보가 있어, 자기 정보가 얼마나 오래됐는지·특정 질문에 답할 수 있는 상황인지를 판단하게 돕는다.

그림 5. 시스템 프롬프트가 담는 것 — 단계적 추론·유해 요청 거부·markdown 응답 같은 절차와, 톤·인격을 규정한다.

 

뒷부분은 응답의 절차와 톤을 지시한다 — 단계적으로 추론하라, 유해한 요청은 돕지 말라, markdown으로 답하라 등. 또 "지적 호기심이 있고 사람 생각을 듣길 즐긴다" 같은 인격(personality)도 부여한다. 같은 원리로 내 시스템 프롬프트를 만들 수 있다 — 자세히/간결히 답하라, RAG라면 검색된 문서만 써서 답하라, 문서 관련성을 판단하라, 출처를 인용하라 등. 시스템 프롬프트는 모든 프롬프트에 매번 추가되므로, 다듬는 데 시간을 쓰면 결과 품질이 크게 오른다.

그림 6. 내 시스템 프롬프트 만들기 — RAG에선 "검색된 문서만 사용·출처 인용"처럼 원하는 원칙을 지시한다.

 

 

 

4. 프롬프트 템플릿 (Prompt Template)

이제 augmented prompt를 조립할 차례다. 이 프롬프트엔 여러 정보 조각이 들어가므로, 잘 설계된 템플릿이 유용하다. 템플릿은 프롬프트의 상위 구조를 정하고 어떤 내용이 어디에 삽입될지를 결정한다. 전형적 순서는 이렇다.

  1. 시스템 프롬프트 — 행동 방식에 대한 상위 지침으로 시작.
  2. 이전 대화 — 멀티턴을 지원하면 사용자·LLM이 주고받은 이전 메시지.
  3. 검색된 맥락 — retriever가 가져온 상위 5~10개 chunk와, 그것을 어떻게 다룰지에 대한 지시.
  4. 최근 사용자 프롬프트 — LLM이 답해야 할 가장 최근 질문.

그림 7. 프롬프트 템플릿 — 어디에 무엇을 넣을지 정한다(시스템 → 이전 대화 → 검색 chunk → 최근 질문).

 

템플릿의 장점은 실험이 쉽다는 것이다. 개별 구성요소만 바꿔 최종 응답이 어떻게 달라지는지 볼 수 있다. 잘 쓴 시스템 프롬프트 + 검색된 맥락 + 이전 대화 + 최근 사용자 프롬프트를 합치면, 전형적인 RAG 프롬프트가 완성된다.

그림 8. 템플릿으로 조립한 실제 프롬프트 — 시스템 지시 + 검색된 정보 + 대화 이력 + 최근 질의.

 

다음 글에서는 여기에 얹는 고급 프롬프트 기법 — in-context learning(few-shot), 단계적 추론, chain of thought 등 — 을 다룬다.

'AI > RAG' 카테고리의 다른 글

환각(Hallucination) 다루기  (0) 2026.07.03
Prompt Engineering : 고급 기법  (0) 2026.07.03
어떤 LLM을 고를까  (0) 2026.07.03
LLM Sampling 전략  (0) 2026.07.03
Transformer Architecture  (0) 2026.07.03

+ Recent posts