Wtyczka Firebase zapewnia integrację z usługami Firebase, co umożliwia tworzenie inteligentnych i skalowalne aplikacji AI. Najważniejsze funkcje:
- Firestore Vector Store: używaj Firestore do indeksowania i wyszukiwania za pomocą wektorów dystrybucyjnych.
- Cloud Functions: wdróż przepływy jako funkcje aktywowane przez HTTPS.
- Uwierzytelnianie Firebase: wdrożenie zasad autoryzacji.
- Telemetria: eksportuj dane telemetryczne do pakietu operacyjnego Google Cloud i wyświetl widoki specjalistyczne w konsoli Firebase.
Instalacja
Zainstaluj wtyczkę Firebase za pomocą npm:
npm install @genkit-ai/firebase
Wymagania wstępne
Konfigurowanie projektu Firebase
- Wszystkie usługi Firebase wymagają projektu Firebase. W konsoli Firebase możesz utworzyć nowy projekt lub włączyć Firebase w dotychczasowym projekcie Google Cloud.
- Jeśli wdrażasz przepływy za pomocą Cloud Functions, uaktualnij projekt Firebase do abonamentu Blaze.
- Jeśli chcesz uruchomić lokalnie kod, który eksportuje dane telemetryczne, musisz mieć zainstalowane narzędzie Google Cloud CLI.
Inicjowanie pakietu Firebase Admin SDK
W aplikacji musisz zainicjować pakiet SDK Firebase Admin. Wtyczka nie obsługuje tego automatycznie.
import { initializeApp } from 'firebase-admin/app';
initializeApp({
projectId: 'your-project-id',
});
Aby korzystać z wtyczki, musisz podać identyfikator projektu Firebase. Identyfikator projektu Firebase możesz podać na jeden z tych sposobów:
W obiekcie konfiguracji
initializeApp()
ustaw wartośćprojectId
, jak pokazano w powyższym fragmencie kodu.Ustaw zmienną środowiskową
GCLOUD_PROJECT
. Jeśli uruchamiasz przepływ z otoczenia Google Cloud (np. Cloud Functions czy Cloud Run), zmiennaGCLOUD_PROJECT
jest automatycznie ustawiana na identyfikator projektu tego środowiska.Jeśli ustawisz
GCLOUD_PROJECT
, możesz pominąć parametr konfiguracji w plikuinitializeApp()
.
Dane logowania
Aby podać dane logowania Firebase, musisz też skonfigurować domyślne dane logowania do aplikacji Google Cloud. Aby określić swoje dane uwierzytelniające:
Jeśli uruchamiasz przepływ z środowiska Google Cloud (Cloud Functions, Cloud Run itp.), ta wartość jest ustawiana automatycznie.
W innych środowiskach:
- Wygeneruj dane logowania do konta usługi dla swojego projektu Firebase i pobierz plik klucza JSON. Możesz to zrobić na stronie Konto usługi w konsoli Firebase.
- Ustaw zmienną środowiskową
GOOGLE_APPLICATION_CREDENTIALS
na ścieżkę do pliku JSON zawierającego klucz konta usługi. Możesz też ustawić zmienną środowiskowąGCLOUD_SERVICE_ACCOUNT_CREDS
na zawartość pliku JSON.
Funkcje i użytkowanie
Dane telemetryczne
Ten wtyczka jest bezpośrednio zależna od wtyczki Google Cloud, dlatego zawiera postanowienia umożliwiające eksportowanie danych telemetrycznych do pakietu operacyjnego Google Cloud. Aby włączyć wywołanie eksportowania danych telemetrycznych: enableFirebaseTelemetry()
import { enableFirebaseTelemetry } from '@genkit-ai/firebase';
enableFirebaseTelemetry();
Informacje o wszystkich opcjach konfiguracji i wymaganych interfejsach API, które należy włączyć w projekcie, znajdziesz w dokumentacji wtyczki Google Cloud.
Wyszukiwanie wektorowe w Cloud Firestore
Cloud Firestore możesz używać jako magazynu wektorów do indeksowania i wyszukiwania RAG.
Ta sekcja zawiera informacje dotyczące wtyczki firebase
i funkcji wyszukiwania wektorów w Cloud Firestore. Więcej informacji o wdrażaniu RAG za pomocą Genkit znajdziesz na stronie generowania rozszerzonego przez wyszukiwanie w zapisanych informacjach.
Korzystanie z GCLOUD_SERVICE_ACCOUNT_CREDS i Firestore
Jeśli używasz danych logowania konta usługi, przekazując je bezpośrednio za pomocą funkcji GCLOUD_SERVICE_ACCOUNT_CREDS
, i używasz Firestore jako magazynu wektorów, musisz przekazać dane logowania bezpośrednio do instancji Firestore podczas inicjalizacji. W przeciwnym razie singleton może zostać zainicjowany za pomocą domyślnych danych logowania aplikacji w zależności od kolejności inicjowania wtyczki.
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);
}
Definiowanie funkcji pobierania Firestore
Użyj defineFirestoreRetriever()
, aby utworzyć funkcję pobierania zapytań opartych na wektorach Firestore.
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'
});
Pobieranie dokumentów
Aby pobrać dokumenty za pomocą zdefiniowanego retrievera, przekaż instancję retrievera i opcje zapytania do 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
},
});
Dostępne opcje odzyskiwania
Do pola options
w elementach ai.retrieve
można przekazać te opcje:
limit
: (liczba)
określa maksymalną liczbę dokumentów do pobrania. Wartość domyślna to10
.where
: (Record<string, any>)
Dodaj dodatkowe filtry na podstawie pól Firestore. Przykład:where: { category: 'news', status: 'published' }
collection
: (ciąg)
Zastąpić domyślną kolekcję określoną w konfiguracji retrievera. Jest to przydatne w przypadku wysyłania zapytań do podzbiorów lub dynamicznego przełączania się między zbiorami.
Wypełnianie Firestore za pomocą elementów wbudowanych
Aby wypełnić kolekcję Firestore, użyj generatora umieszczania i pakietu Admin SDK. Na przykład skrypt przetwarzania menu z strony generowania wzbogaconego o wyszukiwanie można dostosować do Firestore w ten sposób:
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 korzysta z indektów, aby umożliwiać szybkie i wydajne wykonywanie zapytań dotyczących kolekcji. (Pamiętaj, że „indeks” odnosi się tutaj do indeksów baz danych, a nie do abstrakcji indeksatora i pobierania Genkit).
W poprzednim przykładzie pole embedding
musi być zindeksowane, aby działać. Aby utworzyć indeks:
Uruchom polecenie
gcloud
opisane w sekcji Tworzenie indeksu wektorowego pojedynczego pola w dokumentacji Firestore.Polecenie wygląda tak:
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
Prawidłowa konfiguracja indeksowania zależy jednak od zapytań, które będziesz wysyłać, i używanego modelu umieszczania.
Możesz też wywołać funkcję
ai.retrieve()
, a Firestore zwróci błąd z prawidłowym poleceniem do utworzenia indeksu.
Więcej informacji
- Więcej informacji o indeksowaniu i pobieraniu w Genkit znajdziesz na stronie generacji wspomaganej przez odzyskiwanie.
- Więcej informacji o funkcji wyszukiwania wektorowego znajdziesz w artykule Wyszukiwanie z użyciem wektorów dystrybucyjnych w dokumentacji Cloud Firestore.
Wdrażanie przepływów jako funkcji Cloud Functions
Wtyczka udostępnia konstruktor onFlow()
, który tworzy przepływ obsługiwany przez funkcję w Cloud Functions dla Firebase aktywowaną przez HTTPS. Te funkcje są zgodne z interfejsem wywoływalnych funkcji Firebase i można je wywoływać za pomocą pakietów SDK klienta Cloud Functions.
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;
}
);
Wdróż przepływ za pomocą wiersza poleceń Firebase:
firebase deploy --only functions
Funkcja onFlow()
ma opcje niedostępne w funkcji defineFlow()
:
httpsOptions
: obiektHttpsOptions
służący do konfigurowania funkcji w Cloud Functions:export const exampleFlow = onFlow( ai, { name: "exampleFlow", httpsOptions: { cors: true, }, // ... }, async (prompt) => { // ... } );
enforceAppCheck
: gdytrue
, odrzucaj żądania, w których brakuje tokenów Sprawdzania aplikacji lub są one nieprawidłowe.consumeAppCheckToken
: gdytrue
, unieważnij token Sprawdzania aplikacji po jego zweryfikowaniu.Zobacz Ochrona przed odtwarzaniem.
Uwierzytelnianie Firebase
Ten wtyczka zawiera funkcję pomocniczą do tworzenia zasad autoryzacji w Uwierzytelnianiu Firebase:
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) => {
// ...
}
);
Aby zdefiniować zasady uwierzytelniania, podaj w funkcji firebaseAuth()
funkcję wywołania zwrotnego, która ma DecodedIdToken
jako jedyny parametr. W ramach tej funkcji sprawdzaj token użytkownika i wyrzucaj błąd, jeśli użytkownik nie spełnia któregokolwiek z wymaganych kryteriów.
Więcej informacji na ten temat znajdziesz w artykule Autoryzacja i nienaruszalność danych.