Das Firebase-Plug-in bietet Integrationen mit Firebase-Diensten, mit denen Sie intelligente und skalierbare KI-Anwendungen erstellen können. Besondere Merkmale:
- Firestore Vector Store: Verwenden Sie Firestore für die Indexierung und den Abruf mit Vektoreinbettungen.
- Cloud Functions: Hier können Sie Abläufe als HTTPS-ausgelöste Funktionen bereitstellen.
- Firebase Authentication: Implementieren Sie Autorisierungsrichtlinien.
- Telemetrie: Telemetriedaten in die Operations Suite von Google Cloud exportieren und spezielle Ansichten in der Firebase Console aufrufen
Installation
Installieren Sie das Firebase-Plug-in mit npm:
npm install @genkit-ai/firebase
Vorbereitung
Firebase-Projekt einrichten
- Für alle Firebase-Produkte ist ein Firebase-Projekt erforderlich. In der Firebase Console können Sie ein neues Projekt erstellen oder Firebase in einem vorhandenen Google Cloud-Projekt aktivieren.
- Wenn Sie Workflows mit Cloud Functions bereitstellen, führen Sie ein Upgrade Ihres Firebase-Projekts auf den Blaze-Tarif durch.
- Wenn Sie Code lokal ausführen möchten, der Telemetry-Daten exportiert, muss das Tool Google Cloud CLI installiert sein.
Firebase Admin SDK-Initialisierung
Sie müssen das Firebase Admin SDK in Ihrer Anwendung initialisieren. Das Plug-in übernimmt das nicht automatisch.
import { initializeApp } from 'firebase-admin/app';
initializeApp({
projectId: 'your-project-id',
});
Sie müssen die Firebase-Projekt-ID angeben. Sie haben folgende Möglichkeiten, die Firebase-Projekt-ID anzugeben:
Legen Sie
projectId
im KonfigurationsobjektinitializeApp()
wie im Snippet oben gezeigt fest.Legen Sie die Umgebungsvariable
GCLOUD_PROJECT
fest. Wenn Sie Ihren Ablauf in einer Google Cloud-Umgebung (z. B. Cloud Functions oder Cloud Run) ausführen, wirdGCLOUD_PROJECT
automatisch auf die Projekt-ID der Umgebung festgelegt.Wenn Sie
GCLOUD_PROJECT
festlegen, können Sie den Konfigurationsparameter ininitializeApp()
weglassen.
Anmeldedaten
Wenn Sie Firebase-Anmeldedaten angeben möchten, müssen Sie auch die Standardanmeldedaten für Google Cloud-Anwendungen einrichten. So geben Sie Ihre Anmeldedaten an:
Wenn Sie Ihren Ablauf in einer Google Cloud-Umgebung (z. B. Cloud Functions oder Cloud Run) ausführen, wird dies automatisch festgelegt.
Für andere Umgebungen:
- Generieren Sie Anmeldedaten für Ihr Dienstkonto für Ihr Firebase-Projekt und laden Sie die JSON-Schlüsseldatei herunter. Sie können dies auf der Seite Dienstkonto in der Firebase Console tun.
- Legen Sie die Umgebungsvariable
GOOGLE_APPLICATION_CREDENTIALS
auf den Dateipfad der JSON-Datei fest, die Ihren Dienstkontoschlüssel enthält, oder legen Sie die UmgebungsvariableGCLOUD_SERVICE_ACCOUNT_CREDS
auf den Inhalt der JSON-Datei fest.
Funktionen und Verwendung
Telemetrie
Das Plug-in ist direkt vom Google Cloud-Plug-in abhängig und bietet daher die Möglichkeit, den Telemetrieexport in die Google Cloud Operations Suite zu aktivieren. So aktivieren Sie den Telemetrieexport:enableFirebaseTelemetry()
import { enableFirebaseTelemetry } from '@genkit-ai/firebase';
enableFirebaseTelemetry();
In der Dokumentation zum Google Cloud-Plug-in finden Sie alle Konfigurationsoptionen und die erforderlichen APIs, die im Projekt aktiviert werden müssen.
Cloud Firestore-Vektorsuche
Sie können Cloud Firestore als Vektorspeicher für die Indexierung und Abfrage von RAGs verwenden.
Dieser Abschnitt enthält Informationen speziell zum firebase
-Plug-in und zur Vektorsuchfunktion von Cloud Firestore. Ausführlichere Informationen zur Implementierung von RAG mit Genkit finden Sie auf der Seite Retrieval-Augmented Generation.
GCLOUD_SERVICE_ACCOUNT_CREDS und Firestore verwenden
Wenn Sie Anmeldedaten für ein Dienstkonto verwenden, indem Sie sie direkt über GCLOUD_SERVICE_ACCOUNT_CREDS
übergeben, und Firestore als Vektorspeicher verwenden, müssen Sie die Anmeldedaten während der Initialisierung direkt an die Firestore-Instanz übergeben. Andernfalls wird das Singleton je nach Reihenfolge der Plugin-Initialisierung möglicherweise mit den Standardanmeldedaten der Anwendung initialisiert.
import {initializeApp} from "firebase-admin/app";
import {getFirestore} from "firebase-admin/firestore";
const app = initializeApp();
let firestore = getFirestore(app);
if (process.env.GCLOUD_SERVICE_ACCOUNT_CREDS) {
const serviceAccountCreds = JSON.parse(process.env.GCLOUD_SERVICE_ACCOUNT_CREDS);
const authOptions = { credentials: serviceAccountCreds };
firestore.settings(authOptions);
}
Firestore-Abrufmethode definieren
Verwenden Sie defineFirestoreRetriever()
, um einen Retriever für Firestore-basierte Vektorabfragen zu erstellen.
import { defineFirestoreRetriever } from '@genkit-ai/firebase';
import { initializeApp } from 'firebase-admin/app';
import { getFirestore } from 'firebase-admin/firestore';
const app = initializeApp();
const firestore = getFirestore(app);
const retriever = defineFirestoreRetriever(ai, {
name: 'exampleRetriever',
firestore,
collection: 'documents',
contentField: 'text', // Field containing document content
vectorField: 'embedding', // Field containing vector embeddings
embedder: yourEmbedderInstance, // Embedder to generate embeddings
distanceMeasure: 'COSINE', // Default is 'COSINE'; other options: 'EUCLIDEAN', 'DOT_PRODUCT'
});
Dokumente abrufen
Wenn Sie Dokumente mit dem definierten Retriever abrufen möchten, übergeben Sie die Retrieverinstanz und die Abfrageoptionen an ai.retrieve
.
const docs = await ai.retrieve({
retriever,
query: 'search query',
options: {
limit: 5, // Options: Return up to 5 documents
where: { category: 'example' }, // Optional: Filter by field-value pairs
collection: 'alternativeCollection', // Optional: Override default collection
},
});
Verfügbare Wiederherstellungsoptionen
Die folgenden Optionen können an das Feld options
in ai.retrieve
übergeben werden:
limit
: (Zahl)
Gibt die maximale Anzahl der abzurufenden Dokumente an. Standardwert ist10
.where
: (Record<string, any>)
Weitere Filter basierend auf Firestore-Feldern hinzufügen. Beispiel:where: { category: 'news', status: 'published' }
collection
: (String)
Überschreibt die in der Abrufkonfiguration angegebene Standardsammlung. Das ist nützlich, um Untersammlungen abzufragen oder dynamisch zwischen Sammlungen zu wechseln.
Firestore mit Einbettungen füllen
Verwenden Sie einen Einbettungsgenerator zusammen mit dem Admin SDK, um Ihre Firestore-Sammlung zu füllen. Das Skript zum Aufnehmen von Menüs von der Seite Erweiterte Generierung durch Abruf könnte beispielsweise so für Firestore angepasst werden:
import { genkit } from 'genkit';
import { vertexAI, textEmbedding004 } from "@genkit-ai/vertexai";
import { applicationDefault, initializeApp } from "firebase-admin/app";
import { FieldValue, getFirestore } from "firebase-admin/firestore";
import { chunk } from "llm-chunk";
import pdf from "pdf-parse";
import { readFile } from "fs/promises";
import path from "path";
// Change these values to match your Firestore config/schema
const indexConfig = {
collection: "menuInfo",
contentField: "text",
vectorField: "embedding",
embedder: textEmbedding004,
};
const ai = genkit({
plugins: [vertexAI({ location: "us-central1" })],
});
const app = initializeApp({ credential: applicationDefault() });
const firestore = getFirestore(app);
export async function indexMenu(filePath: string) {
filePath = path.resolve(filePath);
// Read the PDF.
const pdfTxt = await extractTextFromPdf(filePath);
// Divide the PDF text into segments.
const chunks = await chunk(pdfTxt);
// Add chunks to the index.
await indexToFirestore(chunks);
}
async function indexToFirestore(data: string[]) {
for (const text of data) {
const embedding = await ai.embed({
embedder: indexConfig.embedder,
content: text,
});
await firestore.collection(indexConfig.collection).add({
[indexConfig.vectorField]: FieldValue.vector(embedding),
[indexConfig.contentField]: text,
});
}
}
async function extractTextFromPdf(filePath: string) {
const pdfFile = path.resolve(filePath);
const dataBuffer = await readFile(pdfFile);
const data = await pdf(dataBuffer);
return data.text;
}
Firestore verwendet Indexe, um schnelle und effiziente Abfragen in Sammlungen zu ermöglichen. Hinweis: „Index“ bezieht sich hier auf Datenbankindexe und nicht auf die Indexierungs- und Abrufabstraktion von Genkit.
Im vorherigen Beispiel muss das Feld embedding
indexiert sein, damit es funktioniert. So erstellen Sie den Index:
Führen Sie den Befehl
gcloud
aus, der im Abschnitt Einzelfeld-Vektorindex erstellen der Firestore-Dokumentation beschrieben ist.Der Befehl sieht folgendermaßen aus:
gcloud alpha firestore indexes composite create --project=your-project-id \ --collection-group=yourCollectionName --query-scope=COLLECTION \ --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=yourEmbeddingField
Die richtige Indexierungskonfiguration hängt jedoch von den Abfragen und dem verwendeten Einbettungsmodell ab.
Alternativ können Sie
ai.retrieve()
aufrufen. Firestore gibt dann einen Fehler mit dem richtigen Befehl zum Erstellen des Index zurück.
Weitere Informationen
- Auf der Seite Retrieval-Augmented Generation finden Sie allgemeine Informationen zu Indexern und Retrievern in Genkit.
- Weitere Informationen zur Vektorsuche finden Sie in der Cloud Firestore-Dokumentation unter Mit Vektoreinbettungen suchen.
Abläufe als Cloud Functions bereitstellen
Das Plug-in bietet den Konstruktor onFlow()
, mit dem ein Ablauf erstellt wird, der von einer HTTPS-ausgelösten Cloud Functions for Firebase-Funktion unterstützt wird. Diese Funktionen entsprechen der aufrufbaren Funktionsoberfläche von Firebase und Sie können sie mit den Cloud Functions-Client-SDKs aufrufen.
import { onFlow, noAuth } from "@genkit-ai/firebase/functions";
export const exampleFlow = onFlow(
ai, // Provide the Genkit instance
{
name: "exampleFlow",
authPolicy: noAuth(), // WARNING: noAuth() creates an open endpoint!
},
async (prompt) => {
// Flow logic goes here.
return response;
}
);
Binden Sie den Ablauf mit der Firebase CLI ein:
firebase deploy --only functions
Die Funktion onFlow()
bietet einige Optionen, die in defineFlow()
nicht vorhanden sind:
httpsOptions
: EinHttpsOptions
-Objekt, mit dem Ihre Cloud-Funktion konfiguriert wird:export const exampleFlow = onFlow( ai, { name: "exampleFlow", httpsOptions: { cors: true, }, // ... }, async (prompt) => { // ... } );
enforceAppCheck
: Wenntrue
, werden Anfragen mit fehlenden oder ungültigen App Check-Tokens abgelehnt.consumeAppCheckToken
: Wenntrue
, heben Sie das App Check-Token nach der Überprüfung auf.Weitere Informationen finden Sie unter Replay-Schutz.
Firebase Authentication
Dieses Plug-in bietet eine Hilfsfunktion zum Erstellen von Autorisierungsrichtlinien für Firebase Auth:
import {firebaseAuth} from "@genkit-ai/firebase/auth";
export const exampleFlow = onFlow(
ai,
{
name: "exampleFlow",
authPolicy: firebaseAuth((user) => {
if (!user.email_verified) throw new Error("Requires verification!");
}),
},
async (prompt) => {
// ...
}
);
Wenn Sie eine Authentifizierungsrichtlinie definieren möchten, geben Sie für firebaseAuth()
eine Callback-Funktion an, die DecodedIdToken
als einzigen Parameter hat. In dieser Funktion wird das Nutzertoken geprüft und ein Fehler ausgegeben, wenn der Nutzer eines der von dir festgelegten Kriterien nicht erfüllt.
Weitere Informationen zu diesem Thema finden Sie unter Autorisierung und Integrität.