LlamaIndex 인덱싱 메커니즘 심층 분석

핵심 개념 및 용어 설명

인덱스 유형 분석 전에 다음 기본 개념을 이해해야 합니다:

  • 노드(Node): 문서를 분할한 최소 의미 단위
  • 응답 합성(Response Synthesis): 검색된 노드를 자연어 답변으로 변환
  • 검색기(Retriever): 쿼리 기반 노드 검색 인터페이스

요약 인덱스(Summary Index)

인덱스 구조

NodeA → NodeB → NodeC → ... → NodeZ

모든 노드를 선형 체인으로 저장하는 기본 구조

검색 프로세스

전체 검색 모드:

쿼리 → [모든 노드 로드] → 응답 합성 → 결과

필터 검색 모드:

쿼리 + 필터["키워드"] → 노드 필터링 → 응답 합성 → 결과

구현 예시

from llama_index import SummaryIndex, DocumentLoader

docs = DocumentLoader("./source").load_docs()
idx = SummaryIndex.from_docs(docs)

query_tool = idx.as_query_tool(
    keyword_filters=["AI", "알고리즘"]
)

answer = query_tool.search("지도학습 원리 설명")

벡터 저장소 인덱스(Vector Store Index)

인덱스 아키텍처

NodeX → 임베딩X
NodeY → 임베딩Y
      ↓
  벡터 저장소

쿼리 실행 흐름

사용자 질문 → 임베딩 생성 → 유사도 계산(top_k=3) → 상위 노드 반환 → 응답 합성

실전 구현

from llama_index import VectorIndex, RedisVectorDB
from llama_index.embeddings import EmbeddingModel

embedder = EmbeddingModel("BGE-ko-small")
vector_db = RedisVectorDB(redis_url="redis://localhost:6379")

idx = VectorIndex.from_docs(
    docs=docs,
    embed_model=embedder,
    storage=vector_db
)

query_engine = idx.as_query_engine(top_k=3)

트리 인덱스(Tree Index)

계층적 구조

     루트
    /    \
 부모A   부모B
 /  \    /  \
자식1 자식2 자식3 자식4

검색 전략

탐욕적 접근: 매층 1개 노드 선택
너비 우선 탐색: 매층 다수 노드 선택

키워드 테이블 인덱스(Keyword Table Index)

매핑 구조

키워드A → NodeP, NodeR
키워드B → NodeQ, NodeS

TF-IDF/BM25 가중치 계산으로 키워드-노드 매핑

벡터 인덱스 비교

키워드 테이블벡터 저장소
정확 매칭의미적 유사도
소규모 적합대규모 적합

속성 그래프 인덱스(Property Graph Index)

지식 그래프

엔티티A(속성)─관계→엔티티B(속성)

다중 검색기 협업을 통한 관계형 질의 처리

Neo4j 연동

from llama_index import GraphIndex, Neo4jStore

neo4j_db = Neo4jStore(
    url="bolt://localhost:7687",
    auth=("user", "pass")
)

graph_idx = GraphIndex.from_docs(
    documents=docs,
    graph_db=neo4j_db,
    entity_types=["인물", "기관"]
)

인덱스 선택 가이드

시작 → 데이터 크기? → 소형: 요약/키워드
         │          → 대형: 벡터/트리
         └ 질문 유형? → 의미: 벡터
                   → 계층: 트리
                   → 정확: 키워드
                   → 관계: 그래프

복합 인덱스 전략

from llama_index import CompositeGraph

vector_idx = VectorIndex.from_docs(docs)
keyword_idx = KeywordIndex.from_docs(docs)

graph = CompositeGraph(
    indices={
        "vector": vector_idx,
        "keyword": keyword_idx
    }
)

smart_engine = graph.as_query_engine(
    routing_config={
        "vector": {"priority": 1},
        "keyword": {"priority": 2}
    }
)

태그: LlamaIndex RAG 벡터_저장소 트리_인덱스 키워드_테이블

7월 23일 17:22에 게시됨