Today I Run

[GoogleStudyJam] Vector Search and Embeddings

조핑구 2024. 5. 20. 15:21

Vector Search

  • 의미적 유사성에 초점을 맞춘 벡터 검색을 사용하면 유사성 높은 것들을 검색할 수 있다. 의미상 유사하거나 관련된 수십억 개의 항목을 검색하는 기능이 있다.
  • vector 검색이 왜 중요한가? :
    • keyword search와 같은 기존 검색 기술과 다른 점 : 키워드 검색은 웹 크롤링, 키워드 색인 생성으로 시작하여 검색 및 순위 지정을 통해 결과를 제공하는 프로세스를 따른다. 데이터는 테이블에 저장되며 검색은 어느정도까지 유효하다.
    • 사람들이 점점 더 정교한 검색 기능을 요구함에 따라 검색 엔진이 더욱 지능적이고 사용자의 의도를 더 잘 이해할 수 있기를 기대한다. 또한 검색엔진이 요약 생성 및 추천 생성과 같은 광범위한 작업을 수행하기를 원한다. 그러나 기존 검색기술은 쿼리의 의도와 컨텍스트를 이해할 수 없다. 다중 모드 검색을 지원하지 않는다. 도메인 특이성이 부족하다.
  • 벡터 검색의 이점은 다음과 같다
    • Semantic understanding : 정확히 동일한 키워드가 포함되어 있지 않아도 검색어와 의미가 유사하다.
    • Multimodal search capabilites : 벡터 검색은 텍스트, 이미지, 오디오를 포함한 다양한 데이터 유형에 적용될 수 있다. 이를 통해 사용자는 여러 유형의 데이터를 사용하여 정보를 검색할 수 있는 다중 모드 검색 애플리케이션을 사용할 수 있다.
    • Personalization & recommendation : 벡터 검색은 컨텍스트의 이해 기능을 활용하여 검색 결과와 추천을 개인화하는데 사용할 수 있다. 이를 통해 사용자는 보다 관련성이 높고 흥미로운 정보를 찾을 수 있다.
    • 또한 벡터 검색은 정보를 빠르고 효율적으로 검색하는데 도움이 되는 생성 AI 애플리케이션의 중요한 구성 요소이다.
  • 벡터 검색의 작동
    1. 임베일 모델이라는 AI모델을 사용해 데이터를 벡터로 인코딩한다.
    2. 빠르고 확장가능한 벡터 검색을 가능하게하는 인덱스를 생성한다.
    3. 벡터 공간을 검색하여 쿼리와 유사한 정보를 찾는다.

임베딩생성

  • 단어 임베딩 : 벡터공간으로 차원을 표현해 단어 사이의 의미적 유사성을 나타내기 위해 단어 사이의 거리를 구한다.
    • 단어 임베딩의 활용
    1. 유사한 단어 찾기: 단어 임베딩을 사용하면 의미적으로 유사한 단어들을 쉽게 찾을 수 있습니다. 예를 들어, "king"과 "queen"은 벡터 공간에서 가까운 위치에 있을 것입니다.
    2. 단어 군집화: 단어 임베딩은 단어들을 의미적으로 유사한 그룹으로 군집화하는 데 사용될 수 있습니다. 예를 들어, "apple", "banana", "orange"와 같은 과일 이름들이 하나의 클러스터를 형성할 수 있습니다.
    3. 문장/문서 표현: 단어 임베딩을 이용해 문장이나 문서를 벡터로 표현할 수 있습니다. 여러 단어 벡터를 평균하거나 합치는 방식으로 문장/문서 벡터를 만들 수 있습니다.
    4. 감정 분석: 단어 임베딩을 사용하여 텍스트의 감정을 분석할 수 있습니다. 감정적으로 긍정적이거나 부정적인 단어들의 임베딩을 학습하여 텍스트의 전체적인 감정을 예측할 수 있습니다.

벡터 검색

  • 벡터 검색에서의 과제는 빠르고 효율적인 검색을 가능하게 하기 위해 벡터 공간을 색인화하는 것이다.
  • 벡터 사이의 거리를 측정하는 방법
    • 맨하튼 거리(L1) : 맨해튼 거리는 뉴욕 맨해튼의 거리처럼 격자 패턴으로 두 지점 사이의 거리를 계산한다. 이는 한 번에 하나의 축을 따라서만 이동할 수 있는 두 점의 해당 좌표 간의 절대 차이의 합으로 정의된다.
    • 유클리드 거리(L2) : 직선상 두 점 사이의 최단 거리를 계산한다. 이는 두 점의 해당 좌표 사이의 차이 제곱합의 제곱근으로 정의된다.
    • 코사인 거리 : 방향 측면에서 두 벡터의 유사성을 측정하는 코사인거리이다. 코사인 유사성은 두 벡터 사이의 각도의 코사인을 취하여 계산된다. 0은 벡터가 완전히 정렬되었음을 나타내고 1은 벡터가 완전히 직교함을 나타낸다.
    • 내적 거리 : 이는 한 벡터를 다른 벡터로 투영하는 것을 기반으로 한다. 방향과 크기 측면에서 두 벡터 간의 유사성을 고려한다.
  • 벡터 공간에서 유사한 벡터를 효율적으로 찾는 방법
    • Brute-force
      1. 쿼리에서 벡터 공간의 다른 벡터까지의 거리를 계산한다.
      2. 모든 거리를 정렬한다.
      3. 가장 가까운 상위 k개 벡터를 찾는다.
      4. 데이터베이스의 크기는 쉽게 수백만 또는 심지어 수십억에 이를 수 있기 때문에 철저한 검색은 비실용적이며 무차별 대입 알고리즘은 계산상의 병목 현상이 된다.
    • TreeAh는 얕은 트리(Shallow Tree)와 비대칭 해싱(Asymmetric Hashing)이다. TreeAh 알고리즘은 ANN 또는 근사 최근접 이웃이라는 근사 검색 기술을 사용하여 검색을 가속화한다. ANN은 검색 공간을 여러 공간으로 나누어 수십억 개의 임베딩으로 빠르고 확장 가능한 검색을 가능하게 한다. 트리 구조를 사용하여 공간을 색인화하고 무차별 검색에 비해 상당한 속도 향상을 위해 어느 정도 정확도를 포기한다.
    • 2020년 구글리서치는 새로운 ANN 알고리즘인 Scalable Approximate Nearest Neighbor를 뜻하는 ScaNN을 선보였다. 정확성과 속도 측면에서 업계 최고의 ANN 알고리즘 중 하나로 꼽힌다.
    • 검색 공간을 줄이기 위해 ScaNN은 공간 정리를 위한 다단계 트리 검색을 사용합니다.
      1. 벡터 공간을 계층적 파티션으로 나눈다.
      2. 이 구조를 나타내기 위한 검색 트리가 구성된다. 트리의 각 노드는 파티션의 중심점을 나타낸다.
      3. 쿼리에 가장 가까운 파티션을 선택한다.
    • Data quantization (데이터 양자화) : 데이터 포인트를 압축하여 공간을 절약하고 인덱싱 시간을 줄이는데 사용된다.

RAG를 사용한 벡터 검색

  • 벡터 검색에는 다양한 응용프로그램이 있다. 검색 외에도 개인화, 신뢰와 안전을 위해 사용할 수 있다. 최근 적용 사례 중 하나는 벡터 검색을 사용해 대규모 언어 모델의 환각 문제를 해결하는 것이다.
  • LLM은 훈련받은 정보만 이해할 수 있다. 이는 독점적인 정보 또는 도메인별 데이터를 인식하지 못할 수 도 있다는 것이다. 또한 실시간 정보에 접근할 수도 없다. 게다가 LLM은 프롬프트에서 명시적으로 제공된 정보만 이해하고 사실로 받아들인다. 또한 추가적인 정보를 요청할 능력도 없다. Grounding은 LLM이 요청을 처리하기에 충분한 정보가 없을 때 발생한다.
  • 환각은 LLM의 주요 문제이다
    • Fine-tuning : 많은 양의 데이터와 컴퓨팅 성능이 필요한 비용이 많이 드는 프로세스이다.
    • Human review : 비용이 많이 들고 시간이 많이 소요되는 프로세스이며 모든 환각을 포착한다고 장담할 수 없다.
    • Prompt engineering : 환각을 줄이는데 도움이 될 수 있지만 LLM의 기존 지식으로 인해 제한된다.

→ LLM이 실시간 팩트체크를 위해 벡터 검색을 사용하면 어떨까?

  • 벡터 검색을 사용하면 관련 컨텍스트를 LLM에 실시간으로 제공할 수 있다. 이 프로세스를 수행하는 아키텍처를 RAG(Retrieval Augmented Generation)라고 한다. 이를 수행하려면 입력 프롬프트를 선택하고 벡터 검색을 사용해 실시간 정보를 쿼리하고 상위 결과를 검색해 원래 프롬프트에 추가한다. 그런 다음 실시간 컨텍스트 정보와 함께 이 증강된 프롬프트를 LLM에 전달한다.
  • 검색 기능과 검증 기능을 결합하여 데이터의 최신성과 정확성을 보장하면 검색의 신뢰성과 신뢰성이 더욱 높아진다.
  • 예시) LLM은 수백 개의 문서를 정확하게 암기할 수 없다. LLM이 벡터 검색을 수행하여 관련 문서를 식별할 수 있도록 RAG 모델을 사용하는 것이다. 그러면 LLM은 논문을 읽은 후 질문에 대한 요약된 답변을 생성한다. RAG 모델을 사용하면 모든 것을 기억하기 위해 LLM을 교육할 필요가 없으므로 환각의 위험을 줄이는데 도움이 된다.

 

오늘은 어땠냐면요

구글 스터디 잼의 마지막 수업!

가장 신기하고 의외였던 점은 LLM이 수백만건의 논문을 다 기억못한다는 사실. 이친구.. 천재인줄 알았는데..?

 

어릴 때 부터 포털사이트와 검색엔진을 사용해왔기 때문에, 그리고 검색엔진은 항상 내 두뇌의 발맞추어 성장해왔기 때문에 딱히 검색기능에 불편한 점을 느끼지 못했던 것 같다. 오히려 문법적으로(구글이나 네이버에서 가능한) 문제없는 검색이 다른 서비스에서 동작하지 않을 때 "이게 안돼?" 라는 생각을 했던 것 같다. 엄청난 데이터를 빠르게 훑기 위해 트리탐색을 사용한다던지, 클러스터를 만드는 방법은 신기하면서도 구관이 명관이라는 생각이 들었다. 기술이 발전해도 역시 빠른 탐색은 트리 ㅋㅋ

벡터 검색에 Multimodal search 가 적용된다는 것을 배우니 예전에 한 유튜버가 부지런이 썸네일을 바꿔서 알고리즘을 태우려 했던 것이 생각난다. 어떤 사람이 유튜버에게 왜 자꾸 썸네일을 바꾸냐 질문했는데, 유튜버가 자신의 분석에 따르면 썸네일을 여러 각도로 바꿨을 때 알고리즘과 fit하면 바로 조회수가 늘어난다고 한다. 이 유튜버.. 거의 프롬프트 엔지니어다.