인덱스란 무엇인가?
LlamaIndex 에서 인덱스는 Document 객체(혹은 Node)로 구성된 데이터 구조로, LLM(대형 언어 모델)에 의해 쿼리할 수 있도록 설계되었다.
Document vs Node
1) Document는 원본 텍스트 데이터를 나타내며, 전체 텍스트 블록이다.
2) Node는 Document를 더 작은 단위로 분할한 것이며, 각 Node는 독립적인 텍스트 조각이다.
Document는 인덱싱 과정의 시작점이고, Node는 그 결과로 생성되어 더 효율적인 검색을 가능하게 합니다.
VectorStoreIndex는 가장 자주 사용되는 인덱스 유형이다.
Vector Store Index는 Documents를 Nodes로 분할한다.
그런 다음 각 노드의 텍스트에 대한 벡터 임베딩을 생성하여 LLM이 쿼리할 준비를 한다.
벡터 임베딩, 종종 임베딩이라고 불리는 것은 텍스트의 의미, 즉 의미론의 수치적 표현이다.
의미가 유사한 두 개의 텍스트는 실제 텍스트가 많이 다르더라도 수학적으로 유사한 임베딩을 갖는다.
이 수학적 관계는 사용자가 쿼리 용어를 제공하면 LlamaIndex가 단순한 키워드 매칭이 아니라 쿼리 용어의 의미와 관련된 텍스트를 찾을 수 있게 해주는 의미 검색을 가능하게 합니다.
이것은 검색 증강 생성(Retrieval-Augmented Generation) 및 LLM이 작동하는 일반적인 방식의 큰 부분입니다.
임베딩의 유형은 많으며, 효율성, 효과 및 계산 비용이 다양하다.
기본적으로 LlamaIndex는 OpenAI에서 사용하는 기본 임베딩인 text-embedding-ada-002를 사용한다.
Vector Store Index는 LLM의 API를 사용하여 모든 텍스트를 임베딩으로 변환한다.
이 과정이 "텍스트를 임베딩한다"는 의미다.
텍스트가 많으면 임베딩 생성에 많은 시간이 걸릴 수 있다.
이는 많은 왕복 API 호출이 필요하기 때문이다.
임베딩을 검색하고 싶을 때, 쿼리 자체가 벡터 임베딩으로 변환된 후, VectorStoreIndex가 수학적 연산을 수행하여 쿼리와 의미적으로 유사한 모든 임베딩을 순위 매긴다.
순위 매기기가 완료되면, VectorStoreIndex는 가장 유사한 임베딩을 해당 텍스트 조각과 함께 반환한다.
반환되는 임베딩의 수를 k라고 하며, 반환할 임베딩 수를 제어하는 매개변수를 top_k라고 합니다.
이러한 유형의 검색은 종종 "top-k 의미 검색"이라고 불린다.
top-k 검색은 벡터 인덱스를 쿼리하는 가장 간단한 형태이다.