แชทกับไฟล์ PDF

โค้ดแล็บนี้แสดงวิธีสร้างแอปพลิเคชันการสนทนาที่อนุญาตให้ผู้ใช้ดึงข้อมูลจากเอกสาร PDF โดยใช้ภาษาธรรมชาติ

  1. สร้างโปรเจ็กต์
  2. นําเข้าไลบรารีที่ต้องระบุ
  3. กําหนดค่า Genkit และโมเดลเริ่มต้น
  4. โหลดและแยกวิเคราะห์ไฟล์ PDF
  5. ตั้งค่าพรอมต์
  6. ติดตั้งใช้งาน UI
  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 ให้สิทธิ์เข้าถึงโมเดล AI Gemini ของ Google
  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 ได้
  • 2 บรรทัดถัดไปจะนําเข้าไลบรารี 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 รายการที่ 2 จะแทรกคํานำหน้าพรอมต์และข้อความทั้งหมดของไฟล์ PDF ลงในพรอมต์สําหรับโมเดล

6. ติดตั้งใช้งาน UI

เพิ่มโค้ดต่อไปนี้เพื่อเริ่มแชทและติดตั้งใช้งาน UI

    // 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 ได้