Zusammenfassung
- Installieren Sie LlamaIndex in 2 Minuten mit
pip install llama-index(Python) odernpm install llamaindex(TypeScript) Vollständiger Leitfaden. - Laden Sie Dokumente aus über 200 Quellen (PDFs, SQL, Notion) und parsen Sie diese in strukturierte Knoten Datenlader.
- Erstellen Sie produktionsreife RAG-Pipelines mit Hybrid-Suche (Vektor + Schlüsselwort) und Neuordnung RAG-Leitfaden.
- Stellen Sie mit Observability (Arize, LangSmith) bereit und skalieren Sie mit LlamaCloud Anmeldung.
- Fallstricke: Große Indizes benötigen 16 GB+ RAM; Multi-Modal-RAG erfordert kostenpflichtige APIs Multi-Modal-Kosten.
1. Installation und Schnellstart
Python (LlamaIndex.Py)
# Kernpaket installieren (minimale Abhängigkeiten)
pip install llama-index-core
# Vollständige Suite installieren (inkl. Multi-Modal, Agents usw.)
pip install llama-index
# Installation überprüfen
python -c "from llama_index.core import VectorStoreIndex; print('LlamaIndex v0.10.28 bereit')"
# Erwartete Ausgabe: LlamaIndex v0.10.28 bereit
Version überprüft in GitHub Releases.
Fallstricke:
- Falls Sie
ImportError: No module named 'llama_index'sehen, stellen Sie sicher, dass Sie Python 3.9+ und eine virtuelle Umgebung verwenden. - Für GPU-Beschleunigung installieren Sie zunächst PyTorch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118.
TypeScript (LlamaIndex.TS)
npm install llamaindex
# oder
yarn add llamaindex
# Installation überprüfen
node -e "const { VectorStoreIndex } = require('llamaindex'); console.log('LlamaIndex.TS v0.3.12 bereit')"
# Erwartete Ausgabe: LlamaIndex.TS v0.3.12 bereit
TypeScript-Unterstützung dokumentiert im TS-Leitfaden.
2. Dokumentenlader und Parsing
PDF laden und in Knoten parsen
from llama_index.core import SimpleDirectoryReader
# Dokumente aus einem Verzeichnis laden (unterstützt PDF, DOCX, CSV usw.)
documents = SimpleDirectoryReader("data/").load_data()
print(f"{len(documents)} Dokumente geladen")
# Erwartete Ausgabe: 3 Dokumente geladen
# In Knoten parsen (Chunks mit Metadaten)
from llama_index.core.node_parser import SentenceSplitter
parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
nodes = parser.get_nodes_from_documents(documents)
print(f"{len(nodes)} Knoten erstellt")
# Erwartete Ausgabe: 42 Knoten erstellt
Dokumentation für Datenlader verfügbar unter Datenlader.
Wichtige Funktionen:
- Über 200 Datenkonnektoren: Laden Sie Daten aus Notion, Slack, SQL und mehr Datenlader.
- LlamaParse: Kostenpflichtige API zum Parsen komplexer PDFs (Tabellen, mehrspaltige Layouts). Kostenlose Testversion verfügbar LlamaParse.
from llama_parse import LlamaParse parser = LlamaParse(api_key="llx-...", result_type="markdown") documents = parser.load_data("data/report.pdf")
Fallstricke:
- Große PDFs (>100 Seiten) können mit
SimpleDirectoryReaderzu Timeouts führen. Verwenden SieLlamaParsefür bessere Ergebnisse LlamaParse. - Für SQL-Datenbanken verwenden Sie
SQLTableRetrieverQueryEngine, um automatisch Abfragen aus natürlicher Sprache zu generieren.
3. Indextypen
Vektorindex (Standard für RAG)
from llama_index.core import VectorStoreIndex
# Einen Vektorindex erstellen (verwendet standardmäßig OpenAI-Embeddings)
index = VectorStoreIndex.from_documents(documents)
# Auf Festplatte speichern
index.storage_context.persist("storage/")
Erwartete Ausgabe:
INFO:llama_index.core.storage.storage_context:VectorStoreIndex in storage/ gespeichert
Schlüsselwortindex (Lexikalische Suche)
from llama_index.core import KeywordTableIndex
keyword_index = KeywordTableIndex.from_documents(documents)
Baumindex (Hierarchische Zusammenfassung)
from llama_index.core import TreeIndex
tree_index = TreeIndex.from_documents(documents)
# Abfrage mit Kind-Zweig-Traversierung
query_engine = tree_index.as_query_engine(child_branch_factor=2)
response = query_engine.query("Fassen Sie die wichtigsten Punkte zusammen")
print(response)
Wann welchen Index verwenden:
| Indextyp | Anwendungsfall | Vorteile | Nachteile |
|---|---|---|---|
| Vektor | Semantische Suche, RAG. | Hohe Genauigkeit, unterstützt Hybrid-Suche. | Langsamer bei großen Datensätzen. |
| Schlüsselwort | Lexikalische Suche (z. B. exakte Übereinstimmungen). | Schnell, keine Embeddings nötig. | Kein semantisches Verständnis. |
| Baum | Hierarchische Daten (z. B. juristische Dokumente). | Erhält Struktur. | Komplexe Abfragen. |
Fallstricke:
- Vektorindizes benötigen ein Embedding-Modell (Standard: OpenAIs
text-embedding-3-small). Für lokale Embeddings verwenden SieHuggingFaceEmbedding:from llama_index.embeddings.huggingface import HuggingFaceEmbedding embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5") index = VectorStoreIndex.from_documents(documents, embed_model=embed_model)
4. Abfrage-Engine einrichten
Grundlegende Abfrage-Engine
query_engine = index.as_query_engine()
response = query_engine.query("Welche Risiken birgt KI im Jahr 2026?")
print(response)
Erwartete Ausgabe:
Die Risiken von KI im Jahr 2026 umfassen:
1. Arbeitsplatzverluste in kreativen Branchen.
2. Zunahme von Desinformation durch Deepfakes.
3. Regulatorische Lücken bei Multi-Modal-Modellen.
Quelle: data/report.pdf (Seite 42)
Hybrid-Suche (Vektor + Schlüsselwort)
from llama_index.core import QueryBundle
from llama_index.core.retrievers import BaseRetriever
class HybridRetriever(BaseRetriever):
def __init__(self, vector_index, keyword_index):
self.vector_retriever = vector_index.as_retriever()
self.keyword_retriever = keyword_index.as_retriever()
def _retrieve(self, query_bundle: QueryBundle):
vector_nodes = self.vector_retriever.retrieve(query_bundle)
keyword_nodes = self.keyword_retriever.retrieve(query_bundle)
return vector_nodes + keyword_nodes
retriever = HybridRetriever(index, keyword_index)
query_engine = index.as_query_engine(retriever=retriever)
Fortgeschrittene Abfragetechniken dokumentiert im RAG-Leitfaden.
Fallstricke:
- Hybrid-Suche erhöht die Latenz um ~200-500 ms. Verwenden Sie
similarity_top_k=2, um die Ergebnisse zu begrenzen. - Für die Produktion fügen Sie einen Neuordner hinzu (z. B.
CohereRerank):from llama_index.postprocessor.cohere_rerank import CohereRerank reranker = CohereRerank(api_key="...", top_n=3) query_engine = index.as_query_engine(node_postprocessors=[reranker])
5. Benutzerdefinierte Retriever
Zeitbasierten Retriever erstellen
from llama_index.core import get_response_synthesizer
from llama_index.core.retrievers import BaseRetriever
from llama_index.core.schema import NodeWithScore
from typing import List
class TimeBasedRetriever(BaseRetriever):
def __init__(self, index, time_field="date"):
self.index = index
self.time_field = time_field
def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:
# Knoten nach Zeit filtern (z. B. "Dokumente aus 2025-2026")
nodes = self.index.docstore.get_nodes()
filtered_nodes = [
node for node in nodes
if node.metadata.get(self.time_field, "").startswith("2025")
]
return [NodeWithScore(node=node, score=1.0) for node in filtered_nodes]
retriever = TimeBasedRetriever(index)
query_engine = index.as_query_engine(retriever=retriever)
Anwendungsfälle:
- ASSESS (AI-Sicherheitsrahmenwerk): Abrufen von Protokollen aus einem bestimmten Zeitfenster zur Bewertung der Exposition.
- COMPLY: Filtern von Dokumenten nach Compliance-Tags (z. B. "GDPR", "HIPAA").
6. Evaluation und Metriken
RAG-Evaluation durchführen
from llama_index.core.evaluation import (
generate_question_context_pairs,
EmbeddingQAFinetuneDataset,
)
from llama_index.evaluation import RetrieverEvaluator
# Synthetische Frage-Antwort-Paare generieren
qa_dataset = generate_question_context_pairs(documents, num_questions_per_chunk=2)
# Retriever evaluieren
retriever = index.as_retriever(similarity_top_k=2)
evaluator = RetrieverEvaluator.from_metric_names(
["mrr", "hit_rate"], retriever=retriever
)
eval_results = await evaluator.aevaluate_dataset(qa_dataset)
print(eval_results)
Erwartete Ausgabe:
{'mrr': 0.85, 'hit_rate': 0.92}
Wichtige Metriken:
| Metrik | Beschreibung | Zielwert |
|---|---|---|
| MRR | Mittlerer reziproker Rang. | >0,8 |
| Hit Rate | % der Abfragen mit relevanten Ergebnissen. | >0,9 |
| Faithfulness | % der Antworten, die im Kontext verankert sind. | >0,95 |
Fallstricke:
- Die Generierung synthetischer Frage-Antwort-Paare erfordert ein LLM (Standard: OpenAI). Für lokale Evaluation verwenden Sie
LlamaCPP:from llama_index.llms.llama_cpp import LlamaCPP llm = LlamaCPP(model_path="models/llama-2-7b.Q4_K_M.gguf") qa_dataset = generate_question_context_pairs(documents, llm=llm)
7. Tipps für die Produktionsbereitstellung
Bereitstellung mit FastAPI
from fastapi import FastAPI
from llama_index.core import VectorStoreIndex
from pydantic import BaseModel
app = FastAPI()
index = VectorStoreIndex.from_documents(documents)
class QueryRequest(BaseModel):
query: str
@app.post("/query")
async def query_index(request: QueryRequest):
query_engine = index.as_query_engine()
response = query_engine.query(request.query)
return {"response": str(response)}
# Ausführen mit: uvicorn app:app --reload
Erwartete Ausgabe (API):
{
"response": "Die Risiken von KI im Jahr 2026 umfassen Arbeitsplatzverluste und Desinformation."
}
Observability mit Arize
from llama_index.core.callbacks import CallbackManager
from llama_index.callbacks.arize_ai import ArizeCallbackHandler
arize_callback = ArizeCallbackHandler(
api_key="...",
space_key="...",
)
callback_manager = CallbackManager([arize_callback])
index = VectorStoreIndex.from_documents(
documents, callback_manager=callback_manager
)
Observability-Funktionen dokumentiert unter Observability.
Skalierung mit LlamaCloud
from llama_index.indices.managed.llama_cloud import LlamaCloudIndex
index = LlamaCloudIndex.from_documents(
documents,
name="my-production-index",
project_name="my-project",
api_key="llx-...",
)
LlamaCloud-Dokumentation verfügbar unter Anmeldung.
Fallstricke:
- LlamaCloud-Indizes sind eventually consistent (Aktualisierungen können ~1 Minute dauern).
- Für Multi-Modal-RAG verwenden Sie
LlamaCloudMultiModalIndexMulti-Modal.
Alternativen im Überblick
| Tool | Am besten geeignet für | Wichtigste Einschränkung |
|---|---|---|
| LlamaIndex | Enterprise-RAG, Multi-Modal-Anwendungen. | TS-Version weniger ausgereift TS-Roadmap |
