logs-*, metrics-* 같은 인덱스들벡터 검색도 똑같이 "인덱스"에 문서가 들어가고, 단지 필드 중 하나가 벡터(knn_vector)인 것뿐이다
knn_vector벡터 검색을 하려면 OpenSearch의 k-NN 플러그인을 써야하고,
이 플러그인이 제공하는 knn_vector 필드 타입을 사용하게 됨
knn_vector가 해주는 일즉, 일반 text 필드가 "키워드/문자열 검색"을 담당한다면,
knn_vector 필드는 "의미적 유사도 기반 검색을 담당한다고 보면 됨
인덱스 생성시 필수 설정
{
{
"settings": {
"index": {
"knn": true // k-NN 기능 활성화
}
}
},
"mappings" :{
"properties": {
"embedding": {
"type": "knn_vector"
"dimension": 1536, // 임베딩 차원 수 (모델에 맞춰야 함)
"method": {
"name" : "hnsw",
"space_type": "cosinesimil",
"engine": "nmslib",
"parameters": {
"ef_construction": 128,
"m": 16
}
}
}
// .. other properties
}
}
}
중요한 포인트
index.knn: true
knn_vector.dimension
text-embedding-3-small = 1536차원 -> dimension 1536벡터 검색 품질은 아래 두 요소로 결정됨
ef_construction : 인덱싱 정확도
ef_search : 검색 정확도
m : 그래프 branching factor
사실 embedding + vector search만으로는 검색 품질이 100% 나오지 않음 그래서 대규모 서비스는 다음을 조합함
score = 0.7 * vector_score + 0.3 * bm25_scoreVector Search -> Top 200 전달 -> Reranker -> Top 5 추출