Vector Retriever
정의
벡터 공간에서의 유사도 검색을 기반으로 정보를 검색하는 시스템. 텍스트, 이미지, 음성 등을 고차원 벡터로 변환한 후, 의미론적(semantic) 유사도를 계산하여 가장 유사한 정보를 반환한다.
작동 원리
1. 쿼리 텍스트 입력
↓
2. 임베딩 모델로 벡터화
↓
3. 저장된 벡터들과 유사도 계산 (코사인 유사도 등)
↓
4. 상위 K개 결과 반환
핵심 개념
임베딩 (Embedding)
- 텍스트를 고차원 벡터로 변환
- 의미론적 유사도가 벡터 공간에서의 거리로 표현됨
- 예: “영화 줄거리” → [0.123, -0.456, 0.789, …]
유사도 함수 (Similarity Function)
- 코사인 유사도 (Cosine Similarity): 벡터 간 각도 기반 (범위: -1 ~ 1, 보통 0 ~ 1)
- 유클리드 거리 (Euclidean Distance): 벡터 간 거리 기반
- 닷 곱 (Dot Product): 벡터 간 내적
Vector INDEX
- 검색 성능 최적화를 위한 인덱스
- 전체 벡터를 스캔하지 않고 빠른 검색 제공
- 예: HNSW (Hierarchical Navigable Small World), IVF (Inverted File)
Vector Retriever vs. 키워드 검색
| 구분 | 키워드 검색 | Vector Retriever |
|---|---|---|
| 기반 | 정확한 단어 매칭 | 의미론적 유사도 |
| 강점 | 명확한 쿼리에 효과적 | 모호한 쿼리, 동의어 처리 |
| 약점 | 동의어·표현 변화에 약함 | 의미론적 오류 가능 |
| 속도 | 빠름 | 상대적으로 느림 |
구현 예시 (Neo4j)
from neo4j_genai.retrievers import VectorRetriever
# 1. 벡터 인덱스 생성
# CREATE VECTOR INDEX movie_plot_embedding
# FOR (m:Movie)
# ON (m.plot_embedding)
# OPTIONS {indexConfig: {
# 'vector.dimensions': 1536,
# 'vector.similarity_function': 'cosine'
# }}
# 2. Vector Retriever 초기화
retriever = VectorRetriever(
driver=neo4j_driver,
index_name="movie_plot_embedding",
embedder=OpenAIEmbeddings(model="text-embedding-ada-002"),
return_properties=["title", "plot"]
)
# 3. 검색 수행
results = retriever.search("Toy Story에 대한 이야기", top_k=3)
# → [
# {"title": "Toy Story", "plot": "...", "similarity_score": 0.95},
# {"title": "Toy Story 2", "plot": "...", "similarity_score": 0.93},
# {"title": "..."}
# ]실제 활용 사례
✅ 검색 엔진: Google, Bing의 의미론적 검색
✅ 추천 시스템: 사용자 선호도 벡터 기반 추천
✅ RAG (Retrieval-Augmented Generation): LLM을 위한 정보 검색
✅ 중복 탐지: 유사한 문서/이미지 찾기
✅ 질문-답변 시스템: FAQ 매칭
온톨로지 설계에서의 활용
- 지식 검색: 사용자 쿼리 → 관련 온톨로지 개념 검색
- 개념 연결: 의미상 유사한 개념 자동 발견
- 범주화: 새로운 개체를 온톨로지 클래스로 분류
- 그래프 기반 검색: Vector INDEX + Cypher 쿼리 결합
관련 개념: Embedding, RAG, Graph Database, Cypher Query Language