Czat z plikiem PDF

Ten projekt kodu pokazuje, jak tworzyć aplikację konwersacyjną, która umożliwia użytkownikom wyodrębnianie informacji z dokumentów PDF za pomocą języka naturalnego.

  1. Konfigurowanie projektu
  2. Importowanie wymaganych zależności
  3. Konfigurowanie Genkit i modelu domyślnego
  4. Wczytywanie i analizowanie pliku PDF
  5. Konfigurowanie prośby
  6. Implementacja interfejsu użytkownika
  7. Wdrażanie pętli czatu
  8. Uruchamianie aplikacji

Wymagania wstępne

Przed rozpoczęciem pracy musisz spełnić te wymagania wstępne:

Etapy wdrażania

Po skonfigurowaniu zależności możesz skompilować projekt.

1. Konfigurowanie projektu

  1. Utwórz strukturę katalogów i plik, w których będziesz przechowywać kod źródłowy.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. Zainicjuj nowy projekt TypeScript.

    $ npm init -y
    
  3. Zainstaluj moduł pdf-parse.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. Aby używać Genkit w projekcie, zainstaluj te zależności Genkit:

    $ npm i genkit @genkit-ai/googleai
    
    • genkit zapewnia podstawowe funkcje Genkit.
    • @genkit-ai/googleai zapewnia dostęp do modeli Google AI Gemini.
  5. Pobieranie i konfigurowanie klucza interfejsu API modelu

    Aby korzystać z interfejsu Gemini API, którego używa ten samouczek, musisz najpierw skonfigurować klucz API. Jeśli nie masz jeszcze klucza, utwórz go w Google AI Studio.

    Gemini API oferuje obszerny bezpłatny poziom dostępu i nie wymaga karty kredytowej, aby zacząć korzystać z usługi.

    Po utworzeniu klucza interfejsu API ustaw zmienną środowiskową GOOGLE_GENAI_API_KEY na klucz, używając tego polecenia:

    $ export GOOGLE_GENAI_API_KEY=<your API key>
    

2. Importowanie wymaganych zależności

W utworzonym pliku index.ts dodaj te wiersze, aby zaimportować zależności wymagane w tym projekcie:

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";
  • Pierwszy wiersz importuje model gemini20Flash i wtyczkę googleAI z pakietu @genkit-ai/googleai, umożliwiając dostęp do modeli Gemini od Google.
  • Kolejne 2 wiersze importują bibliotekę pdf-parse do analizowania plików PDF oraz moduł fs do operacji na systemie plików.
  • Ostatni wiersz importuje funkcję createInterface z modułu node:readline/promises, który służy do tworzenia interfejsu wiersza poleceń do interakcji z użytkownikiem.

3. Konfigurowanie Genkit i modelu domyślnego

Aby skonfigurować Genkit i ustawić Gemini 2.0 Flash jako domyślny model, dodaj te wiersze.

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

Następnie możesz dodać szkielet kodu i obsługi błędów.

(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. Wczytaj i przeanalizuj plik PDF

  1. Dodaj kod, który odczytuje nazwę pliku PDF przekazaną z wiersza poleceń.

        // 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. Dodaj kod, który wczyta zawartość pliku PDF.

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

5. Konfigurowanie prompta

Dodaj kod, aby skonfigurować prompt:

    // 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}
    `;
  • Pierwsza deklaracja const definiuje domyślne prompt, jeśli użytkownik nie poda własnego prompta w wierszu poleceń.
  • Druga deklaracja const interpoluje prefiks prompta i pełny tekst pliku PDF w prompt modelu.

6. Implementacja interfejsu użytkownika

Dodaj ten kod, aby rozpocząć czat i zaimplementować interfejs użytkownika:

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

Pierwsza deklaracja const uruchamia czat z modelem przez wywołanie metody chat, przekazując prompt (który zawiera pełny tekst pliku PDF). Pozostała część kodu tworzy instancję wejścia tekstowego, a następnie wyświetla wiadomość użytkownikowi.

7. Zaimplementuj pętlę czatu

W kroku 5 dodaj kod, który będzie odbierał dane wejściowe od użytkownika i przesyłał je do modelu za pomocą funkcji chat.send. Ta część aplikacji działa w pętli, dopóki użytkownik nie naciśnie CTRL + C.

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

8. Uruchamianie aplikacji

Aby uruchomić aplikację, otwórz terminal w folderze głównym projektu, a potem uruchom to polecenie:

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

Możesz wtedy rozpocząć czat z pliku PDF.