Worum es geht
Du hast eine Produktdokumentation, ein internes Wiki oder einen Haufen PDFs – und willst, dass ein Chatbot Fragen dazu akkurat beantwortet.
Playbook
5. April 2026
Leseführung
Du hast eine Produktdokumentation, ein internes Wiki oder einen Haufen PDFs – und willst, dass ein Chatbot Fragen dazu akkurat beantwortet.
1Lies zuerst die Einordnung links. Sie erklärt dir, warum der Beitrag überhaupt relevant ist.
2Danach einmal komplett lesen. Der Beitrag ist kurz genug für einen sauberen Durchgang.
3Wenn du tiefer gehen willst, erst am Ende in die Quellen springen.
• Die fünf Phasen einer RAG-Pipeline
• Phase 1: Dokumente laden und chunken
• Phase 2: Embeddings generieren und speichern
• Phase 3: Retrieval – die passenden Chunks finden
Du hast eine Produktdokumentation, ein internes Wiki oder einen Haufen PDFs – und willst, dass ein Chatbot Fragen dazu akkurat beantwortet. Genau das ist der Kernanwendungsfall von RAG. In diesem Artikel baust du Schritt für Schritt eine vollständige RAG-Pipeline: vom rohen Dokument bis zum antwortenden Bot.
Eine RAG-Pipeline besteht aus zwei zeitlich getrennten Phasen:
Ingestion (einmalig oder periodisch): Dokumente laden → Chunking → Embeddings generieren → in Vektordatenbank speichern.
Retrieval + Generation (bei jeder Anfrage): Nutzeranfrage als Embedding → ähnliche Chunks suchen → Kontext + Frage an LLM → Antwort.
Lass uns beide Phasen konkret durchgehen.
Rohe Dokumente (PDF, DOCX, Markdown, Web-Seiten) müssen zunächst in Text umgewandelt und dann in kleinere Chunks aufgeteilt werden. Warum nicht einfach das ganze Dokument übergeben? Weil Vektordatenbanken besser funktionieren, wenn die Einheiten semantisch kohärent und überschaubar groß sind – typischerweise 256–512 Tokens.
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader
# Dokument laden
loader = PyPDFLoader("produkthandbuch.pdf")
docs = loader.load()
# In Chunks aufteilen (512 Tokens, 50 Token Overlap)
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50,
length_function=len
)
chunks = splitter.split_documents(docs)
print(f"{len(chunks)} Chunks erstellt")
RecursiveCharacterTextSplitter ist der empfohlene Standard: Er versucht, Absätze und Sätze zusammenzuhalten, anstatt mitten im Satz zu schneiden.
Jeder Chunk wird jetzt in einen Vektor umgewandelt und in die Vektordatenbank geschrieben. Wir nutzen OpenAI text-embedding-3-small und Qdrant als lokale Datenbank:
from langchain_openai import OpenAIEmbeddings
from langchain_qdrant import QdrantVectorStore
from qdrant_client import QdrantClient
embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
# Qdrant lokal starten: docker run -p 6333:6333 qdrant/qdrant
client = QdrantClient(host="localhost", port=6333)
# Alle Chunks auf einmal indexieren
vectorstore = QdrantVectorStore.from_documents(
documents=chunks,
embedding=embedding_model,
url="http://localhost:6333",
collection_name="produkthandbuch"
)
print("Indexierung abgeschlossen")
Für einen ersten Prototyp kannst du chromadb verwenden – das läuft ohne Docker direkt im Speicher.
Bei einer Nutzeranfrage wird die Frage ebenfalls in einen Vektor umgewandelt und dann nach den ähnlichsten Chunks gesucht:
# Top-3 ähnlichste Chunks zur Anfrage finden
results = vectorstore.similarity_search(
query="Wie setze ich das Passwort zurück?",
k=3
)
for i, doc in enumerate(results):
print(f"--- Chunk {i+1} ---")
print(doc.page_content[:200])
Die Suche nutzt Cosine Similarity: Je kleiner der Winkel zwischen zwei Vektoren, desto ähnlicher sind die Texte.
Die gefundenen Chunks werden als Kontext in den Prompt eingebaut:
from openai import OpenAI
client = OpenAI()
kontext = "\n\n".join([doc.page_content for doc in results])
frage = "Wie setze ich das Passwort zurück?"
prompt = f"""Du bist ein hilfreicher Support-Assistent. Beantworte die Frage
nur auf Basis der folgenden Dokumentauszüge. Wenn die Antwort nicht
im Kontext steht, sage das ehrlich.
Kontext:
{kontext}
Frage: {frage}"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
Keine Lust auf Python-Code? n8n bietet fertige RAG-Nodes für die komplette Pipeline:
Der n8n-Template "Basic RAG Chat" gibt dir einen fertigen Startpunkt, den du in 15 Minuten konfigurieren kannst. Das n8n-Blog listet über 600 RAG-Workflow-Templates in der Community.
Dokument (PDF/DOCX/MD)
↓ Loader
Text-Chunks (512 Tokens, 50 Overlap)
↓ Embedding-Modell (text-embedding-3-small)
Vektoren (1536 Dimensionen)
↓ Vektordatenbank (Qdrant/Chroma)
←--- gespeichert ---
Nutzeranfrage
↓ Embedding
Query-Vektor
↓ Similarity Search (Top-K)
Relevante Chunks
↓ Prompt-Building
LLM (GPT-4o)
↓
Antwort mit Quellenangabe
Eine RAG-Pipeline ist in wenigen Stunden aufgebaut: Dokumente laden, in Chunks aufteilen, Embeddings generieren, in einer Vektordatenbank speichern. Bei jeder Anfrage werden die passenden Chunks gesucht und dem LLM als Kontext mitgegeben. Das Ergebnis ist ein Chatbot, der verlässlich aus deinen eigenen Daten antwortet – kein Halluzinieren, keine veralteten Fakten.
Quellen:
Nachvollziehbarkeit
Sauberer Abschluss
Wenn du die Kernidee verstanden hast und einen nächsten Schritt für dich benennen kannst, ist der Beitrag für heute erfüllt. Du musst hier nicht alles in einem Zug durcharbeiten.
War dieser Inhalt hilfreich?