LlamaIndex Architectural Guide: Data Ingestion, Indexing, and Query Engines
Connecting enterprise data stores (Notion, Google Drive, SQL databases, unstructured PDF repositories) to LLMs requires specialized data plumbing. While generic agent frameworks focus on cyclical control loops, LlamaIndex is purpose-built for the Data Ingestion and Retrieval layer.
LlamaIndex structures unstructured data into queryable indices, creates hierarchical node graphs, and provides high-level query engines capable of automated multi-document routing and sub-question decomposition.
1. Core Architecture & Mental Model
The LlamaIndex ingestion-to-query pipeline consists of five sequential primitives:
- 1Document Readers & Data Connectors (LlamaHub): Ingest raw files from 160+ data sources into standard
Documentobjects. - 2Node Parsers: Splits documents into semantically coherent
Nodechunks preserving parent/child relationships and metadata. - 3Index Stores (
VectorStoreIndex,SummaryIndex): Generates vector embeddings for nodes and persists them to Qdrant, Pinecone, or LanceDB. - 4Retriever: Queries vector and keyword indices to retrieve the top-$K$ most relevant nodes.
- 5Response Synthesizer & Query Engine: Augments prompts with retrieved context nodes to generate grounded answers.
2. Installation & Quick Setup
# For Python
pip install llama-index llama-index-llms-openai llama-index-embeddings-openai llama-index-vector-stores-qdrant
# For TypeScript / Node.js
npm install llamaindex3. Recommended Production Folder Structure
src/
├── data/ # Raw document inputs (.pdf, .md, .csv)
├── indexing/
│ ├── ingestion.py # Document parsing & embedding generation
│ └── vectorStore.py # Qdrant / Pinecone store configuration
├── engines/
│ ├── routerEngine.py# Query intent router
│ └── queryEngine.py # Top-level RAG query engine
└── main.py4. Complete, Runnable Starter Project in Python
Below is a complete Python production script setting up semantic node parsing, a vector store index, and a structured query engine:
import os
from llama_index.core import Document, VectorStoreIndex, Settings
from llama_index.core.node_parser import SentenceSplitter
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
# 1. Global Settings Configuration
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0.1)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=64)
# 2. Ingest Sample Technical Corpus
documents = [
Document(
text="LlamaIndex provides specialized data connectors via LlamaHub to ingest PDF, SQL, and Notion files.",
metadata={"category": "ai-infra", "source": "docs.llamaindex.ai"}
),
Document(
text="Sub-question query engines break complex multi-part queries into sub-queries across distinct document indices.",
metadata={"category": "rag-architecture", "source": "docs.llamaindex.ai"}
)
]
# 3. Build VectorStoreIndex (In-memory for illustration, swap with Qdrant in production)
index = VectorStoreIndex.from_documents(documents)
# 4. Construct Query Engine with Similarity Top-K
query_engine = index.as_query_engine(
similarity_top_k=2,
response_mode="compact"
)
# 5. Query the Engine
def execute_query(query_str: str):
response = query_engine.query(query_str)
print(f"Query: {query_str}")
print(f"Response: {response.response}\n")
print("Source Nodes:")
for node in response.source_nodes:
print(f"- Score ({node.score:.3f}): {node.node.text[:80]}...")
if __name__ == "__main__":
execute_query("How do sub-question query engines work in LlamaIndex?")5. Architectural Tradeoffs Matrix
| Capability | LangChain | LlamaIndex |
|---|---|---|
| Primary Specialty | Agent orchestration & chains | Data Ingestion, Indexing & Structured RAG |
| Index Strategies | Basic Vector Store | Hierarchical, Summary, Keyword, Knowledge Graph |
| Data Connectors | Community Loaders | 160+ Enterprise Readers (LlamaHub) |
| Query Routing | Manual Router Chains | Built-in RouterQueryEngine & SubQuestionQueryEngine |
6. When to Use vs. When to Avoid
Choose LlamaIndex When:
- Your application's primary bottleneck is complex search, document chunking, multi-source ingestion, and RAG accuracy.
- You need structured evaluation metrics for retrieval precision and faithfulness.
Avoid LlamaIndex When:
- You are building non-retrieval applications (e.g. coding agents or DevOps control planes that manipulate infrastructure tools).



