멀티모달 LLM - 이미지를 이해하는 모델
지금까지 LLM은 텍스트만 읽고 텍스트만 답하는 존재였습니다. 하지만 이제는 이미지를 던져주고 "이게 뭐야?" 라고 물을 수 있습니다. 스크린샷을 붙여 버그를 물어보고, 차트를 보여주며 요약을 시키고, 손글씨 영수증을 표로 바꾸는 일이 한 번의 프롬프트로 됩니다. 이것이 멀티모달 LLM(Multimodal LLM) 입니다.
이 글에서는 멀티모달이 무엇인지, 어떻게 이미지를 "이해"하는지, 어디에 쓰고 무엇을 조심해야 하는지를 정리합니다.
1. 멀티모달이란
모달리티(modality) 는 정보의 종류입니다. 텍스트, 이미지, 오디오, 비디오가 각각 하나의 모달리티입니다.
멀티모달 LLM은 이 중 둘 이상을 한 모델이 함께 다루는 것입니다. 이 글에서는 가장 널리 쓰이는 이미지 + 텍스트 조합에 집중합니다. 흔히 Vision Language Model(VLM) 이라고도 부릅니다.
핵심은 이겁니다. 이미지를 단순히 "인식(고양이가 있다)"하는 데서 그치지 않고, 텍스트 지식과 함께 추론한다는 점입니다. 그래서 "이 차트에서 매출이 꺾인 분기의 원인을 표 데이터와 함께 설명해줘" 같은 복합 질문에 답할 수 있습니다.
2. 이미지를 어떻게 "이해"하나
직관은 의외로 단순합니다. 이미지를 LLM이 알아듣는 언어로 번역해서 넣어주는 것입니다.
이미지 → [이미지 인코더] → 이미지 임베딩(숫자 벡터)
↓
텍스트 → [토크나이저] → 텍스트 임베딩
↓
두 임베딩을 한 시퀀스로 합쳐 → [LLM] → 텍스트 답변
단계별로 보면 이렇습니다.
- 이미지 인코더: 이미지를 벡터로 바꿉니다. 흔히 비전 트랜스포머(ViT) 계열을 쓰며, 이미지를 격자(patch) 단위로 쪼개 각 조각을 벡터로 만듭니다.
- 정렬(projection): 이미지 벡터를 LLM이 쓰는 임베딩 공간에 맞게 변환합니다. 이미지의 "언어"를 텍스트의 "언어"와 같은 차원으로 맞추는 다리 역할입니다.
- 결합: 변환된 이미지 벡터를 텍스트 토큰들과 하나의 입력 시퀀스로 이어 붙여 LLM에 넣습니다.
비유하면, LLM은 한국어만 아는 전문가이고, 이미지 인코더는 그림을 한국어 설명으로 번역해주는 통역사입니다. LLM 입장에서는 이미지든 텍스트든 결국 같은 종류의 벡터로 들어오기 때문에 자연스럽게 함께 추론합니다.
그래서 "이미지 토큰"이라는 표현을 씁니다. 이미지 한 장이 수백 개의 토큰으로 환산되어 컨텍스트를 차지합니다. 고해상도 이미지일수록 토큰을 많이 먹는다는 뜻이기도 합니다.
3. 프롬프트에 이미지 넣기
API 사용법은 텍스트 메시지에 이미지 블록을 추가하는 형태입니다. 대부분 URL 또는 base64 인코딩으로 넣습니다.
import base64
from openai import OpenAI
client = OpenAI()
# 로컬 이미지를 base64로 인코딩
with open("chart.png", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{
: ,
: [
{: , : },
{: ,
: {: }},
],
}],
)
(resp.choices[].message.content)