핵심 개념 및 용어 설명
인덱스 유형 분석 전에 다음 기본 개념을 이해해야 합니다:
- 노드(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}
}
)