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

Lớp học lập trình này minh hoạ cách tạo một ứng dụng trò chuyện cho phép người dùng trích xuất thông tin từ tài liệu PDF bằng ngôn ngữ tự nhiên.

  1. Thiết lập dự án
  2. Nhập các phần phụ thuộc bắt buộc
  3. Định cấu hình Genkit và mô hình mặc định
  4. Tải và phân tích cú pháp tệp PDF
  5. Thiết lập lời nhắc
  6. Triển khai giao diện người dùng
  7. Triển khai vòng lặp trò chuyện
  8. Chạy ứng dụng

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

Trước khi bắt đầu, bạn nên thiết lập các điều kiện tiên quyết sau:

Các bước triển khai

Sau khi thiết lập các phần phụ thuộc, bạn có thể tạo dự án.

1. Thiết lập dự án

  1. Tạo cấu trúc thư mục và tệp để lưu trữ mã nguồn.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. Khởi chạy một dự án TypeScript mới.

    $ npm init -y
    
  3. Cài đặt mô-đun pdf-parse.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. Cài đặt các phần phụ thuộc Genkit sau đây để sử dụng Genkit trong dự án:

    $ npm i genkit @genkit-ai/googleai
    
    • 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.
  5. Lấy và định cấu hình khoá API mô hình

    Để sử dụng API Gemini mà lớp học lập trình này sử dụng, trước tiên, bạn phải định cấu hình khoá API. Nếu bạn chưa có, hãy tạo khoá trong Google AI Studio.

    Gemini API 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.

    Sau khi 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>
    

2. Nhập các phần phụ thuộc bắt buộc

Trong tệp index.ts mà bạn đã tạo, hãy thêm các dòng sau để nhập các phần phụ thuộc cần thiết cho dự án này:

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";
  • Dòng đầu tiên nhập mô hình gemini20Flash và trình bổ trợ googleAI từ gói @genkit-ai/googleai, cho phép truy cập vào các mô hình Gemini của Google.
  • Hai dòng tiếp theo nhập thư viện pdf-parse để phân tích cú pháp tệp PDF và mô-đun fs để thao tác với hệ thống tệp.
  • Dòng cuối cùng nhập hàm createInterface từ mô-đun node:readline/promises. Mô-đun này dùng để tạo giao diện dòng lệnh cho hoạt động tương tác của người dùng.

3. Định cấu hình Genkit và mô hình mặc định

Thêm các dòng sau để định cấu hình Genkit và đặt Gemini 2.0 Flash làm mô hình mặc định.

const ai = genkit({
  plugins: [googleAI()],
  model: gemini20Flash,
});

Sau đó, bạn có thể thêm một khung cho mã và xử lý lỗi.

(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. Tải và phân tích cú pháp tệp PDF

  1. Thêm mã để đọc tên tệp PDF được truyền vào từ dòng lệnh.

        // 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. Thêm mã để tải nội dung của tệp PDF.

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

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

Thêm mã để thiết lập lời nhắc:

    // 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}
    `;
  • Nội dung khai báo const đầu tiên xác định một lời nhắc mặc định nếu người dùng không truyền một lời nhắc của riêng họ qua dòng lệnh.
  • Phần khai báo const thứ hai nội suy tiền tố lời nhắc và toàn bộ văn bản của tệp PDF vào lời nhắc cho mô hình.

6. Triển khai giao diện người dùng

Thêm mã sau để bắt đầu cuộc trò chuyện và triển khai giao diện người dùng:

    // 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");

Nội dung khai báo const đầu tiên 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). Phần còn lại của mã tạo bản sao 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.

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

Trong Bước 5, hãy thêm mã để nhận dữ liệu đầu vào của người dùng và gửi dữ liệu đầu vào đó đến mô hình bằng chat.send. Phần này của ứng dụng lặp lại cho đến khi người dùng nhấn tổ hợp phím CTRL + C.

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

8. Chạy ứng dụng

Để chạy ứng dụng, hãy mở thiết bị đầu cuối 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.