Retrieval-Augmented Generation (RAG) verbindet LLMs mit Ihren eigenen Daten — Wissensbasis, Dokumente, Datenbanken. Das AI SDK bietet native Unterstützung für Embedding-Generierung und nahtlose Integration mit Vector Stores.
Embeddings sind numerische Repräsentationen von Text in einem hochdimensionalen Vektorraum. Semantisch ähnliche Texte haben ähnliche Vektoren — das ermöglicht semantische Suche.
import { embed, embedMany } from 'ai'
import { openai } from '@ai-sdk/openai'
// Einzelnes Embedding
const { embedding } = await embed({
model: openai.embedding('text-embedding-3-large'),
value: 'Was ist Kubernetes?',
})
// Batch-Embeddings
const { embeddings } = await embedMany({
model: openai.embedding('text-embedding-3-large'),
values: ['Dokument 1...', 'Dokument 2...', 'Dokument 3...'],
})
| Modell | Dimensionen | Stärke |
|---|---|---|
| text-embedding-3-large (OpenAI) | 3.072 | Beste Qualität, vielseitig |
| text-embedding-3-small (OpenAI) | 1.536 | Gutes Preis-Leistungs-Verhältnis |
| voyage-3-large (Anthropic/Voyage) | 1.024 | Stark für Code und technische Texte |
| multilingual-e5-large (Open Source) | 1.024 | Mehrsprachig, Self-hosted möglich |
Das AI SDK integriert sich mit allen gängigen Vector-Datenbanken:
1. Dokumente indexieren:
import { embedMany } from 'ai'
import { openai } from '@ai-sdk/openai'
import { supabase } from '@/lib/supabase'
async function indexDocuments(documents: string[]) {
const { embeddings } = await embedMany({
model: openai.embedding('text-embedding-3-large'),
values: documents,
})
for (let i = 0; i < documents.length; i++) {
await supabase.from('documents').insert({
content: documents[i],
embedding: embeddings[i],
})
}
}
2. Relevante Dokumente abrufen:
async function findRelevantDocs(query: string) {
const { embedding } = await embed({
model: openai.embedding('text-embedding-3-large'),
value: query,
})
const { data } = await supabase.rpc('match_documents', {
query_embedding: embedding,
match_threshold: 0.7,
match_count: 5,
})
return data
}
3. Kontext an LLM übergeben:
export async function POST(req: Request) {
const { messages } = await req.json()
const lastMessage = messages[messages.length - 1]
const relevantDocs = await findRelevantDocs(lastMessage.content)
const context = relevantDocs.map(d => d.content).join('\n\n')
const result = streamText({
model: openai('gpt-4.1'),
system: `Beantworte Fragen basierend auf diesem Kontext:\n\n${context}`,
messages,
})
return result.toDataStreamResponse()
}
LLMs haben ein begrenztes Context Window (128K–2M Tokens). Effektives RAG muss relevante Informationen in dieses Fenster packen — ohne es zu überladen.
| Strategie | Beschreibung | Wann |
|---|---|---|
| Top-K Retrieval | Die K ähnlichsten Dokumente | Standard |
| Reranking | Ergebnisse mit einem Reranker-Modell neu sortieren | Höhere Qualität |
| Chunking | Dokumente in kleinere Teile aufteilen | Lange Dokumente |
| Hierarchical | Erst grob suchen, dann detailliert | Große Wissensbasen |
| Hybrid Search | Vektor + Keyword + Filter kombinieren | Komplexe Anfragen |
RAG-Realität: Die Qualität Ihres RAG-Systems hängt zu 80 % von der Datenaufbereitung ab (Chunking, Cleaning, Metadata) und nur zu 20 % vom Modell. Investieren Sie in Ihre Datenpipeline.