Transformers documentation
채팅 기본
채팅 기본
Chat 모델은 메시지를 보내고 응답을 받을 수 있는 대화형 모델입니다. 2023년 중반 이후의 대부분의 언어 모델은 chat 모델이며, “instruct” 또는 “instruction-tuned” 모델이라고도 불립니다. chat을 지원하지 않는 모델은 “base” 또는 “pretrained” 모델이라고 불립니다.
크고 새로운 모델은 일반적으로 더 높은 성능을 보이지만, 특정 도메인(의료, 법률 텍스트, 비영어권 언어 등)에 특화된 모델은 이러한 대형 모델보다 더 나은 성능을 발휘할 수 있습니다. OpenLLM 및 LMSys Chatbot Arena와 같은 리더보드를 활용하여 사용 사례에 가장 적합한 모델을 찾아보세요.
이 가이드에서는 Transformers에서 명령줄을 통해 채팅 모델을 빠르게 로드하는 방법, 대화 구성 및 포맷팅 방법, 그리고 TextGenerationPipeline을 사용하여 채팅하는 방법을 보여줍니다.
채팅 CLI
Transformers 설치 후, 명령줄에서 모델과 직접 대화할 수 있습니다. 아래 명령은 모델과 대화하는 인터랙티브 세션을 시작하며, 세션 시작 시 기본 명령 몇 가지가 나열됩니다.
다음 명령어의 경우
transformers serve가 실행 중인지 확인하십시오.
transformers chat Qwen/Qwen2.5-0.5B-Instruct

generate 플래그를 임의로 사용하여 CLI를 시작할 수 있으며, 형식은 arg_1=value_1 arg_2=value_2 ...입니다.
transformers chat Qwen/Qwen2.5-0.5B-Instruct do_sample=False max_new_tokens=10
전체 옵션 목록을 확인하려면 아래 명령을 실행하세요.
transformers chat -h
채팅은 AutoClass 위에 구현되어 있으며, 텍스트 생성 및 채팅의 도구를 사용합니다. 내부적으로 transformers serve CLI를 사용합니다(문서).
TextGenerationPipeline
TextGenerationPipeline는 “채팅 모드”를 지원하는 고수준 텍스트 생성 클래스입니다. 대화형 모델이 감지되고 채팅 프롬프트가 적절하게 포맷되어 있을 때 채팅 모드가 활성화됩니다.
Chat 모델은 메시지 목록(채팅 히스토리)을 입력으로 받습니다. 각 메시지는 role과 content 키를 가진 딕셔너리입니다.
채팅을 시작하려면 user 메시지를 하나 추가합니다. 모델의 동작 방식을 지시하기 위해 system 메시지를 선택적으로 포함할 수도 있습니다.
chat = [
{"role": "system", "content": "You are a helpful science assistant."},
{"role": "user", "content": "Hey, can you explain gravity to me?"}
]TextGenerationPipeline를 생성하고 chat을 전달합니다. 대규모 모델의 경우 device_map=“auto”를 설정하면 모델 로딩 속도가 빨라지고, 사용 가능한 가장 빠른 장치에 자동으로 배치됩니다.
import torch
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="HuggingFaceTB/SmolLM2-1.7B-Instruct", dtype="auto", device_map="auto")
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])이 과정이 성공적으로 완료되면 모델의 응답을 확인할 수 있습니다. 대화를 계속하려면 모델의 응답으로 채팅 히스토리를 업데이트해야 합니다. chat에 텍스트를 추가(assistant 역할 사용)하거나, 최신 응답을 포함한 전체 채팅 히스토리를 담고 있는 response[0]["generated_text"]를 읽는 방식으로 수행할 수 있습니다.
모델의 응답을 받은 후에는 채팅 기록에 새로운 user 메시지를 추가하여 대화를 계속할 수 있습니다.
chat = response[0]["generated_text"]
chat.append(
{"role": "user", "content": "Woah! But can it be reconciled with quantum mechanics?"}
)
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])이 과정을 반복하면 컨텍스트 윈도우가 소진되거나 메모리가 부족해질 때까지 대화를 계속할 수 있습니다.
성능 및 메모리 사용량
Transformers는 기본적으로 모델을 float32 정밀도로 로드하며, 8B 모델의 경우 약 32GB의 메모리가 필요합니다. 메모리 사용량을 줄이려면 torch_dtype="auto" 인수를 사용하세요. 이 인수는 해당 모델이 bfloat16로 학습된 경우 일반적으로 bfloat16를 사용합니다.
사용 가능한 다양한 양자화 백엔드에 대한 자세한 내용은 Quantization 문서를 참조하세요.
메모리 사용량을 더 낮추려면 bitsandbytes를 사용하여 모델을 8비트 또는 4비트로 양자화할 수 있습니다. 원하는 양자화 설정으로 BitsAndBytesConfig를 생성하고 pipelines의 model_kwargs 매개변수에 전달합니다. 아래 예제는 모델을 8비트로 양자화합니다.
from transformers import pipeline, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
pipeline = pipeline(task="text-generation", model="meta-llama/Meta-Llama-3-8B-Instruct", device_map="auto", model_kwargs={"quantization_config": quantization_config})일반적으로 모델 크기와 성능은 직접적인 상관관계가 있습니다. 더 큰 모델은 더 많은 메모리가 필요할 뿐만 아니라, 생성되는 각 토큰마다 활성 파라미터가 메모리에서 읽혀야 하므로 속도가 느려집니다. 이는 LLM 텍스트 생성의 병목 현상이며, 생성 속도를 개선하기 위한 주요 옵션은 모델을 양자화하거나 더 높은 메모리 대역폭을 가진 하드웨어를 사용하는 것입니다. 컴퓨트 파워를 추가하는 것은 실질적인 도움이 되지 않습니다.
speculative decoding와 같은 기법도 시도해 볼 수 있습니다. 이 기법에서는 작은 모델이 후보 토큰을 생성하고, 더 큰 모델이 이를 검증합니다. 후보 토큰이 정확하다면 더 큰 모델은 한 번에 여러 개의 토큰을 생성할 수 있습니다. 이를 통해 대역폭 병목 현상을 크게 완화하고 생성 속도를 향상시킬 수 있습니다.
Update on GitHubMixtral, Qwen2MoE, GPT-OSS와 같은 Mixture-of-Expert(MoE) 모델은 매개변수가 많지만, 각 토큰을 생성할 때 그 중 일부만 “활성화”합니다. 그 결과, MoE 모델은 일반적으로 메모리 대역폭 요구 사항이 훨씬 낮으며, 동일한 크기의 일반 LLM보다 더 빠를 수 있습니다. 그러나 추측적 디코딩과 같은 기법은 MoE 모델에서 효과가 없는데, 이는 새로운 추측 토큰이 추가될 때마다 활성화되는 매개변수의 수가 증가하기 때문입니다.