키워드 검색은 정확한 단어가 겹쳐야 문서를 찾는다. 그래서 의미는 같지만 표현이 다른 문서를 놓친다. 이 한계를 푸는 것이 시맨틱 검색(semantic search)  공유된 의미를 기준으로 프롬프트와 문서를 매칭한다.

 

1. 키워드 검색의 한계

키워드 검색은 happy glad가 동의어인데도 서로 매칭하지 못하고, 반대로 프로그래밍 언어 Python과 뱀 python처럼 철자는 같지만 뜻이 다른 단어를 잘못 매칭한다. 즉 단어의 존재만 보고 의미를 못 본다.

그림 1. 키워드 검색은 동의어(happy/glad)를 잇지 못하고, 같은 철자의 다른 의미를 잘못 잇는다. 어휘(lexical)가 아니라  의미(meaning) 를 포착해야 한다.

 

 

 

 

2. 큰 그림 — 키워드 검색과 같은 골격

높은 수준에서 보면 시맨틱 검색은 키워드 검색과 똑같이 작동한다. 모든 문서를 벡터로 매핑하고, 프롬프트도 벡터로 매핑한 뒤, 프롬프트 벡터와 문서 벡터를 비교해 점수를 내고 가장 잘 맞는 문서를 찾는다. 유일한 차이는 벡터를 부여하는 방식이다.

  • 키워드 검색 — 텍스트에 각 단어가 몇 번 나오는지 센다(bag of words).
  • 시맨틱 검색 — 텍스트를 embedding model(임베딩 모델)이라는 특수한 수학 모델에 통과시켜 벡터를 생성한다.

그림 2. 두 방식 모두 "프롬프트·문서 → 벡터 → 비교 → 점수"의 골격은 같다. 차이는 벡터를 어떻게 만드느냐 — 단어를 세느냐(키워드), 임베딩 모델로 생성하느냐(시맨틱).

 

 

 

3. 임베딩 모델 — 단어를 공간의 점으로

embedding model은 단어를 공간상의 위치에 매핑하고, 그 위치를 벡터로 표현한다. 예컨대 pizza를 [3, 1], bear를 [5, 2]에 매핑하는 식이다. 2차원이라면 이 벡터들을 x-y 평면 위의 점으로 볼 수 있다.

그림 3. 임베딩 모델은 토큰을 공간의 한 위치(벡터)로 매핑한다. pizza→[3,1], bear→[5,2].

 

여기서 거의 마법 같은 부분이 나온다 — 임베딩 모델은 의미적으로 비슷한 단어를 공간상 가까운 위치에 매핑한다. food cuisine은 가까이, trombone cat은 멀리 임베딩된다. 주의할 점은, 이 x축·y축에는 단순한 해석이 없다는 것이다. "food 축"이나 "animal 축"이 있는 게 아니라, 그저 의미가 비슷한 점들이 함께 군집을 이룬다고 생각하면 된다.

그림 4. 축 자체에 의미는 없다. 점들이 평면 위에 떠 있고, 의미가 비슷한 단어들이 서로 모여 군집을 이룬다.

 

 

4. 차원 — 2D로는 부족함

단어들의 관계는 복잡해서 2차원으로는 의미 있는 군집을 만들기 어렵다. 벡터 구성 요소가 3개면 3차원 공간에 임베딩할 수 있고, 그러면 관련 개념의 군집과 미묘한 관계를 담을 여유 공간이 늘어난다. 실제 대부분의 임베딩 모델은 벡터가 수백~수천 개의 구성 요소를 가진다. 이 고차원 공간은 그리거나 상상하기 어렵지만, 수학적으로는 똑같은 원리가 적용된다 — 벡터는 그 공간 속 좌표이고, 비슷한 개념은 가까이, 다른 개념은 멀리 놓인다.

그림 5. 차원이 늘수록 군집을 만들고 미묘한 관계를 담을 공간이 많아진다. 실제 임베딩은 수백~수천 차원이다.

 

 

 

 

 

5. 단어뿐 아니라 문장·문서도

이 예시는 개별 단어에 초점을 맞췄지만, 임베딩 모델은 여러 종류의 입력에 대해 존재한다 — 단어·문장·문서 각각을 위한 모델이 있다. 입력의 종류는 달라도, 각 경우 공간의 한 점을 지정하는 하나의 벡터를 출력한다. 그리고 단어와 마찬가지로, 벡터가 가까울수록 텍스트의 의미가 비슷하다.

그림 6. 단어·문장·문서 각각을 위한 임베딩 모델이 있으며, 입력이 무엇이든 하나의 벡터를 출력한다.

 

예를 들어 "그는 수업 중 조용히 말했다", "그는 수업 중 조용히 속삭였다", "그녀의 딸은 우울한 하루를 밝게 만들었다"라는 세 문장을 벡터 공간에 투영하면, 앞의 두 문장은 서로 가깝고 세 번째 문장은 멀리 떨어진다.

그림 7. 문장 임베딩 예시 — 의미가 비슷한 두 문장(①②)은 가깝고, 다른 문장(③)은 멀다.

 

 

6. 벡터 거리 측정

텍스트의 유사도를 정량화하려면 벡터 간 거리를 측정한다. 대표적으로 세 가지가 있다.

Euclidean distance (유클리드 거리)

두 벡터를 잇는 직선의 길이 — 기하 시간의 피타고라스 정리를 고차원으로 확장한 것이다. 다만 아주 높은 차원에서는 모든 점이 서로 멀어지는 경향이 있어, 단독으로는 잘 쓰이지 않는다.

그림 8. Euclidean distance — 두 벡터를 잇는 최단 직선 거리.

 

Cosine similarity (코사인 유사도)

가장 널리 쓰이는 척도다. 두 벡터가 공간상 가까운지와 무관하게 방향의 유사성을 측정한다. 예를 들어 [10,10]과 [100,100]은 서로 멀지만 같은 방향을 향한다. 값의 범위는 같은 방향이면 1, 반대 방향이면 −1이다.

그림 9. Cosine similarity — 벡터의 방향이 얼마나 같은지(1 ~ −1). 크기와 무관해 고차원에서 안정적이다.

 

Dot product (내적)

한 벡터를 다른 벡터 위에 투영한 길이를 측정한다. 두 벡터의 길이·방향이 비슷하면 커지고, 직각(90°)이면 0, 반대 방향이면 음수다. 범위는 −∞ ~ +∞다.

그림 10. Dot product — 한 벡터를 다른 벡터에 투영한 길이. cosine·dot 모두  값이 클수록 가깝고 = 더 비슷한 개념 이다.

 

7. 시맨틱 검색의 전체 흐름

이제 이 거리 척도로 시맨틱 검색이 완성된다.

  1. 모든 문서를 임베딩 모델로 벡터 공간에 투영한다(의미가 비슷한 문서는 가까이).
  2. 프롬프트도 임베딩해 자체 벡터를 얻는다.
  3. 프롬프트 벡터와 각 문서 벡터의 거리를 측정한다.
  4. 거리가 가까운 순으로 정렬해 상위 문서를 반환한다 — 곧 프롬프트와 의미가 가장 비슷한 문서다.

그림 11. 문서·프롬프트를 임베딩 모델로 벡터 공간에 투영하고, 프롬프트와의 거리가 가까운 문서를 순위대로 반환한다.

 

여기서 자연스러운 질문 하나 — 임베딩 모델은 어떻게 "비슷한 개념을 가까이 놓는 법"을 알까? 다음 글에서는 임베딩 모델이 어떻게 학습되는지 조금 더 깊이 파고든다.

'AI > RAG' 카테고리의 다른 글

Hybrid Search & RRF  (0) 2026.07.02
How to train Embedding Model  (0) 2026.07.02
BM25 (키워드 검색)  (0) 2026.07.02
TF-IDF (키워드 검색)  (0) 2026.07.02
Metadata Filtering(메타데이터 필터링)  (0) 2026.07.02

+ Recent posts