학습일지/AI
데이터야놀자 2022 - ElasticSearch에서 NLP 처리를 위한 Vector 데이터 검색하기
inspirit941
2023. 12. 10. 20:50
반응형
https://youtu.be/aW5_voFk938?si=hEwqM1kQCDBAwbd0
ES Advocate 김종민님
전통 검색엔진으로서의 ES
- '사용자가 입력한 query'가 포함된 Docs를 Text Matching 방식으로 찾는다.
- Docs 저장할 때 Tokenizer 사용해서 text -> index 변환
- 해당 docs가 query를 얼마나 많이 포함하고 있는지를 TF 같은 요소를 기반으로 점수 계산. -> 연관도 높은 결과를 가져온다.
LLM 등장으로 '검색엔진이 질문 의미를 이해하고, 적합한 결과를 가져오는 형태'의 서비스를 제공하려는 시도가 늘었음.
- query와 매칭되지는 않지만, query의 해답인 'connection speed requirements' 정보를 포함한 docs를 리턴하는 식.
NLP의 Vector 검색
ES 7.3 버전에서 Vector Similarity 기능이 추가됨.
- Brute Force 방식. ES의 denced_vector 필드로 ranking score 계산하는 방식
- 단 데이터셋이 적은 경우에만 잘 동작함.
- BM25 등 기존 방식으로 검색했을 때 나온 결과인 수백 / 수천 개의 docs에 다시 query해서 ranking을 다시 하는 형태로 동작함.
- 따라서 기존 방식으로 검색했을 때 나온 docs 개수를 최적화해야 함. (최소 사이즈로 필터링한다거나, index 사이즈 자체를 줄이거나)
즉 데이터양에 따라 비용이 O(n)으로 증가하는 구조. 검색해야 할 docs * Vector Dimension 만큼 복잡도가 올라간다.
ES 8.0 버전에서 HNSW & KNN 기법 도입.
- 데이터양에 따라 비용이 O(logN) 으로 증가하는 구조. 따라서 대용량 데이터에서 효율적으로 동작함.
동작 방식
- Index 포함하는 전체 노드를 대상으로 그래프 생성
- 그래프를 Layer 단위로 추가
- Query가 들어오면, 가장 spot이 많은 layer로 Greedy 검색.. 연관도가 높은 결과들을 계속 수집한다
Recall (재현율) 품질이 좋다.
- ES의 전신이자 core engine인 Apache Lucene에도 Multi Layer 구조가 가능하도록 contribution.
- QPS가 늘어났고, 안정화됐다.
KNN 결과 filtering 기능: 검색 결과 Relevance ranking으로 도출된 결과를 다시 filter
- Filter 적용하면, 알고리즘으로 Brute Force가 나은지 / HNSW가 나은지 확인 가능해진다.
- 그래프의 분홍색 세로선 기준
- 오른쪽: HNSW가 낫다
- 왼쪽: Brute force가 낫다
Filtering: Deep Dive
- filter가 얼마나 많은 docs를 선택하는지 파악한다.
- HNSW로 시작 -> 확인할 노드 개수를 filter 기준치 (brute force vs HNSW 중 뭐가 더 최적인지) 파악한다
- brute force가 효과적일 경우 brute force로 다시 검색을 시작한다.
예시를 보면
- 파란색 + : destination
- 그래프의 전체 노드는 16개.
- brute force 진행하면 총 16번의 평가 연산이 필요함
- 녹색 세모: 임의의 시작 노드
- 핑크색: 필터 통과한 노드
- 검은색: 필터 통과 못하고 걸러진 노드
왼쪽: 필터 통과한 노드가 13개
- 녹색 세모인 1 -> 2,3,4 노드 평가.
- 4가 목적지와 가장 가까우므로 5 평가 (3은 이미 했으니)
- 5에서 6,7 탐색 -> 7 선택
- 7에서 탐색 -> 8보다 목적지가 가까움. 연산 끝
- brute force 썼으면 13번 연산했을 텐데, HNSW 써서 8번의 연산으로 끝.
오른쪽: 필터 통과한 노드가 2개
- 일단 HNSW로 노드1, 2 평가.
- 그런데 필터 통과한 노드가 2개이고, 이미 2번의 연산을 끝냈음. => 목표 결과가 없다
- 그러면 HNSW 연산 결과를 버리고, 필터 통과한 노드로만 다시 연산 시작
- 3,4 연산.. 목적지에 좀더 가까운 4를 최종 선택
- 처음부터 brute force 했으면 2번으로 끝. 그러나 HNSW 2번 + brute force 2번으로 총 4번 연산.
- 그래도 HNSW 연산 결과인 8보다는 빨리 끝난다
ES의 머신러닝 NLP 모델
ES는 학습을 지원하지 않으나, Pytorch로 학습된 NLP 모델을 elastic에 업로드해서 쓸 수 있도록 하고 있음.
- Text Embedding, QA, Classification 지원 중이다.
Eland 모델
- huggingface의 모델 바로 받아서 사용할 수 있는 라이브러리 라고 함.
- Elastic Cloud에서 사용 가능한 듯.
모델 내려받고, ES Cluster로 모델 업로드.
- 업로드한 모델이 text embedding -> ES 쿼리로 텍스트 넣어서 embedding, vector로 만들어서 저장
- 질문할 query를 text embedding -> ES에 쿼리하면 앞서 저장한 vector와 비교... 연관성 높은 결과 리턴
한글데모도 있긴 한데 썩 만족스럽진 않았다. 보고싶으면 Elastic 로비 부스로.
반응형