본문 바로가기
  • 컴공생의 공부 일기
  • 공부보단 일기에 가까운 것 같은
  • 블로그
🤖 AI/AI

🔬벡터 데이터베이스로 확장하기 : ANN, NSW, HNSW

by 정람지 2025. 2. 6.

LLM을 활용한 실전 AI 애플리케이션 개발

- 허정준


🧭 벡터 데이터베이스로 확장하기 : RAG 구현하기

< 벡터 검색 수행 방법 >

 

KNN (K-nearest neighbor)

- 모든 벡터 사이의 거리 계산

- 데이터의 수가 많아지면 느려짐

 

ANN ( Approximate Nearest neighbor )

- 속도 개선

 

 

 

벡터 데이터베이스 파인콘 사용해 보기

이미지와 텍스트를 교차 검색하는 멀티 모달 검색을 구현해 보기


🗃️ 벡터 데이터베이스란

: 임베딩 벡터를 키 값으로 사용하는 데이터베이스


🥞 딥러닝과 벡터 데이터베이스

딥러닝 : 스스로 특징을 추출하는 머신 러닝

    표현 학습 : 모델이 스스로 특징을 추출하는 과정을 학습

 

벡터 거리 측정법 : 유클리드 거리/코사인 유사도 / 점곱 (내적), 등

 


🥞 벡터 데이터베이스 지형 파악하기

벡터 라이브러리 

Meta : Faiss 

스포티파이 : Annoy

구글 : ScaNN, NMSLIB

 

 

 

 

벡터 데이터베이스 

(출처: 엔코아 블로그)

 

 

 

벡터 라이브러리 vs 벡터 데이터베이스 

둘 다 벡터 검색과 저장 기능 수행

 

벡터 데이터베이스 추가 기능

- 메타 데이터 저장과 필터링

- 데이터 백업/관리

- 모니터링, 관련 AI 도구 통합

- 데이터 보안과 액세스 관리


🥞 벡터 데이터베이스 작동 원리

KNN 검색

: 검색 벡터와 가장 가까운 K개의 데이터 찾기

 

- 모든 벡터를 조사함 

- 연산량이 데이터 수에 비례하여 큰 데이터 사용 시 속도가 느려져 확장성이 떨어짐

 

 

 

 

벡터 DB 성능 지표

색인(벡터 저장) 단계

- 메모리 사용량

- 색인 시간

 

검색 단계

- 검색 시간

- 재현율 ( 실제로 가까운 K 개의 데이터가 정확히 반환된 비율) ( KNN는 100프로 )

 

 

 

 

ANN 검색 

: 근사 최근접 이웃

- 약간의 손실이 있더라도 속도를 빠르게 개선

- IVF, HNSW 알고리즘 등 활용

 

IVF

데이터셋을 클러스트로 그룹화

전체 데이터가 아닌 몇 개의 클래스터를 검색 

 

HNSW

그래프 기반 인덱싱 구조

한 번에 먼 거리 이동 가능

NSW + 계층 구조

 

재현율 떨어짐ㅠㅠ


🥞 탐색 가능한 작은 세계 (NSW)

HNSW는

NSW + 계층 구조

그래프 기반의 ANN 검색 알고리즘

 

 

탐색 가능한 작은 세계 =>

'적당히 랜덤한' 그래프 상태

 

 

규칙적인 연결 상태 말고 랜덤 연결이 추가된 연결 상태에서는 한 번에 더 긴 거리의 탐색을 가능하게 함

=> 하지만 가장 가까운 노드를 찾지 못하는 "지역 최솟값 문제" 발생

 

 

근데 이러면 "규칙적인 연결 상태"는 다음 노드들이 이전 노드의 다음 값 느낌 그니까 정렬된 상태로 다 연결된다는 거겠지? 

근데 N차원 그래프에서 어떻게 만드는 거지


🥞 계층 구조

"지역 최솟값 문제"를 해결하는 계층 구조

 

HNSW : NSW적당히 랜덤한 그래프 + 계층 구조 

 

낮은 층에는 모든 벡터가 저장되어 있기 때문에 지역 최솟값에 빠질 위험 줄일 수 있음!

 

 

이분탐색 개념이내

오..근데 이분탐색 같은 일차원은 정렬이 직관적으로 보여서 이해가 되는데

이런 N차원 벡터는 정렬을 어떻게 해서 나머지를 떼어내나? 

뭐 딕셔너리에 노드번호:거리계산값 해서 정렬해서 자르나

엥? 애초에 계산 다 하고 넣으면 그게 KNN아닌가;;;


🥞 실습 : HNSW 인덱스의 핵심 파라미터 이해하기

 

벡터 DB 성능 지표

- 메모리 사용량

- 색인 시간

- 검색 시간

- 재현율 

 

를 결정하는

 

HNSW 인덱스의 3개 핵심 파라미터 

- 하나의 벡터에 연결하는 최소 연결 수 m

- 색인 과정에서 가장 가까운 M개를 선택하기 위해 저장하는 후보의 수 ef_construction

- 검색 과정에서 가장 가까운 K개를 선택할 때 저장하는 후보의 수 ef_search

 

 

아아~ 100퍼센트 되는 게 아니었구나~ 간선이 많이질수록 정확도(재현율)이 높아진다니

정확히 정렬된 그래프가 아니었나 봐그럼 이해되는군

 

 

 

 

 

🌡️하나의 벡터에 연결하는 최소 연결 수 m

임베딩 벡터에 연결하는 간선의 수

 

많을수록 검색의 품질(재현율)이 좋아짐

많을수록 메모리 사용량/색인 시간/검색 시간 상승

 

보통 5-48 사용

 

 

 

 

🌡️색인 과정에서 가장 가까운 M개를 선택하기 위해 저장하는 후보의 수 ef_construction

 

새롭게 들어온 벡터가 기존 노드들 중 가장 가까운 M개를 선택하기 위해 탐색하는 후보 개수

벡터가 그래프에 추가될 때 가장 가까운 M개의 이웃을 찾기 위해 검색하는 범위(탐색 깊이)를 의미

 

 

많을수록 검색의 품질(재현율)이 좋아짐

많을수록 색인 시간 상승

메모리 사용량/검색 시간은 딱히 영향 없음

 

보통 100-200 사용

 

 

 

 

🌡️검색 과정에서 가장 가까운 K개를 선택할 때 저장하는 후보의 수 ef_search

벡터 검색을 수행할 때 후보로 저장하는 개수를 의미
커질수록 더 많은 벡터 탐색

 

많을수록 검색의 품질(재현율)이 좋아짐

많을수록 검색 시간 상승

메모리 사용량/색인 시간은 딱히 영향 없음

 

5: 실시간 응답 속도를 최우선으로 (예: 초저지연 검색)

 

10~50: 빠른 검색이 필요한 경우

 

100~300 : 검색 속도와 정확도 간의 균형 ( 실무에서 가장 많이 사용되는 값)

500~1000 : 검색 시간이 증가, 정확도를 최대로