토크나이저와 임베딩의 운영 감각
토크나이저는 LLM 비용과 컨텍스트 활용도를 좌우하고, 임베딩은 RAG와 검색 품질의 토대가 된다. 이 스크립트는 한국어 토큰 효율, 임베딩 모델 선택, 차원 축소, reranker와 hybrid search, 운영 silent failure까지 연결해 설명한다.
Script Companion
오디오와 함께 스크립트 보기
- 01
토크나이저와 임베딩은 LLM을 운영할 때 서로 다른 층에서 비용과 품질을 결정한다. 토크나이저는 텍스트를 모델이 읽는 입력 단위인 토큰으로 쪼개고, 임베딩은 토큰이나 문장, 이미지를 의미를 가진 고차원 벡터로 바꾼다. 그래서 API 비용을 추정할 때는 토큰 수를 봐야 하고, RAG나 의미 검색을 설계할 때는 임베딩 공간의 거리와 랭킹 방식을 봐야 한다. 특히 한국어처럼 토큰화 효율이 영어와 다른 언어에서는 같은 문장 길이라도 비용과 context window 활용도가 크게 달라진다.
- 02
토크나이저의 계보는 word-level에서 시작해 character-level, BPE, SentencePiece, WordPiece, Tiktoken으로 이어진다. word-level은 단어를 그대로 어휘로 삼기 때문에 어휘가 폭증하고 OOV 문제가 생긴다. character-level은 어휘는 작지만 시퀀스가 지나치게 길어진다. BPE는 빈도 높은 byte 쌍을 반복해서 합병하며 균형을 잡고, SentencePiece는 unicode를 직접 처리하며 BPE와 Unigram을 모두 지원한다. WordPiece는 likelihood 기반으로 합병하고, Tiktoken은 OpenAI의 BPE 구현으로 byte-level과 regex pretokenization을 함께 쓴다. 현대 LLM의 표준은 모든 unicode를 처리할 수 있고 OOV가 없는 byte-level BPE다.
- 03
BPE 알고리즘은 자주 붙어 나오는 조각을 더 큰 조각으로 합치며 토큰 효율을 만든다. 예를 들어 영어 running은 학습된 합병에 따라 run과 ning처럼 나뉠 수도 있고, runn과 ing처럼 나뉠 수도 있다. Llama 3 토크나이저는 128k vocabulary를 사용하며, Llama 2의 32k에서 4배 확대되어 더 많은 합병으로 토큰 효율을 높인다. 이 차이는 비용으로 바로 이어진다. GPT-4의 cl100k_base에서 한국어는 영어 대비 2.5에서 3배 비효율적이고, GPT-4o의 o200k_base에서는 다국어 vocabulary가 200k로 커지며 한국어가 1.5에서 2배 수준으로 개선된다. 같은 8k context window라도 한국어로는 모델 vocabulary에 따라 실제로 들어가는 글의 양이 3k에서 5k token 정도로 줄어들 수 있다.
- 04
한국어가 더 비싼 이유는 BPE가 주로 영어 코퍼스 기반으로 학습되면 한국어가 byte 단위로 더 많이 쪼개지기 때문이다. 한 글자는 UTF-8에서 대략 3 bytes로 표현되며, vocabulary 크기가 작을수록 한국어 조각이 더 세분화된다. 그래서 cl100k와 o200k의 차이는 단순한 구현 차이가 아니라 운영 비용 차이로 나타난다. 여기서 silent failure도 시작된다. GPT-4는 앞에 공백이 붙은 hello와 공백이 없는 hello를 다르게 토큰화할 수 있고, prompt 끝의 trailing space도 모델 출력 확률을 바꿀 수 있다. < im_start >나 < endoftext > 같은 special token이 raw text와 섞이면 prompt injection 위험이나 모델 혼란이 생긴다. fine-tuning에서는 base와 다른 토크나이저를 쓰면 학습은 되는 것처럼 보여도 추론 결과가 망가질 수 있다.
- 05
임베딩은 입력을 고차원 벡터로 바꾸는 함수다. Token embedding은 LLM 내부의 first layer에서 각 token ID를 vector로 바꾸는 층이고, word2vec의 정적 단일 vector를 self-attention으로 문맥별 vector로 일반화한 산물로 볼 수 있다. 같은 bank라는 토큰도 layer를 통과한 뒤에는 문맥에 따라 vector가 달라진다. Sentence embedding은 문장 전체를 하나의 vector로 바꾸며 검색과 분류에 쓰인다. contextual encoder 출력을 풀링하고 contrastive 학습으로 다듬은 결과다. Image embedding은 이미지를 vector로 바꾸며, CLIP처럼 텍스트와 이미지를 같은 공간에 두는 cross-modal 방식도 있다.
- 06
좋은 임베딩 공간에서는 의미가 거리로 드러난다. 비슷한 의미의 문서는 가까운 곳에 있고, 같은 토픽의 문서들은 클러스터를 형성한다. word2vec의 king - man + woman이 queen에 가깝다는 예시는 현대 LLM 임베딩에서는 약하지만, 의미 연산의 직관을 설명하는 토대가 된다. 거리 계산에서는 cosine similarity가 RAG와 검색의 표준이고, LLM 임베딩 모델은 보통 L2 정규화된 출력을 내기 때문에 cosine과 dot product가 같아진다. 그래서 검색에서는 dot product를 쓰는 편이 더 빠를 수 있다. 반대로 Euclidean은 크기까지 반영하므로 anisotropy 영향을 크게 받고 거의 쓰이지 않는다. 모든 임베딩이 좁은 cone에 몰리는 anisotropy가 생기면 거리가 의미를 충분히 구분하지 못한다.
- 07
임베딩 모델 선택은 비용, 품질, 언어, 운영 위치를 함께 봐야 한다. OpenAI text-embedding-3-small은 1536차원, 8k context, MTEB 62.3이며 가성비와 Matryoshka가 장점이다. text-embedding-3-large는 3072차원, MTEB 64.6으로 OpenAI 생태계의 default 위치에 가깝다. Voyage AI voyage-3-large는 1024차원, 32k context, 다국어 SOTA와 MRL, int8과 binary 네이티브를 특징으로 한다. BGE-M3는 open-source 다국어 표준으로 dense, sparse, ColBERT 모드를 함께 제공한다. NV-Embed-v2와 Qwen3-Embedding-8B처럼 open-weight와 decoder-as-encoder 흐름도 중요해졌다. OpenAI 생태계라면 3-small과 3-large를 비용과 품질 기준으로 고르고, 다국어 SOTA는 voyage-3-large나 Qwen3-Embedding, on-prem과 open 조건은 BGE-M3나 NV-Embed-v2를 검토한다.
- 08
임베딩 학습의 핵심 방식은 contrastive learning이다. 같은 의미의 두 문장은 가깝게, 다른 의미의 문장은 멀게 학습한다. positive 쌍은 번역 대응 문장, paraphrase, query-document 매칭으로 만들 수 있고, 표면적으로는 비슷하지만 의미가 다른 hard negative가 학습 효과를 높인다. SimCSE, GTR, E5, BGE는 모두 이 방식의 변형이다. Matryoshka Representation Learning은 차원을 사후에 잘라도 의미가 보존되도록 학습하는 방식이다. OpenAI text-embedding-3-large는 dimensions 파라미터로 256에서 3072까지 선택할 수 있고, 256d로 절단해도 ada-002의 1536d, MTEB 61.0을 상회한다고 문서에 정리되어 있다. 운영 관점에서는 같은 모델로 vector store storage와 메모리를 4에서 6배 줄이고, 검색 품질 손실을 1에서 3% 정도로 제한하는 데 가치가 있다.
- 09
차원 축소와 압축은 비슷해 보여도 출발점이 다르다. PCA와 UMAP은 이미 만든 임베딩을 사후 처리하므로 일부 정보 손실이 생긴다. Matryoshka는 학습할 때부터 절단을 가정하므로 잘랐을 때 손실이 적다. Quantization도 비용을 크게 바꾼다. fp32에서 int8로 바꾸면 메모리를 4배 줄이면서 검색 품질을 거의 100% 보존할 수 있고, binary 1비트는 메모리를 32배 줄이고 속도를 약 40배 높이지만 품질은 약 95% 수준으로 본다. Matryoshka와 Binary를 결합하면 256차원과 binary 조합으로 원본 대비 storage 192배 절감도 가능하다. 다만 256d 미만에서는 품질이 폭락할 수 있고, binary embedding은 단독 사용보다 fp32 rerank를 함께 두는 조건에서 판단해야 한다.
- 10
RAG 품질에서는 bi-encoder 임베딩만으로 한계가 있어 2단계 검색이 표준이 된다. 먼저 bi-encoder로 후보를 넓게 가져오고, cross-encoder가 query와 document를 같이 입력받아 직접 점수를 매긴다. cross-encoder는 정확하지만 매번 forward가 필요하므로 보통 100개 후보에만 적용한다. 운영 표준 reranker로는 BGE-reranker-v2-m3, voyage-rerank-2, voyage-rerank-2-lite, Cohere Rerank 3.5가 정리되어 있다. 한국어 RAG에서는 reranker가 recall@10을 보통 10에서 30% 개선하는 ROI가 큰 도구로 언급된다. 다만 top-10이 이미 정확하면 50에서 100ms의 추가 손해가 될 수 있다. top-100 안에 정답이 들어오는지 먼저 확인하지 않으면 rerank를 추가해도 의미가 없다.
- 11
Dense embedding은 의미 검색에 강하지만 고유명사, 신조어, 법률, 코드 식별자에는 약하다. 그래서 Hybrid search는 BM25의 lexical 결과와 dense embedding의 semantic 결과를 RRF, 즉 Reciprocal Rank Fusion으로 결합한다. Sparse 또는 learned-sparse embedding인 SPLADE는 어휘 기반이지만 학습된 가중치를 사용해 BM25보다 강하고 dense보다 해석 가능하다. BGE-M3는 한 모델이 dense, sparse, ColBERT multi-vector late interaction 출력을 함께 낸다. 셋을 RRF로 결합하면 단일 dense 대비 큰 개선을 기대할 수 있다. 한국어 운영에서는 고유명사, 법령, 약어 비중이 크면 BM25나 sparse 가중치를 dense보다 높이는 것이 흔히 정답이다. 일반 도메인에서는 Hybrid의 RRF k=60이 유효하지만, 고유명사가 압도적인 도메인에서는 BM25 우위의 0.4 대 0.6 같은 가중치 판단이 필요하다.
- 12
임베딩에도 분명한 한계가 있다. 긴 문서를 하나의 vector로 압축하면 세부 정보가 손실되고, 학습 코퍼스 밖 도메인인 OOD에서는 품질이 크게 떨어질 수 있다. 의학이나 법률처럼 도메인이 다르면 외부 벤치 수치만 믿기 어렵다. BPE 토크나이저가 고유명사나 신조어를 잘못 쪼개면 임베딩도 실패할 수 있고, 검색에 좋은 임베딩이 생성 모델 내부 임베딩과 같은 역할을 한다고 보면 안 된다. 운영 silent failure는 정량 신호로 잡아야 한다. 한국어 query 검색이 부정확하고 recall@10이 50% 미만이면 영어 임베딩 모델 사용을 의심하고 BGE-M3나 voyage-3-large 같은 다국어 모델을 검토한다. 고유명사 검색에서 exact match 점수가 0%라면 dense만 사용한 것이 원인일 수 있어 BM25와 dense, RRF 조합으로 복구한다.
- 13
모델 버전 변경은 reindex 절차를 따로 설계해야 하는 영역이다. OpenAI는 text-embedding-ada-002를 2025-01-04에 deprecation 공지하고 2025-06-14 retire로 12개월 grace를 줬다고 문서에 적혀 있다. 같은 query에 대해 ada-002와 3-small 좌표계가 cosine 0.3 이상 차이 나면, rolling migration 중 부분 색인된 인덱스의 retrieval 결과가 비결정적으로 흔들릴 수 있다. 안전한 절차는 새 인덱스를 만들고 양쪽 모델로 같은 문서를 동시에 인덱싱하는 dual-write에서 시작한다. 그다음 기존 문서를 새 모델로 batch reindex하고, 진행률 90% 이상 전에는 cutover하지 않는다. shadow read로 recall@10과 top-1 일치율을 측정하고, 새 인덱스가 baseline 이상일 때만 traffic switch를 한다. 100% cutover 후에도 1에서 2주 옛 인덱스를 read-only로 보존한 뒤 purge한다.
- 14
토크나이저와 임베딩의 실무 연결점은 비용 견적, 검색 품질, 저장 비용, fine-tuning 안정성으로 모인다. 플랫폼 엔지니어가 LLM을 운영할 때 한국어는 영어 대비 1.5에서 2배 토큰 비효율이 있어 prompt 설계와 context window 활용을 따로 봐야 한다. 임베딩 모델은 text-embedding-3-large의 품질, text-embedding-3-small의 비용, BGE 계열의 self-host 조건처럼 운영 제약에 맞춰 고른다. Matryoshka로 1536차원을 512로 절단하면 storage와 메모리를 3배 줄이면서 검색 품질을 거의 유지할 수 있다. 더 일반화하면 임베딩은 데이터를 의미 공간으로 옮기는 도구이고, 그 위 검색은 거리, 랭킹, 재정렬의 문제다. 새 검색 기술을 만났을 때는 표현 단위와 dtype, 거리 정의, 2-stage 가능 여부, native 압축 지원, recall@10이나 exact match 같은 silent failure 지표를 먼저 확인하면 된다.
같은 레이어