Trò chuyện với tệp PDF

Lớp học lập trình này hướng dẫn bạn cách sử dụng Genkit để triển khai một ứng dụng cho phép bạn trò chuyện bằng tệp PDF.

Điều kiện tiên quyết

Lớp học lập trình này giả định rằng bạn đã quen với việc xây dựng ứng dụng bằng Node.js. Để hoàn thành lớp học lập trình này, hãy đảm bảo rằng môi trường phát triển của bạn đáp ứng các yêu cầu sau:

  • Node.js phiên bản 20 trở lên
  • npm

Tạo dự án mới

  1. Tạo một thư mục trống mới.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. Khởi chạy một dự án TypeScript mới.

    npm init -y
    

Cài đặt Genkit

Cài đặt các phần phụ thuộc Genkit sau đây để sử dụng Genkit trong dự án:

  • genkit cung cấp các tính năng cốt lõi của Genkit.
  • @genkit-ai/googleai cung cấp quyền truy cập vào các mô hình Gemini AI của Google.
npm install genkit @genkit-ai/googleai

Định cấu hình khoá API mô hình

Trong hướng dẫn này, chúng tôi sẽ hướng dẫn bạn cách sử dụng Gemini API. API này cung cấp một cấp miễn phí hào phóng và không yêu cầu thẻ tín dụng để bắt đầu. Để sử dụng Gemini API, bạn cần có khoá API. Nếu bạn chưa có, hãy tạo khoá trong Google AI Studio.

Lấy khoá API từ Google AI Studio

Sau khi bạn tạo khoá API, hãy đặt biến môi trường GOOGLE_GENAI_API_KEY thành khoá của bạn bằng lệnh sau:

export GOOGLE_GENAI_API_KEY=<your API key>

Lưu ý: Mặc dù hướng dẫn này sử dụng API Gemini của AI Studio, nhưng Genkit hỗ trợ nhiều nhà cung cấp mô hình, bao gồm: * Gemini của Vertex AI * Mô hình Claude 3 của Anthropic và Llama 3.1 thông qua Vertex AI Model Garden * Mô hình nguồn mở thông qua Ollama * Các nhà cung cấp được cộng đồng hỗ trợ như OpenAI và Cohere.

Nhập và khởi chạy Genkit

  1. Tạo một thư mục mới src và bên trong thư mục đó, hãy tạo một tệp mới index.ts. Thêm các dòng sau để nhập Genkit và trình bổ trợ AI của Google.

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. Thêm các dòng sau để định cấu hình Genkit và đặt Gemini 1.5 Flash làm mô hình mặc định.

    const ai = genkit({
      plugins: [googleAI()],
      model: gemini15Flash,
    });
    
  3. Thêm phần thân chính của ứng dụng.

    (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!
    

Tải và phân tích cú pháp tệp PDF

Trong bước này, bạn sẽ viết mã để tải và phân tích cú pháp tệp PDF.

  1. Cài đặt pdf-parse.

    npm i pdf-parse
    
  2. Nhập thư viện PDF vào ứng dụng.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. Đọc tên tệp PDF được truyền vào từ dòng lệnh.

      // 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. Tải nội dung của tệp PDF.

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

Thiết lập lời nhắc

Hãy làm theo các bước sau để thiết lập lời nhắc.

  1. Cho phép người dùng cung cấp lời nhắc tuỳ chỉnh thông qua dòng lệnh. Nếu họ không đưa ra lời nhắc, hãy sử dụng lời nhắc mặc định.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. Chèn tiền tố câu lệnh và toàn bộ văn bản của tệp PDF vào câu lệnh cho mô hình.

        const prompt = `
          ${prefix}
          Context:
          ${data.text}
        `
    

Triển khai vòng lặp trò chuyện

  1. Bắt đầu cuộc trò chuyện với mô hình bằng cách gọi phương thức chat, truyền lời nhắc (bao gồm toàn bộ văn bản của tệp PDF).

    const chat = ai.chat({ system: prompt })
    
  2. Nhập createInterface; thao tác này sẽ cho phép bạn tạo giao diện người dùng dựa trên văn bản.

    import {createInterface} from "node:readline/promises";
    
  3. Tạo bản sao cho một phương thức nhập văn bản, sau đó hiển thị thông báo cho người dùng.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. Đọc dữ liệu đầu vào của người dùng, sau đó gửi dữ liệu đó đến mô hình bằng chat.send. Phần này của ứng dụng sẽ lặp lại cho đến khi người dùng nhấn tổ hợp phím CTRL + C.

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

Chạy ứng dụng

Giờ đây, bạn có thể chạy ứng dụng từ thiết bị đầu cuối. Mở cửa sổ dòng lệnh trong thư mục gốc của dự án, sau đó chạy lệnh sau:

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

Sau đó, bạn có thể bắt đầu trò chuyện bằng tệp PDF.