In den letzten Jahren hat sich retrieval-augmented generation (RAG) als Standardansatz etabliert, der großen Sprachmodellen (LLM) ermöglicht, auf externe Wissensdatenbanken zuzugreifen. Dadurch können produktive Anwendungen aktuellere und präzisere Antworten liefern und gleichzeitig das Risiko von Halluzinationen reduzieren. In diesem Artikel zeigen wir, wie Produktteams eine effiziente RAG‑Pipeline aufbauen können, welche Kosten und Herausforderungen damit verbunden sind und wie Coderia.it diese Techniken in täglichen Projekten einsetzt.
Warum RAG‑LLM in produktiven Anwendungen?
Traditionelle LLM basieren ausschließlich auf Trainingsdaten, die schnell veralten. Retrieval-augmented generation für Produktteams fügt eine Schicht zur Dokumentensuche hinzu, die die neuesten und relevantesten Informationen liefert. Dadurch erhalten wir zwei zentrale Vorteile: höhere Antwortgenauigkeit und reduzierte Kosten für kontinuierliches Fine‑Tuning des Modells.
Grundarchitektur einer RAG‑Pipeline
Eine typische Pipeline besteht aus drei Schritten:
- Ingestion und Indexierung – Dokumente werden verarbeitet, in Fragmente aufgeteilt und mittels eines Einbettungsmodells in Vektoren umgewandelt.
- Vektorbasierte Suche – die Nutzeranfrage wird eingebettet und mit den nächsten Vektoren in der Datenbank abgeglichen (z. B. mit
FAISSoderMilvus). - Generierung – die ausgewählten Fragmente werden als Kontext an das LLM übergeben, das die finale Antwort erzeugt.
Wichtig ist, dass die Suchschicht schnell (niedrige Latenz) und skalierbar ist und gleichzeitig ein angemessenes Datenschutzniveau gewährleistet.
Wie man eine RAG‑Pipeline in Node.js aufbaut
Nachfolgend ein einfaches Beispiel, das node-fetch, openai und faiss-node verwendet. Der Code ist bewusst knapp gehalten, zeigt aber die wesentlichen Schritte: Embedding‑Vorbereitung, Suche und Aufruf des LLM.
const fetch = require('node-fetch');
const { OpenAI } = require('openai');
const { FaissIndex } = require('faiss-node');
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const index = new FaissIndex('cosine'); // Vektorbasierte Suche für große Sprachmodelle
async function embed(text) {
const resp = await openai.embeddings.create({
model: 'text-embedding-ada-002',
input: text,
});
return resp.data[0].embedding;
}
async function retrieve(query) {
const qVec = await embed(query);
const ids = index.search(qVec, 5); // Top‑5 nächste Fragmente
return ids.map(id => index.getDocument(id));
}
async function generateAnswer(query) {
const context = await retrieve(query);
const prompt = `Context:\n${context.join('\n')}\n\nQuestion: ${query}\nAnswer:`;
const completion = await openai.completions.create({
model: 'gpt-4',
prompt,
max_tokens: 200,
});
return completion.choices[0].text.trim();
}
module.exports = { generateAnswer };
In der Praxis erfordert die Pipeline zusätzliche Komponenten wie Index‑Updates, Kosten‑Monitoring und Fallback‑Mechanismen, wenn die Suche nicht ausreichend relevante Ergebnisse liefert.
Kosten und Latenz von RAG in der Cloud vs. On‑Device
In der Cloud können verwaltete Dienste (z. B. Azure Cognitive Search, Pinecone) genutzt werden – sie bieten hohe Verfügbarkeit und automatische Skalierbarkeit, verursachen jedoch Kosten für Datenübertragung und Vektor‑Speicherung. On‑Device‑Lösungen (z. B. onnxruntime + lokales FAISS) eliminieren Transferkosten und erhöhen die Privatsphäre, sind jedoch in ihrer Skalierbarkeit begrenzt und können intensive Speicheroptimierung erfordern.
Ein typischer Trade‑off sieht folgendermaßen aus:
- Cloud: höhere Betriebskosten, niedrige Latenz (



