LLMLLM 기초 · 2입문

토크나이저와 임베딩 — 텍스트가 숫자가 되는 과정

LLM토크나이저임베딩벡터의미검색

컴퓨터는 글자를 모른다

LLM은 텍스트를 '이해'한다고 하지만, 컴퓨터는 본질적으로 숫자만 처리합니다. "안녕하세요"라는 문장이 모델 안으로 들어가려면 반드시 숫자로 바뀌어야 합니다.

이 변환 과정이 토크나이징임베딩입니다.


1단계: 토크나이징 — 텍스트를 조각으로

토크나이저는 문장을 토큰(token) 단위로 쪼갭니다.

flowchart LR
    A["나는 ChatGPT를\n좋아합니다"] -->|토크나이저| B["['나', '는', ' Chat', 'G', 'PT', '를', ' 좋아', '합니다']"]
    B -->|ID 변환| C["[2314, 8, 15723, 38, 2849, 176, 9201, 4422]"]

토큰은 단어일 수도, 단어의 일부일 수도, 공백·구두점일 수도 있습니다. 모델은 이 숫자 배열만 봅니다.

한국어는 왜 토큰을 많이 쓰나?

영어: "I love programming"  →  3 토큰
한국어: "저는 프로그래밍을 좋아합니다"  →  약 8~10 토큰

한국어는 교착어 특성상 형태소 분리가 많이 일어납니다. 같은 내용이라도 영어보다 토큰 소비가 많아 비용이 더 많이 들고 처리 속도가 느립니다. API 비용을 계산할 때 반드시 고려해야 합니다.


2단계: 임베딩 — 숫자 ID를 의미 벡터로

토큰 ID는 단순한 번호입니다. "고양이 = 1234", "강아지 = 5678"이라고 해서 둘의 관계를 알 수 없습니다.

임베딩(Embedding) 은 각 토큰을 고차원 공간의 벡터로 변환합니다. 의미가 비슷한 단어는 벡터 공간에서도 가깝게 위치합니다.

flowchart LR
    subgraph 토큰_ID["토큰 ID (의미 없음)"]
        A1["고양이 = 1234"]
        A2["강아지 = 5678"]
        A3["자동차 = 9012"]
    end

    subgraph 임베딩_벡터["임베딩 벡터 (의미 있음)"]
        B1["고양이 → [0.82, 0.91, 0.12, ...]"]
        B2["강아지 → [0.79, 0.88, 0.14, ...]"]
        B3["자동차 → [0.11, 0.05, 0.93, ...]"]
    end

    A1 --> B1
    A2 --> B2
    A3 --> B3

    B1 <-->|"거리 가까움\n(둘 다 동물)"| B2
    B1 <-->|"거리 멂\n(전혀 다른 개념)"| B3

벡터 유사도: 의미가 가까우면 숫자도 가깝다

두 벡터가 얼마나 가까운지는 코사인 유사도로 계산합니다.

flowchart TB
    subgraph 유사도_예시["코사인 유사도 예시"]
        direction LR
        P1["'왕' 벡터"]
        P2["'여왕' 벡터"]
        P3["'사과' 벡터"]

        P1 <-->|"유사도 0.92\n(매우 가까움)"| P2
        P1 <-->|"유사도 0.11\n(관계 없음)"| P3
    end

유명한 벡터 연산 예시:

왕 - 남자 + 여자 ≈ 여왕
파리 - 프랑스 + 한국 ≈ 서울

임베딩 벡터가 단순 번호가 아닌 의미를 인코딩하고 있기 때문에 이런 산술이 가능합니다.


임베딩의 실용적 활용

의미 기반 검색 (Semantic Search)

키워드 검색은 단어가 정확히 일치해야 합니다. 임베딩 기반 검색은 의미가 비슷하면 찾아냅니다.

flowchart LR
    Q["질문:\n'강아지 먹이를\n뭘 주나요?'"] -->|임베딩 변환| QV["질문 벡터\n[0.7, 0.8, ...]"]

    subgraph DB["문서 DB"]
        D1["'반려견 사료 추천'"]
        D2["'고양이 건강 관리'"]
        D3["'개에게 좋은 음식'"]
    end

    D1 -->|임베딩| V1["[0.69, 0.79, ...]"]
    D2 -->|임베딩| V2["[0.61, 0.72, ...]"]
    D3 -->|임베딩| V3["[0.68, 0.81, ...]"]

    QV <-->|"유사도 0.94 ✅"| V1
    QV <-->|"유사도 0.41 ❌"| V2
    QV <-->|"유사도 0.91 ✅"| V3

'강아지'와 '개', '반려견'이 다른 단어지만 의미가 같으므로 모두 검색됩니다. 이것이 RAG의 핵심 검색 엔진입니다.


임베딩 모델 vs 생성 모델

구분임베딩 모델생성 모델 (LLM)
출력숫자 벡터텍스트
용도유사도 검색, 분류대화, 요약, 작성
대표 모델text-embedding-3, BGEGPT-4o, Claude
비용매우 저렴상대적으로 비쌈

검색은 임베딩 모델로, 답변 생성은 LLM으로 역할을 나누는 것이 실전 RAG 시스템의 기본 패턴입니다.


전체 흐름 정리

flowchart LR
    A["원본 텍스트\n'오늘 날씨 어때?'"]
    B["토큰 ID\n[2314, 1204, 892]"]
    C["임베딩 벡터\n[0.8, 0.2, 0.6, ...]"]
    D["LLM 처리\n(어텐션, 예측)"]
    E["출력 텍스트\n'맑고 따뜻합니다'"]

    A -->|"토크나이저"| B
    B -->|"임베딩 레이어"| C
    C -->|"트랜스포머"| D
    D -->|"디코딩"| E

정리

개념내용
토크나이징텍스트를 토큰(숫자 ID)으로 분리
한국어 토큰영어보다 토큰 소비가 많아 비용·속도 불리
임베딩토큰을 의미를 담은 고차원 벡터로 변환
코사인 유사도두 벡터의 의미적 거리 측정
의미 기반 검색키워드 불일치해도 의미 유사하면 검색

다음 편에서는 임베딩을 활용해 외부 문서를 LLM에 연결하는 RAG(검색 증강 생성) 를 배웁니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.