멀티모달과 최신 AI 기술
지금까지의 LLM은 텍스트 토큰만 읽고 썼다. 하지만 사람이 다루는 정보의 상당 부분은 사진, 문서 스캔, 음성, 영상이다. 이 장의 핵심 아이디어는 하나다. 무엇이든 벡터 열(토큰)로 바꾸면 Transformer가 처리할 수 있다. 이미지는 패치로, 소리는 멜 스펙트로그램 프레임이나 코덱 토큰으로 바뀌어 같은 공간에 들어온다. 생성 쪽에서는 잡음을 조금씩 걷어 내는 디퓨전이 이미지·영상의 주력이 되었다. 이 장에서는 CLIP의 InfoNCE 손실, ViT의 토큰 수, 음성 인식의 WER, 디퓨전의 역과정을 브라우저에서 직접 계산하고, 오픈 웨이트와 클로즈드 모델의 선택, 온디바이스 AI의 속도 상한, AI 코딩 에이전트의 구조까지 실무 판단 기준으로 정리한다.
- 모달리티별 인코더가 공통 임베딩·토큰 공간으로 이어지는 구조와 초기 융합·후기 융합의 차이를 설명할 수 있다.
- CLIP의 이미지-텍스트 유사도 행렬과 대칭 InfoNCE 손실을 손으로 계산하고, 온도 τ의 역할을 안다.
- 이미지 크기·패치 크기·타일링으로 VLM의 시각 토큰 수를 계산하고, 프로젝터의 역할과 VLM 환각의 원인을 안다.
- 멜 스펙트로그램 프레임 수, Whisper류 인코더-디코더 ASR, 편집 거리로 WER을 계산하고 TTS·음성 대 음성 구조를 그릴 수 있다.
- 디퓨전의 순방향 닫힌 꼴, 노이즈 예측 목표, 잠재 디퓨전, CFG 공식, 단계 수와 속도의 관계, flow matching의 아이디어를 설명할 수 있다.
- 오픈 웨이트와 오픈소스를 구분하고, 통제·프라이버시·비용·성능·운영 부담으로 모델을 고를 수 있다.
- 메모리 대역폭으로 온디바이스 토큰/초 상한을 추정하고, AI 코딩 에이전트의 구성과 검증 방법을 안다.
왜 멀티모달인가: 모든 것을 토큰으로
모달리티(modality)는 정보가 표현되는 형식, 즉 텍스트·이미지·오디오·영상·센서 신호 같은 종류를 말한다. 멀티모달 모델(multimodal model)은 둘 이상의 모달리티를 입력으로 받거나 출력으로 내는 모델이다. 영수증 사진을 보고 합계를 묻거나, 회의 녹음을 받아 요약하거나, 문장으로 그림을 그리는 일은 모두 멀티모달 작업이다.
6장의 Transformer는 사실 텍스트 전용 기계가 아니다. 입력은 \(n\times d\) 벡터 열이고, 어텐션은 그 벡터들 사이의 관계를 계산할 뿐이다. 벡터가 단어에서 왔는지, 이미지 조각에서 왔는지는 상관없다. 그래서 멀티모달 모델을 만드는 일의 대부분은 각 모달리티를 적절한 길이의 벡터 열로 바꾸는 일, 그리고 서로 다른 출처의 벡터가 같은 의미 공간을 쓰게 맞추는 일이다.
| 모달리티 | 원시 데이터 크기(예) | 토큰화 방법 | 토큰 수(예) |
|---|---|---|---|
| 텍스트 | 한국어 1,000자 ≈ 3 KB(UTF-8) | BPE 서브워드(4장) | 수백~1,000여 개 |
| 이미지 | 336×336×3 = 338,688 값 | 14×14 픽셀 패치 → ViT | 576개 |
| 오디오 | 30초 × 16 kHz = 480,000 샘플 | 멜 스펙트로그램 → 인코더(또는 코덱 토큰) | 1,500개(Whisper 인코더) |
| 영상 | 10초 × 24 fps × 720p | 시공간 패치 | 수만~수십만 개 |
표의 마지막 열이 이 장 전체를 관통하는 비용 감각이다. 5장에서 본 대로 어텐션은 토큰 수의 제곱에 비례하고, 8장의 KV 캐시는 토큰 수에 비례한다. 사진 한 장이 텍스트 몇 쪽과 맞먹고, 영상은 책 한 권을 넘는다. 그래서 멀티모달 모델의 설계는 늘 "얼마나 적은 토큰으로 충분한 정보를 담을까"라는 압축 문제와 맞물려 있다.
멀티모달 모델의 구조: 인코더, 공통 공간, 융합
모달리티별 인코더와 공통 임베딩 공간
가장 흔한 구조는 모달리티마다 전용 인코더를 두는 것이다. 이미지는 ViT(Vision Transformer), 오디오는 멜 스펙트로그램을 읽는 오디오 인코더, 텍스트는 토큰 임베딩이다. 각 인코더는 자기 데이터의 통계에 맞는 귀납적 편향(이미지의 2D 국소성, 소리의 시간-주파수 구조)을 갖고, 각자의 차원(예: ViT-L은 1,024차원)으로 벡터를 낸다. 이 벡터를 공통 공간으로 옮기는 작은 층이 프로젝터(projector, adapter)다. 공통 공간은 두 가지 의미로 쓰인다.
- 공통 임베딩 공간: 이미지 벡터와 텍스트 벡터를 같은 차원의 단위 벡터로 만들어, "고양이 사진"과 "a photo of a cat"이 코사인으로 가깝게 한다. 검색·분류에 쓰인다(CLIP).
- 공통 토큰 공간: 이미지 패치 벡터를 LLM의 토큰 임베딩과 같은 차원(예: 4,096)으로 바꿔 텍스트 토큰 사이에 끼워 넣는다. LLM은 그것을 '읽을 수 있는 단어'처럼 처리한다(VLM).
초기 융합 vs 후기 융합
융합(fusion)은 서로 다른 모달리티의 정보가 어느 층에서 처음 만나는가의 문제다. 정의는 단순하지만 비용과 능력이 크게 갈린다.
- 후기 융합(late fusion): 이미지 인코더와 텍스트 인코더가 서로를 전혀 보지 않고 각자 벡터 하나를 낸다. 만나는 곳은 마지막 코사인 유사도뿐이다. CLIP이 대표적이다. 수억 장의 이미지 벡터를 미리 계산해 색인할 수 있으므로(10장의 바이-인코더와 같은 원리) 검색이 매우 빠르다.
- 초기 융합(early fusion): 이미지 토큰과 텍스트 토큰을 같은 시퀀스에 섞어 첫 층부터 서로 어텐션한다. "사진 왼쪽 위 표지판에 뭐라고 쓰여 있어?"처럼 질문에 따라 이미지의 다른 부분을 봐야 하는 일에 강하다. 이미지 생성까지 같은 토큰 열에서 하는 모델(예: Chameleon, 2024)은 이미지도 이산 토큰으로 바꿔 처음부터 섞는다.
- 중간 형태: 사전학습된 인코더로 이미지를 따로 인코딩한 뒤(후기적), 그 패치 토큰을 LLM 입력 열에 넣어 LLM 층에서 섞는다(초기적). 오늘날 대부분의 VLM이 이 형태이며, 문헌에 따라 이것을 초기 융합으로 부르기도 한다. 또 다른 갈래는 LLM 층 사이에 크로스 어텐션 층을 끼워 텍스트 쿼리가 이미지 특징(키·값)을 조회하게 하는 방식이다(Flamingo, 2022).
| 항목 | 후기 융합 (CLIP식) | 토큰 결합 (LLaVA식 VLM) | 크로스 어텐션 결합 (Flamingo식) |
|---|---|---|---|
| 만나는 지점 | 최종 벡터의 코사인 | LLM 입력 열(모든 층) | LLM 중간에 끼운 크로스 어텐션 층 |
| 이미지 토큰 비용 | LLM 없음, 인코더 1회 | LLM 컨텍스트를 그대로 차지 | 컨텍스트는 안 차지, 추가 층 계산 |
| 사전 계산·검색 | 가능 (벡터 색인) | 불가 (질문마다 다시) | 이미지 특징은 캐시 가능 |
| 잘하는 일 | 검색, 제로샷 분류, 필터링 | VQA, OCR, 문서·차트 이해, 대화 | 여러 이미지·영상이 섞인 긴 입력 |
| 약점 | 세밀한 관계·개수·위치 | 고해상도에서 토큰 폭증 | 구조가 복잡, 학습할 층이 많음 |
초기 융합은 표현력이 크지만, 질문이 바뀔 때마다 이미지 전체를 다시 처리해야 한다. 상품 이미지 1억 장 중 "빨간 운동화"를 찾는 일에 VLM을 1억 번 돌릴 수는 없다. 실무 시스템은 보통 후기 융합으로 후보를 좁히고, 초기 융합 모델로 상위 몇 개를 정밀 판단한다. 10장의 "바이-인코더 검색 + 교차 인코더 리랭킹"과 정확히 같은 구조다.
CLIP: 대조 학습으로 이미지와 텍스트를 같은 공간에
CLIP(Contrastive Language-Image Pre-training, Radford 등 2021)은 웹에서 모은 이미지-캡션 쌍 약 4억 개로 두 인코더를 함께 학습했다. 아이디어는 "정답 쌍은 가깝게, 나머지는 멀게"다. 배치에 \(N\)개의 쌍이 있으면 이미지 벡터 \(\mathbf u_i\)와 텍스트 벡터 \(\mathbf v_j\)(둘 다 길이 1로 정규화)로 \(N\times N\) 유사도 행렬을 만든다. 대각선 \(N\)칸이 정답이고 나머지 \(N^2-N\)칸이 오답(음성 쌍)이다. 정답 레이블을 사람이 달 필요가 없다. 캡션이 곧 레이블이다.
숫자로 감을 잡아 보자. 모든 유사도가 같으면 각 행의 softmax는 균등하고 손실은 \(\ln N\)이다. \(N=4\)이면 \(\ln 4\approx 1.386\), CLIP의 배치 32,768이면 \(\ln 32768\approx 10.4\)다. 학습은 이 '찍기 수준'에서 손실을 끌어내리는 과정이다. 배치가 클수록 한 번에 비교하는 오답이 많아져 더 어려운 문제가 되고, 그래서 대조 학습은 큰 배치를 선호한다. 온도는 확률 분포의 날카로움을 정한다. 정답 코사인이 0.30, 오답이 0.25로 차이가 0.05밖에 안 나도 \(\tau=0.01\)이면 로짓 차이가 5가 되어 정답 확률이 크게 쏠린다. 반대로 \(\tau=1\)이면 로짓 차이 0.05로 거의 구분하지 못한다(8장의 온도와 같은 수학이다).
CLIP 유사도 행렬과 InfoNCE 손실
학습이 끝난 CLIP은 제로샷 분류를 한다. 클래스 이름마다 "a photo of a {고양이}" 같은 문장을 만들어 텍스트 벡터를 얻고, 이미지 벡터와 코사인이 가장 큰 클래스를 고른다. 분류기를 따로 학습하지 않았는데도 ImageNet에서 약 76%(ViT-L/14@336, 2021 논문 기준)를 냈다. 같은 텍스트 인코더는 이후 Stable Diffusion의 조건 입력으로, 같은 이미지 인코더는 LLaVA 같은 VLM의 눈으로 재사용되었다. 이후 SigLIP(2023)은 행 단위 softmax 대신 모든 칸을 독립적인 이진 분류(시그모이드)로 바꿔, 배치 전체의 정규화 없이도 학습되게 했다.
CLIP은 이미지와 문장의 유사도 점수만 낸다. 문장을 생성하지 못하고, 벡터 하나에 이미지 전체를 압축하므로 "고양이가 두 마리인가 세 마리인가", "컵이 왼쪽인가 오른쪽인가" 같은 개수·위치 관계에 약하다고 알려져 있다. 캡션을 생성하거나 질문에 답하려면 다음 절의 VLM이 필요하다.
VLM: LLM에 눈을 달기
VLM(Vision-Language Model)은 이미지(와 텍스트)를 입력받아 텍스트를 생성하는 모델이다. LLaVA(2023)가 보여 준 표준 구조는 놀랄 만큼 단순하다. 사전학습된 비전 인코더(CLIP·SigLIP의 ViT) + 프로젝터 + 사전학습된 LLM. 세 부품 중 새로 학습하는 것은 처음엔 프로젝터뿐이다.
ViT 패치 토큰화: 이미지 한 장은 몇 토큰인가
ViT(Dosovitskiy 등, 2020)는 이미지를 \(P\times P\) 픽셀 정사각형 패치로 자른다. 각 패치(\(P\cdot P\cdot 3\)개 값)를 펴서 선형층으로 \(d\)차원 벡터 하나로 만들면 그것이 토큰 하나다. 위치 임베딩을 더한 뒤 일반 Transformer 인코더에 넣는다. 토큰 수는 단순한 나눗셈이다.
문제는 해상도다. A4 문서를 150 dpi로 스캔하면 약 1,240×1,754 픽셀이고, 10 pt 글자 높이는 약 21픽셀이다. 이것을 336×336으로 줄이면 세로 배율이 336/1,754 ≈ 0.19라서 글자가 약 4픽셀로 뭉개진다. 아무리 큰 LLM을 붙여도 읽을 수 없다. 해법은 두 갈래다.
- 타일링(tiling, AnyRes): 큰 이미지를 인코더 기본 해상도(예: 448×448) 타일 여러 장으로 잘라 각각 인코딩하고, 전체 구도를 위해 축소한 썸네일 한 장을 더한다. LLaVA-NeXT(2024), InternVL 계열이 이 방식이다. 3×3 타일 + 썸네일이면 10장 분량이다.
- 네이티브 해상도: 이미지를 정사각형으로 늘리지 않고 원래 비율 그대로 패치를 자른다. 2D 위치 인코딩(예: 2D RoPE)으로 가변 격자를 처리한다. Qwen2-VL(2024)이 대표적이다.
어느 쪽이든 토큰이 폭증하므로 토큰 병합을 함께 쓴다. 이웃한 2×2 패치 벡터 4개를 이어 붙여(4d차원) MLP로 하나로 줄이면 토큰이 1/4이 된다(픽셀 셔플, 패치 병합). 이렇게 하면 448×448 타일 하나가 32×32 = 1,024 패치에서 256 토큰이 된다.
이미지 → 시각 토큰 수 계산기
프로젝터(어댑터): 시각 토큰을 LLM 임베딩 공간으로
ViT의 출력 \(\mathbf z\in\mathbb R^{d_v}\)(예: 1,024)와 LLM의 토큰 임베딩 \(\mathbb R^{d_{\text{LLM}}}\)(예: 4,096)은 차원도 다르고, 무엇보다 좌표계의 의미가 다르다. 프로젝터는 이 둘을 잇는 번역기다.
학습은 보통 두 단계다. 1단계(정렬): 비전 인코더와 LLM을 얼리고 프로젝터만 이미지-캡션 쌍으로 학습한다. 시각 토큰을 LLM이 '알아듣는 단어'로 바꾸는 법을 배우는 단계다. 2단계(지시 튜닝): 이미지에 대한 질문-답 대화 데이터로 프로젝터와 LLM(경우에 따라 인코더까지)을 함께 학습한다(7장의 SFT와 같다). 프로젝터가 작아도 되는 이유는, CLIP 인코더가 이미 언어와 정렬된 특징을 내기 때문이다. 좌표계를 돌리고 늘리는 정도의 변환이면 충분하다.
OCR, 문서 이해, 그라운딩
VLM의 실무 가치는 대부분 글자가 있는 이미지에서 나온다. 고전적인 파이프라인은 OCR 엔진이 글자와 위치를 뽑고, 레이아웃 분석기가 표·단락을 나눈 뒤, 텍스트 모델이 의미를 해석했다. VLM은 이 단계를 하나로 합친다(OCR-free 문서 이해, Donut 2022 이후).
| 작업 | 입력 → 출력 | 핵심 요구 | 대표 실패 |
|---|---|---|---|
| OCR / 텍스트 추출 | 스캔·사진 → 글자 | 고해상도(작은 글자), 다국어 | 비슷한 글자 혼동(0/O, 1/l), 줄 건너뜀 |
| 문서 이해 (DocVQA, 표·차트) | 문서 → 질문의 답, JSON | 레이아웃·읽기 순서, 표 구조 | 행·열 어긋남, 차트 값 어림 |
| 그라운딩 (grounding) | "빨간 컵" → 박스 좌표 | 위치를 좌표 토큰으로 출력 | 좌표 규약 혼동, 작은 물체 누락 |
| GUI 이해 (컴퓨터 사용) | 화면 캡처 → 클릭 위치 | 작은 아이콘, 정확한 좌표 | 비슷한 버튼 오클릭 |
그라운딩(grounding)은 말과 이미지 영역을 대응시키는 일이다. VLM은 좌표도 텍스트로 출력한다. 예를 들어 "[312, 140, 455, 298]"처럼 박스의 (x1, y1, x2, y2)를 숫자 토큰으로 쓴다. 모델마다 0~1,000 정규화 좌표, 원본 픽셀 좌표 등 규약이 달라 그대로 섞어 쓰면 엉뚱한 곳을 가리킨다. 박스를 출력하게 하면 답의 근거를 사람이 눈으로 검증할 수 있다는 장점도 있다. 이 '근거 제시' 역할은 10장의 출처 번호와 같다.
VLM의 환각
VLM의 환각(hallucination)은 이미지에 없는 물체·글자·관계를 있다고 말하는 것이다. 식탁 사진을 보고 "포크와 나이프가 놓여 있다"고 하는데 실제로는 젓가락뿐인 경우가 전형적인 물체 환각(object hallucination)이다. "이 사진에 X가 있나요?"라는 예/아니오 질문으로 측정하는 POPE(2023) 같은 벤치마크가 이 경향을 체계적으로 재기 위해 만들어졌다.
- 언어 사전 확률의 우세: LLM 부분은 수조 토큰의 텍스트에서 "식탁 → 포크"의 강한 연관을 배웠다. 시각 근거가 약하면 이 사전 확률이 이긴다(7장의 환각과 같은 뿌리).
- 해상도와 압축 손실: 576토큰으로 줄이면 작은 글자·작은 물체는 애초에 정보가 없다. 모델은 "안 보인다" 대신 그럴듯한 값을 채운다.
- 유도 질문: "사진 속 강아지는 무슨 색이야?"처럼 존재를 전제한 질문에 모델이 맞장구치기 쉽다.
- 긴 답변 후반부: 생성이 길어질수록 앞서 쓴 텍스트에 더 의존하고 이미지 토큰에 대한 어텐션이 약해지는 경향이 보고되었다.
(1) 고해상도·타일링 또는 관심 영역을 잘라(crop) 다시 보게 하기, (2) 박스 좌표로 근거를 함께 출력하게 하고 검증하기, (3) "보이지 않으면 '확인 불가'라고 답하라"는 지시와 구조화 출력(8장), (4) 숫자·금액은 OCR 결과와 교차 확인, (5) 존재를 전제하지 않는 질문 설계("강아지가 있다면 무슨 색인가?").
음성: ASR과 TTS
음성은 1초에 수만 개의 샘플이 흐르는 1차원 신호다. 음성 인식(ASR(Automatic Speech Recognition))은 이것을 글자로, 음성 합성(TTS(Text-to-Speech))은 글자를 다시 파형으로 바꾼다. 둘 다 "긴 파형 ↔ 짧은 토큰 열"의 길이 변환이 핵심이다.
파형에서 멜 스펙트로그램으로
원시 파형을 그대로 Transformer에 넣으면 30초에 48만 토큰이다. 그래서 먼저 짧은 창으로 잘라 주파수 성분을 본다. 창 하나(예: 25 ms)를 푸리에 변환하면 그 순간의 주파수별 에너지가 나오고, 창을 hop(예: 10 ms)만큼 밀며 반복하면 시간×주파수 그림, 스펙트로그램이 된다. 사람의 귀는 저주파의 차이에 민감하고 고주파는 둔감하므로 주파수 축을 멜 척도로 묶어 80~128개 대역만 남기고, 에너지에 로그를 취한다. 이것이 로그 멜 스펙트로그램(log-mel spectrogram)이다.
| 단계 | 30초 음성의 크기 | 비고 |
|---|---|---|
| 파형 (16 kHz) | 480,000 × 1 | 1초 16,000 샘플 |
| 로그 멜 (hop 10 ms, 80 멜) | 3,000 × 80 | 시간 해상도 10 ms |
| Whisper 인코더 입력 (합성곱 stride 2) | 1,500 × d | 위치 하나 = 20 ms |
| 출력 텍스트 (한국어 약 120어절) | 수백 토큰 | BPE 토큰 |
인코더-디코더 ASR: Whisper의 구조
Whisper(Radford 등, 2022)는 원래 Transformer(6장)와 같은 인코더-디코더다. 인코더는 30초 단위 로그 멜을 합성곱 2층(두 번째가 stride 2)으로 1,500개 위치로 줄인 뒤 셀프 어텐션으로 소리 전체의 문맥을 만든다. 디코더는 자기회귀로 텍스트 토큰을 하나씩 내며, 매 층에서 크로스 어텐션으로 인코더 출력을 조회한다. 즉 "지금 쓸 글자에 해당하는 소리가 어디인가"를 어텐션이 찾는다. 디코더 앞에는 언어·작업을 지정하는 특수 토큰(전사/번역, 타임스탬프 유무)이 붙어, 한 모델로 다국어 전사와 영어 번역을 한다. 약 68만 시간의 약지도(weakly supervised) 웹 음성으로 학습해 잡음·억양에 강한 것이 특징이다.
다른 계열인 CTC(Connectionist Temporal Classification) 모델은 디코더 없이 프레임마다 글자(또는 빈칸)를 내고 중복·빈칸을 지운다. 빠르고 스트리밍에 유리하지만 출력 토큰 간 언어적 의존을 직접 모델링하지 않는다. 인코더-디코더는 더 정확하지만 자기회귀라 느리고, 무음 구간에서 없는 문장을 지어내는 ASR 환각이 보고되어 앞단에 VAD(Voice Activity Detection)를 두는 것이 흔하다.
WER: 편집 거리로 인식 오류 세기
ASR의 표준 지표는 WER(Word Error Rate)이다. 정답 문장(reference)을 인식 문장(hypothesis)으로 바꾸는 데 필요한 최소 편집 횟수를 정답 단어 수로 나눈다.
예를 들어 정답 "오늘 서울 날씨는 맑음"(4단어)을 "오늘 서울에 날씨 맑음 입니다"로 인식했다고 하자. 최소 정렬은 '서울→서울에'(S), '날씨는→날씨'(S), '입니다' 삽입(I)으로 \(S=2, I=1\)이고 WER = 3/4 = 75%다. 분모가 정답 단어 수이고 삽입에는 상한이 없으므로 WER은 100%를 넘을 수 있다. 한국어처럼 띄어쓰기와 조사가 붙는 언어는 '날씨는'과 '날씨'가 통째로 다른 단어가 되어 WER이 과장되기 쉽다. 그래서 한국어·중국어·일본어는 글자 단위 CER(Character Error Rate)을 함께, 또는 대신 보고하는 경우가 많다.
WER 계산기: 편집 거리 DP와 역추적
WER은 정확도의 보수가 아니다. 삽입 때문에 음수 '정확도'도 가능하고, 모든 오류를 똑같이 센다. "삼백만 원"을 "삼십만 원"으로 틀린 것과 "음"을 빠뜨린 것이 같은 1점이다. 업무 지표로 쓸 때는 텍스트 정규화(숫자 표기, 문장 부호, 대소문자 통일)를 먼저 맞추고, 숫자·고유명사 같은 핵심 항목의 오류율을 따로 보는 것이 좋다. 정규화 규칙만 바꿔도 WER이 몇 %p씩 달라질 수 있어, 서로 다른 논문의 WER을 그대로 비교하기 어렵다.
TTS: 텍스트 → 음향 특징 → 보코더
TTS는 ASR의 역방향이지만 더 어렵다. 같은 문장을 읽는 방법(억양, 속도, 감정, 화자)이 무수히 많은 일대다 문제이기 때문이다. 전형적인 파이프라인은 세 단계다.
- 텍스트 정규화·발음 변환: "3시 15분"을 "세 시 십오 분"으로, "AI"를 "에이아이"로 읽는 규칙. 한국어는 연음·경음화 같은 발음 규칙(G2P, grapheme-to-phoneme)이 필요하다.
- 음향 모델: 음소 열 → 멜 스펙트로그램. Tacotron 2(2017)는 자기회귀, FastSpeech 2(2020)는 음소마다 길이를 예측해 한 번에 만드는 비자기회귀 방식이다. 음소 하나가 프레임 수십 개로 늘어나는 길이 확장이 핵심이다.
- 보코더(vocoder): 멜 → 파형. 멜은 위상 정보를 버렸으므로 그대로 역변환할 수 없다. HiFi-GAN(2020) 같은 신경 보코더가 1프레임(예: hop 256 샘플)을 수백 샘플로 복원한다.
최근에는 신경 오디오 코덱이 중심이 되었다. 코덱 인코더가 파형을 초당 수십 프레임으로 줄이고, 각 프레임을 잔차 벡터 양자화(RVQ)로 코드북 몇 개의 정수 토큰으로 바꾼다. 예를 들어 EnCodec(2022)은 24 kHz 음성을 초당 75프레임 × 코드북 8개 × 10비트 = 6 kbps로 압축한다. 소리가 이산 토큰이 되면 TTS는 "텍스트 다음에 올 오디오 토큰 예측"이라는 언어 모델링 문제가 된다. VALL-E(2023)는 3초짜리 목소리 샘플을 프롬프트로 주면 그 화자의 목소리로 읽는 제로샷 음성 복제를 보였다. 이 능력은 보이스 피싱·딥페이크 위험과 직결되므로 동의 확인, 워터마크, 공개 범위 제한이 함께 논의된다.
음성 대 음성 모델
음성 비서를 만드는 가장 쉬운 방법은 캐스케이드(cascade)다. ASR → 텍스트 LLM → TTS를 직렬로 잇는다. 부품을 따로 고르고 고칠 수 있고, 중간 텍스트를 기록·검열하기 쉽다. 단점은 두 가지다. ① 지연 누적: 발화 끝 감지 수백 ms + LLM 첫 토큰 수백 ms + TTS 첫 음성 수백 ms가 더해져 1초 안팎이 되기 쉽다(가정한 예). 사람 사이의 대화 차례 전환 간격은 평균 약 200 ms로 알려져 있다. ② 정보 손실: 텍스트로 바뀌는 순간 억양, 감정, 웃음, 말 끊김 같은 비언어 정보가 사라진다.
음성 대 음성(speech-to-speech, end-to-end) 모델은 오디오 토큰을 입력받아 오디오 토큰을 바로 낸다. 하나의 Transformer가 텍스트 토큰과 오디오 코덱 토큰을 같은 열에서 다루며(초기 융합), 듣는 중에도 말할 수 있는 전이중(full-duplex) 대화를 노린다. GPT-4o의 음성 모드(2024), Moshi(Kyutai, 2024) 등이 이 방향이다. 대가는 학습 데이터(대규모 대화 음성)와 평가·안전 검토의 어려움이다. 텍스트 중간 단계가 없으니 무엇을 말할지 미리 검사하기 어렵다.
| 항목 | 캐스케이드 (ASR→LLM→TTS) | 음성 대 음성 (end-to-end) |
|---|---|---|
| 지연 | 단계 지연의 합 (스트리밍으로 단축) | 짧게 만들기 유리, 끼어들기 가능 |
| 비언어 정보 (억양·감정) | 대부분 손실 | 보존·생성 가능 |
| 부품 교체·디버깅 | 쉬움 (중간 텍스트 확인) | 어려움 |
| 지식·추론 능력 | 최신 텍스트 LLM을 그대로 사용 | 음성 학습으로 텍스트 능력이 떨어질 수 있음 |
| 안전 필터 | 텍스트 단계에서 적용 쉬움 | 오디오 출력 검사 필요 |
디퓨전: 잡음을 걷어 내며 그리기
텍스트 LLM은 토큰을 하나씩 이어 쓰지만, 이미지 생성의 주력은 디퓨전 모델(diffusion model)이다. 아이디어는 거꾸로 생각하는 것이다. 깨끗한 이미지에 가우시안 잡음을 조금씩 더하면 결국 순수한 잡음이 된다. 이 과정은 공식 하나로 정확히 쓸 수 있다. 그렇다면 잡음을 한 단계씩 걷어 내는 법을 신경망에 배우게 하면, 순수한 잡음에서 출발해 이미지를 '조각'해 낼 수 있다. DDPM(Ho 등, 2020)이 이 틀을 실용화했고, Stable Diffusion(2022) 이후 이미지·영상·음성 생성으로 퍼졌다. 텍스트에 이 아이디어를 옮긴 마스크 디퓨전 언어 모델은 7장에서 다뤘다. 여기서는 연속값(픽셀, 잠재 벡터) 디퓨전의 원리를 다룬다.
순방향 과정: 잡음 더하기의 닫힌 꼴
순방향(forward process)은 학습이 필요 없는 고정된 과정이다. 단계 \(t=1,\dots,T\)마다 이전 값을 살짝 줄이고 잡음을 섞는다.
노이즈 스케줄
\(\beta_t\)를 어떻게 늘릴지가 노이즈 스케줄(noise schedule)이다. DDPM의 선형 스케줄은 \(T=1000\), \(\beta\)를 \(10^{-4}\)에서 \(0.02\)까지 고르게 늘린다. 계산해 보면 \(\bar\alpha_{100}\approx0.90\), \(\bar\alpha_{250}\approx0.52\), \(\bar\alpha_{500}\approx0.079\), \(\bar\alpha_{1000}\approx4\times10^{-5}\)이다. 중간 단계에서 이미 신호가 거의 사라져, 뒤쪽 절반의 단계는 사실상 "잡음에서 잡음으로"의 낭비가 된다. Nichol & Dhariwal(2021)의 코사인 스케줄 \(\bar\alpha_t = \cos^2\!\bigl(\tfrac{t/T+s}{1+s}\cdot\tfrac{\pi}{2}\bigr)/\cos^2\!\bigl(\tfrac{s}{1+s}\cdot\tfrac{\pi}{2}\bigr)\)(\(s=0.008\))은 \(\bar\alpha_{500}\approx0.49\)로 신호를 더 오래 남겨, 저해상도 이미지에서 품질을 높였다. 해상도가 높을수록 같은 잡음에서도 이웃 픽셀 평균으로 신호가 살아남기 때문에, 고해상도 모델은 스케줄을 잡음 쪽으로 더 밀어 준다(SNR 이동).
학습 목표: 섞인 잡음을 맞혀라
역방향(reverse process) \(p_\theta(\mathbf x_{t-1}\mid\mathbf x_t)\)를 배우는 대신, DDPM은 놀랍도록 단순한 회귀 문제로 바꿨다. 깨끗한 \(\mathbf x_0\)와 무작위 \(t\), 잡음 \(\boldsymbol\varepsilon\)을 뽑아 \(\mathbf x_t\)를 만들고, 신경망에게 섞인 잡음을 맞히게 한다.
생성은 \(\mathbf x_T\sim\mathcal N(\mathbf 0,\mathbf I)\)에서 시작해, 매 단계 잡음을 예측하고 그 일부를 빼 \(\mathbf x_{t-1}\)로 옮긴다. DDPM 샘플러는 매 단계 새 잡음을 조금 다시 넣는 확률적 과정이고, DDIM(Song 등, 2020)은 같은 학습된 모델로 잡음을 다시 넣지 않는 결정적 경로를 따라 단계를 크게 건너뛸 수 있게 했다. 아래 시뮬레이터는 신경망 대신, 데이터 분포가 가우시안 혼합이라 스코어를 해석적으로 정확히 계산할 수 있는 2차원 예제다. 즉 '완벽하게 학습된 디퓨전 모델'을 흉내 낸다.
2D 디퓨전: 순방향 잡음과 해석적 스코어 역과정
잠재 디퓨전: 픽셀 대신 VAE 잠재공간에서
512×512 RGB 이미지는 786,432개 값이다. 이 공간에서 수십 번의 신경망 호출을 하는 것은 비싸다. 게다가 픽셀 값의 대부분은 사람이 구분하기 어려운 미세한 질감 정보다. 잠재 디퓨전(Latent Diffusion, Rombach 등 2022)은 먼저 오토인코더(VAE)로 이미지를 작은 잠재 텐서로 압축하고, 디퓨전은 그 잠재공간에서만 한다. Stable Diffusion 1.x의 VAE는 가로세로를 8배 줄이고 채널 4개를 둔다.
Classifier-Free Guidance (CFG)
조건부 디퓨전 모델 \(\boldsymbol\varepsilon_\theta(\mathbf x_t, t, c)\)를 그대로 쓰면, 생성된 이미지가 프롬프트를 '느슨하게'만 따르는 경우가 많다. CFG(Classifier-Free Guidance, Ho & Salimans 2021)는 학습할 때 조건 \(c\)를 일정 확률(예: 10~20%)로 빈 조건 \(\varnothing\)으로 바꿔, 한 신경망이 조건부와 무조건부 예측을 모두 배우게 한다. 생성할 때는 둘의 차이를 증폭한다.
\(s\)를 키우면 프롬프트 일치도는 오르지만 다양성이 줄고 색이 과포화되거나 형태가 과장된다. 위 시뮬레이터의 링 데이터에서 s를 4~8로 올리면 샘플이 클래스 안의 일부 모드로 몰리고 모드 바깥으로 밀려나는 것이 바로 이 현상의 2D 버전이다. 또한 매 단계 조건부·무조건부 두 번의 신경망 계산이 필요해 비용이 2배다(두 입력을 배치로 묶어 한 번에 돌린다). '부정 프롬프트'는 \(\varnothing\) 자리에 원치 않는 내용의 조건을 넣어 그 반대 방향으로 밀어내는 변형이다.
단계 수 vs 품질·속도
디퓨전의 생성 비용은 (신경망 1회 비용) × (단계 수) × (CFG면 2)다. DDPM 원 논문은 학습과 같은 1,000단계를 모두 밟았다. DDIM 같은 결정적 샘플러와 고차 ODE 솔버(DPM-Solver 등)는 20~50단계로 줄였고, 증류(distillation)는 여러 단계의 결과를 한 번에 내도록 학생 모델을 학습해 1~4단계까지 줄였다(Consistency Models 2023, Latent Consistency Models, Adversarial Diffusion Distillation 등). 단계를 줄이는 대가는 다양성·세부 품질 손실이다.
| 방식 | 단계 수(예) | NFE (CFG 포함) | 특징 |
|---|---|---|---|
| DDPM 원형 | 1,000 | 최대 2,000 | 확률적, 매우 느림 |
| DDIM / ODE 솔버 | 20~50 | 40~100 | 결정적, 같은 잡음 → 같은 이미지 |
| 증류 (consistency, LCM, 적대적 증류) | 1~4 | 1~8 (CFG를 증류에 흡수하기도) | 실시간 생성 가능, 다양성·세부 일부 손실 |
증류 없이 원래 모델로 1단계만 밟으면, 모델은 \(\mathbb E[\mathbf x_0\mid\mathbf x_T]\), 즉 모든 가능한 이미지의 평균을 낸다. 뿌연 회색 이미지가 나오는 이유다. 시뮬레이터에서 단계 수 1로 실행하면 두 가우시안 사이 가운데로 샘플이 몰리는 것이 이 현상이다. 적은 단계로 날카로운 샘플을 내려면 그렇게 하도록 별도로 학습(증류)해야 한다.
Flow matching: 곧은 길로 옮기기
Flow matching(Lipman 등 2022, rectified flow: Liu 등 2022)은 잡음과 데이터를 직선으로 잇는다. \(\mathbf x_t = (1-t)\,\mathbf x_0 + t\,\boldsymbol\varepsilon\) (\(t\in[0,1]\))로 섞고, 신경망은 이 직선을 따라 움직이는 속도 \(\mathbf v = \boldsymbol\varepsilon - \mathbf x_0\)를 회귀로 맞힌다. 생성은 \(t=1\)의 잡음에서 \(d\mathbf x/dt = \mathbf v_\theta(\mathbf x_t,t)\)를 \(t=0\)까지 오일러법 등으로 적분한다.
| 항목 | 디퓨전 (DDPM/DDIM) | Flow matching | 자기회귀 (LLM식) |
|---|---|---|---|
| 생성 단위 | 전체를 동시에, 여러 번 다듬기 | 전체를 동시에, ODE 적분 | 토큰 하나씩 순서대로 |
| 학습 목표 | 잡음 \(\varepsilon\) 예측 (MSE) | 속도 \(\varepsilon-x_0\) 예측 (MSE) | 다음 토큰 교차 엔트로피 |
| 비용 축 | 단계 수 × 신경망 (× CFG 2) | 단계 수 × 신경망 | 토큰 수 × 신경망 |
| 주 사용처 | 이미지·영상·음성 | 최신 이미지·영상 | 텍스트, 일부 이미지·음성 토큰 |
영상 생성과 이해: 토큰 폭증의 계산
영상은 이미지에 시간 축이 붙은 것이다. 같은 패치 토큰화를 시간에도 적용하면 시공간 패치(spacetime patch)가 된다. 문제는 크기다. 이미지 한 장의 토큰 수에 프레임 수가 곱해지고, 어텐션 비용은 그 제곱으로 늘어난다.
영상 이해도 같은 문제를 겪는다. 1시간 영상을 1 fps로 뽑고 프레임당 256토큰이면 3,600 × 256 = 921,600토큰이다. 그래서 VLM은 프레임을 성기게 뽑고(0.5~2 fps), 프레임당 토큰을 풀링으로 줄이고(64토큰 등), 비슷한 연속 프레임의 토큰을 합치는 기법을 쓴다. "3분 12초에 무엇이 나왔나" 같은 질문은 샘플링 간격 사이에 끼면 답할 수 없다. 이것은 VLM 환각의 또 다른 원인이다.
영상 토큰 수와 어텐션 규모
임베딩 공유 검색: 멀티모달 RAG
CLIP식 공통 임베딩 공간이 있으면 10장의 RAG를 이미지로 확장할 수 있다. 이미지마다 벡터를 미리 계산해 벡터 DB에 넣고, 텍스트 질문 벡터와 코사인으로 검색한다("빨간 우산을 든 사람 사진"). 반대로 이미지로 텍스트 문서를 찾을 수도 있다. 문서 RAG에서는 PDF를 텍스트로 추출하는 과정에서 표·도표·레이아웃이 깨지는 일이 잦은데, 페이지 이미지 자체를 임베딩하는 방법(예: ColPali, 2024)은 VLM으로 페이지 패치마다 벡터를 만들고 질의 토큰과 MaxSim으로 비교한다(10장의 ColBERT와 같은 후기 상호작용). 검색된 페이지 이미지를 VLM에 넣어 답을 생성한다.
코사인 비교는 함께 학습된 인코더 쌍(같은 CLIP의 이미지·텍스트 타워)끼리만 의미가 있다. 서로 다른 모델의 벡터는 차원이 같아도 좌표계가 다르다. 또한 CLIP류의 텍스트 타워는 짧은 캡션(77토큰 내외)에 맞춰져 긴 질문을 잘 담지 못한다. 실무에서는 이미지 캡션·OCR 텍스트를 함께 색인해 텍스트 검색과 섞는(하이브리드) 방식이 흔하다.
추론 모델: 짧은 정리
추론 모델(reasoning model)은 답하기 전에 긴 사고 과정을 토큰으로 생성하도록 강화학습(RLVR)으로 훈련된 LLM이다. 원리(사고 사슬, 테스트타임 계산, GRPO)는 11장, 학습 파이프라인은 7장, 생성 비용은 8장에서 자세히 다뤘다. 이 장의 관점에서 기억할 것은 세 가지다.
- 비용 구조: 사고 토큰은 보이지 않아도 출력 토큰으로 생성·과금된다. 답 300토큰에 사고 8,000토큰이 붙으면 출력이 약 28배, 초당 50토큰이면 대기 시간이 약 2분 46초다. 디코딩은 대역폭 한계라 사고 토큰은 지연에 그대로 더해진다.
- 멀티모달 추론: VLM도 추론 모드를 갖추면서 차트·도형·수식 이미지를 보고 단계적으로 푼다. 이미지를 잘라 확대하는 도구를 사고 중에 호출하는 방식도 쓰인다. 다만 사고가 길어질수록 이미지 근거보다 앞선 텍스트에 기대는 환각 위험도 함께 커질 수 있다.
- 언제 쓰나: 다단계 수학·코드·계획에는 이득이 크지만, 단순 조회·분류·OCR에는 비용만 늘린다. 많은 모델이 사고 예산(effort)을 조절하게 해 준다.
오픈 웨이트 vs 클로즈드 모델
오픈 웨이트 ≠ 오픈소스
클로즈드 모델(closed / proprietary model)은 가중치를 공개하지 않고 API나 앱으로만 쓰게 한다. 오픈 웨이트 모델(open-weight model)은 학습된 가중치 파일을 내려받아 직접 실행할 수 있게 공개한다. 흔히 둘째를 "오픈소스 모델"이라 부르지만, 소프트웨어의 오픈소스와는 다르다. 프로그램에서 오픈소스는 '수정·재빌드할 수 있는 원천'을 공개한다는 뜻인데, 모델의 원천은 학습 데이터와 학습 코드다. 가중치만 있으면 그대로 실행하고 파인튜닝은 할 수 있어도, 모델을 처음부터 재현하거나 데이터에 무엇이 들어갔는지 검증할 수 없다. 컴파일된 실행 파일을 무료로 받은 것에 더 가깝다.
| 공개 수준 | 가중치 | 추론 코드 | 학습 코드 | 학습 데이터(또는 상세 정보) | 예 |
|---|---|---|---|---|---|
| 클로즈드 | ✗ | ✗ (API) | ✗ | ✗ | 상용 API 전용 모델 다수 |
| 오픈 웨이트 (제한 라이선스) | ✓ | ✓ | 대개 ✗ | ✗ (개요만) | Llama 계열(커뮤니티 라이선스), Gemma(이용 약관) |
| 오픈 웨이트 (표준 OSS 라이선스) | ✓ Apache 2.0·MIT 등 | ✓ | 일부 | 대개 ✗ | Mistral 7B(Apache 2.0), DeepSeek-R1(MIT) |
| 완전 공개 (fully open) | ✓ | ✓ | ✓ | ✓ | OLMo(AI2), Pythia 등 연구용 모델 |
OSI(Open Source Initiative)는 2024년 10월 오픈소스 AI 정의 1.0을 발표해, 오픈소스 AI라 부르려면 가중치뿐 아니라 학습 코드와 학습 데이터에 대한 충분히 상세한 정보가 공개되어야 한다고 정했다. 이 기준으로는 널리 쓰이는 오픈 웨이트 모델 대부분이 '오픈소스'에 해당하지 않는다.
라이선스 조건을 읽는 법
오픈 웨이트라도 자유롭게 쓸 수 있는지는 라이선스가 정한다. 확인할 항목은 다음과 같다.
- 상업적 이용: 허용되는가? 규모 제한이 있는가? 예를 들어 Llama 2·3 커뮤니티 라이선스는 월간 활성 사용자 7억 명을 넘는 서비스는 별도 허가를 받도록 했다.
- 이용 제한 정책(acceptable use policy): 특정 용도(무기, 감시 등)를 금지하는 조항. 위반 시 라이선스가 종료될 수 있다.
- 파생 모델: 파인튜닝한 모델에도 같은 라이선스·이름 표기 의무가 따르는가? 모델 출력으로 다른 모델을 학습하는 것(증류)을 막는가?
- 표기 의무: "Built with ..." 같은 문구, 라이선스 사본 동봉.
Apache 2.0·MIT 같은 표준 라이선스는 이런 추가 제한이 없어 법무 검토가 쉽다. 라이선스 조항은 버전마다 바뀌므로, 실제 도입 전에는 사용하려는 그 버전의 라이선스 원문을 확인해야 한다.
장단점 비교
| 기준 | 오픈 웨이트 (자체 호스팅) | 클로즈드 (API) |
|---|---|---|
| 통제 | 버전 고정·수정 가능. 모델이 바뀌거나 사라질 위험 없음 | 제공사가 모델을 갱신·폐기. 같은 프롬프트의 동작이 변할 수 있음 |
| 프라이버시·규제 | 데이터가 내 인프라 밖으로 나가지 않음 (망 분리, 온프레미스) | 데이터가 외부로 전송. 계약(보존 기간, 학습 사용 금지)과 리전 선택에 의존 |
| 비용 구조 | 고정비 (GPU 임대·구매) + 인건비. 사용량이 많고 꾸준할수록 유리 | 변동비 (토큰당 과금). 초기 비용 0, 사용량이 적거나 들쭉날쭉할수록 유리 |
| 최신 성능 | 최상위 성능은 대체로 클로즈드가 앞서는 경향이 있으나 격차가 줄었다는 평가가 많음(2025~2026) | 가장 큰·최신 모델과 멀티모달·도구 기능을 바로 사용 |
| 커스터마이즈 | 전체·LoRA 파인튜닝, 양자화, 디코딩 제약 등 자유 | 제공되는 범위(프롬프트, 일부 파인튜닝 API) 안에서만 |
| 운영 부담 | 서빙 엔진, GPU 확보, 스케일링, 모니터링, 보안 패치를 직접 | 거의 없음. 대신 속도 제한·장애에 의존 |
| 안전장치 | 직접 필터·가드레일 구축 필요 | 제공사의 안전 정책·필터 포함 (과도한 거절 가능성도) |
비용은 가동률이 가른다. GPU 한 장을 시간당 \(C_h\)달러에 빌려 초당 \(R\)토큰을 처리한다면, 1M 토큰당 비용은 \(C_h / (3600\,R\,u) \times 10^6\)이다(\(u\)는 가동률). 예를 들어 \(C_h=\$2.5\), 연속 배칭으로 \(R=1{,}000\)토큰/초(가정)이면 \(u=100\%\)일 때 약 $0.69/1M 토큰이지만, 밤과 주말에 놀아서 \(u=20\%\)이면 약 $3.5/1M 토큰으로 5배가 된다. 자세한 처리량·비용 계산은 12장을 보자.
선택 기준: 의사결정 흐름
가중치 다운로드는 무료지만, 70B 모델을 BF16으로 서빙하려면 140 GB 이상의 GPU 메모리(9장)와 이를 운영할 사람이 필요하다. 사용량이 적으면 API가 훨씬 싸다. 반대로 "API는 데이터를 학습에 쓴다"도 일반화할 수 없다. 기업용 계약은 학습 사용 금지·보존 기간을 명시하는 경우가 많으므로 계약 조건을 확인해야 한다.
온디바이스 AI: 내 기기에서 돌리기
온디바이스 AI(on-device AI)는 모델을 서버가 아닌 스마트폰·노트북·차량 같은 사용자 기기에서 실행하는 것이다. 이점은 분명하다. ① 프라이버시: 메시지·사진·음성이 기기 밖으로 나가지 않는다. ② 오프라인: 네트워크 없이도 동작한다. ③ 지연: 왕복 통신이 없다. ④ 비용: 서버 GPU 비용이 사용자 기기로 분산된다. 대가는 제약이다. 메모리 용량, 메모리 대역폭, 배터리와 발열이다.
왜 대역폭이 핵심인지는 9장과 12장에서 봤다. 배치 1 디코딩은 토큰 하나마다 모든 가중치를 메모리에서 한 번씩 읽는다. 기기에서는 사용자 한 명만 쓰므로 배치가 거의 항상 1이다. 그래서 속도 상한은 단순한 나눗셈이 된다.
온디바이스 토큰/초 상한 계산기
NPU: 기기 속 행렬 가속기
NPU(Neural Processing Unit)는 신경망의 행렬곱을 저전력으로 처리하도록 만든 전용 가속기다. 스마트폰 SoC와 최신 노트북 칩에 CPU·GPU와 함께 들어 있다. 성능은 보통 INT8 기준 TOPS(초당 조 단위 연산)로 표시하며, 마이크로소프트는 Copilot+ PC의 조건으로 40 TOPS 이상의 NPU를 내걸었다(2024). NPU의 강점은 전력당 연산량이다. 같은 일을 GPU보다 적은 전력으로 해 배터리와 발열에 유리하다.
TOPS는 연산 성능이다. 긴 프롬프트를 한꺼번에 처리하는 프리필은 연산 한계라 TOPS의 덕을 보지만, 토큰을 하나씩 내는 디코드는 메모리 대역폭 한계라 TOPS를 두 배로 늘려도 거의 빨라지지 않는다. NPU·CPU·GPU가 같은 LPDDR 메모리를 공유하는 기기에서는 디코드 속도의 천장이 메모리 대역폭으로 정해진다. 위 시뮬레이터에서 프리필 시간과 디코드 속도가 서로 다른 변수에 반응하는 것을 확인하자. 또한 NPU는 지원하는 연산자·데이터 형식이 제한적이어서, 모델을 기기 전용 형식으로 변환하는 과정이 필요하고 일부 연산은 CPU로 되돌아가기도 한다.
소형 모델, 양자화, 증류
기기에 맞추는 세 가지 도구는 서로 보완적이다.
| 기법 | 줄이는 것 | 대표 수치 | 대가 |
|---|---|---|---|
| 소형 모델 (1~4B) | 파라미터 수 자체 | Llama 3.2 1B·3B(2024), 약 3B급 기기 내장 모델들 | 지식량·복잡한 추론 능력 감소 |
| 양자화 (9장) | 파라미터당 비트 | BF16 → 4비트: 크기·읽기 바이트 1/4 | 3비트 이하에서 품질 하락 가속 |
| 증류 (distillation) | 같은 크기에서 품질 향상 | 큰 모델의 출력·확률 분포를 작은 모델이 모방 | 교사 모델 비용, 라이선스(출력 사용 조건) 확인 |
| 가지치기·구조 축소 | 층·헤드·뉴런 일부 제거 | 큰 모델을 잘라 작은 모델의 출발점으로 | 재학습 필요 |
증류는 교사 모델의 다음 토큰 확률 분포 전체(소프트 레이블)를 학생이 따라 하게 하거나, 교사가 생성한 답·추론 과정을 학습 데이터로 쓰는 방식이다(추론 모델 증류는 11장). 실무 온디바이스 시스템은 흔히 하이브리드다. 요약·자동완성·분류 같은 짧은 일은 기기의 소형 모델이, 어려운 질문은 서버의 큰 모델이 처리하고, 어느 쪽으로 보낼지를 정책과 사용자 동의로 정한다.
AI 코딩 에이전트
코딩은 LLM 응용 중 가장 빠르게 자리 잡은 분야다. 코드가 텍스트이고, 결과를 컴파일러와 테스트가 자동으로 검증해 주기 때문이다. 이 피드백 덕분에 코딩은 11장의 에이전트 루프가 가장 잘 동작하는 환경이 되었다. 여기서는 일반 에이전트 원리는 11장에 맡기고, 코딩 에이전트의 부품과 실무 위험에 집중한다.
구성: 탐색, 편집, 실행, 샌드박스
- 저장소 탐색: 수만 개 파일을 다 컨텍스트에 넣을 수 없으므로(11장 컨텍스트 엔지니어링), 디렉터리 목록·텍스트 검색(grep)·심볼 검색으로 관련 파일만 찾아 읽는다. 임베딩 검색(10장)을 쓰기도 하지만, 정확한 함수 이름 검색은 grep이 강하다.
- 파일 편집 도구: 파일 전체를 다시 쓰면 토큰이 낭비되고 다른 부분을 망가뜨리기 쉽다. 그래서 "이 문자열을 저 문자열로" 같은 정확한 치환이나 diff 패치 형식의 도구를 쓴다. 치환 대상이 유일하지 않으면 실패하게 만드는 것이 안전하다.
- 실행·테스트 루프: 빌드·테스트·타입 검사·린터 결과가 곧 보상 신호다. 에러 메시지는 다음 수정의 단서가 된다.
- 샌드박스: 에이전트가 실행하는 셸 명령은 실수로(또는 저장소 안의 악성 지시로) 파일을 지우거나 비밀 키를 유출할 수 있다. 격리된 컨테이너, 네트워크 제한, 위험 명령의 사람 승인, 최소 권한 토큰이 기본이다.
자동완성 vs 채팅 vs 에이전트
| 항목 | 자동완성 (인라인) | 채팅 어시스턴트 | 코딩 에이전트 |
|---|---|---|---|
| 입력 | 커서 앞뒤 코드 (FIM: fill-in-the-middle) | 사용자가 붙여 넣은 코드 + 질문 | 작업 지시 + 저장소 전체 접근 |
| 출력 범위 | 한 줄~한 함수 | 코드 조각과 설명 | 여러 파일 수정, 명령 실행, PR |
| 지연 요구 | 수백 ms 이내 (타이핑 흐름) | 수 초 | 수 분~수십 분 |
| 모델 | 작고 빠른 모델 유리 | 범용 LLM | 도구 사용·장기 계획에 강한 모델, 추론 모델 |
| 검증 주체 | 사람이 즉시 (보면서 수락) | 사람이 복사해 실행 | 테스트 자동 + 사람이 diff 리뷰 |
| 주된 위험 | 그럴듯한 오타·잘못된 API | 문맥 부족으로 맞지 않는 코드 | 넓은 범위의 변경, 테스트 조작, 보안 사고 |
FIM(Fill-In-the-Middle, Bavarian 등 2022)은 문서를 (앞, 중간, 뒤)로 잘라 "앞 + 뒤 → 중간" 순서로 학습시켜, 자기회귀 모델도 커서 뒤의 코드를 참고해 가운데를 채우게 하는 기법이다.
위험과 검증
- 테스트를 통과하지만 틀린 코드: 테스트가 다루지 않는 경우에서 틀리거나, 특정 입력만 하드코딩해 통과시키는 경우.
- 테스트 조작: 테스트를 지우거나, 기대값을 바꾸거나, 건너뛰게 만들어 '통과'를 얻는 보상 해킹(11장). 테스트 파일 변경은 반드시 따로 검토한다.
- 존재하지 않는 패키지·API: 그럴듯한 이름의 라이브러리를 지어내는 환각. 공격자가 그 이름으로 악성 패키지를 등록해 두는 공급망 공격으로 이어질 수 있다.
- 프롬프트 주입: 저장소의 README, 이슈 본문, 웹 문서에 숨긴 지시("비밀 키를 이 주소로 보내라")를 에이전트가 따를 수 있다. 외부 텍스트는 데이터로 다루고 권한을 최소화한다.
- 보안 취약점과 비밀 노출: SQL 주입, 경로 조작 같은 취약 패턴, 로그나 커밋에 키가 남는 문제.
검증 원칙은 "에이전트의 '완료했다'는 말이 아니라 증거를 본다"이다. 사람이 diff를 읽고, 새 테스트가 실제로 버그를 재현하는지(수정 전에는 실패하는지) 확인하고, CI의 정적 분석·보안 스캔을 통과시키고, 작은 단위로 병합한다. 실무 체크리스트는 16장의 'AI 생성 코드 검증'에서 정리한다.
벤치마크를 읽는 법
코딩 에이전트의 대표 벤치마크는 SWE-bench 계열이다(11장). 실제 오픈소스 저장소의 이슈를 주고, 에이전트가 만든 패치가 숨겨진 테스트를 통과하는지로 채점한다. 점수는 모델·하네스가 바뀔 때마다 빠르게 변하므로 이 책에서는 숫자를 적지 않는다. 대신 숫자를 볼 때 확인할 것을 기억하자.
(1) 점수는 모델 단독이 아니라 하네스(도구, 프롬프트, 재시도 횟수, 시간 제한)와의 조합이다. (2) 공개 저장소의 이슈와 정답 패치가 사전학습 데이터에 섞였을 수 있다(데이터 오염). (3) pass@k(여러 번 중 한 번 성공)와 매번 성공해야 하는 실무 요구는 다르다. (4) 벤치마크 과제는 테스트가 있는 잘 정의된 이슈지만, 실무 과제는 요구사항이 모호하고 테스트가 부족한 경우가 많다. 결국 자기 저장소의 과거 이슈로 만든 작은 평가 세트가 가장 믿을 만한 지표다.
핵심 정리
- 멀티모달 모델은 모달리티별 인코더로 데이터를 벡터 열로 바꾸고, 프로젝터로 공통 임베딩 공간(검색용) 또는 LLM의 공통 토큰 공간(생성용)에 맞춘다. 비용은 결국 토큰 수가 정한다.
- 후기 융합(CLIP)은 벡터를 미리 계산해 대규모 검색에 강하고, 초기 융합(토큰 결합)은 세밀한 교차 이해에 강하다. 실무는 "후기 융합으로 좁히고 초기 융합으로 판단"하는 2단계가 흔하다.
- CLIP은 \(N\times N\) 유사도 행렬의 대각선을 정답으로 하는 대칭 InfoNCE로 학습한다. 찍기 수준 손실은 \(\ln N\)이고, 온도 τ가 작을수록 코사인 차이가 확률 차이로 크게 증폭된다.
- ViT 토큰 수 = \((H/P)(W/P)\): 224·P14 → 256, 336 → 576. 고해상도는 타일링(+썸네일)이나 네이티브 해상도로 처리하고 2×2 병합으로 토큰을 1/4로 줄인다.
- VLM = 비전 인코더 + 작은 프로젝터(MLP) + LLM. 1단계는 프로젝터 정렬, 2단계는 지시 튜닝이다. 환각은 언어 사전 확률, 해상도 손실, 유도 질문에서 오며 고해상도·그라운딩·"확인 불가" 지시로 완화한다.
- 16 kHz, hop 10 ms면 초당 100 멜 프레임(30초 → 3,000)이다. Whisper는 인코더-디코더로, 디코더의 크로스 어텐션이 글자와 소리를 정렬한다.
- WER = (S+D+I)/N은 편집 거리 DP로 계산하며 100%를 넘을 수 있다. 띄어쓰기가 흔들리는 한국어는 CER을 함께 보고, 정규화 규칙을 맞춘 뒤 비교한다.
- TTS는 텍스트 정규화 → 음향 특징(멜) 또는 코덱 토큰 → 보코더다. 코덱 토큰은 음성을 언어 모델링 문제로 만들고, 음성 대 음성 모델은 캐스케이드의 지연·비언어 정보 손실을 줄인다.
- 디퓨전: \(\mathbf x_t=\sqrt{\bar\alpha_t}\mathbf x_0+\sqrt{1-\bar\alpha_t}\boldsymbol\varepsilon\)으로 잡음을 넣고 \(\lVert\boldsymbol\varepsilon-\boldsymbol\varepsilon_\theta\rVert^2\)로 잡음(=스코어)을 예측한다. 잠재 디퓨전은 VAE 잠재(512²×3 → 64²×4, 48배)에서 계산한다.
- CFG \(\tilde\varepsilon=\varepsilon_\varnothing+s(\varepsilon_c-\varepsilon_\varnothing)\)는 프롬프트 일치를 높이지만 다양성을 줄이고 NFE를 2배로 만든다. 단계 수는 DDPM 1,000 → DDIM 20~50 → 증류 1~4로 줄었고, flow matching은 직선 경로의 속도를 학습한다.
- 오픈 웨이트 ≠ 오픈소스(데이터·학습 코드 공개 여부, 라이선스 제한). 선택은 데이터 통제·최신 성능·가동률에 따른 비용 구조·운영 역량으로 판단한다.
- 온디바이스 디코드 속도 상한 ≈ 대역폭 × 효율 ÷ (파라미터 × 비트/8). NPU TOPS는 프리필을 돕지만 디코드는 대역폭이 정한다. 코딩 에이전트는 탐색·편집·테스트 루프·샌드박스로 구성되며, 결과는 테스트와 diff 리뷰라는 증거로 검증한다.
확인 퀴즈
1. 패치 크기 14인 ViT에 448×448 이미지를 넣으면 패치 토큰은 몇 개이고, 2×2 토큰 병합 후에는 몇 개인가?
2. 배치 크기 1,024로 CLIP을 학습하기 시작했다. 모든 유사도가 거의 같은 초기 상태에서 대칭 InfoNCE 손실은 대략 얼마인가?
3. 정답 문장 10단어를 인식한 결과에 치환 1개, 삭제 1개, 삽입 2개가 있었다. WER은?
4. 16 kHz 오디오를 창 25 ms, hop 10 ms로 로그 멜 스펙트로그램으로 바꾼다. 30초 음성의 프레임 수와, stride 2 합성곱 후 인코더 위치 수는 대략?
5. Stable Diffusion 1.x에서 512×512 RGB 이미지 대신 VAE 잠재공간(64×64×4)에서 디퓨전을 하면 처리하는 값의 수는 몇 배 줄어드는가?
6. CFG 가이던스 s = 7.5, 샘플링 30단계로 이미지를 만든다. 다음 중 옳은 것은?
7. 메모리 대역폭 약 68 GB/s인 스마트폰에서 7B 모델을 4비트로 돌린다. 배치 1 디코드의 이론 상한(효율 100%, KV 캐시 무시)에 가장 가까운 것은?
8. 어떤 모델이 가중치를 공개했지만 학습 데이터와 학습 코드는 비공개이고, 월간 사용자 수가 일정 규모를 넘으면 별도 허가를 받도록 한다. 가장 정확한 설명은?
9. 상품 이미지 5천만 장에서 "줄무늬 셔츠"를 찾고, 상위 20개에 대해서만 "사진 속 셔츠의 단추가 몇 개인가"를 판단하려 한다. 알맞은 설계는?
10. 코딩 에이전트가 "모든 테스트 통과"라고 보고했다. diff를 보니 기존 테스트 2개의 기대값이 바뀌어 있다. 가장 적절한 대응은?