Firebase プラグイン

Firebase プラグインは Firebase サービスと統合できるため、インテリジェントでスケーラブルな AI アプリケーションを構築できます。主な特長は以下のとおりです。

  • Firestore ベクトルストア: ベクトル エンベディングによるインデックス作成と検索に Firestore を使用します。
  • テレメトリー: Firebase Genkit Monitoring コンソールを支える Google Cloud のオペレーション スイートにテレメトリーをエクスポートします。

インストール

npm を使用して Firebase プラグインをインストールします。

npm install @genkit-ai/firebase

前提条件

Firebase プロジェクトの設定

  1. すべての Firebase プロダクトで Firebase プロジェクトが必要です。新しいプロジェクトを作成するか、Firebase コンソールを使用して既存の Google Cloud プロジェクトで Firebase を有効にできます。
  2. Cloud Functions を使用してフローをデプロイする場合は、Blaze プランにFirebase プロジェクトをアップグレードします。
  3. テレメトリーをエクスポートするコードをローカルで実行する場合は、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 Functions、Cloud Run など)からフローを実行している場合、GCLOUD_PROJECT は環境のプロジェクト ID に自動的に設定されます。

    GCLOUD_PROJECT を設定した場合は、initializeApp() の構成パラメータを省略できます。

認証情報

Firebase 認証情報を指定するには、Google Cloud アプリケーションのデフォルト認証情報も設定する必要があります。認証情報を指定するには:

  • Google Cloud 環境(Cloud Functions、Cloud Run など)からフローを実行している場合は、自動的に設定されます。

  • その他の環境の場合:

    1. Firebase プロジェクトのサービス アカウント認証情報を生成し、JSON キーファイルをダウンロードします。そのためには、Firebase コンソールの [サービス アカウント] ページで操作します。
    2. 環境変数 GOOGLE_APPLICATION_CREDENTIALS を、サービス アカウント キーが含まれる JSON ファイルのファイルパスに設定します。または、環境変数 GCLOUD_SERVICE_ACCOUNT_CREDS を JSON ファイルの内容に設定することもできます。

機能と使用方法

テレメトリー

Firebase Genkit Monitoring は、Google の Cloud オペレーション スイートを利用しています。これを行うには、プロジェクトでテレメトリー関連の API を有効にする必要があります。詳細については、Google Cloud プラグインのドキュメントをご覧ください。

Google Cloud IAM コンソールで、「デフォルトの Compute サービス アカウント」に次のロールを付与します。

  • モニタリング指標の書き込み(roles/monitoring.metricWriter)
  • Cloud Trace エージェント(roles/cloudtrace.agent)
  • ログ書き込み(roles/logging.logWriter)

テレメトリーのエクスポートを有効にするには、enableFirebaseTelemetry() を呼び出します。

import { enableFirebaseTelemetry } from '@genkit-ai/firebase';

enableFirebaseTelemetry({
  forceDevExport: false, // Set this to true to export telemetry for local runs
});

このプラグインは、Google Cloud プラグイン構成オプションを共有します。

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.retrieveoptions フィールドには、次のオプションを渡すことができます。

  • 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 Functions ライブラリの 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