Die moderne Standardarchitektur für Wissensdatenbanken
Eine herkömmliche Wissensdatenbanksuche liefert Links; der Nutzer liest sie. RAG macht daraus eine einmalige dialogbasierte Antwort mit Zitaten. Gute Umsetzung liefert Antworten in 2 Sekunden statt nach dem Durchsuchen von 5 Dokumenten. Bei schlechter Umsetzung halluziniert der Chatbot und Ihr CTO verbietet das Projekt für ein Jahr. Diese Seite erklärt den Unterschied.
Der minimal erforderliche Produktions-Stack
- Vektorspeicher: pgvector, wenn Sie bereits Postgres verwenden; Pinecone oder Qdrant als verwaltete Lösung
- Embeddings: text-embedding-3-large, direkt über OpenAI aufgerufen — Kunavo stellt keine Embeddings bereit, und der Embedding-Aufruf ist in jedem Fall eine separate Anfrage vom Generierungsaufruf
- Retrieval: hybrid (Vektor + BM25 mit Reciprocal-Rank-Fusion)
- Generierung: Claude Sonnet 5 mit cache_control im System-Prompt
- UI: Streaming-Antworten, Zitatanzeige, Fallback „Ich weiß es nicht“
from openai import OpenAI
client = OpenAI(api_key="sk-kn-...", base_url="https://api.kunavo.com/v1")
def chat(question: str, history: list[dict]) -> dict:
chunks = hybrid_retrieve(question, k=5) # vector + BM25
context = "\n\n---\n\n".join(
f"[doc:{c['id']}] {c['text']}" for c in chunks
)
resp = client.chat.completions.create(
model="claude-sonnet-5",
messages=[
{"role": "system", "content": [{
"type": "text",
"text": (
"Answer only from Context. Cite [doc:N] for each claim. "
"If Context doesn't answer, say 'I don't have that.' "
"Be concise, no throat-clearing."
),
"cache_control": {"type": "ephemeral"},
}]},
*history,
{"role": "user", "content": f"# Context\n{context}\n\n# Q\n{question}"},
],
max_tokens=600,
)
answer = resp.choices[0].message.content
cited_ids = parse_citations(answer) # extract [doc:N] references
return {"answer": answer, "sources": [c for c in chunks if c["id"] in cited_ids]}Kosten im Produktionsmaßstab
- Erstindizierung: etwa $0,25 für 5.000 Dokumente mit jeweils 500 Tokens
- 1.000 Anfragen/Tag: etwa $210/Monat mit Caching
- 10.000 Anfragen/Tag: etwa $2.100/Monat
- Bei Verwendung von Haiku 4.5 statt Sonnet: etwa 4-mal günstiger, etwa 85 % Antwortqualität
Die vollständige Architekturaufschlüsselung finden Sie im RAG-Implementierungsleitfaden. Sprachspezifische Hinweise finden Sie im Deep Dive zu japanischem RAG und im Leitfaden zu spanischem RAG.
Die drei Muster, die Halluzinationen tatsächlich verhindern
- Jede Behauptung zitieren:
[doc:42]-Tags in der Modellausgabe. Wenn die zitierte ID nicht in der abgerufenen Menge enthalten ist, handelt es sich um eine Halluzination — blockieren und protokollieren - Explizite Verweigerung im System-Prompt: „Wenn der Kontext keine Antwort liefert, sagen Sie: ‚Das weiß ich nicht.‘“ Ohne diese Vorgabe ergänzt das Modell Inhalte aus seinem Weltwissen
- Ausgabelimit von 600 Tokens: Kurze Antworten sind meist präzise Antworten. In längeren Ausgaben schleichen sich zusätzliche Erfindungen ein
Was in Woche 1 und was in Woche 4 ausgeliefert wird
| Woche | Meilenstein |
|---|---|
| 1 | 100 Dokumente, eine Chunking-Strategie, einfache Vektorsuche, Evaluationssatz mit 10 Fragen, etwa 70 % Recall@5 |
| 2 | Vollständiger Korpus, hybride Suche, Evaluationssatz mit 100 Fragen, erzwungene Zitate, interne Beta |
| 3 | Chunking anhand fehlgeschlagener Fragen optimieren, für interne Nutzer bereitstellen, CSAT messen |
| 4 | Monitoring und Kosten-Dashboard, tägliches Ausgabenlimit, öffentliche Beta oder Produktionsstart |
Start unter /app/signup
Eine Aufladung von $10 deckt die Erstindizierung von etwa 100.000 Dokumenten und 1.500 Testanfragen ab — mehr als genug für einen funktionalen Prototypen; das Guthaben verfällt nie. Lesen Sie anschließend den vollständigen RAG-Leitfaden für Produktionsmuster.
FAQ
How much does one RAG chatbot query cost?
About $0.007 per query on Claude Sonnet 4.6 with prompt caching active, or about $0.001 on Claude Haiku 4.5 — which returns roughly 85% of the quality at one-seventh of the cost.
How do I stop a RAG chatbot from hallucinating?
Three patterns do most of the work: require the model to cite a [doc:N] id for every claim, put an explicit refusal instruction in the system prompt, and cap the answer with max_tokens=600. Then verify every cited id appears in the retrieved set before rendering the answer.
What chunk size should a RAG index use?
1,000–1,500 characters per chunk with 100–200 characters of overlap, split with RecursiveCharacterTextSplitter and embedded with text-embedding-3-large.
Is vector search alone enough for RAG retrieval?
No. Hybrid retrieval combines vector similarity with BM25 keyword search and merges the two with reciprocal rank fusion, taking the top 5 chunks.