벡터 DB는 텍스트, 이미지, 음성 등을 벡터(숫자 배열)로 변환한 뒤, 비슷한 벡터끼리 검색하므로 검색 요청 시 4단계를 거쳐 결과를 출력
검색어나 질문을 벡터로 변환하는 단계
사용자가 입력한 텍스트(예: "붉은 드레스")를 벡터로 변환
NLP 또는 멀티모달 AI 모델(BERT, CLIP 등)을 사용
예시 임베딩 결과: [0.12, -0.45, 0.89, ...]
(보통 128~768차원 이상)
검색 품질은 사용하는 모델에 따라 달라짐
전체 벡터 중에서 빠르게 후보 벡터를 찾기 위한 구조적 탐색
ANN 알고리즘 사용 (예: HNSW, IVF, PQ 등)
검색 속도 최적화에 핵심적인 역할
쿼리 벡터와 후보 벡터 간의 유사도 또는 거리 계산
주요 방법:
예: 코사인 유사도가 0.92면 거의 비슷한 것으로 간주
유사도 점수 기준으로 정렬 (Top-K 등)
필터링 조건 적용 가능 (예: 가격, 브랜드, 카테고리 등)
메타데이터 기반 필터링도 가능
“벡터 검색 결과 + 조건 기반 필터”를 함께 사용하는 방식
예시 쿼리
“붉은 색 드레스 + 가격 < 5만 원”
처리 방식
동작 순서
"붉은 드레스"
를 임베딩 → 벡터 A 생성즉, 벡터 기반 의미 검색과 속성 기반 필터링이 결합된 형태로, 텍스트 의미 유사성과 숫자 조건을 함께 만족하는 결과를 효율적으로 추출
[하이브리드 검색 구현 가능 대상]
[요약]
단계 | 설명 |
---|---|
1. 쿼리 임베딩 | 입력 쿼리를 벡터로 변환 |
2. 인덱스 탐색 | ANN 인덱스를 통해 빠르게 후보 벡터 탐색 |
3. 유사도 계산 | 코사인, L2, 내적 등을 이용하여 유사도 측정 |
4. 결과 정렬/필터 | 유사도 순 정렬 후 메타 조건으로 필터링 |
[하이브리드 검색]
"빨간색 가방"
+ 브랜드 = 구찌pip install qdrant-client sentence-transformers
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct, Filter, FieldCondition, Range
from sentence_transformers import SentenceTransformer
# 1. 벡터화 모델 로딩 (텍스트 -> 벡터)
encoder = SentenceTransformer('all-MiniLM-L6-v2')
# 2. Qdrant 클라이언트 연결 (로컬 or 클라우드)
client = QdrantClient(host='localhost', port=6333)
# 3. 예시 데이터 (신발 정보 + 가격)
products = [
{"id": 1, "name": "노란색 운동화", "price": 30000},
{"id": 2, "name": "검정 구두", "price": 70000},
{"id": 3, "name": "노란색 슬리퍼", "price": 45000},
{"id": 4, "name": "빨간색 운동화", "price": 40000}
]
# 4. 벡터 생성 및 업로드
points = []
for p in products:
벡터 = encoder.encode(p["name"]).tolist()
payload = {"name": p["name"], "price": p["price"]}
points.append(PointStruct(id=p["id"], vector=벡터, payload=payload))
# 5. 컬렉션 생성 및 데이터 업로드
collection_name = "shoes"
client.recreate_collection(
collection_name=collection_name,
vector_size=len(points[0].vector),
distance="Cosine"
)
client.upsert(collection_name=collection_name, points=points)
→ 유사도는 코사인을 기준으로 측정함
# 6. 검색 쿼리: "노란색 신발" + 가격 < 50000
query_text = "노란색 신발"
query_벡터 = encoder.encode(query_text).tolist()
# 메타데이터 필터 정의
price_filter = Filter(
must=[
FieldCondition(
key="price",
range=Range(lt=50000)
)
]
)
# 7. 벡터 + 필터 검색 (하이브리드)
results = client.search(
collection_name=collection_name,
query_vector=query_벡터,
limit=3,
query_filter=price_filter
)
# 8. 결과 출력
for r in results:
print(f"{r.payload['name']} | {r.payload['price']}원 | 유사도: {r.score:.4f}")
단어의 등장 빈도가 비슷한 문서를 검색하거나, 등장 여부를 필터링하여 검색하는 방식
[키워드 검색]
■ 개념
■ 기술적 구성
■ 예시
"인공지능 기술 동향"
→ 문서 내 일치 문장 검색"2023년 AI 기술이 급속히 발전"
→ 연도 포함 문서 매칭"BERT"
→ 기술 키워드 필터링"AI 관련 정보 사례"
등 명확 키워드 기반 문장■ 장점
■ 단점
[보완 방식]
WHERE
절과 유사가격 < 50000
, 카테고리 = '신발'
개념
구성 방식
장점
대표 모델
개념
작동 원리
특징
개념
주요 특징
개념
기술적 구성
예시
"변비로 고생한 김철민"
→ 문서: "고양이를 키우면서 주의해야할 건강요소"
→ 유사도 낮음 → 문서: "변비 증상과 해결법"
→ 유사도 높음 → 문서: "변화됨을 본질 비교"
→ 유사도 낮음장점
단점
인덱싱 및 거리 계산 알고리즘
거리 계산 방식
어떤 인덱싱/알고리즘을 사용하느냐에 따라 정확도 및 속도는 달라짐
일반적으로 임베딩 모델의 벡터를 그대로 사용하는 것이 가장 이상적
구분 | Keyword Search(Attribute Filter / Sparse 벡터) | Semantic Search(Dense 벡터) |
---|---|---|
장점 | - 속도가 빠르다 - 비용 효율적이다 - 제한적 검색 요건에 적합 - 표기 형태가 중요한 경우(고유명사 등)에 유리 | - 정확한 표현이 아니어도 검색 가능 - 오타, 표현의 다양성에 강함 - 유사도 기반 결과 제공 가능 - 멀티모달 콘텐츠 지원 (텍스트, 이미지, 오디오 등) |
단점 | - 유연성이 떨어진다 - 의미 기반 표현 인식에 약함 - 쿼리의 디테일에 검색 성능이 의존적 | - 속도가 느릴 수 있음 - 리소스 소비가 큼 (Heavy) - 고유명사 중심 콘텐츠에 약할 수 있음 |
키워드 서칭 방식과 Semantic 서칭 방식을 조합하여 상호 간의 장점만 취하는 방향으로 안정적인 성능
개념
기술적 구성
최종점수 = 키워드 점수 * 가중치 + 시맨틱 점수 * 가중치
장점
단점
figure들을 인용하여 멋진글 작성해주셨네요
다만 어떤 이해관계자들에게 어필이 될지 그런 부분들을 좀더 develop하길 바라요~^^