LlamaIndex(구 GPT Index)는 LLM과 외부 데이터를 연결하는 데이터 프레임워크다. 다양한 형태의 문서를 인덱싱하고 LLM이 효과적으로 검색·활용할 수 있는 RAG 파이프라인을 제공한다.
| 항목 | LlamaIndex | LangChain |
|---|
| 강점 | 데이터 인덱싱, 문서 검색 | 체인/에이전트 오케스트레이션 |
| RAG | 고급 인덱싱 전략 | 기본 RAG |
| 에이전트 | ReAct, SubQuestion | 다양한 에이전트 유형 |
| 커스터마이징 | 인덱스/쿼리 엔진 | 체인/도구 |
기본 VectorStoreIndex
python
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
# 문서 로드 및 인덱싱
documents = SimpleDirectoryReader("./docs/").load_data()
index = VectorStoreIndex.from_documents(documents, show_progress=True)
index.storage_context.persist(persist_dir="./storage")
# 쿼리
query_engine = index.as_query_engine(similarity_top_k=5)
response = query_engine.query("최신 성능 개선 사항은 무엇인가요?")
print(response)
print("
출처:")
for node in response.source_nodes:
print(f" - {node.metadata.get('file_name')}: {node.score:.3f}")
고급 인덱싱 전략
python
from llama_index.core import SummaryIndex, KeywordTableIndex
from llama_index.core.indices.composability import ComposableGraph
# 계층적 인덱싱: 청크 요약 + 벡터 검색
from llama_index.core.node_parser import SentenceWindowNodeParser
from llama_index.core.indices.postprocessor import MetadataReplacementPostProcessor
# 문장 윈도우 방식 (컨텍스트 확장)
node_parser = SentenceWindowNodeParser.from_defaults(window_size=3)
index = VectorStoreIndex.from_documents(documents, node_parser=node_parser)
query_engine = index.as_query_engine(
similarity_top_k=3,
node_postprocessors=[
MetadataReplacementPostProcessor(target_metadata_key="window"),
],
)
Sub-Question Query Engine
python
from llama_index.core.query_engine import SubQuestionQueryEngine
from llama_index.core.tools import QueryEngineTool
# 복잡한 질문을 하위 질문으로 분해
tools = [
QueryEngineTool.from_defaults(
query_engine=index_2023.as_query_engine(),
description="2023년 연간 보고서",
),
QueryEngineTool.from_defaults(
query_engine=index_2024.as_query_engine(),
description="2024년 연간 보고서",
),
]
sq_engine = SubQuestionQueryEngine.from_defaults(query_engine_tools=tools)
response = sq_engine.query("2023년과 2024년 매출 성장률을 비교해 주세요.")