RAG — Retrieval Augmented Generation
Problem: LLMs kennen deine Dokumente nicht. Lösung: Vor jeder Anfrage relevante Dokumentteile suchen und mitschicken.
Pipeline in 5 Schritten
- Indexieren: Dokumente in Chunks teilen (~500 Token), Embeddings berechnen, in Vector-DB speichern.
- Abfrage: Nutzerfrage in Embedding umwandeln.
- Retrieval: Top-k ähnlichste Chunks finden (Cosine Similarity).
- Augmentation: Chunks an den Prompt anhängen.
- Generation: LLM antwortet basierend auf den abgerufenen Inhalten.
Beispiel — minimal RAG mit Python
from openai import OpenAI
import chromadb
client = OpenAI()
chroma = chromadb.Client()
collection = chroma.create_collection("docs")
# Indexieren
def index(text, id):
emb = client.embeddings.create(model="text-embedding-3-small", input=text)
collection.add(documents=[text], embeddings=[emb.data[0].embedding], ids=[id])
# Abfragen
def ask(question):
q_emb = client.embeddings.create(model="text-embedding-3-small", input=question)
results = collection.query(query_embeddings=[q_emb.data[0].embedding], n_results=3)
context = "\n".join(results['documents'][0])
prompt = f"Kontext:\n{context}\n\nFrage: {question}"
return client.chat.completions.create(
model="gpt-4o", messages=[{"role": "user", "content": prompt}]
).choices[0].message.contentVector-Datenbanken
| DB | Stärken | Setup |
|---|---|---|
| Chroma | Lokal, simpel, Python-freundlich | 1 Zeile |
| Pinecone | Managed, sehr skalierbar | API-Key |
| Qdrant | Open-Source, Self-Hosted, schnell | Docker |
| Weaviate | GraphQL, Multi-Modal | Docker/Cloud |
| pgvector | PostgreSQL-Erweiterung | SQL-Befehl |
Chunking-TippZu klein = Kontext verloren. Zu groß = irrelevant. Sweet spot: 500-1000 Tokens mit 100 Token Overlap zwischen Chunks. Bei strukturierten Dokumenten: nach Sections splitten, nicht nach fester Länge.
