Firebase 플러그인

Firebase 플러그인은 Firebase 서비스와의 여러 통합 기능을 제공합니다.

  • Cloud Firestore 벡터 저장소를 사용하는 색인 생성기 및 검색기
  • Cloud Firestore를 사용한 스토리지 추적
  • Cloud Functions를 사용한 흐름 배포
  • Firebase 인증 사용자를 위한 승인 정책

설치

npm i --save @genkit-ai/firebase

기본 요건

  • 모든 Firebase 제품에는 Firebase 프로젝트가 필요합니다. 새 프로젝트를 만들 수 있습니다. 또는 Firebase Console
  • 또한 Cloud Functions에 흐름을 배포하려면 프로젝트 업그레이드 사용한 만큼만 지불하는 Blaze 요금제로 전환하세요.

구성

프로젝트 ID

이 플러그인을 사용하려면 configureGenkit()를 호출할 때 지정합니다.

import {configureGenkit} from "@genkit-ai/core";
import {firebase} from "@genkit-ai/firebase";

configureGenkit({
  plugins: [firebase({projectId: "your-firebase-project"})],
});

플러그인을 사용하려면 Firebase 프로젝트 ID를 지정해야 합니다. 사용자는 다음 방법 중 하나로 Firebase 프로젝트 ID에 연결할 수 있습니다.

  • firebase() 구성 객체에서 projectId를 설정합니다.

  • GCLOUD_PROJECT 환경 변수를 설정합니다. 흐름을 실행 중인 경우 Google Cloud 환경 (Cloud Functions, Cloud Run 등)에서 GCLOUD_PROJECT는 환경의 프로젝트 ID로 자동 설정됩니다.

    GCLOUD_PROJECT를 설정하면 구성 매개변수를 생략할 수 있습니다. firebase()

사용자 인증 정보

Firebase 사용자 인증 정보를 제공하려면 Google Cloud도 설정해야 합니다. 애플리케이션 기본 사용자 인증 정보 사용자 인증 정보를 지정하려면 다음 단계를 따르세요.

  • Google Cloud 환경 (Cloud Functions, Cloud Run 등)에서 자동으로 설정됩니다.

  • 기타 환경의 경우:

    1. Firebase 프로젝트의 서비스 계정 사용자 인증 정보를 생성합니다. JSON 키 파일을 다운로드합니다 이 작업은 서비스 계정 페이지로 이동합니다.
    2. 환경 변수 GOOGLE_APPLICATION_CREDENTIALS를 파일에 설정합니다. 서비스 계정 키가 포함된 JSON 파일의 경로를 확인하거나 환경 변수 GCLOUD_SERVICE_ACCOUNT_CREDS를 JSON 파일의 콘텐츠로 설정할 수 있습니다.

원격 분석

이 플러그인은 Google Cloud 플러그인에 직접 종속되므로 Google의 Cloud 운영 제품군으로 원격 분석을 내보낼 수 있도록 프로비저닝됩니다. 원격 분석 내보내기를 사용 설정하려면 enableTracingAndMetricstrue로 설정하고 Genkit 구성에 원격 분석 섹션을 추가합니다.

import {configureGenkit} from "@genkit-ai/core";
import {firebase} from "@genkit-ai/firebase";

configureGenkit({
  plugins: [firebase()],
  enableTracingAndMetrics: true,
  telemetry: {
    instrumentation: 'firebase',
    logger: 'firebase',
  },
});

프로젝트에서 사용 설정해야 하는 모든 구성 옵션과 필요한 API에 관해서는 Google Cloud 플러그인 문서를 참고하세요.

용도

이 플러그인은 Firebase 서비스와의 여러 통합을 제공하며 이를 통해 함께 또는 개별적으로 사용할 수 있습니다.

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);
}

검색기

firebase 플러그인은 Firestore를 정의하는 편의 함수를 제공합니다. 검색자, 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)
});

이를 사용하려면 retrieve() 함수에 전달합니다.

const docs = await retrieve({
  retriever: yourRetrieverRef,
  query: "look for something",
  options: {limit: 5},
});

사용 가능한 가져오기 옵션은 다음과 같습니다.

  • limit: 반환할 일치하는 결과의 수를 지정합니다.
  • where: 벡터 검색 외에 일치시킬 필드/값 쌍입니다 (예: {category: 'food'}).
  • collection: 검색할 기본 컬렉션을 재정의합니다. 예: 하위 컬렉션 검색

색인 생성 및 삽입

Firestore 컬렉션을 채우려면 임베딩 생성기를 Admin SDK가 있습니다. 예를 들어 Firestore에 맞게 검색 증강 생성 페이지 조정 가능 사용할 수 있습니다.

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는 빠르고 효율적인 쿼리를 제공하기 위해 색인을 사용합니다. 컬렉션입니다. (여기서 '색인'은 데이터베이스 색인을 가리키며 Genkit의 색인 생성기 및 검색기 추상화.

이전 예에서는 embedding 필드의 색인을 생성해야 합니다. 있습니다 색인을 만들려면 다음 안내를 따르세요.

  • 다음에 설명된 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
    

    하지만 올바른 색인 생성 구성은 사용 중인 임베딩 모델을 기반으로 합니다.

  • 또는 retrieve()를 호출하면 Firestore에서 색인을 만들도록 하는 데 도움이 됩니다.

자세히 알아보기

Cloud Firestore trace 스토리지

Cloud Firestore를 사용하여 trace를 저장할 수 있습니다.

import {firebase} from "@genkit-ai/firebase";

configureGenkit({
  plugins: [firebase()],
  traceStore: "firebase",
  enableTracingAndMetrics: true,
});

기본적으로 플러그인은 genkit-traces라는 컬렉션에 트레이스를 저장합니다. 프로젝트의 기본 데이터베이스에 저장됩니다 두 설정 중 하나를 변경하려면 다음 단계를 따르세요.

firebase({
  traceStore: {
    collection: "your-collection";
    databaseId: "your-db";
  }
})

Firestore 기반 trace 스토리지를 사용하는 경우 trace 문서에 TTL을 사용 설정하는 것이 좋습니다. https://firebase.google.com/docs/firestore/ttl

Cloud Functions

플러그인은 onFlow() 생성자를 제공하며 이 생성자는 Firebase용 Cloud Functions HTTPS 트리거 함수 이러한 함수는 Firebase의 호출 가능 함수 인터페이스를 호출하고 Cloud Functions 클라이언트 SDK 지정합니다.

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;
  }
);

Firebase CLI를 사용하여 흐름을 배포합니다.

firebase deploy --only functions

onFlow() 함수에는 defineFlow()에 없는 몇 가지 옵션이 있습니다.

  • httpsOptions: HttpsOptions 객체입니다.

    export const exampleFlow = onFlow(
      {
        name: "exampleFlow",
        httpsOptions: {
          cors: true,
        },
        // ...
      },
      async (prompt) => {
        // ...
      }
    );
    
  • enforceAppCheck: true인 경우 앱 체크가 누락되거나 잘못된 요청을 거부합니다. 토큰입니다.

  • consumeAppCheckToken: true인 경우 앱 체크 토큰을 확인한 후 무효화합니다.

    재생 보호를 참고하세요.

Firebase 인증

이 플러그인은 승인 정책을 만드는 도우미 함수를 제공합니다. 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) => {
    // ...
  }
);

인증 정책을 정의하려면 firebaseAuth()에 다음과 같은 콜백 함수를 제공합니다. 이 DecodedIdToken 를 유일한 매개변수로 사용합니다. 이 함수에서 사용자 토큰을 검사하고 오류가 발생합니다.

다음에 대한 자세한 내용은 승인 및 무결성을 참조하세요. 이 주제에서 볼 수 있습니다.