Das native RAG ist neben NL2SQL Teil der nativen KI, die in das Aurabase-Backendintegriert ist: kein Drittanbieterdienst, der auf einer allgemeinen Basis zusammengestellt werden kann. Voraussetzungen für die Durchführung dieses Tutorials: ein vorhandenes Aurabase-Projekt, ein konfigurierter LLM-Anbieter (OpenAI oder Google Gemini für Einbettungen, einer der drei nativen Anbieter für die Generierung) und ein Projekt-API-Schlüssel.
- Eine Aurabase RAG-Pipeline besteht aus zwei Aufrufen:
ragIngest()zum Indizieren eines Dokuments,rag()zum Abfragen und Generieren einer Antwort. Chunking, Einbettungen und Vektorsuche werden serverseitig verwaltet. - Unter der Haube sind es Standard-PostgreSQL und pgvector: eine
embeddings-Tabelle mit einer Vektorspalte pro Dimensionsklasse (768, 1536, 3072) und einem partiellen HNSW-Index pro Klasse. - Beim Chunking wird ein echter Tokenizer (
tiktokeno200k) mit konfigurierbarer Überlappung und einem Explosionsschutz für große Dokumente verwendet. - Der abgerufene Inhalt wird neutralisiert, bevor er in die Eingabeaufforderung eingefügt wird: Ein Dokument, das versucht, sein Tag zu umgehen, um Systemanweisungen zu fälschen, wird explizit entschärft.
- Nur OpenAI und Gemini generieren Einbettungen auf der Aurabase-Seite. Anthropic/Claude verfügt nicht über eine öffentliche Einbettungs-API, sie bleibt für die Generierung der endgültigen Antwort reserviert.
Wie diese RAG-Pipeline funktioniert
Die Pipeline erfolgt in fünf Stufen. Bei der Aufnahme wird der Text zerschnitten, jeder Block wird stapelweise vektorisiert und dann gespeichert. Bei der Abfrage wird die Frage der Reihe nach vektorisiert, mit den durch Kosinusähnlichkeit gespeicherten Blöcken verglichen und die nächstgelegenen Schnipsel werden in die an das Generierungsmodell gesendete Eingabeaufforderung eingefügt.
Chunking (tiktoken)→Einbettungen (Batch)→pgvector storage (HNSW)→Ähnlichkeitssuche→Erweiterte Generierung
Ein architektonisches Detail, das in der Produktion von Bedeutung ist: Bei Netzwerkanrufen an den Einbettungs- oder Generierungsanbieter wird keine Postgres-Verbindung aufrechterhalten. Die DB-Transaktion wird vor dem externen Aufruf geschlossen und danach erneut geöffnet, um niemals ein gemeinsam genutztes PgBouncer-Backend für Netzwerklatenz von Drittanbietern zu blockieren.
Erstellen Sie das Projekt
Im Gegensatz zu einem typischen selbstgehosteten pgvector müssen Sie für diese Pipeline weder CREATE EXTENSION vector ausführen noch selbst eine Tabelle erstellen. Das embeddings-Schema des Projekts mit seinen Vektorspalten und HNSW-Indizes wird automatisch bereitgestellt, wenn das Projekt erstellt wird.
Der Einbettungsanbieter wird einmalig auf Projektseite konfiguriert (Studio → IA → Lieferanten). Es ist dieser Anbieter, der die effektive Dimension Ihrer Vektoren bestimmt, also die Spalte, die in der Tabelle embeddingsverwendet wird.
Indizieren Sie Ihre Dokumente mit ragIngest()
Ein Aufruf reicht aus, um ein Dokument zu indizieren: Der Text wird in Blöcke unterteilt, jeder Block wird vektorisiert und dann im angeforderten Namensraum gespeichert. Die Aufteilung verwendet einen echten Tokenizer (tiktoken, Kodierung o200k_base), keine einfache Aufteilung nach Leerzeichen, die bei Text ohne Leerzeichen wie in einigen asiatischen Sprachen korrekt bleibt.
In rohem HTTP ist die entsprechende Route POST /v1/ai/{project_id}/rag/ingest, authentifiziert durch den API-Schlüssel des Projekts.
Die Aufnahme ist standardmäßig idempotent: Eine Dokumentkennung wird automatisch abgeleitet (SHA-256-Hash des Inhalts oder metadata.document_id, wenn Sie ihn angeben). Durch die erneute Einbindung desselben Inhalts werden dessen vorhandene Blöcke ersetzt, anstatt sie zu duplizieren, sodass ein regelmäßiger Synchronisierungsauftrag sicher wiederholt werden kann.
Was tatsächlich in Postgres landet
Hier gibt es keine proprietäre Magie: Die Tabelle, die Ihre Vektoren empfängt, ist eine gewöhnliche Postgres-Tabelle mit einer vector-Spalte pro Dimensionsklasse und einem partiellen HNSW-Index pro Spalte (aktiv nur für die Zeilen, die sie füllen). Hier ist die tatsächliche Definition, vereinfacht:
Bei jeder Suche werden die Vektoren mit dem Kosinus-Abstandsoperator (<=>) verglichen, auf den die Operatorklassen vector_cosine_ops und halfvec_cosine_ops des Index abzielen. Einzelheiten zu den Recall-/Latenz-Kompromissen von HNSW gegenüber IVFFlat finden Sie im Artikel zur HNSW-Indizierung. Für die Wahl der Einbettungsdimension selbst siehe den Vergleich 768 vs 1536 vs 3072.
Fragen Sie ab und generieren Sie eine Antwort mit rag()
Auf der Abfrageseite verkettet rag() die Vektorisierung der Frage, die Suche nach Ähnlichkeit im Namespace, die Konstruktion des erweiterten Prompts und den Aufruf des Generierungsmodells in einem einzigen Netzwerk-Roundtrip auf der Client-Seite.
Die Antwort enthält die generierte Antwort und ihre Quellen sowie den tatsächlich verwendeten Anbieter:
Der abgerufene Inhalt wird niemals roh in die Systemeingabeaufforderung eingefügt. Hierbei handelt es sich um unzuverlässige Daten (Benutzer-Upload, indizierte Seite): Ein Dokument, das beispielsweise ein Schlussabschnitts-Tag gefolgt von falschen Anweisungen enthält, wird vor dem Zusammensetzen neutralisiert, seine spitzen Klammern werden durch Klammern ersetzt, der Text bleibt erhalten, die Struktur wird jedoch entschärft.
Wenn rag() nichts findet, obwohl Ihr Namespace nicht leer ist, enthält die Antwort eine explizite Warnung und nicht ein irreführendes Schweigen: Ihr Korpus ist wahrscheinlich unter einem anderen Modell oder einer anderen Einbettungsdimension indiziert. Indizieren Sie es über POST /v1/ai/{project_id}/rag/{namespace}/reindexneu.
From LangChain and a handmade pgvector: what changes
Wenn Sie mit LangChain bereits einen RAG-Chatbot auf PostgreSQL erstellt haben, verfügt jeder manuelle Baustein hier über ein serverseitig verwaltetes Äquivalent, ohne die zugrunde liegende Datenbank zu ändern.
| Den Text aufbrechen | RecursiveCharacterTextSplitter können Sie selbst festlegen | ragIngest(): integriertes Tiktoken-Chunking, standardmäßig 512 Tokens / 64 Überlappung |
|---|---|---|
| Einbettungen | Manueller Aufruf von OpenAIEmbeddings, Verwaltung von Batch-Limits | Automatisch gestapelter, integrierter vorübergehender Wiederholungsversuch |
| Vektorspeicher | pgvector-Tabelle + HNSW-Index zum Erstellen und Migrieren | Schema und Indizes werden pro Projekt bereitgestellt |
| Suchen + Eingabeaufforderung | PGVector.similarity_search() und dann die Eingabeaufforderung manuell zusammenstellen | rag(): search and augmented generation in one call |
| Wiederhergestellter Inhalt | Gespritzt wie es in der Aufforderung steht | Automatische Neutralisierung von Struktur-Tags vor dem Zusammenbau |
Migrieren Sie ein bestehendes, auf Supabase erstelltes Projekt mit dieser Art der manuellen Montage? Die Migrationslogik für den Rest des Backends (Schema, RLS-Richtlinien, SDK) wird in unserem Migrationsleitfaden von Supabase zu Aurabasebehandelt.
Bevor Sie mit der Produktion beginnen, müssen Sie sich über Einstellungen und Grenzen im Klaren sein
Three settings directly affect cost and latency, all verified in the aura-aiservice code. The number of attempts on a transient embedding call (network failure, provider error 429) is 3 by default, with a base backoff of 100 ms. Große Dokumente werden standardmäßig in Teilstapel eingebettet, die auf 2048 Blöcke begrenzt sind, um die API-Obergrenzen der Lieferanten zu respektieren, ohne dass es bei einem einzigen riesigen Dokument zu Fehlern kommt. Eine Leitplanke (standardmäßig 10.000 Blöcke, konfigurierbar) lehnt explizit die Aufnahme eines Dokuments ab, das eine abweichende Anzahl von Blöcken erzeugen würde.
Auf der Suchseite passt sich die Größe der HNSW-Kandidatenliste automatisch an max(64, top_k × 4)an: Je mehr Ergebnisse Sie anfordern, desto mehr Kandidaten werden vom Index untersucht, um die Erinnerung zu wahren. A fixed value remains possible via an environment variable if your corpus has a particular profile.
Die Vektorräume verschiedener Modelle werden niemals miteinander verglichen: Jede Suche bleibt auf das aktuelle Einbettungsmodell beschränkt, und ein Wechsel der Modelle erfordert eine explizite Neuindizierung und nicht einen stillen Wechsel, der die Konsistenz der Ergebnisse beeinträchtigen würde.
Aktuelle Grenzwerte, die Sie beachten sollten
Die Einbettungsdimension muss in eine der drei unterstützten Klassen fallen: 768, 1536 oder 3072. Ein Anbieter, der eine andere Dimension zurückgibt, wird mit einem expliziten Fehler abgelehnt, niemals abgeschnitten oder stillschweigend umgewandelt.
Die Einbettungsgenerierung ist bei den drei nativen Anbietern nur über OpenAI oder Google Gemini verfügbar: Anthropic/Claude stellt keine öffentliche Einbettungs-API zur Verfügung, daher wird sie nur zum Generieren der endgültigen Antwort in dieser Pipeline verwendet, niemals zur Vektorisierung.
Das JavaScript SDK stellt die Überschreibungen top_k und threshold beim rag()-Aufruf noch nicht zur Verfügung: Sie bleiben im direkten HTTP zugänglich und auf [1, 50] bzw. [0, 1] beschränkt, jedoch nicht wie heute über aura.ai.rag(). The default similarity threshold (0.3) is deliberately permissive; narrow it down to a dense corpus to avoid irrelevant sources in the prompt.
Um weiter zu gehen
The RAG covers questions on unstructured content (documents, notes, tickets). For questions about your relational data, Aurabase's native NL2SQL directly translates a question into validated SQL. For details of the HNSW parameters and dimension classes mentioned above, see the article on HNSW indexing and the comparison of embedding dimensions. The full API reference remains the RAG & pgvector documentation and the AI Gateway documentation.