צ'אט עם קובץ PDF

בשיעור הזה תלמדו איך להשתמש ב-Genkit כדי להטמיע אפליקציה שמאפשרת לשוחח בצ'אט עם קובץ PDF.

דרישות מוקדמות

בשיעור הזה אנחנו מניחים שאתם מכירים את תהליך פיתוח האפליקציות באמצעות Node.js. כדי להשלים את הקודלאב הזה, צריך לוודא שסביבת הפיתוח עומדת בדרישות הבאות:

  • Node.js v20 ואילך
  • npm

יצירת פרויקט חדש

  1. יוצרים תיקייה חדשה ריקה.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. מפעילים את הפרויקט החדש ב-TypeScript.

    npm init -y
    

התקנת Genkit

כדי להשתמש ב-Genkit בפרויקט, צריך להתקין את יחסי התלות הבאים של Genkit:

  • genkit מספק את היכולות הבסיסיות של Genkit.
  • @genkit-ai/googleai מספק גישה למודלים של Google AI Gemini.
npm install genkit @genkit-ai/googleai

הגדרת מפתח ה-API של המודל

במדריך הזה נסביר איך להשתמש ב-Gemini API, שמציע תוכנית חינמית נדיבה ולא מחייב כרטיס אשראי כדי להתחיל. כדי להשתמש ב-Gemini API, צריך מפתח API. אם עדיין אין לכם מפתח, תוכלו ליצור מפתח ב-Google AI Studio.

קבלת מפתח API מ-Google AI Studio

אחרי שיוצרים מפתח API, מגדירים את משתנה הסביבה GOOGLE_GENAI_API_KEY למפתח באמצעות הפקודה הבאה:

export GOOGLE_GENAI_API_KEY=<your API key>

הערה: במדריך הזה נעשה שימוש ב-Gemini API מ-AI Studio, אבל Genkit תומך במגוון רחב של ספקי מודלים, כולל:‏ * Gemini מ-Vertex AI‏ * המודלים Claude 3 ו-Llama 3.1 של Anthropic דרך Vertex AI Model Garden‏ * מודלים בקוד פתוח דרך Ollama‏ * ספקים שנתמכים על ידי הקהילה כמו OpenAI ו-Cohere.

ייבוא והפעלה של Genkit

  1. יוצרים תיקייה חדשה src ובתוכה קובץ חדש index.ts. מוסיפים את השורות הבאות כדי לייבא את Genkit ואת הפלאגין של Google AI.

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. מוסיפים את השורות הבאות כדי להגדיר את Genkit ולהגדיר את Gemini 1.5 Flash בתור מודל ברירת המחדל.

    const ai = genkit({
      plugins: [googleAI()],
      model: gemini15Flash,
    });
    
  3. מוסיפים את הגוף הראשי של האפליקציה.

    (async () => {
      try {
        // 1: get command line arguments
        // 2: load PDF file
        // 3: construct prompt
        // 4: start chat
        // 5: chat loop
      } catch (error) {
        console.error("Error parsing PDF or interacting with Genkit:", error);
      }
    })(); // <-- don't forget the trailing parentheses to call the function!
    

טעינת קובץ PDF וניתוח שלו

בשלב הזה נכתוב קוד לטעינה ולניתוח של קובץ PDF.

  1. מתקינים את pdf-parse.

    npm i pdf-parse
    
  2. מייבאים את ספריית ה-PDF לאפליקציה.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. קריאת שם הקובץ של קובץ ה-PDF שהוענק משורת הפקודה.

      // 1: get command line arguments
      const filename = process.argv[2];
      if (!filename) {
        console.error("Please provide a filename as a command line argument.");
        process.exit(1);
      }
    
  4. טוענים את התוכן של קובץ ה-PDF.

      // 2: load PDF file
      let dataBuffer = fs.readFileSync(filename);
      const { text } = await pdf(dataBuffer);
    

הגדרת ההנחיה

כדי להגדיר את ההנחיה, פועלים לפי השלבים הבאים:

  1. לאפשר למשתמש לספק הנחיה מותאמת אישית דרך שורת הפקודה. אם הם לא מספקים הנחיה, משתמשים בברירת מחדל.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. מזינים את הקידומת של ההנחיה ואת הטקסט המלא של קובץ ה-PDF בהנחיה של המודל.

        const prompt = `
          ${prefix}
          Context:
          ${data.text}
        `
    

הטמעת לולאת הצ'אט

  1. כדי להתחיל את הצ'אט עם המודל, קוראים לשיטה chat ומעבירים את ההנחיה (שכוללת את הטקסט המלא של קובץ ה-PDF).

    const chat = ai.chat({ system: prompt })
    
  2. מייבאים את createInterface. כך תוכלו ליצור ממשק משתמש מבוסס-טקסט.

    import {createInterface} from "node:readline/promises";
    
  3. יוצרים מכונה של קלט טקסט ומציגים הודעה למשתמש.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. קוראים את הקלט של המשתמש ושולחים אותו למודל באמצעות chat.send. החלק הזה של האפליקציה יתבצע בלולאה עד שהמשתמש ילחץ על CTRL + C.

        while (true) {
          const userInput = await readline.question("> ");
          const {text} = await chat.send(userInput);
          console.log(text);
        }
    

הפעלת האפליקציה

עכשיו אפשר להריץ את האפליקציה מהמסוף. פותחים את הטרמינל בתיקיית השורש של הפרויקט ומריצים את הפקודה הבאה:

npx tsx src/index.ts path/to/some.pdf

לאחר מכן תוכלו להתחיל לצ'אט עם קובץ ה-PDF.