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 : 검색 시간이 증가, 정확도를 최대로
'🤖 AI > AI' 카테고리의 다른 글
🔬LLM 운영하기 : MLOps, LLMOps (0) | 2025.02.07 |
---|---|
🔬벡터 데이터베이스로 확장하기 : 파인콘 이용 벡터/멀티 모달 검색 RAG 구현하기 (0) | 2025.02.06 |
😎 AutoGen을 이용한 AI 에이전트 개발 (0) | 2025.02.05 |
🐋 deepseek (0) | 2025.02.03 |
🔬자신의 데이터에 맞춘 임베딩 모델 만들기 : RAG 개선하기 - 언어 모델을 임베딩 모델로 (0) | 2025.01.20 |