Wtyczka Firebase zapewnia integrację z usługami Firebase, dzięki czemu możesz tworzyć inteligentne i skalowalne aplikacje AI. Najważniejsze funkcje:
- Firestore Vector Store: używaj Firestore do indeksowania i wyszukiwania za pomocą wektorów dystrybucyjnych.
- Telemetria: eksportuj dane telemetryczne do pakietu operacyjnego Google Cloud, który obsługuje konsolę monitorowania Firebase Genkit.
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ą funkcji 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 środowiska Google Cloud (Cloud Functions, Cloud Run itp.), 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ę pliku JSON zawierającego klucz konta usługi lub ustaw zmienną środowiskowąGCLOUD_SERVICE_ACCOUNT_CREDS
na zawartość pliku JSON.
Funkcje i użytkowanie
Dane telemetryczne
Genkit Monitoring w Firebase korzysta z pakietu operacyjnego Google Cloud. Wymaga to włączenia interfejsów API związanych z telemetrią w Twoim projekcie. Więcej informacji znajdziesz w dokumentacji wtyczki Google Cloud.
Przypisz te role do „domyślnego konta usługi obliczeniowej” w konsoli Google Cloud IAM:
- Monitoring Metric Writer (roles/monitoring.metricWriter)
- Cloud Trace Agent (roles/cloudtrace.agent)
- Zapisujący logi (roles/logging.logWriter)
Aby włączyć wywołanie eksportowania danych telemetrycznych: enableFirebaseTelemetry()
import { enableFirebaseTelemetry } from '@genkit-ai/firebase';
enableFirebaseTelemetry({
forceDevExport: false, // Set this to true to export telemetry for local runs
});
Ta wtyczka udostępnia opcje konfiguracji wtyczce Google Cloud.
Wyszukiwanie wektorowe w Cloud Firestore
Cloud Firestore możesz używać jako magazynu wektorów do indeksowania i wyszukiwania w ramach 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 Generowanie rozszerzone 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 wektorowego magazynu danych, 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 funkcji 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 podczas wysyłania zapytań do podkolekcji lub dynamicznego przełączania się między
kolekcje.
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 Generowanie z użyciem rozszerzonego wyszukiwania można dostosować do Firehose 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,
}))[0].embedding;
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 indeksu, aby zapewniać 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 wysyłasz, 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
- Ogólne informacje o indeksatorach i wyszukiwaczach w Genkit znajdziesz na stronie generacji wspomaganej przez wyszukiwanie.
- Więcej informacji o funkcji wyszukiwania wektorowego znajdziesz w dokumencie Wyszukiwanie z wektorami dystrybucyjnymi w Cloud Firestore.
Wdrażanie przepływów jako funkcji Cloud Functions
Aby wdrożyć przepływ za pomocą Cloud Functions, użyj wbudowanego w bibliotekę Firebase Functions obsługi genkit. Metoda onCallGenkit
umożliwia tworzenie funkcji wywoływalnej z poziomu przepływu. Obsługuje automatycznie strumieniowanie i żądania JSON. Do ich wywoływania możesz użyć pakietów SDK klienta Cloud Functions.
import { onCallGenkit } from 'firebase-functions/https';
import { defineSecret } from 'firebase-functions/params';
export const exampleFlow = ai.defineFlow({
name: "exampleFlow",
}, async (prompt) => {
// Flow logic goes here.
return response;
}
);
// WARNING: This has no authentication or app check protections.
// See github.com/firebase/genkit/blob/main/docs/auth.md for more information.
export const example = onCallGenkit({ secrets: [apiKey] }, exampleFlow);
Wdróż przepływ za pomocą wiersza poleceń Firebase:
firebase deploy --only functions