Chattare con un file PDF

Questo codelab mostra come creare un'applicazione di conversazione che consenta agli utenti di estrarre informazioni dai documenti PDF utilizzando il linguaggio naturale.

  1. Configurare il progetto
  2. Importa le dipendenze richieste
  3. Configurare Genkit e il modello predefinito
  4. Carica e analizza il file PDF
  5. Configurare il prompt
  6. Implementare l'interfaccia utente
  7. Implementare il loop di chat
  8. Eseguire l'app

Prerequisiti

Prima di iniziare a lavorare, devi configurare i seguenti prerequisiti:

Procedura di implementazione

Dopo aver configurato le dipendenze, puoi compilare il progetto.

1. Configura il progetto

  1. Crea una struttura di directory e un file per contenere il codice sorgente.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. Inizializza un nuovo progetto TypeScript.

    $ npm init -y
    
  3. Installa il modulo pdf-parse.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. Installa le seguenti dipendenze Genkit per utilizzare Genkit nel tuo progetto:

    $ npm i genkit @genkit-ai/googleai
    
    • genkit fornisce le funzionalità di base di Genkit.
    • @genkit-ai/googleai consente di accedere ai modelli Gemini di Google AI.
  5. Ottieni e configura la chiave API del modello

    Per utilizzare l'API Gemini, utilizzata da questo codelab, devi prima configurare una chiave API. Se non ne hai già una, crea una chiave in Google AI Studio.

    L'API Gemini offre un generoso livello senza costi e non richiede una carta di credito per iniziare.

    Dopo aver creato la chiave API, imposta la variabile di ambiente GOOGLE_GENAI_API_KEY sulla chiave con il comando seguente:

    $ export GOOGLE_GENAI_API_KEY=<your API key>
    

2. Importa le dipendenze richieste

Nel file index.ts che hai creato, aggiungi le seguenti righe per importare le dipendenze richieste per questo progetto:

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";
  • La prima riga importa il modello gemini20Flash e il plug-in googleAI dal pacchetto @genkit-ai/googleai, consentendo l'accesso ai modelli Gemini di Google.
  • Le due righe successive importano la libreria pdf-parse per l'analisi dei file PDF e il modulo fs per le operazioni sul file system.
  • L'ultima riga importa la funzione createInterface dal modulo node:readline/promises, che viene utilizzata per creare un'interfaccia a riga di comando per l'interazione con l'utente.

3. Configura Genkit e il modello predefinito

Aggiungi le seguenti righe per configurare Genkit e impostare Gemini 2.0 Flash come modello predefinito.

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

Puoi quindi aggiungere uno scheletro per il codice e la gestione degli errori.

(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. Carica e analizza il PDF

  1. Aggiungi il codice per leggere il nome del file PDF passato dalla riga di comando.

        // 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. Aggiungi il codice per caricare i contenuti del file PDF.

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

5. Configurare il prompt

Aggiungi il codice per configurare il 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}
    `;
  • La prima dichiarazione const definisce un prompt predefinito se l'utente non ne specifica uno dalla riga di comando.
  • La seconda dichiarazione const interpola il prefisso del prompt e il testo completo del file PDF nel prompt per il modello.

6. Implementa l'interfaccia utente

Aggiungi il codice seguente per avviare la chat e implementare l'interfaccia utente:

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

La prima dichiarazione const avvia la chat con il modello chiamando il metodo chat, passando il prompt (che include il testo completo del file PDF). Il resto del codice crea un input di testo, quindi mostra un messaggio all'utente.

7. Implementare il loop di chat

Nel passaggio 5, aggiungi il codice per ricevere l'input dell'utente e inviarlo al modello utilizzando chat.send. Questa parte dell'app esegue un loop finché l'utente non preme CTRL + C.

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

8. Esegui l'app

Per eseguire l'app, apri il terminale nella directory principale del progetto ed esegui il seguente comando:

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

A questo punto puoi iniziare a chattare con il file PDF.