צ'אט עם קובץ PDF

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

  1. הגדרת הפרויקט
  2. ייבוא יחסי התלות הנדרשים
  3. הגדרת Genkit והמודל שמוגדר כברירת מחדל
  4. טעינה וניתוח של קובץ ה-PDF
  5. הגדרת ההנחיה
  6. הטמעת ממשק המשתמש
  7. הטמעת לולאת הצ'אט
  8. הפעלת האפליקציה

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

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

שלבי ההטמעה

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

1. הגדרת הפרויקט

  1. יוצרים מבנה ספריות וקובץ לאחסון קוד המקור.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. מפעילים את הפרויקט החדש ב-TypeScript.

    $ npm init -y
    
  3. מתקינים את המודול pdf-parse.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. כדי להשתמש ב-Genkit בפרויקט, צריך להתקין את יחסי התלות הבאים של Genkit:

    $ npm i genkit @genkit-ai/googleai
    
    • genkit מספק את היכולות הבסיסיות של Genkit.
    • @genkit-ai/googleai מספק גישה למודלים של Google AI Gemini.
  5. אחזור והגדרה של מפתח ה-API של המודל

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

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

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

    $ export GOOGLE_GENAI_API_KEY=<your API key>
    

2. מייבאים את יחסי התלות הנדרשים

בקובץ index.ts שיצרתם, מוסיפים את השורות הבאות כדי לייבא את יחסי התלות הנדרשים לפרויקט הזה:

import { gemini20Flash, googleAI } from '@genkit-ai/googleai';
import { genkit } from 'genkit/beta'; // chat is a beta feature
import pdf from 'pdf-parse';
import fs from 'fs';
import { createInterface } from "node:readline/promises";
  • השורה הראשונה מייבאת את המודל gemini20Flash ואת הפלאגין googleAI מחבילת @genkit-ai/googleai, ומאפשרת גישה למודלים של Gemini מבית Google.
  • בשתי השורות הבאות מייבאים את הספרייה pdf-parse לניתוח קובצי PDF ואת המודול fs לפעולות במערכת הקבצים.
  • השורה האחרונה מייבאת את הפונקציה createInterface מהמודול node:readline/promises, שמשמשים ליצירת ממשק שורת פקודה לאינטראקציה עם משתמשים.

3. הגדרת Genkit והדגם שמוגדר כברירת מחדל

מוסיפים את השורות הבאות כדי להגדיר את Genkit ולהגדיר את Gemini 2.0 Flash בתור מודל ברירת המחדל.

const ai = genkit({
  plugins: [googleAI()],
  model: gemini20Flash,
});

לאחר מכן אפשר להוסיף שלד לקוד ולטיפול בשגיאות.

(async () => {
  try {
    // Step 1: get command line arguments

    // Step 2: load PDF file

    // Step 3: construct prompt

    // Step 4: start chat

    // Step 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!

4. טעינת קובץ ה-PDF וניתוח שלו

  1. מוסיפים קוד לקריאת שם קובץ ה-PDF שהוענק משורת הפקודה.

        // Step 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);
        }
    
  2. מוסיפים קוד כדי לטעון את התוכן של קובץ ה-PDF.

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

5. הגדרת ההנחיה

מוסיפים קוד כדי להגדיר את ההנחיה:

    // Step 3: construct prompt
    const prefix = process.argv[3] || "Sample prompt: Answer the user's questions about the contents of this PDF file.";
    const prompt = `
      ${prefix}
      Context:
      ${text}
    `;
  • ההצהרה הראשונה של const מגדירה הנחיה שמוגדרת כברירת מחדל, אם המשתמש לא מעביר הנחיה משלו משורת הפקודה.
  • ההצהרה השנייה של const מבצעת אינטרפולציה של הקידומת של ההנחיה והטקסט המלא של קובץ ה-PDF בהנחיה למודל.

6. הטמעת ממשק המשתמש

מוסיפים את הקוד הבא כדי להתחיל את הצ'אט ולהטמיע את ממשק המשתמש:

    // Step 4: start chat
    const chat = ai.chat({ system: prompt });
    const readline = createInterface(process.stdin, process.stdout);
    console.log("You're chatting with Gemini. Ctrl-C to quit.\n");

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

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

בשלב 5, מוסיפים קוד כדי לקבל קלט מהמשתמש ולשלוח את הקלט הזה למודל באמצעות chat.send. החלק הזה באפליקציה חוזר על עצמו עד שהמשתמש מקשיב על CTRL + C.

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

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

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

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

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