Firebase प्लगिन

Firebase प्लग इन, Firebase की सेवाओं के साथ इंटिग्रेशन की सुविधा देता है. इससे, बेहतर और स्केलेबल एआई ऐप्लिकेशन बनाए जा सकते हैं. मुख्य सुविधाएं:

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

इंस्टॉल करना

npm की मदद से Firebase प्लग इन इंस्टॉल करें:

npm install @genkit-ai/firebase

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

Firebase प्रोजेक्ट सेट अप करना

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

Firebase Admin SDK टूल को शुरू करना

आपको अपने ऐप्लिकेशन में Firebase Admin SDK टूल को शुरू करना होगा. यह प्लग इन अपने-आप नहीं करता.

import { initializeApp } from 'firebase-admin/app';

initializeApp({
  projectId: 'your-project-id',
});

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

  • ऊपर दिए गए स्निपेट में दिखाए गए तरीके से, initializeApp() कॉन्फ़िगरेशन ऑब्जेक्ट में projectId सेट करें.

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

    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 फ़ाइल के कॉन्टेंट पर सेट किया जा सकता है.

सुविधाएं और इस्तेमाल

टेलिमेट्री

यह प्लग इन, Google Cloud प्लग इन पर पूरी तरह से निर्भर है. इसलिए, इसमें Google के Cloud ऑपरेशंस सुइट में टेलीमेट्री एक्सपोर्ट की सुविधा चालू करने के प्रावधान हैं. टेलीमेट्री एक्सपोर्ट कॉल enableFirebaseTelemetry() चालू करने के लिए:

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

enableFirebaseTelemetry();

कॉन्फ़िगरेशन के सभी विकल्पों और प्रोजेक्ट पर चालू किए जाने वाले ज़रूरी एपीआई के बारे में जानने के लिए, Google Cloud प्लग इन के दस्तावेज़ देखें.

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

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

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 रीट्रिवर तय करना

Firestore वेक्टर-आधारित क्वेरी के लिए, defineFirestoreRetriever() का इस्तेमाल करके रिट्रिवर बनाएं.

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

दस्तावेज़ वापस पाना

तय किए गए retriever का इस्तेमाल करके दस्तावेज़ों को वापस पाने के लिए, retriever इंस्टेंस और क्वेरी के विकल्पों को 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: (number)
    जितने दस्तावेज़ों को वापस लाना है उनकी संख्या बताएं. डिफ़ॉल्ट रूप से 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,
    });
    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 के तौर पर डिप्लॉय करना

प्लग इन, onFlow() कन्स्ट्रक्टर उपलब्ध कराता है. यह Firebase के लिए Cloud Functions की मदद से, एचटीटीपीएस से ट्रिगर होने वाले फ़ंक्शन का फ़्लो बनाता है. ये फ़ंक्शन, Firebase के कॉल किए जा सकने वाले फ़ंक्शन इंटरफ़ेस के मुताबिक होते हैं. साथ ही, इन्हें कॉल करने के लिए, Cloud Functions क्लाइंट SDK टूल का इस्तेमाल किया जा सकता है.

import { onFlow, noAuth } from "@genkit-ai/firebase/functions";

export const exampleFlow = onFlow(
  ai, // Provide the Genkit instance
  {
    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: आपके Cloud फ़ंक्शन को कॉन्फ़िगर करने के लिए इस्तेमाल किया जाने वाला HttpsOptions ऑब्जेक्ट:

    export const exampleFlow = onFlow(
      ai,
      {
        name: "exampleFlow",
        httpsOptions: {
          cors: true,
        },
        // ...
      },
      async (prompt) => {
        // ...
      }
    );
    
  • enforceAppCheck: जब true, ऐप्लिकेशन की जांच के लिए टोकन मौजूद न होने या अमान्य होने पर, अनुरोध अस्वीकार करें.

  • consumeAppCheckToken: जब true, तो पुष्टि करने के बाद, ऐप्लिकेशन की जांच करने वाले टोकन को अमान्य कर दें.

    रीप्ले प्रोटेक्शन देखें.

Firebase से पुष्टि करना

यह प्लग इन, Firebase Auth के लिए अनुमति से जुड़ी नीतियां बनाने के लिए, सहायक फ़ंक्शन उपलब्ध कराता है:

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

export const exampleFlow = onFlow(
  ai,
  {
    name: "exampleFlow",
    authPolicy: firebaseAuth((user) => {
      if (!user.email_verified) throw new Error("Requires verification!");
    }),
  },
  async (prompt) => {
    // ...
  }
);

पुष्टि करने की नीति तय करने के लिए, firebaseAuth() के साथ एक कॉलबैक फ़ंक्शन दें. यह फ़ंक्शन, DecodedIdToken को अपने एकमात्र पैरामीटर के तौर पर लेगा. इस फ़ंक्शन में, उपयोगकर्ता टोकन की जांच करें और अगर उपयोगकर्ता आपके तय किए गए किसी भी मानदंड को पूरा नहीं करता है, तो गड़बड़ी का मैसेज दिखाएं.

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