시맨틱 검색
고친 사람 github-actions[bot]
시맨틱 검색은 검색어와 뜻이 맞는 글을 찾아 줍니다. 낱말이 겹치는지보다 무엇을 묻는지를 봅니다. 그래서 검색어와 다른 말로 적힌 글도 찾아냅니다. 요즘은 글의 뜻을 숫자로 옮겨 견주는 방식으로 주로 만듭니다.
쉽고 빠른 이해
무슨 일을 하나 — 검색어의 뜻을 알아듣고 맞는 글을 찾아 줍니다. 「비밀번호를 잊어버렸어요」로 찾으면 「암호 재설정 방법」이라는 글이 맨 위에 옵니다. 두 문장에 같은 낱말은 하나도 없습니다.
왜 필요한가 — 낱말이 같은지만 보는 검색은 이 글을 못 찾습니다. 사람은 같은 것을 여러 말로 부릅니다. 그래서 이렇게 놓치는 글이 적지 않습니다.
어떻게 도나
- 글마다 뜻을 담은 숫자 목록을 미리 만들어 둡니다
- 검색어가 오면 같은 방법으로 숫자 목록을 만듭니다
- 검색어의 목록과 가장 가까운 글부터 돌려줍니다
대가 — 오류 코드나 모델명처럼 글자가 딱 맞아야 하는 검색에 약합니다. 글이 왜 나왔는지 짚어 설명하기도 어렵습니다. 그래서 낱말로 찾는 검색과 함께 쓰는 일이 많습니다.
상세
동네 서점 직원에게 「비 오는 날 읽을 잔잔한 소설」을 찾는다고 말해 봅시다. 직원은 제목에 「비」나 「잔잔한」이 든 책을 뒤지지 않습니다. 무엇을 원하는지 알아듣고 어울리는 책을 몇 권 골라 옵니다.
시맨틱 검색은 이 직원처럼 검색어의 뜻을 보고 글을 찾아 줍니다. 시맨틱(semantic)은 「뜻의」라는 말입니다. 사내 도움말에서 「비밀번호를 잊어버렸어요」로 찾으면 「암호 재설정 방법」이라는 글이 나옵니다.
낱말로 찾는 검색이 놓치는 글
이 절은 시맨틱 검색이 왜 필요한지를 낱말로 찾는 검색과 견주어 봅니다. 견주는 데는 도움말 글 세 편을 씁니다.
낱말로 찾는 검색이 전문 검색입니다. 글 본문에 검색어의 낱말이 들어 있는지를 봅니다. 낱말이 많이 겹치는 글일수록 앞에 세웁니다.
전문 검색의 약점은 사람이 같은 것을 여러 말로 부른다는 데서 옵니다. 글쓴이는 「암호」라고 적었습니다. 찾는 사람은 「비밀번호」라고 칩니다.
낱말이 다르면 전문 검색은 그 글을 후보에 올리지 못합니다. 이 어긋남이 어휘 불일치입니다.
도움말에 글이 셋 있습니다. 「비밀번호를 잊어버렸어요」로 찾는다고 해 봅시다. 두 검색은 대개 이렇게 답합니다.
| 글 제목 | 검색어와 겹치는 낱말 | 전문 검색 | 시맨틱 검색 |
|---|---|---|---|
| 암호 재설정 방법 | 없음 | 못 찾는다 | 1위 |
| 비밀번호 정책 변경 공지 | 비밀번호 | 1위 | 2위 |
| 회원 탈퇴 절차 | 없음 | 못 찾는다 | 3위 |
전문 검색은 「비밀번호」가 겹치는 공지 하나만 내놓습니다. 찾는 사람에게 필요한 글은 첫 줄입니다. 그런데 이 글은 결과에 없습니다. 시맨틱 검색은 뜻이 가장 가까운 첫 줄을 맨 위에 둡니다.
셋째 줄은 검색어와 동떨어진 글입니다. 그래도 순위에 들었습니다. 이 까닭은 아래 「시맨틱 검색이 약한 검색」 소절에서 봅니다.
어긋남은 반대 방향으로도 일어납니다. 「자바 설치」의 자바는 프로그래밍 언어입니다. 「자바 여행」의 자바는 인도네시아의 섬입니다.
전문 검색은 둘을 같은 낱말로 봅니다. 시맨틱 검색은 앞뒤 낱말을 함께 보고 어느 자바인지 가립니다.
뜻을 숫자로 옮기는 임베딩
이 절은 기계가 뜻을 어떻게 견주는지를 봅니다. 열쇠는 글을 숫자 목록으로 바꾸는 일입니다.
벡터는 숫자를 정해진 개수만큼 늘어놓은 목록입니다. [0.8, 0.1, 0.3] 은 숫자 셋짜리 벡터입니다. 이 숫자 셋을 가로·세로·높이 좌표로 읽으면 공간의 한 점이 됩니다. 원점에서 그 점까지 화살표를 그으면 벡터는 한 방향을 가리킵니다.
글을 이런 벡터로 바꾸는 일이 임베딩입니다. 글이 숫자 목록이 되면 두 글이 얼마나 가까운지를 기계가 셈으로 잴 수 있습니다.
바꾸는 일은 임베딩 모델이 맡습니다. 글을 넣으면 벡터가 나오는 모델입니다. 많은 글을 미리 학습해 두었기 때문에 뜻이 비슷한 글에 서로 가까운 벡터를 줍니다.
앞 표의 「암호 재설정 방법」과 「비밀번호를 잊어버렸어요」는 가까운 벡터를 받습니다. 「회원 탈퇴 절차」는 둘과 먼 벡터를 받습니다. 시맨틱 검색은 이 가까움을 뜻이 맞는 정도로 씁니다.
두 벡터가 얼마나 가까운지는 흔히 두 벡터가 가리키는 방향으로 잽니다. 이 값이 코사인 유사도입니다. 방향이 같으면 1 입니다. 방향이 벌어질수록 값이 작아집니다.
미리 하는 일과 검색할 때 하는 일
이 절은 시맨틱 검색이 도는 순서를 두 단계로 나눠 봅니다. 글을 넣을 때 한 번 하는 일과 검색어가 올 때마다 하는 일입니다.
미리 하는 일은 글을 벡터로 바꿔 쌓아 두는 것입니다. 긴 글은 문단 몇 개 크기의 조각으로 먼저 나눕니다. 글 하나를 벡터 하나로 만들면 여러 주제가 한데 섞여 뜻이 흐려지기 때문입니다. 이렇게 조각으로 나누는 일이 청킹입니다.
조각마다 임베딩 모델로 벡터를 만듭니다. 벡터는 원래 조각을 가리키는 번호와 함께 저장합니다. 벡터 데이터베이스는 벡터를 담아 두는 저장소입니다. 가까운 벡터를 빨리 찾아 주는 데 맞춰져 있습니다.
검색할 때는 검색어를 같은 임베딩 모델로 벡터로 바꿉니다. 저장소에서 그 벡터와 가장 가까운 벡터 k 개를 꺼냅니다. k 는 몇 개를 돌려받을지 부르는 쪽이 정하는 수입니다. 꺼낸 벡터가 가리키는 조각을 가까운 순서대로 돌려줍니다.
flowchart TD
subgraph 미리["미리 하는 일 · 글을 넣을 때 한 번"]
A["글을 조각으로 나누기"] --> B["임베딩 모델"]
B --> C["벡터 데이터베이스에 저장"]
end
subgraph 검색["검색할 때 · 검색어마다"]
D["검색어"] --> E["같은 임베딩 모델"]
E --> F["가장 가까운 벡터 k 개 꺼내기"]
F --> G["그 조각을 가까운 순서로 돌려주기"]
end
C --> F
검색어와 글은 반드시 같은 모델로 바꿉니다. 모델마다 숫자를 매기는 방식이 다릅니다. 다른 모델이 만든 벡터끼리는 가까움을 재도 뜻이 없습니다.
가장 가까운 벡터를 골라내는 이 계산이 벡터 검색입니다. 벡터가 몇 개 안 되면 검색어의 벡터를 전부와 하나씩 견주면 됩니다. 벡터가 수백만 개로 늘면 검색어마다 전부 견주기에는 너무 느립니다.
그래서 큰 데이터에서는 근사 최근접 이웃 검색을 씁니다. 가장 가까운 벡터를 가끔 놓치는 대신 일부만 견주어 훨씬 빨리 찾는 방법입니다. 어떻게 일부만 고르는지는 벡터 검색 항목이 다룹니다.
시맨틱 검색과 벡터 검색
이 절은 자주 섞어 부르는 두 이름을 가릅니다. 시맨틱 검색은 무엇을 하려는지를 말하는 이름입니다. 벡터 검색은 그 일을 하는 방법 하나를 말하는 이름입니다.
벡터 검색은 글의 뜻과 상관없는 일에도 쓰입니다. 사진을 벡터로 바꾸면 비슷한 사진을 찾을 수 있습니다. 상품을 벡터로 바꾸면 비슷한 상품을 추천할 수 있습니다. 이런 검색은 보통 시맨틱 검색이라고 부르지 않습니다.
반대로 벡터 없이 뜻을 맞추는 방법도 있습니다. 임베딩이 널리 쓰이기 전에는 주로 이런 방법으로 뜻을 맞췄습니다. 아래 표가 대표적인 셋입니다.
| 방법 | 하는 일 | 예 |
|---|---|---|
| 동의어 사전 | 검색어에 같은 뜻의 낱말을 덧붙여 찾는다 | 「비밀번호」로 찾을 때 「암호」도 함께 찾는다 |
| 지식 그래프 | 검색어가 가리키는 대상을 가려 그 대상을 다룬 글을 찾는다 | 「파리 날씨」의 파리를 곤충이 아니라 도시로 읽는다 |
| 의도 분류 | 검색어가 무엇을 하려는 물음인지 가려 맞는 안내로 보낸다 | 「환불」을 치면 환불 신청 안내를 먼저 보여 준다 |
세 방법 모두 사람이 사전이나 지식을 미리 정리해 두어야 합니다. 정리해 두지 않은 말은 따라가지 못합니다. 임베딩에서는 모델이 많은 글을 읽어 뜻의 가까움을 스스로 익힙니다. 그래서 사람이 적어 두지 않은 말끼리도 가깝게 놓습니다.
요즘 시맨틱 검색이라고 하면 대개 임베딩으로 만든 검색을 가리킵니다. 이 항목도 그 뜻을 중심으로 썼습니다.
시맨틱 검색이 약한 검색
이 절은 시맨틱 검색이 잘 못 하는 검색 셋을 봅니다. 셋 다 글자보다 뜻을 보는 성질에서 나옵니다.
첫째는 글자가 딱 맞아야 하는 검색입니다. 「1045번 오류」 같은 오류 코드나 상품 모델명은 뜻이랄 것이 없는 글자 묶음입니다. 임베딩 모델은 이런 글자를 모양이 비슷한 다른 코드와 가깝게 두기도 합니다. 그러면 찾는 코드가 든 글보다 다른 코드의 글이 앞에 설 수 있습니다.
둘째는 맞는 글이 없는 검색입니다. 시맨틱 검색은 가까운 순서로 k 개를 고를 뿐 맞는 글과 안 맞는 글을 가르지 않습니다. 앞 표의 「회원 탈퇴 절차」가 순위에 든 까닭이 이것입니다. 그래서 가까움 점수가 일정 값보다 낮은 결과를 버리는 문턱을 따로 두기도 합니다.
셋째는 결과가 나온 까닭을 밝혀야 하는 검색입니다. 전문 검색은 맞은 낱말을 짚어 보여 줄 수 있습니다. 시맨틱 검색이 댈 수 있는 것은 두 벡터가 가깝다는 것뿐입니다. 벡터의 숫자 하나하나가 무슨 뜻인지는 사람이 읽어 낼 수 없습니다.
전문 검색과 함께 쓰는 하이브리드 검색
이 절은 두 검색의 약점을 서로 메우는 방법을 봅니다. 전문 검색은 오류 코드처럼 글자가 맞아야 하는 검색에 강합니다. 시맨틱 검색은 다른 말로 적은 같은 뜻에 강합니다.
그래서 두 검색을 함께 돌려 결과를 합치는 일이 많습니다. 이 방식이 하이브리드 검색입니다. 한쪽이 놓친 글을 다른 쪽이 건져 올립니다.
두 검색의 점수는 재는 척도가 달라 바로 더하지 못합니다. 흔히 점수는 버리고 순위만 가지고 합칩니다. 대표 방법이 상호 순위 융합(RRF, Reciprocal Rank Fusion)입니다. 두 검색 모두에서 앞에 선 글이 합친 순위에서도 맨 위로 옵니다.
합친 뒤에 한 번 더 줄을 세우기도 합니다. 이 일이 재순위화입니다. 검색어와 후보 글을 한 모델에 함께 넣어 더 꼼꼼히 견주므로 앞 단계보다 순서가 정확합니다.
꼼꼼히 견주는 만큼 계산이 많이 듭니다. 앞 단계가 추린 후보 수십 개에만 쓰는 까닭입니다. 후보가 적으니 계산이 많은 모델을 써도 시간이 감당됩니다.
flowchart TD
Q["검색어"] --> K["전문 검색 · 낱말로 찾는다"]
Q --> S["시맨틱 검색 · 뜻으로 찾는다"]
K --> M["순위로 합치기"]
S --> M
M --> R["재순위화 · 후보 수십 개만"]
R --> O["결과"]
들이는 비용
이 절은 시맨틱 검색을 들여놓을 때 더 드는 것을 봅니다. 전문 검색만 쓸 때와 견준 차이입니다.
| 더 드는 것 | 까닭 |
|---|---|
| 계산 | 글을 넣을 때마다 조각마다 임베딩 모델을 돌린다. 검색어가 올 때마다 또 돌린다 |
| 저장 공간 | 조각마다 숫자 수백 개짜리 벡터를 따로 쌓는다 |
| 모델 교체 | 모델을 바꾸면 쌓아 둔 벡터를 전부 다시 만든다 |
셋째 줄이 특히 무겁습니다. 다른 모델의 벡터끼리는 견줄 수 없습니다. 새 모델로 검색하려면 글 전체를 새 모델로 다시 바꿔 넣어야 합니다.
시맨틱 웹의 검색
「시맨틱 검색」은 다른 흐름에서 다른 뜻으로도 쓰였습니다. 이 절은 그 뜻을 짧게 가릅니다.
시맨틱 웹은 웹의 데이터에 기계가 읽을 수 있는 뜻 꼬리표를 달자는 구상입니다. 「이 페이지의 이 값은 사람 이름이다」 같은 것을 데이터 옆에 적어 둡니다. 이 흐름에서는 꼬리표를 단 데이터를 찾는 일을 시맨틱 검색이라고 불렀습니다.
두 뜻은 뜻을 누가 적느냐로 갈립니다. 시맨틱 웹에서는 사람이 꼬리표로 뜻을 미리 적습니다. 임베딩 방식에서는 모델이 글에서 뜻을 읽어 냅니다.
쓰이는 곳
이 절은 시맨틱 검색이 자주 쓰이는 곳 셋을 봅니다. 셋 가운데 하나는 글을 써 내는 모델에 붙여 쓰는 검색이라 그 모델부터 풉니다.
대규모 언어 모델은 많은 글을 학습해 사람처럼 글을 써 내는 모델입니다. 이 모델은 학습하지 않은 사내 문서를 모릅니다.
검색 증강 생성은 이 모델이 답하기 전에 관련 문서를 먼저 찾아 함께 건네는 방식입니다. 모델은 건네받은 문서를 읽고 그 문서에 근거한 답을 씁니다. 이 문서를 찾는 단계에서 시맨틱 검색을 씁니다.
아래 표가 이 쓰임까지 셋을 모았습니다. 셋 다 묻는 사람과 쓴 사람의 말이 어긋나기 쉬운 곳입니다.
| 쓰임 | 찾는 것 | 뜻으로 찾는 까닭 |
|---|---|---|
| 사내 문서 · 도움말 검색 | 질문에 답하는 문서 | 묻는 사람과 쓴 사람의 낱말이 다르다 |
| 고객 문의 응대 | 이미 답한 비슷한 문의 | 같은 문제를 사람마다 다르게 적는다 |
| 검색 증강 생성 | 답을 쓰는 모델에 건넬 참고 문서 | 질문이 긴 문장이라 문서와 겹치는 낱말이 적다 |
관련 항목
시맨틱 검색이 속하는 상위 분류
시맨틱 검색을 떠받치는 표현과 모델
임베딩 · 임베딩 모델 · 문장 임베딩 · 벡터 · 밀집 벡터 · 신경망 · 트랜스포머 · BERT
시맨틱 검색을 구현하는 검색 기법
벡터 검색 · 최근접 이웃 검색 · 근사 최근접 이웃 검색 · HNSW · 코사인 유사도 · 청킹 · 바이 인코더
시맨틱 검색과 맞세워지는 낱말 일치 검색
전문 검색 · 키워드 검색 · 역색인 · BM25 · TF-IDF · 불리언 검색 · 희소 벡터 · 어휘 불일치
시맨틱 검색과 결과를 합치는 결합 방식
하이브리드 검색 · 상호 순위 융합 · 재순위화 · 크로스 인코더
시맨틱 검색을 벡터 없이 이루는 기법
동의어 사전 · 질의 확장 · 지식 그래프 · 의도 분류 · 개체명 인식 · 형태소 분석
시맨틱 검색을 구현한 저장소와 제품
벡터 데이터베이스 · pgvector · Elasticsearch · OpenSearch · Apache Lucene · FAISS · Milvus · Qdrant
시맨틱 검색을 쓰는 응용
검색 증강 생성 · 대규모 언어 모델 · 질의응답 시스템 · 챗봇 · 추천 시스템 · 중복 탐지
시맨틱 검색의 결과를 재는 지표
재현율 · 정밀도 · 관련도 · nDCG · 평균 역순위
시맨틱이라는 이름이 겹치는 다른 용어
시맨틱 웹 · RDF · SPARQL · 온톨로지 · 시맨틱 마크업 · 시맨틱 버저닝
다른 이름: semantic search · Semantic Search · 의미 검색 · 의미 기반 검색 · 시맨틱 서치