Firebase 外掛程式提供 Firebase 服務整合功能,方便您建構智慧且可擴充的 AI 應用程式。主要功能包括:
- Firestore 向量儲存空間:使用 Firestore 為向量嵌入項目建立索引和擷取。
- 遙測:將遙測資料匯出至支援 Firebase Genkit 監控主控台的 Google Cloud 作業套件。
安裝
使用 npm 安裝 Firebase 外掛程式:
npm install @genkit-ai/firebase
事前準備
設定 Firebase 專案
- 所有 Firebase 產品都需要 Firebase 專案。您可以使用 Firebase 控制台建立新專案,或在現有 Google Cloud 專案中啟用 Firebase。
- 如果您要部署含有 Cloud 函式的流程,請將 Firebase 專案升級為 Blaze 方案。
- 如果您想在本機執行匯出遙測資料的程式碼,請務必安裝 Google Cloud CLI 工具。
Firebase Admin SDK 初始化
您必須在應用程式中初始化 Firebase Admin SDK。外掛程式不會自動處理這項作業。
import { initializeApp } from 'firebase-admin/app';
initializeApp({
projectId: 'your-project-id',
});
外掛程式要求您指定 Firebase 專案 ID。您可以使用下列任一方式指定 Firebase 專案 ID:
如上方程式碼片段所示,請在
initializeApp()
設定物件中設定projectId
。設定
GCLOUD_PROJECT
環境變數。如果您透過 Google Cloud 環境 (Cloud 函式、Cloud Run 等) 執行流程,GCLOUD_PROJECT
會自動設為該環境的專案 ID。如果您設定
GCLOUD_PROJECT
,可以省略initializeApp()
中的設定參數。
憑證
如要提供 Firebase 憑證,您也必須設定 Google Cloud 應用程式預設憑證。如要指定憑證,請按照下列步驟操作:
如果您是透過 Google Cloud 環境 (Cloud Functions、Cloud Run 等) 執行流程,系統會自動設定這項屬性。
適用於其他環境:
功能與用途
遙測
Firebase 外掛程式提供遙測導入,可將指標、追蹤記錄和記錄傳送至 Firebase Genkit Monitoring。
如要開始使用,請參閱入門指南,瞭解安裝和設定操作說明。
請參閱驗證和授權指南,瞭解如何驗證 Google Cloud。
如需設定選項,請參閱進階設定指南。
如要進一步瞭解收集的 Genkit 指標、追蹤記錄和記錄檔,請參閱遙測收集。
Cloud Firestore 向量搜尋
您可以使用 Cloud Firestore 做為向量儲存空間,用於 RAG 索引和擷取。
本節提供 firebase
外掛程式和 Cloud Firestore 向量搜尋功能的相關資訊。如要進一步瞭解如何使用 Genkit 導入 RAG,請參閱「檢索增強生成」頁面。
使用 GCLOUD_SERVICE_ACCOUNT_CREDS
和 Firestore
如果您使用服務帳戶憑證,並透過 GCLOUD_SERVICE_ACCOUNT_CREDS
直接傳遞憑證,同時也將 Firestore 用於向量儲存空間,則您需要在初始化期間直接將憑證傳遞至 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);
}
定義 Firestore 擷取器
使用 defineFirestoreRetriever()
為 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'
});
擷取文件
如要使用已定義的擷取器擷取文件,請將擷取器例項和查詢選項傳遞至 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
},
});
可用的擷取選項
下列選項可傳遞至 ai.retrieve
中的 options
欄位:
limit
:(數字) 指定要擷取的文件數量上限。預設值為10
。where
:(Record<string, any>) 根據 Firestore 欄位新增額外篩選條件。範例:where: { category: 'news', status: 'published' }
collection
:(字串) 覆寫擷取器設定中指定的預設集合。這項功能可用於查詢子集合,或動態切換子集合
產品素材資源集合。
使用嵌入內容填充 Firestore
如要填入 Firestore 集合,請使用內嵌產生器搭配 Admin SDK。舉例來說,您可以將「擷取內容增強產生」頁面中的選單擷取指令碼,以以下方式調整為 Firestore 專用:
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 會使用索引,在集合上提供快速且有效率的查詢。(請注意,「索引」在此處是指資料庫索引,而非 Genkit 的索引器和擷取器抽象化)。
在前述範例中,embedding
欄位必須建立索引才能運作。如要建立索引,請按照下列步驟操作:
執行 Firestore 文件「建立單一欄向量索引」一節所述的
gcloud
指令。這個指令如下所示:
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
不過,正確的索引設定取決於您提出的查詢和使用的嵌入模型。
或者,您也可以呼叫
ai.retrieve()
,Firestore 會擲回錯誤,並提供建立索引的正確指令。
瞭解詳情
將流程部署為 Cloud Functions
如要使用 Cloud Functions 部署流程,請使用 Firebase 函式程式庫內建的 Genkit 支援功能。onCallGenkit
方法可讓您從資料流建立可呼叫的函式。這項功能會自動支援串流和 JSON 要求。您可以使用 Cloud Functions 用戶端 SDK 呼叫這些模型。
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);
使用 Firebase CLI 部署流程:
firebase deploy --only functions