Auf dieser Seite wird beschrieben, wie Sie die AlloyDB Omni AI-Abfrage-Engine verwenden und intelligente SQL-Abfragen mit KI-Funktionen ausführen.
AlloyDB AI-Funktionen integrieren Large Language Models (LLMs) wie Gemini direkt in Ihre AlloyDB Omni-Daten, um intelligente Datenvorgänge auszuführen. Diese Funktion umfasst integrierte Funktionen für Folgendes:
- Filtern (
ai.if) - Semantische Rangfolge (
ai.rank) - Textgenerierung (
ai.generate)
Diese KI-Funktionen verwenden die AlloyDB AI-Abfrage-Engine, um Ihre Anwendung bei der Verarbeitung von Daten mit Modellen für künstliche Intelligenz in verschiedenen Größenordnungen zu unterstützen, von Antworten mit einer einzelnen Zeile bis hin zu umfangreichen Datenbankvorgängen. Mit den Operatoren ai.if, ai.rank und ai.generate können Sie natürliche Sprache mit SQL-Abfragen kombinieren. AlloyDB AI reserviert und erstellt das
ai-Schema.
Es gibt drei Kategorien von KI-Funktionen, die sich darin unterscheiden, wie sie Eingabedaten und die Arbeitsspeicherzuweisung verarbeiten: Skalar-, Array-basierte und Cursor-Funktionen. Die Wahl der richtigen KI-Funktion hängt von der Größe Ihrer Daten und Ihren Leistungsanforderungen ab. In der folgenden Tabelle finden Sie Informationen zu diesen Funktionen und ihren Anwendungsfällen:
Kategorie |
Beschreibung |
Empfohlener Anwendungsfall |
Skalar |
Für die einfache 1:1-Verarbeitung konzipiert. Akzeptiert eine einzelne Eingabe und gibt eine einzelne Ausgabe zurück. |
Verwenden Sie diese Funktion, wenn Sie eine einfache Funktion benötigen, die eine akzeptable Leistung für Abfragen bietet, die eine geringe Anzahl – weniger als 50 – von Skalarfunktionsaufrufen ausführen. |
Array-basiert |
Verarbeitet Daten als Array von Zeilen in einem einzigen Funktionsaufruf. Akzeptiert ein Array als Eingabe und gibt ein Array als Ausgabe zurück. |
Verwenden Sie diese Funktion für kleine bis mittelgroße Datasets, bei denen das gesamte Array der infrage kommenden Zeilen in die Speicherlimits passt. Dies bietet einen hohen Durchsatz für setbasierte Vorgänge. |
Cursor |
Akzeptiert einen Cursor als Eingabe und gibt einen Cursor als Ausgabe zurück. |
Verwenden Sie diese Funktion, um eine große Anzahl von Zeilen zu verarbeiten,z. B. 10.000 Zeilen. |
Hinweis
- Konfigurieren Sie den Nutzerzugriff auf Vertex AI-Modelle.
-
Prüfen Sie, ob die neueste Version von
google_ml_integrationinstalliert ist.-
Führen Sie den folgenden Befehl aus, um die installierte Version zu prüfen:
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.5.2 (1 row)
-
Wenn die Erweiterung nicht installiert ist oder die installierte Version älter als 1.5.2 ist, aktualisieren Sie die Erweiterung.
CREATE EXTENSION IF NOT EXISTS google_ml_integration; ALTER EXTENSION google_ml_integration UPDATE;
Wenn beim Ausführen der vorherigen Befehle Probleme auftreten oder die Erweiterung nach dem Ausführen der vorherigen Befehle nicht auf Version 1.5.2 aktualisiert wird, wenden Sie sich an den Google Cloud Support.
-
-
Wenn Sie die Funktion der AlloyDB AI-Abfrage-Engine verwenden möchten, setzen Sie das
google_ml_integration.enable_ai_query_engineFlag aufon.SQL
-
Aktivieren Sie die KI-Abfrage-Engine für die aktuelle Sitzung.
SET google_ml_integration.enable_ai_query_engine = on;
-
Aktivieren Sie Funktionen für eine bestimmte Datenbank sitzungsübergreifend.
ALTER DATABASE DATABASE_NAME SET google_ml_integration.enable_ai_query_engine = 'on';
-
Aktivieren Sie die KI-Abfrage-Engine für einen bestimmten Nutzer sitzungs und datenbankübergreifend.
ALTER ROLE postgres SET google_ml_integration.enable_ai_query_engine = 'on';
-
- Verwenden Sie ein Gemini-Modell, das in Ihrer Region unterstützt wird. Gemini 2.5 Flash Lite ist das Standardmodell der KI-Abfrage-Engine. Wenn Sie in der Abfrage kein Gemini-Modell angeben, wird das Standardmodell der KI-Abfrage-Engine für die Abfragen ausgewählt.
Ein Gemini-Modell verwenden, das in Ihrer Region unterstützt wird
Wenn sich Ihr AlloyDB Omni-Cluster in einer Region befindet, in der gemini-2.5-flash-lite
nicht unterstützt wird, können Sie eines der anderen verfügbaren Gemini-Modelle
in Ihrer Region mit dem model_id parameter verwenden.
Alternativ können Sie einen Gemini-Modellendpunkt registrieren und diese Modell-ID an die KI-Operatoren übergeben. Weitere Informationen finden Sie unter Remote-KI-Modelle mit der Modellendpunktverwaltung registrieren und aufrufen.
Das folgende Beispiel zeigt, wie Sie einen anderen Gemini-Endpunkt registrieren. In diesem Beispiel ist dieser zweite Gemini-Endpunkt der globale Endpunkt für gemini-2.5-flash-lite. Sie können dieses registrierte Modell
mit KI-Operatoren verwenden, indem Sie model_id => 'gemini-2.5-flash-lite-global' als ein
zusätzliches Argument übergeben.
CALL
google_ml.create_model(
model_id => 'gemini-2.5-flash-lite-global',
model_type => 'llm',
model_provider => 'google',
model_qualified_name => 'gemini-2.5-flash-lite',
model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-2.5-flash-lite:generateContent',
model_auth_type => 'alloydb_service_agent_iam'
);
Gemini 3.0-Modelle verwenden
Einige Gemini-Modelle wie gemini-3.0-pro-preview sind nur über den globalen Endpunkt verfügbar. Sie müssen solche Modelle so registrieren:
CALL
google_ml.create_model(
model_id => 'gemini-3-preview-model',
model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3-pro-preview:generateContent',
model_qualified_name => 'gemini-3-pro-preview',
model_provider => 'google',
model_type => 'llm',
model_auth_type => 'alloydb_service_agent_iam'
);
Ersetzen Sie PROJECT_ID durch die ID des Projekts, in dem das Vertex AI-Modell verfügbar ist. Das
AlloyDB Omni-Dienstkonto muss in
diesem Projekt die Rolle „Vertex AI-Nutzer“ haben.
Nachdem Sie das Modell registriert haben, können Sie es so in KI-Funktionen verwenden:
SELECT ai.generate(prompt => 'What is AlloyDB?', model_id => 'gemini-3-preview-model');
Filter in Abfragen verwenden
AlloyDB AI bietet KI-gestützte SQL-Funktionen, mit denen Sie die Verarbeitung natürlicher Sprache und LLMs direkt in Ihren Datenbankabfragen verwenden können, einschließlich der Operatoren ai.if und ai.rank.
Mit Skalarfunktionen filtern
Verwenden Sie den Operator ai.if/google_ml.if, um zu prüfen, ob eine in natürlicher Sprache angegebene Bedingung erfüllt ist. Die Funktion gibt einen booleschen Wert „true“ oder „false“ zurück und gibt false zurück, wenn die Ausgabe nicht eindeutig erkannt wird.
- Function signature
FUNCTION ai.if(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS bool
Das folgende Beispiel zeigt die Verwendung des Operators ai.if als Filter,um Restaurants mit mehr als 500 positiven Bewertungen in Städten mit mehr als 100.000 Einwohnern zu finden. Das Beispiel verwendet restaurant_reviews und enthält Daten wie Bewertungen und den Standort der Stadt. Mit dem Operator ai.if können Sie die Stimmung der Bewertung analysieren und die Standorte aus der Datenbank mit dem allgemeinen Wissen von Gemini über die Bevölkerung an diesen Standorten kombinieren.
SELECT r.name, r.location_city
FROM restaurant_reviews r
WHERE
AI.IF(r.location_city || ' has a population OF more than 100,000 AND the following is a positive review; Review: ' || r.review)
GROUP BY r.name, r.location_city
HAVING COUNT(*) > 500;
Im Folgenden sehen Sie dasselbe Beispiel mit dem Modell, das Sie unter Ein Gemini-Modell verwenden, das in Ihrer Region unterstützt wird registriert haben.
SELECT r.name, r.location_city
FROM restaurant_reviews r
WHERE
AI.IF(r.location_city || ' has a population of more than 100,000 AND the following is a positive review; Review: ' || r.review, model_id => 'gemini-2.5-flash-lite')
GROUP BY r.name, r.location_city
HAVING COUNT(*) > 500;
Join für eine Abfrage ausführen, die den Operator „if“ verwendet
Verwenden Sie den Operator ai.if/google_ml.if mit „join“, um einen Join-Vorgang auszuführen.
Die folgende Beispielabfrage ermittelt die Anzahl der Bewertungen, in denen die einzelnen Menüpunkte aus der Speisekarte des Restaurants erwähnt werden.
SELECT item_name, COUNT(*)
FROM menu_items JOIN user_reviews
ON ai.if(
prompt => 'Does the following user review talk about the menu item mentioned ? review: ' || user_reviews.review_text || ' menu item: ' || item_name)
GROUP BY item_name;
Mit Array-basierten Funktionen filtern
Im folgenden Beispiel werden Restaurants mit mehr als 10 positiven Bewertungen ermittelt, indem ein KI-Modell (gemini-2.5-flash-lite) verwendet wird, um die Stimmung der Bewertungen zu analysieren und die Ergebnisse zu filtern. ARRAY_AGG wird verwendet, um einzelne Datenzeilen in strukturierte Arrays umzuwandeln, damit sie vom KI-Modell in großen Mengen und nicht zeilenweise verarbeitet werden können.
WITH initial_arrays AS (WITH initial_arrays AS (
SELECT
ARRAY_AGG(r.id ORDER BY r.id) AS review_ids,
-- Assuming ai.if takes an array of prompts and returns a boolean array
ai.if(
prompts => ARRAY_AGG('Is the review positive: ' || r.review ORDER BY r.id)
model_id => 'gemini-2.5-flash-lite',
batch_size => 20
) AS truth_values
FROM restaurant_reviews r
),
reviews AS (
SELECT
initial_arrays.review_ids[i] AS review_id,
initial_arrays.truth_values[i] AS truth_value
FROM
initial_arrays,
generate_series(1, array_length(initial_arrays.review_ids, 1)) AS i
)
SELECT rest_review.city, rest_review.name
FROM restaurant_reviews rest_review JOIN reviews review ON rest_review.id=review.review_id
WHERE review.truth_value = 't'
GROUP BY rest_review.city, rest_review.name
HAVING COUNT(*) > 10;
Mit Cursors filtern
Im folgenden Beispiel wird gezeigt, wie Sie eine große Anzahl von Restaurantbewertungen filtern, indem Sie sie über einen Cursor streamen.
CREATE TABLE filtered_results(input text, result bool);
DO $$
DECLARE
prompt_cursor REFCURSOR;
result_cursor REFCURSOR;
rec RECORD;
BEGIN
-- 1. Open a cursor for the input data
OPEN prompt_cursor FOR
SELECT r.location_city || ' has a population of > 100,000 and is a positive review; Review: ' || r.review
FROM restaurant_reviews r;
-- 2. Call the array-based function using the input cursor
result_cursor := ai.if(
'Is the given statement true? ',
prompt_cursor,
model_id => 'gemini-2.5-flash-lite'
);
-- 3. Fetch results from the output cursor and store them
LOOP
FETCH result_cursor INTO rec;
EXIT WHEN NOT FOUND;
INSERT INTO filtered_results VALUES(rec.input, rec.output);
END LOOP;
CLOSE result_cursor;
END $$;
Textgenerierung und -zusammenfassung
AlloyDB AI bietet Operatoren zur Textgenerierung wie die Skalarfunktion ai.generate und die Array- und Cursor-basierten Funktionen ai.generate.
Text mit Skalarfunktionen generieren
Die Funktion ai.generate erstellt Text, indem sie die bereitgestellten Daten mit dem Prompt des Nutzers kombiniert.
-- Function Signature
FUNCTION ai.generate(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS TEXT
Mit der folgenden Abfrage können Sie beispielsweise eine kurze Zusammenfassung jeder Nutzerbewertung erstellen.
SELECT
ai.generate(
prompt => 'Summarize the review in 20 words or less. Review: ' || review) AS review_summary
FROM user_reviews;
Text mit Array-basierten Funktionen generieren
Die folgende Abfrage verwendet UNNEST und ai.generate, um mehrere Bewertungen effizient zusammenzufassen.
SELECT
UNNEST(
ai.generate(
prompts => ARRAY_AGG('Summarize the review in 20 words or less. Review: ' || review),
model_id => 'gemini-2.5-flash-lite',
)
) AS review_summary
FROM user_reviews;
Text mit Cursors generieren
Verwenden Sie die Batchgenerierung mit Cursors, um Zusammenfassungen oder Übersetzungen für Millionen von Zeilen zu erstellen, ohne Speicherengpässe zu verursachen.
CREATE TABLE summary_results(summary text);
DO $$
DECLARE
prompt_cursor REFCURSOR;
summary_cursor REFCURSOR;
rec RECORD;
BEGIN
OPEN prompt_cursor FOR SELECT review_text FROM user_reviews ORDER BY id;
summary_cursor := ai.generate(
'Summarize the review in 20 words or less. Review:',
prompt_cursor,
);
LOOP
FETCH summary_cursor INTO rec;
EXIT WHEN NOT FOUND;
INSERT INTO summary_results VALUES(rec.output);
END LOOP;
CLOSE summary_cursor;
END $$;
Abfrageergebnisse bewerten
Wenn Sie Abfrageergebnisse mit benutzerdefinierten Anweisungen in natürlicher Sprache sortieren müssen, verwenden Sie den Operator ai.rank.
Mit Skalarfunktionen bewerten
Mit der folgenden Funktion können Sie einen Prompt angeben, der die Rankingkriterien beschreibt, und für jedes Element eine Bewertung zurückgeben.
-- Function signature
FUNCTION ai.rank(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS real
Die folgende Abfrage ruft beispielsweise die 20 positivsten Restaurantbewertungen ab und verwendet dabei Bewertungen aus einem LLM.
SELECT review AS top20
FROM user_reviews
ORDER BY ai.rank(
'Score the following review according to these rules:
(1) Score OF 8 to 10 IF the review says the food IS excellent.
(2) 4 to 7 IF the review says the food is ok.
(3) 1 to 3 IF the review says the food is not good. Here is the review:' || review) DESC
LIMIT 20;
Mit Array-basierten Funktionen bewerten
Mit dieser Funktion ai.rank können Sie Abfrageergebnisse anhand benutzerdefinierter Anweisungen in natürlicher Sprache bewerten und einstufen.
FUNCTION ai.rank(prompts TEXT[], model_id VARCHAR(100) DEFAULT NULL) RETURNS real[]
Die folgende Abfrage verwendet UNNEST und ai.rank, um mehrere Bewertungen effizient zu bewerten.
SELECT
UNNEST(
ai.rank(
ARRAY_AGG('Score the following review according to these rules:
(1) Score OF 8 to 10 IF the review says the food IS excellent.
(2) 4 to 7 IF the review says the food is ok.
(3) 1 to 3 IF the review says the food is not good. Here is the review:' || review),
)
) as review_scores
FROM user_reviews;
Mit Cursors bewerten
Diese Funktion wird verwendet, um große Datasets zu bewerten, ohne Speicherlimits zu erreichen.
FUNCTION ai.rank(context TEXT, input_cursor REFCURSOR, model_id VARCHAR(100) DEFAULT NULL) RETURNS REFCURSOR
Im folgenden Beispiel wird gezeigt, wie Sie große Textmengen anhand bestimmter Kriterien in natürlicher Sprache bewerten.
CREATE TABLE scored_results(input text, score real);
DO $$
DECLARE
prompt_cursor REFCURSOR;
score_cursor REFCURSOR;
rec RECORD;
BEGIN
OPEN prompt_cursor FOR SELECT review FROM user_reviews ORDER BY id;
score_cursor := ai.rank(
'Score the following review: (1) 8-10 if excellent, (2) 4-7 if ok, (3) 1-3 if not good. Review:',
prompt_cursor,
);
LOOP
FETCH score_cursor INTO rec;
EXIT WHEN NOT FOUND;
INSERT INTO scored_results VALUES(rec.input, rec.output);
END LOOP;
CLOSE score_cursor;
END $$;