공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/AI

데이터야놀자 2022 - ElasticSearch에서 NLP 처리를 위한 Vector 데이터 검색하기

inspirit941 2023. 12. 10. 20:50
반응형

https://youtu.be/aW5_voFk938?si=hEwqM1kQCDBAwbd0

 

ES Advocate 김종민님

 

 

스크린샷 2024-02-01 오전 9 42 15

 

전통 검색엔진으로서의 ES

  • '사용자가 입력한 query'가 포함된 Docs를 Text Matching 방식으로 찾는다.
  • Docs 저장할 때 Tokenizer 사용해서 text -> index 변환
  • 해당 docs가 query를 얼마나 많이 포함하고 있는지를 TF 같은 요소를 기반으로 점수 계산. -> 연관도 높은 결과를 가져온다.

LLM 등장으로 '검색엔진이 질문 의미를 이해하고, 적합한 결과를 가져오는 형태'의 서비스를 제공하려는 시도가 늘었음.

  • query와 매칭되지는 않지만, query의 해답인 'connection speed requirements' 정보를 포함한 docs를 리턴하는 식.

NLP의 Vector 검색

스크린샷 2024-02-01 오전 10 07 53

 

ES 7.3 버전에서 Vector Similarity 기능이 추가됨.

  • Brute Force 방식. ES의 denced_vector 필드로 ranking score 계산하는 방식
    • 단 데이터셋이 적은 경우에만 잘 동작함.
  • BM25 등 기존 방식으로 검색했을 때 나온 결과인 수백 / 수천 개의 docs에 다시 query해서 ranking을 다시 하는 형태로 동작함.
    • 따라서 기존 방식으로 검색했을 때 나온 docs 개수를 최적화해야 함. (최소 사이즈로 필터링한다거나, index 사이즈 자체를 줄이거나)

즉 데이터양에 따라 비용이 O(n)으로 증가하는 구조. 검색해야 할 docs * Vector Dimension 만큼 복잡도가 올라간다.

 

스크린샷 2024-02-01 오전 10 12 41

 

ES 8.0 버전에서 HNSW & KNN 기법 도입.

  • 데이터양에 따라 비용이 O(logN) 으로 증가하는 구조. 따라서 대용량 데이터에서 효율적으로 동작함.

동작 방식

  • Index 포함하는 전체 노드를 대상으로 그래프 생성
  • 그래프를 Layer 단위로 추가
  • Query가 들어오면, 가장 spot이 많은 layer로 Greedy 검색.. 연관도가 높은 결과들을 계속 수집한다

Recall (재현율) 품질이 좋다.

스크린샷 2024-02-01 오전 10 16 05

 

  • ES의 전신이자 core engine인 Apache Lucene에도 Multi Layer 구조가 가능하도록 contribution.
  • QPS가 늘어났고, 안정화됐다.

스크린샷 2024-02-01 오전 10 18 10

 

KNN 결과 filtering 기능: 검색 결과 Relevance ranking으로 도출된 결과를 다시 filter

  • Filter 적용하면, 알고리즘으로 Brute Force가 나은지 / HNSW가 나은지 확인 가능해진다.
  • 그래프의 분홍색 세로선 기준
    • 오른쪽: HNSW가 낫다
    • 왼쪽: Brute force가 낫다

스크린샷 2024-02-01 오전 10 21 17

 

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 모델

스크린샷 2024-02-01 오후 5 16 24

 

ES는 학습을 지원하지 않으나, Pytorch로 학습된 NLP 모델을 elastic에 업로드해서 쓸 수 있도록 하고 있음.

  • Text Embedding, QA, Classification 지원 중이다.

스크린샷 2024-02-01 오후 5 17 13스크린샷 2024-02-01 오후 5 17 58

 

Eland 모델

  • huggingface의 모델 바로 받아서 사용할 수 있는 라이브러리 라고 함.
  • Elastic Cloud에서 사용 가능한 듯.

스크린샷 2024-02-01 오후 5 19 00스크린샷 2024-02-01 오후 5 19 27스크린샷 2024-02-01 오후 5 20 10

 

모델 내려받고, ES Cluster로 모델 업로드.

  • 업로드한 모델이 text embedding -> ES 쿼리로 텍스트 넣어서 embedding, vector로 만들어서 저장
  • 질문할 query를 text embedding -> ES에 쿼리하면 앞서 저장한 vector와 비교... 연관성 높은 결과 리턴

한글데모도 있긴 한데 썩 만족스럽진 않았다. 보고싶으면 Elastic 로비 부스로.

반응형