TL;DR
RAG (Retrieval-Augmented Generation) ist ein Chatbot, der vor der LLM-Antwort relevante Fragmente in der Wissensbasis sucht. Kern: Chunking, Embeddings, Vektorspeicher (z. B. pgvector in Branchly) und Prompts mit zitierten Quellen. Pipeline von PDF/FAQ bis Next.js-API — technischer Blickwinkel ergänzend zu Artikeln über Wissensinhalte, nicht über FAQ-Texte.
Für wen
- Produktteams mit Chatbot auf Firmenwebsite oder in SaaS
- Entwickler jenseits von „gesamte AGB in den Prompt“
- Unternehmen mit hunderten Doc-Seiten, wo Fine-Tuning ökonomisch keinen Sinn ergibt
- CTOs mit Abwägung Inference-Kosten vs Antwortqualität
Keyword (SEO)
rag chatbot implementierung, embeddings vektorsuche, pgvector nextjs, ki chatbot wissensbasis technisch 2026
RAG vs Prompt Stuffing — warum Embeddings
| Ansatz | Limit | Kosten | Wissens-Updates |
|---|---|---|---|
| Gesamtes FAQ im System-Prompt | Kontextfenster (~128k Token, ineffizient) | Hoch pro Frage | Manuelle Prompt-Pflege |
| Fine-Tuning | Teuer, langsame Iteration | Einmalig + Retrain | Retrain |
| RAG + Embeddings | Skaliert auf tausende Chunks | Embed einmal + günstige Query | Chunk Re-Index |
Ein Embedding ist ein Vektor (z. B. 1536 Dimensionen) für die Semantik eines Absatzes. Die Nutzerfrage wird ebenfalls vektorisiert — nächste Cosinus-Nachbarn, kein Keyword-Match.
Deployment-Pipeline — 6 Schritte
[Dokumente] → Chunking → Embedding API → [Vector Store]
↓
[Nutzerfrage] → Embedding → Top-k Retrieval → Prompt + LLM → Antwort + Quellen- Ingest — Markdown aus Repo, Angebots-PDFs, FAQ-Export aus Branchly
- Chunking — 400–800 Token, Overlap 50–100, Überschrift in Metadaten
- Embed —
text-embedding-3-small(günstiger) oder-large(genauer) - Store — Tabelle
document_chunksmit Spalteembedding vector(1536) - Query — Frage embedden →
ORDER BY embedding <=> query_vec LIMIT 5 - Generate — GPT-4o-mini mit Anweisung: „Antworte nur aus Kontext unten“
Chunking — praktische Regeln
Schlechte Splits = schlechte Antworten, auch mit gutem Modell.
- Split an Markdown-Überschriften (
##), nicht mitten im Satz - Metadaten:
source_url,locale,updated_at,section_title - Preistabellen — eigener Chunk mit Kontext „Preise 2026“
- PL/EN-Duplikate — separate Embeddings pro Sprache,
locale-Filter in Query
Beispiel in Branchly (branchly.cloud) mit pgvector:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE document_chunks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
content TEXT NOT NULL,
embedding vector(1536),
source_url TEXT,
locale TEXT DEFAULT 'de',
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX ON document_chunks
USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);Unter 10k Chunks reicht ivfflat; darüber HNSW oder dedizierte Engine (Qdrant, Pinecone) — hinter derselben API.
Ingest-Code in Next.js
// scripts/ingest-knowledge.ts
import OpenAI from 'openai';
import { db } from '@/lib/db';
const openai = new OpenAI();
async function embedAndStore(chunks: { text: string; meta: ChunkMeta }[]) {
for (const batch of chunk(chunks, 50)) {
const res = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: batch.map((c) => c.text),
});
for (let i = 0; i < batch.length; i++) {
await db.$executeRaw`
INSERT INTO document_chunks (content, embedding, source_url, locale)
VALUES (
${batch[i].text},
${JSON.stringify(res.data[i].embedding)}::vector,
${batch[i].meta.sourceUrl},
${batch[i].meta.locale}
)
`;
}
}
}Nach Content-Deploy oder per Cron auf DevStudioIT Cloud — nicht bei jeder Nutzerfrage.
RAG-Chat-Endpoint
// app/api/chat/route.ts
import OpenAI from 'openai';
import { streamText } from 'ai';
export async function POST(req: Request) {
const { message, locale } = await req.json();
const queryEmbedding = await embed(message);
const chunks = await db.$queryRaw<Chunk[]>`
SELECT content, source_url
FROM document_chunks
WHERE locale = ${locale}
ORDER BY embedding <=> ${queryEmbedding}::vector
LIMIT 5
`;
const context = chunks.map((c, i) => `[${i + 1}] ${c.content}`).join('\n\n');
return streamText({
model: openai('gpt-4o-mini'),
system: `Antworte auf Deutsch. Nutze nur den Kontext unten. Fehlen Daten — sage, dass du es nicht weißt.
Kontext:
${context}`,
messages: [{ role: 'user', content: message }],
});
}Front-end: Widget mit Links zu source_url unter der Antwort — Vertrauen und weniger Halluzinationen.
Retrieval-Qualität — was Relevanz verbessert
- Hybrid Search: BM25 (Volltext in Postgres) + Vektor, Merge — besser für SKUs
- Re-Ranking: nach Top-20 Vektor, Cross-Encoder oder LLM wählt Top-5
- Query Rewrite: LLM formuliert Nutzerfrage als Suchquery vor Embed
- Threshold: max similarity < 0,75 → „Dazu habe ich keine Information“
Log question, chunk_ids, similarity scores in Branchly — wöchentlich 20 Gespräche mit niedrigem Score reviewen.
Kosten und Latenz (grob 2026)
- Embedding 1M Token
text-embedding-3-small: Größenordnung wenige USD - GPT-4o-mini mit 2k Kontext-Token: Cent pro Gespräch
- pgvector Query <50 ms mit Index — Engpass ist LLM (TTFT ~300–800 ms)
- Embedding-Cache für identische Fragen — ~30 % Ersparnis bei Support-FAQ
Hosting auf DevStudioIT Cloud (devstudioit.cloud): Route Handler mit Streaming, Rate Limits pro IP, OpenAI-Keys in env.
Sicherheit und DSGVO
- Keine Kunden-PII oder interne B2B-Preise indexieren
- Rate Limiting und CAPTCHA auf öffentlichem
/api/chat - Log-Retention 90 Tage, Anonymisierung
- Datenschutzhinweis zu OpenAI-Verarbeitung (DPA, EU-Region falls nötig)
Erfolgsmetriken nach Go-live
Nach 4 Wochen Produktion messen:
- Answer accuracy — manuelle Bewertung von 50 Zufalls-Chats (Ziel: >85 % treffend)
- Fallback rate — wie oft niedriges Similarity zu „weiß nicht“ führt (Ziel: 10–20 %)
- Chunk-Anzahl im Kontext vs Latenz
- Klicks auf source_url — Vertrauens-Proxy
Dashboard in Branchly: Tabelle chat_logs mit question, chunk_ids, user_rating. Chunking quartalsweise iterieren — Antwort-Stabilität schlägt tägliches Tweaking.
FAQ
Ersetzt RAG den Wissensbasis-Artikel?
Nein — dort geht es um was rein soll (FAQ, AGB). Hier wie technisch suchen und generieren.
pgvector vs Pinecone?
pgvector in Branchly = weniger Bausteine für kleine/mittlere Projekte. Pinecone/Qdrant ab >500k Chunks oder Multi-Tenant.
Wie oft Re-Index?
Bei Content-Änderung — CMS-Webhook → partielles Re-Ingest geänderter URLs.
Ohne OpenAI?
Ja — lokale Embedding-Modelle + Llama; Trade-off: Sprachqualität und GPU-Betrieb.
Mehrsprachigkeit?
locale-Filter in SQL + separate Chunks; PL und DE nicht in einem Embed mischen.
CTA
Chatbot, der Ihre Dokumentation zitiert statt zu erfinden?
- RAG-Chatbot anfragen — Architektur, Branchly pgvector, Next.js, DevStudioIT Cloud
- KI-Chatbot für Unternehmen — Geschäftsprozess und Kosten
Über den Autor
Wir bauen schnelle Websites, Web/Mobile-Apps, KI-Chatbots und Hosting — mit Fokus auf SEO und Conversion.
Empfohlene Links
Von Theorie zu Produktion — Branchly, Hosting-Stack und Referenzen.
