인덱싱

인덱싱 (Indexing)

데이터를 로드했다면 이제 Document 객체 목록(또는 Node 목록)을 갖게 됐어요. 이제 이 객체들 위에 Index를 만들어 쿼리할 수 있게 할 차례예요.

Index란 무엇인가?

LlamaIndex 용어에서 IndexDocument 객체로 구성된 데이터 구조이며, LLM이 쿼리할 수 있게 설계돼요. 여러분의 Index는 쿼리 전략과 상호 보완적이도록 설계돼요.

LlamaIndex는 여러 가지 인덱스 유형을 제공해요. 여기서는 가장 흔한 두 가지를 다룰게요.

벡터 스토어 인덱스 (Vector Store Index)

VectorStoreIndex는 단연 가장 자주 마주치는 Index 유형이에요. 벡터 스토어 인덱스는 여러분의 Documents를 받아 Node로 나눠요. 그런 다음 모든 노드의 텍스트에 대해 vector embeddings을 만들어 LLM이 쿼리할 준비를 해요.

임베딩이란 무엇인가?

Vector embeddings는 LLM 애플리케이션이 작동하는 방식의 중심이에요.

vector embedding은 흔히 그냥 임베딩이라고 부르는데, 텍스트의 의미(시맨틱)를 수치로 나타낸 표현이에요. 의미가 비슷한 두 텍스트는 실제 텍스트가 상당히 달라도 수학적으로 유사한 임베딩을 가져요.

이 수학적 관계는 시맨틱 검색을 가능하게 해요. 사용자가 쿼리 용어를 제공하면 LlamaIndex는 단순 키워드 매칭이 아니라 쿼리 용어의 의미와 관련된 텍스트를 찾을 수 있어요. 이것이 검색 증강 생성이 작동하는 큰 부분이고, 일반적으로 LLM이 작동하는 방식이기도 해요.

임베딩 유형은 여러 가지가 있고, 효율성·효과·계산 비용이 각각 달라요. 기본적으로 LlamaIndex는 OpenAI의 기본 임베딩인 text-embedding-ada-002를 사용해요. 다른 LLM을 쓴다면 다른 임베딩을 쓰고 싶어질 때가 많아요.

벡터 스토어 인덱스가 문서를 임베딩한다

벡터 스토어 인덱스는 LLM의 API를 사용해 모든 텍스트를 임베딩으로 바꿔요. 그래서 '텍스트를 임베딩한다(embeds your text)'고 말해요. 텍스트가 많다면 임베딩 생성은 왕복 API 호출이 많이 필요해서 시간이 오래 걸릴 수 있어요.

임베딩을 검색하고 싶을 때는 여러분의 쿼리 자체가 벡터 임베딩으로 바뀌고, VectorStoreIndex가 모든 임베딩을 쿼리와 얼마나 시맨틱하게 유사한지에 따라 순위를 매기는 수학적 연산을 수행해요.

Top K 검색

순위가 끝나면 VectorStoreIndex는 가장 유사한 임베딩을 해당하는 텍스트 청크로 반환해요. 반환하는 임베딩 수를 k라 하고, 얼마나 많은 임베딩을 반환할지 제어하는 파라미터를 top_k라고 해요. 이런 이유로 이 전체 검색 유형을 흔히 'top-k semantic retrieval'이라고 불러요.

Top-k 검색은 벡터 인덱스를 쿼리하는 가장 간단한 형태예요. 더 복잡하고 미묘한 전략은 쿼리 섹션에서 배우게 돼요.

벡터 스토어 인덱스 사용하기

벡터 스토어 인덱스를 사용하려면 로딩 단계에서 만든 Documents 목록을 넘겨줘요:

from llama_index.core import VectorStoreIndex


index = VectorStoreIndex.from_documents(documents)

from_documents는 선택적 인자 show_progress도 받아요. 인덱스 생성 중 진행 막대를 보려면 True로 설정하세요.

Node 객체 목록 위에 직접 인덱스를 구축할 수도 있어요:

from llama_index.core import VectorStoreIndex


index = VectorStoreIndex(nodes)

텍스트가 인덱싱됐으니 이제 기술적으로 쿼리할 준비가 돼요. 하지만 모든 텍스트를 임베딩하는 것은 시간이 걸리고, 호스팅된 LLM을 쓴다면 비용도 들 수 있어요. 시간과 비용을 아끼려면 먼저 임베딩을 저장하고 싶을 거예요.

요약 인덱스 (Summary Index)

요약 인덱스는 더 단순한 형태의 Index로, 이름이 말해주듯 Documents의 텍스트 요약을 생성하려는 쿼리에 가장 잘 맞아요. 모든 Documents를 그냥 저장하고, 그것들을 전부 쿼리 엔진에 돌려줘요.

더 알아보기

데이터가 상호 연결된 개념의 집합(컴퓨터 과학 용어로 '그래프')이라면 지식 그래프 인덱스에 관심이 있을 수 있어요.