Wtyczka Firebase umożliwia integrację z usługami Firebase na kilka sposobów:
- Indeksatory i moduły pobierania danych korzystające z magazynu wektorów Cloud Firestore
- Śledź miejsce na dane za pomocą Cloud Firestore
- Wdrażanie przepływu za pomocą Cloud Functions
- Zasady autoryzacji dla użytkowników usługi Uwierzytelnianie Firebase
Instalacja
npm i --save @genkit-ai/firebase
Wymagania wstępne
- Wszystkie usługi Firebase wymagają projektu Firebase. Możesz utworzyć nowy projekt lub włącz Firebase w dotychczasowym projekcie Google Cloud za pomocą Konsola Firebase.
- Ponadto, jeśli chcesz wdrożyć przepływy w Cloud Functions, musisz przenieś projekt na wyższy abonament na abonament Blaze z płatnościami według wykorzystania.
Konfiguracja
Identyfikator projektu
Aby używać tej wtyczki, określ ją, gdy wywołujesz configureGenkit()
:
import {configureGenkit} from "@genkit-ai/core";
import {firebase} from "@genkit-ai/firebase";
configureGenkit({
plugins: [firebase({projectId: "your-firebase-project"})],
});
Wtyczka wymaga podania identyfikatora projektu Firebase. Możesz określić identyfikatora projektu Firebase na jeden z tych sposobów:
Ustaw
projectId
w obiekcie konfiguracjifirebase()
.Ustaw zmienną środowiskową
GCLOUD_PROJECT
. Jeśli pracujesz nad przepływem ze środowiska Google Cloud (Cloud Functions, Cloud Run itp.), PoleGCLOUD_PROJECT
jest automatycznie ustawiane na identyfikator projektu środowiska.Jeśli ustawisz
GCLOUD_PROJECT
, możesz pominąć parametr konfiguracji:firebase()
Dane logowania
Aby podać dane logowania do Firebase, musisz też skonfigurować Google Cloud Domyślne dane logowania aplikacji. Aby podać dane logowania:
Jeśli uruchamiasz przepływ ze środowiska Google Cloud (Cloud Functions, Cloud Run itd.), to ustawienie jest ustawiane automatycznie.
W przypadku innych środowisk:
- Wygeneruj dane logowania do konta usługi dla projektu Firebase oraz pobierz plik klucza JSON. Możesz to zrobić na Konto usługi w konsoli Firebase.
- Ustaw zmienną środowiskową
GOOGLE_APPLICATION_CREDENTIALS
na plik ścieżki pliku JSON zawierającego klucz konta usługi. Możesz też ustawić zmienną środowiskowąGCLOUD_SERVICE_ACCOUNT_CREDS
na zawartość pliku JSON.
Dane telemetryczne
Wtyczka jest bezpośrednio zależna od wtyczki Google Cloud i dlatego ma funkcje umożliwiające eksport danych telemetrycznych do pakietu operacyjnego Google Cloud. Aby włączyć eksportowanie danych telemetrycznych, ustaw enableTracingAndMetrics
na true
i dodaj sekcję telemetrii do konfiguracji Genkit:
import {configureGenkit} from "@genkit-ai/core";
import {firebase} from "@genkit-ai/firebase";
configureGenkit({
plugins: [firebase()],
enableTracingAndMetrics: true,
telemetry: {
instrumentation: 'firebase',
logger: 'firebase',
},
});
Informacje o wszystkich opcjach konfiguracji i interfejsach API, które musisz włączyć w projekcie, znajdziesz w dokumentacji wtyczki Google Cloud.
Wykorzystanie
Zapewnia ona kilka integracji z usługami Firebase, co pozwala stosowane razem lub osobno.
Magazyn wektorów Cloud Firestore
Cloud Firestore może być używany jako magazyn wektorowy na potrzeby indeksowania i pobierania RAG.
Ta sekcja zawiera informacje na temat wtyczki firebase
i usługi Cloud
Funkcja wyszukiwania wektorowego Firestore.
Bardziej szczegółowe informacje znajdziesz na stronie Generowanie rozszerzonego przez wyszukiwanie.
na temat wdrażania RAG za pomocą Genkit.
Korzystanie z GCLOUD_SERVICE_ACCOUNT_CREDS i Firestore
Jeśli korzystasz z danych logowania konta usługi, przekazując je bezpośrednio przez GCLOUD_SERVICE_ACCOUNT_CREDS
, oraz używasz Firestore jako magazynu wektorów, podczas inicjowania musisz przekazać dane uwierzytelniające bezpośrednio do instancji Firestore. W zależności od kolejności inicjowania wtyczki dane logowania mogą zostać zainicjowane bezpośrednio do instancji Firestore.
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);
}
retrievery
Wtyczka firebase
zapewnia udogodnienie w zakresie definiowania Firestore
retrievery, defineFirestoreRetriever()
:
import {defineFirestoreRetriever} from "@genkit-ai/firebase";
import {retrieve} from "@genkit-ai/ai/retriever";
import {initializeApp} from "firebase-admin/app";
import {getFirestore} from "firebase-admin/firestore";
const app = initializeApp();
const firestore = getFirestore(app);
const yourRetrieverRef = defineFirestoreRetriever({
name: "yourRetriever",
firestore: getFirestore(app),
collection: "yourCollection",
contentField: "yourDataChunks",
vectorField: "embedding",
embedder: textEmbeddingGecko, // Import from '@genkit-ai/googleai' or '@genkit-ai/vertexai'
distanceMeasure: "COSINE", // "EUCLIDEAN", "DOT_PRODUCT", or "COSINE" (default)
});
Aby go użyć, przekaż go do funkcji retrieve()
:
const docs = await retrieve({
retriever: yourRetrieverRef,
query: "look for something",
options: {limit: 5},
});
Dostępne opcje pobierania:
limit
: określ liczbę pasujących wyników do zwrócenia.where
: pary pole/wartość do dopasowania (np.{category: 'food'}
) oprócz wyszukiwania wektorowego.collection
: zastąp kolekcję domyślną, aby wyszukać np. wyszukiwanie podzbioru.
Indeksowanie i umieszczanie
Aby zapełnić kolekcję Firestore, użyj generatora wektorów dystrybucyjnych oraz Admin SDK. Na przykład skrypt przetwarzania menu ze strony Stronę generowania rozszerzonego przez wyszukiwanie można dostosować dla Firestore w następujący sposób:
import { configureGenkit } from "@genkit-ai/core";
import { embed } from "@genkit-ai/ai/embedder";
import { defineFlow, run } from "@genkit-ai/flow";
import { textEmbeddingGecko, vertexAI } 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 * as z from "zod";
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: textEmbeddingGecko,
};
configureGenkit({
plugins: [vertexAI({ location: "us-central1" })],
enableTracingAndMetrics: false,
});
const app = initializeApp({ credential: applicationDefault() });
const firestore = getFirestore(app);
export const indexMenu = defineFlow(
{
name: "indexMenu",
inputSchema: z.string().describe("PDF file path"),
outputSchema: z.void(),
},
async (filePath: string) => {
filePath = path.resolve(filePath);
// Read the PDF.
const pdfTxt = await run("extract-text", () =>
extractTextFromPdf(filePath)
);
// Divide the PDF text into segments.
const chunks = await run("chunk-it", async () => chunk(pdfTxt));
// Add chunks to the index.
await run("index-chunks", async () => indexToFirestore(chunks));
}
);
async function indexToFirestore(data: string[]) {
for (const text of data) {
const embedding = await 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 zależy od indeksów, aby umożliwić szybkie i efektywne wykonywanie zapytań kolekcji. (Zwróć uwagę, że określenie „indeks” odnosi się w tym miejscu do indeksów baz danych, a nie do abstrakcje indeksujące i retrievera Genkit).
Poprzedni przykład wymaga indeksowania pola embedding
w naszej pracy. Aby utworzyć indeks:
Uruchom polecenie
gcloud
opisane w Utwórz indeks wektorów w jednym polu dokumentu 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ń, a używany przez Ciebie model umieszczania.
Możesz też wywołać funkcję
retrieve()
, a Firestore zwróci błąd z poprawnego polecenia, aby utworzyć indeks.
Więcej informacji
- Ogólne informacje znajdziesz na stronie Generowanie rozszerzonego przez wyszukiwanie. na temat indekserów i pickuperów w Genkit.
- Przeczytaj artykuł Wyszukiwanie z wektorami dystrybucyjnymi wektorowymi. w dokumentacji Cloud Firestore, aby dowiedzieć się więcej o funkcji wyszukiwania wektorowego.
Miejsce na dane logu w Cloud Firestore
W Cloud Firestore możesz przechowywać logi czasu:
import {firebase} from "@genkit-ai/firebase";
configureGenkit({
plugins: [firebase()],
traceStore: "firebase",
enableTracingAndMetrics: true,
});
Domyślnie wtyczka przechowuje ślady w kolekcji o nazwie genkit-traces
w
domyślnej bazy danych projektu. Aby zmienić któreś z tych ustawień:
firebase({
traceStore: {
collection: "your-collection";
databaseId: "your-db";
}
})
Jeśli korzystasz z pamięci śledzenia bazującej na Firestore, włącz wartość TTL dla dokumentów śledzenia: https://firebase.google.com/docs/firestore/ttl
Cloud Functions
Wtyczka udostępnia konstruktor onFlow()
, który tworzy przepływ oparty na
Funkcja w Cloud Functions dla Firebase aktywowana przez HTTPS. Funkcje te spełniają
do usługi Firebase
wywoływanego interfejsu funkcji i możesz użyć funkcji
Pakiety SDK klienta Cloud Functions
aby do nich zadzwonić.
import {firebase} from "@genkit-ai/firebase";
import {onFlow, noAuth} from "@genkit-ai/firebase/functions";
configureGenkit({
plugins: [firebase()],
});
export const exampleFlow = onFlow(
{
name: "exampleFlow",
authPolicy: noAuth(), // WARNING: noAuth() creates an open endpoint!
},
async (prompt) => {
// Flow logic goes here.
return response;
}
);
Wdróż przepływ za pomocą interfejsu wiersza poleceń Firebase:
firebase deploy --only functions
Niektóre opcje funkcji onFlow()
są niedostępne w defineFlow()
:
httpsOptions
:HttpsOptions
który jest używany do konfigurowania funkcji w Cloud Functions:export const exampleFlow = onFlow( { name: "exampleFlow", httpsOptions: { cors: true, }, // ... }, async (prompt) => { // ... } );
enforceAppCheck
: gdytrue
, odrzuca prośby z brakującymi lub nieprawidłowymi sprawdzeniem aplikacji. tokeny.consumeAppCheckToken
: gdytrue
, unieważni token Sprawdzania aplikacji po jego zweryfikowaniu.
Uwierzytelnianie Firebase
Ta wtyczka zapewnia funkcję pomocniczą do tworzenia zasad autoryzacji dotyczących Uwierzytelnianie Firebase:
import {firebaseAuth} from "@genkit-ai/firebase/auth";
export const exampleFlow = onFlow(
{
name: "exampleFlow",
authPolicy: firebaseAuth((user) => {
if (!user.email_verified) throw new Error("Requires verification!");
}),
},
async (prompt) => {
// ...
}
);
Aby zdefiniować zasadę uwierzytelniania, podaj w firebaseAuth()
funkcję wywołania zwrotnego, która
trwa
DecodedIdToken
.
. W tej funkcji przejrzyj token użytkownika i wyślij zgłoszenie
występuje wtedy, gdy użytkownik nie spełnia któregokolwiek z wymagań.
Więcej informacji znajdziesz w artykule Autoryzacja i integralność. w tym temacie.