الدردشة باستخدام ملف PDF

يوضّح لك هذا الدرس التطبيقي كيفية استخدام Genkit لإنشاء تطبيق يتيح لك الدردشة مع ملف PDF.

المتطلبات الأساسية

يفترض هذا الدرس التطبيقي حول الترميز أنّك على دراية بإنشاء التطبيقات باستخدام Node.js. لإكمال هذا الدليل التعليمي حول الرموز البرمجية، تأكَّد من أنّ بيئة التطوير تستوفي المتطلبات التالية:

  • الإصدار 20 من Node.js والإصدارات الأحدث
  • 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

ضبط مفتاح واجهة برمجة التطبيقات الخاص بالنموذج

في هذا الدليل، سنوضّح لك كيفية استخدام Gemini API التي توفّر خطة مجانية سخية ولا تتطلّب بطاقة ائتمان للبدء. لاستخدام Gemini API، ستحتاج إلى مفتاح واجهة برمجة التطبيقات. إذا لم يكن لديك مفتاح حاليًا، يمكنك إنشاء مفتاح في Google AI Studio.

الحصول على مفتاح واجهة برمجة التطبيقات من Google AI Studio

بعد إنشاء مفتاح واجهة برمجة التطبيقات، اضبط متغيّر GOOGLE_GENAI_API_KEY environment على مفتاحك باستخدام الأمر التالي:

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.