Firebase प्लगिन

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

  • Firestore वेक्टर स्टोर: वेक्टर एम्बेडमेंट की मदद से, इंडेक्स करने और जानकारी हासिल करने के लिए Firestore का इस्तेमाल करें.
  • टेलीमेट्री: Google के Cloud ऑपरेशंस सुइट में टेलीमेट्री एक्सपोर्ट करें. यह सुइट, Firebase Genkit मॉनिटरिंग कंसोल को बेहतर बनाता है.

इंस्टॉल करना

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

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

टेलिमेट्री

Firebase Genkit मॉनिटरिंग, Google के Cloud ऑपरेशंस सुइट की मदद से काम करती है. इसके लिए, आपके प्रोजेक्ट के लिए, टेलीमेट्री से जुड़े एपीआई चालू होने चाहिए. ज़्यादा जानकारी के लिए, कृपया Google Cloud प्लग इन के दस्तावेज़ देखें.

Google Cloud IAM Console में, "डिफ़ॉल्ट कंप्यूट सेवा खाते" को ये भूमिकाएं दें:

  • मॉनिटरिंग मेट्रिक लेखक (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 प्लग इन के साथ कॉन्फ़िगरेशन के विकल्प शेयर करता है.

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

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

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 retriever तय करना

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 कलेक्शन को पॉप्युलेट करने के लिए, एडमिन 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 के इंडेक्सर और retriever एब्स्ट्रैक्शन से.

पिछले उदाहरण में, 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 के साथ फ़्लो को डिप्लॉय करने के लिए, genkit के लिए Firebase Functions लाइब्रेरी की पहले से मौजूद सहायता का इस्तेमाल करें. 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