LLM 엔지니어링 · 토크나이저와 임베딩 · 이론
임베딩 — 의미를 좌표로 바꾸는 가장 단순한 방법
한 줄 요약
임베딩은 텍스트를 벡터로 바꿔 거리로 비교할 수 있게 만드는 일이며, 신경망 없이 TF-IDF 만으로도 그 원리와 한계를 전부 관찰할 수 있다.
왜 이게 필요했나
"비슷한 문서를 찾아라"는 요구를 만족시키려면 비슷함을 수치로 정의해야 한다. 텍스트를 벡터로 바꿔 두면 내적이나 각도로 유사도를 계산할 수 있다.
가장 단순한 벡터는 단어 등장 횟수를 나열한 것이다. 문제는 흔한 단어가 지배한다는 점이다. 모든 문서에 나오는 단어는 문서를 구분하는 데 아무 도움이 안 되는데 값은 가장 크다.
TF-IDF 는 이 문제를 정면으로 다룬다. 단어의 문서 내 빈도(TF)에 문서 빈도의 역수(IDF)를 곱한다. 여러 문서에 골고루 나오는 단어는 IDF 가 낮아 눌리고, 특정 문서에만 나오는 단어는 IDF 가 높아 강조된다.
어떻게 동작하나
평활을 넣은 IDF 는 보통 이렇게 정의한다.
idf(t) = ln((1 + N) / (1 + df(t))) + 1분모와 분자에 1을 더하는 것은 df 가 0 인 항에서 나눗셈이 깨지지 않게 하려는 것이고, 마지막에 1을 더하는 것은 모든 문서에 나오는 항의 가중치가 0 이 되어 완전히 사라지는 것을 막기 위해서다.
벡터를 만든 뒤에는 L2 정규화를 한다. 길이를 1로 맞추면 두 벡터의 내적이 곧 코사인 유사도가 되고, 문서 길이의 영향이 사라진다. 긴 문서가 단지 길다는 이유로 모든 질의에 잘 걸리는 문제를 막는 장치다.
해싱 트릭도 알아 둘 만하다. 어휘 사전을 유지하는 대신 항을 해시 함수로 고정 개수의 버킷에 배정한다. 어휘가 아무리 늘어도 차원이 고정되고 사전을 들고 다니지 않아도 된다. 대가는 충돌이다. 서로 다른 항이 같은 버킷에 들어가면 구분할 수 없다. 실제로 실습에서 확인하면 최근접 이웃이 상당히 달라진다.
현장에서 만나는 모습
TF-IDF 의 한계는 명확하다. 표면 형태가 다르면 의미가 같아도 0 점이다. "느리다"와 "지연이 크다"는 아무 관계가 없는 것으로 계산된다. 신경망 임베딩이 필요한 이유가 여기 있다.
그렇다고 TF-IDF 가 쓸모없는 것은 아니다. 고유명사, 제품 코드, 오류 코드처럼 정확히 그 문자열을 찾아야 하는 질의에서는 오히려 더 강하다. 그래서 실무 검색은 대개 둘을 합친다. 키워드 기반과 벡터 기반의 결과를 각각 뽑아 순위를 섞는 하이브리드 방식이 표준이 된 이유다.
다음 실습에서 할 것
문서 30건에 대해 토큰화, 문서 빈도, IDF, TF-IDF 행렬을 numpy 로 직접 계산하고, 코사인 유사도로 최근접 이웃과 질의 검색을 수행한다. 마지막에는 해싱 트릭으로 차원을 줄여 결과가 얼마나 달라지는지 측정한다.