개인공부&프로젝트/LLM 에이전트 스터디

Message와 Special Token

백악기작은펭귄 2025. 2. 15.
반응형

Message와 Special Token

이전 글에서 LLM이 어떻게 작동하는지 살펴보았다면, 이제는 이러한 모델이 대화를 구조화하는 방식인 채팅 템플릿(Chat Templates)에 대해 자세히 알아보자.

 

사용자가 AI 에이전트와 상호 작용하는 주요 방법은 채팅 인터페이스를 통한 대화이다. 하지만 모델은 개별 메시지를 기억하지 않으며, 모든 대화 내역이 하나의 단일 프롬프트로 변환된 후 모델에 전달된다. 이 과정에서 특수 토큰(Special Tokens)이 중요한 역할을 하며, 각 LLM 모델은 고유한 포맷을 요구한다.


시스템 메시지와 역할 정의

대화는 일반적으로 시스템 메시지(System Message), 사용자 메시지(User Message), 어시스턴트 메시지(Assistant Message)로 구성된다.

  • 시스템 메시지: 모델의 전반적인 행동을 정의하는 역할을 한다. 모델의 태도나 응답 방식, 그리고 사용 가능한 도구 목록 등을 지정할 수 있다. 
system_message = {
    "role": "system",
    "content": "You are a professional customer service agent. Always be polite, clear, and helpful."
}

 

  • 사용자 메시지 & 어시스턴트 메시지: 일반적인 대화 내역을 구성하며, 사용자의 입력과 모델의 출력을 포함한다. 위 대화는 LLM이 연속적인 문맥을 유지할 수 있도록 변환되어 하나의 프롬프트로 전달된다.
conversation = [
    {"role": "user", "content": "I need help with my order"},
    {"role": "assistant", "content": "I'd be happy to help. Could you provide your order number?"},
    {"role": "user", "content": "It's ORDER-123"},
]

 

채팅 템플릿(Chat Templates)이란?

채팅 템플릿은 메시지를 모델이 이해할 수 있는 형식으로 변환하는 역할을 한다. 다양한 LLM이 각각 다른 특수 토큰과 구조를 사용하기 때문에, 올바른 템플릿을 적용하는 것이 중요하다.

 

예를 들어, SmolLM2의 경우 다음과 같은 포맷을 사용한다:

<|im_start|>system
You are a helpful AI assistant named SmolLM, trained by Hugging Face<|im_end|>
<|im_start|>user
I need help with my order<|im_end|>
<|im_start|>assistant
I'd be happy to help. Could you provide your order number?<|im_end|>
<|im_start|>user
It's ORDER-123<|im_end|>
<|im_start|>assistant

 

반면, Llama 3.2 모델에서는 다른 형식을 사용한다:

<|begin_of_text|><|start_header_id|>system<|end_header_id|>
You are a helpful AI assistant.<|eot_id|>
<|start_header_id|>user<|end_header_id|>
I need help with my order<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
I'd be happy to help. Could you provide your order number?<|eot_id|>
<|start_header_id|>user<|end_header_id|>
It's ORDER-123<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>

 

이처럼 모델마다 메시지를 처리하는 방식이 다르므로, 적절한 채팅 템플릿을 사용해야 한다.

 

채팅 템플릿 활용 예시

Transformer 기반의 모델들은 Jinja2 템플릿을 사용하여 메시지를 변환할 수 있다.

{% for message in messages %}
<|im_start|>{{ message['role'] }}
{{ message['content'] }}<|im_end|>
{% endfor %}

 

이러한 템플릿을 사용하면, 메시지를 모델이 올바르게 이해할 수 있도록 변환할 수 있다.

 

Transformers 라이브러리를 사용하면, 메시지를 자동으로 올바른 형식으로 변환할 수 있다.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM2-1.7B-Instruct")
rendered_prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)

이 함수는 제공된 메시지를 해당 모델에 맞는 프롬프트 형식으로 변환해 준다. 이를 통해 대화형 모델을 사용할 때 일관된 프롬프트 구조를 유지할 수 있다.

 

이처럼 채팅 템플릿은 AI 에이전트가 올바르게 작동하도록 도와주는 핵심 요소이다. 각 LLM은 고유한 포맷을 요구하기 때문에, 올바른 템플릿을 적용하여 문맥을 유지하는 것이 중요하다. 모델이 적절한 문맥을 유지하며, 명령을 효과적으로 이해할 수 있도록 각 LLM에 맞는 채팅 템플릿을 적용하는 것이 필수적이다.

 

다음 글에서는 AI 에이전트가 실제로 환경과 상호 작용하는 방식을 탐구할 예정이다. 이를 통해 AI가 단순한 대화를 넘어 현실 세계에서 어떻게 도구를 사용하고, 복잡한 작업을 수행하는지 살펴보겠다.


+) 기본 모델(Base Model) vs. 명령 모델(Instruct Model)

  • 기본 모델(Base Model):
    • 기본 모델은 단순한 다음 단어 예측을 수행하는 언어 모델로, 주어진 입력을 기반으로 가장 확률이 높은 단어를 이어서 생성하는 방식으로 작동한다. 이러한 모델은 방대한 텍스트 데이터를 학습하여 일반적인 언어 패턴을 이해하지만, 특정한 사용자 지시나 명령을 따르는 데 최적화되어 있지는 않다. 따라서 프롬프트(입력 문장)의 맥락을 완전히 이해하지 못하거나, 기대하는 방식으로 응답하지 않을 가능성이 있다.
  • 명령 모델(Instruct Model)
    • 명령 모델은 기본 모델을 기반으로 특정한 사용자 요청을 수행할 수 있도록 추가적인 미세 조정(Fine-tuning)을 거친 모델이다. 이 과정에서 인간 피드백 학습(RLHF, Reinforcement Learning from Human Feedback)이나 명령형 데이터셋을 활용하여 모델이 명확한 지침을 따르는 능력을 향상시킨다. 이러한 조정을 거친 모델은 주어진 프롬프트에 더욱 일관성 있는 답변을 제공하며, 명령어를 이해하고 적절하게 실행하는 데 최적화된다. 특히, 채팅 기반 애플리케이션이나 특정 역할 수행이 요구되는 환경에서 더 효과적인 성능을 발휘한다.

예를 들어, SmolLM2-135M은 기본 모델이며, SmolLM2-135M-Instruct는 대화 및 명령 수행에 최적화된 모델이다. 따라서 명령 모델을 사용할 때는 적절한 채팅 템플릿을 적용하는 것이 중요하며, 그렇지 않으면 모델이 기대한 방식으로 응답하지 않을 수 있다.

 

Base Model을 Instruct Model로 만들려면, 단순한 텍스트 데이터가 아니라 대화형 태그와 역할(role)이 지정된 데이터가 필요하다. 이때, Chat Template을 활용한 대화 데이터를 사용하여 모델을 훈련한다. Chat Template를 학습 데이터에 적용할 경우, 각 메시지 역할(role)이 명확하게 정의되고, 따라서 모델이 훈련 과정에서 사용자 메시지와 AI 응답을 명확히 구분할 수 있게된다. 결과적으로, Instruct Model은 사용자 지시를 인식하고 적절한 방식으로 답변을 생성하는 능력을 학습할 수 있다.

반응형

댓글