Firebase प्लगिन

Firebase प्लग इन, Firebase सेवाओं के साथ कई इंटिग्रेशन उपलब्ध कराता है:

  • Cloud Firestore वेक्टर स्टोर का इस्तेमाल करने वाले इंडेक्स और रिट्रीवर
  • Cloud Firestore का इस्तेमाल करके स्टोरेज ट्रेस करना
  • Cloud Functions का इस्तेमाल करके फ़्लो डिप्लॉयमेंट
  • Firebase से पुष्टि करने वाले उपयोगकर्ताओं के लिए अनुमति देने से जुड़ी नीतियां

इंस्टॉल करना

npm i --save @genkit-ai/firebase

ज़रूरी शर्तें

  • सभी Firebase प्रॉडक्ट के लिए एक Firebase प्रोजेक्ट ज़रूरी है. Firebase कंसोल का इस्तेमाल करके, एक नया प्रोजेक्ट बनाया जा सकता है या किसी मौजूदा Google Cloud प्रोजेक्ट में Firebase को चालू किया जा सकता है.
  • इसके अलावा, अगर आपको Cloud Functions के लिए फ़्लो डिप्लॉय करना है, तो आपको इस्तेमाल के हिसाब से शुल्क चुकाएं प्लान पर, अपने प्रोजेक्ट को अपग्रेड करना होगा.

कॉन्फ़िगरेशन

इस प्लग इन का उपयोग करने के लिए, configureGenkit() को कॉल करते समय इसका उल्लेख करें:

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

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

प्लगिन के लिए, आपको अपना Firebase प्रोजेक्ट आईडी बताना होगा. इनमें से किसी भी तरीके का इस्तेमाल करके, Firebase प्रोजेक्ट आईडी डाला जा सकता है:

  • projectId को firebase() कॉन्फ़िगरेशन ऑब्जेक्ट में सेट करें.

  • GCLOUD_PROJECT एनवायरमेंट वैरिएबल सेट करें. अगर Google Cloud एनवायरमेंट (Cloud Functions, Cloud Run वगैरह) से फ़्लो चलाया जा रहा है, तो GCLOUD_PROJECT अपने-आप एनवायरमेंट के प्रोजेक्ट आईडी पर सेट हो जाता है.

    अगर GCLOUD_PROJECT को सेट किया जाता है, तो कॉन्फ़िगरेशन पैरामीटर को हटाया जा सकता है: firebase()

Firebase क्रेडेंशियल देने के लिए, आपको Google Cloud ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल भी सेट अप करने होंगे. अपने क्रेडेंशियल बताने के लिए:

  • अगर Google Cloud एनवायरमेंट (Cloud Functions, Cloud Run वगैरह) से फ़्लो चलाया जा रहा है, तो यह अपने-आप सेट हो जाता है.

  • अन्य एनवायरमेंट के लिए:

    1. अपने Firebase प्रोजेक्ट के लिए सेवा खाते के क्रेडेंशियल जनरेट करें और JSON कुंजी वाली फ़ाइल डाउनलोड करें. Firebase कंसोल के सेवा खाता पेज पर ऐसा किया जा सकता है.
    2. एनवायरमेंट वैरिएबल GOOGLE_APPLICATION_CREDENTIALS को उस JSON फ़ाइल के फ़ाइल पाथ पर सेट करें जिसमें आपकी सेवा खाता कुंजी है.

इस्तेमाल किए जाने से जुड़ी जानकारी

यह प्लगिन, Firebase सेवाओं के साथ कई इंटिग्रेशन उपलब्ध कराता है. इनका इस्तेमाल एक साथ या अलग-अलग किया जा सकता है.

Cloud Firestore वेक्टर स्टोर

आरएजी इंडेक्स करने और डेटा वापस पाने के लिए, Cloud Firestore का इस्तेमाल वेक्टर स्टोर के तौर पर किया जा सकता है.

इस सेक्शन में, firebase प्लगिन और Cloud Firestore के वेक्टर खोज की सुविधा के बारे में खास जानकारी होती है. Genkit की मदद से आरएजी लागू करने के बारे में ज़्यादा जानकारी पाने के लिए, Retrieval- Augmented जनरेशन पेज देखें.

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 कलेक्शन में जानकारी भरने के लिए, एडमिन एसडीके के साथ-साथ एम्बेडिंग जनरेटर का इस्तेमाल करें. उदाहरण के लिए, Retrieval-Augmented जनरेशन पेज के मेन्यू का डेटा डालने की स्क्रिप्ट को इस तरह से 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 फ़ील्ड को इंडेक्स करना ज़रूरी है, ताकि वह काम कर सके. इंडेक्स बनाने के लिए:

  • 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
    

    हालांकि, इंडेक्स करने का सही कॉन्फ़िगरेशन, आपकी बनाई जाने वाली क्वेरी और उस एम्बेड मॉडल पर निर्भर करता है जिसका इस्तेमाल किया जा रहा है.

  • इसके अलावा, retrieve() को कॉल किया जा सकता है और इंडेक्स बनाने के लिए, Firestore को सही निर्देश के साथ गड़बड़ी मिलेगी.

और जानें

Cloud Firestore ट्रेस का स्टोरेज

स्टोर ट्रेस के लिए Cloud Firestore का इस्तेमाल किया जा सकता है:

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

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

डिफ़ॉल्ट रूप से, प्लगिन प्रोजेक्ट के डिफ़ॉल्ट डेटाबेस में मौजूद genkit-traces नाम के कलेक्शन में ट्रेस सेव करता है. किसी भी सेटिंग को बदलने के लिए:

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

Firestore पर आधारित ट्रेस स्टोरेज का इस्तेमाल करते समय, आपको ट्रेस दस्तावेज़ों के लिए टीटीएल को चालू करना होगा: https://firebase.google.com/docs/firestore/ttl

Cloud Functions

यह प्लगिन, onFlow() कंस्ट्रक्टर उपलब्ध कराता है, जो Firebase के एचटीटीपीएस से ट्रिगर होने वाले फ़ंक्शन के लिए Cloud Functions का इस्तेमाल करके फ़्लो बनाता है. ये फ़ंक्शन, 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 सीएलआई का इस्तेमाल करके अपने फ़्लो को डिप्लॉय करें:

firebase deploy --only functions

onFlow() फ़ंक्शन में कुछ ऐसे विकल्प हैं जो defineFlow() में मौजूद नहीं हैं:

  • httpsOptions: एक HttpsOptions ऑब्जेक्ट, जिसका इस्तेमाल आपके Cloud फ़ंक्शन को कॉन्फ़िगर करने के लिए किया जाता है: js 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 के पैरामीटर के तौर पर इस्तेमाल होता है. इस फ़ंक्शन में, उपयोगकर्ता टोकन की जांच करें और अगर उपयोगकर्ता आपकी ज़रूरत के हिसाब से किसी भी शर्त को पूरा नहीं कर पाता है, तो गड़बड़ी की जानकारी दें.

इस विषय पर ज़्यादा चर्चा के लिए, अनुमति देना और उसका रखरखाव करना देखें.