แชทกับไฟล์ PDF

โค้ดแล็บนี้จะแสดงวิธีใช้ Genkit เพื่อติดตั้งใช้งานแอปที่ให้คุณแชทกับไฟล์ PDF

ข้อกำหนดเบื้องต้น

โค้ดแล็บนี้ถือว่าคุณคุ้นเคยกับการสร้างแอปพลิเคชันด้วย Node.js หากต้องการทำ Codelab นี้ให้เสร็จสมบูรณ์ โปรดตรวจสอบว่าสภาพแวดล้อมการพัฒนาของคุณมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้

  • 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 ให้สิทธิ์เข้าถึงโมเดล Gemini ของ AI ของ Google
npm install genkit @genkit-ai/googleai

กำหนดค่าคีย์ API ของโมเดล

ในคู่มือนี้ เราจะแสดงวิธีใช้ Gemini API ซึ่งมีระดับแบบไม่มีค่าใช้จ่ายที่ครอบคลุมและไม่จําเป็นต้องใช้บัตรเครดิตในการเริ่มต้นใช้งาน หากต้องการใช้ Gemini API คุณจะต้องมีคีย์ API หากยังไม่มี ให้สร้างคีย์ใน Google AI Studio

รับคีย์ API จาก Google AI Studio

หลังจากสร้างคีย์ API แล้ว ให้ตั้งค่าตัวแปร GOOGLE_GENAI_API_KEY environment เป็นคีย์ของคุณด้วยคําสั่งต่อไปนี้

export GOOGLE_GENAI_API_KEY=<your API key>

หมายเหตุ: แม้ว่าบทแนะนำนี้จะใช้ Gemini API จาก AI Studio แต่ Genkit รองรับผู้ให้บริการโมเดลที่หลากหลาย ซึ่งรวมถึง Gemini จาก Vertex AI, โมเดล Claude 3 ของ Anthropic และ Llama 3.1 ผ่าน Vertex AI Model Garden, โมเดลโอเพนซอร์สผ่าน Ollama และผู้ให้บริการที่ชุมชนสนับสนุน เช่น OpenAI และ Cohere

นําเข้าและเริ่มต้น Genkit

  1. สร้างโฟลเดอร์ใหม่ src และสร้างไฟล์ใหม่ index.ts ไว้ในโฟลเดอร์นั้น เพิ่มบรรทัดต่อไปนี้เพื่อนําเข้า Genkit และปลั๊กอิน AI ของ Google

    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 ซึ่งจะช่วยให้คุณสร้าง UI แบบข้อความได้

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