Jetzt verbinden wir alle Bausteine zu einer funktionierenden End-to-End-Pipeline. Von der Dokumenten-Ingestion über das Retrieval bis zur finalen Antwortgenerierung.
Dokumente → Loader → Chunker → Embedder → Vektor-DB
↑
User Query → Embedder → Similarity Search ──────┘
↓
Top-K Chunks + Query → LLM → Antwort
Verschiedene Quellen erfordern verschiedene Loader:
// Pseudo-Code für die Ingestion
const chunks = recursiveSplit(document, { chunkSize: 512, overlap: 64 })
const embeddings = await embedModel.embed(chunks.map(c => c.text))
await vectorDB.upsert(chunks.map((c, i) => ({
id: c.id,
vector: embeddings[i],
metadata: { source: c.source, page: c.page }
})))
Nach dem initialen Retrieval (Top-20) bewertet ein Reranker-Modell die Relevanz und liefert die besten 3–5 Chunks.
System-Prompt:
"Beantworte die Frage basierend auf dem folgenden Kontext.
Wenn der Kontext die Antwort nicht enthält, sage das ehrlich.
Zitiere relevante Quellen."
Kontext: [Top-K Chunks]
Frage: [User Query]
| Komponente | Empfehlung | Alternative |
|---|---|---|
| Orchestrierung | LangChain / LlamaIndex | Haystack |
| Embeddings | OpenAI text-embedding-3 | Voyage, BGE |
| Vektor-DB | pgvector / Qdrant | Pinecone, Weaviate |
| Reranker | Cohere Rerank v3 | Cross-Encoder |
| LLM | Claude Opus / GPT-5 | Mixtral (Self-hosted) |
Praxis-Tipp: Bauen Sie zuerst einen Minimal-Prototypen ohne Reranking und Query-Optimierung. Messen Sie die Qualität, dann optimieren Sie gezielt.
Was ist der Zweck von Reranking in einer RAG-Pipeline?