يوضِّح هذا الدرس التطبيقي حول الترميز كيفية إنشاء تطبيق محادثات يسمح للمستخدمين باستخراج المعلومات من مستندات PDF باستخدام لغة طبيعية.
- إعداد المشروع
- استيراد العناصر التابعة المطلوبة
- ضبط Genkit والنموذج التلقائي
- تحميل ملف PDF وتحليله
- إعداد الطلب
- تنفيذ واجهة المستخدم
- تنفيذ حلقة المحادثة
- تشغيل التطبيق
المتطلبات الأساسية
قبل بدء العمل، يجب إعداد المتطلبات الأساسية التالية:
خطوات التنفيذ
بعد إعداد التبعيات، يمكنك إنشاء المشروع.
1. إعداد مشروعك
أنشئ بنية دليل وملفًا لتخزين رمز المصدر.
$ mkdir -p chat-with-a-pdf/src && \ cd chat-with-a-pdf && \ touch src/index.ts
ابدأ مشروعًا جديدًا باستخدام TypeScript.
$ npm init -y
ثبِّت وحدة pdf-parse.
$ npm i pdf-parse && npm i -D @types/pdf-parse
ثبِّت التبعيات التالية لـ Genkit لاستخدام Genkit في مشروعك:
$ npm i genkit @genkit-ai/googleai
- يوفّر
genkit
إمكانات Genkit الأساسية. @genkit-ai/googleai
يتيح الوصول إلى نماذج Google AI Gemini.
- يوفّر
الحصول على مفتاح واجهة برمجة التطبيقات للنموذج وضبطه
لاستخدام Gemini API التي يستخدمها هذا الدرس التطبيقي، عليك أولاً ضبط مفتاح واجهة برمجة التطبيقات. إذا لم يكن لديك مفتاح، أنشئ مفتاحًا في Google AI Studio.
توفّر Gemini 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 وتحليله
أضِف رمزًا لقراءة اسم ملف 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); }
أضِف رمزًا لتحميل محتوى ملف 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
الأول المحادثة مع النموذج من خلال
استدعاء طريقة 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.