Chattare con un file PDF

Questo codelab mostra come utilizzare Genkit per implementare un'app che ti consente di chattare con un file PDF.

Prerequisiti

Questo codelab presuppone che tu abbia familiarità con la creazione di applicazioni con Node.js. Per completare questo codelab, assicurati che il tuo ambiente di sviluppo soddisfi i seguenti requisiti:

  • Node.js versione 20 e successive
  • npm

Crea un nuovo progetto

  1. Crea una nuova cartella vuota.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. Inizializza un nuovo progetto TypeScript.

    npm init -y
    

Installa Genkit

Installa le seguenti dipendenze Genkit per utilizzare Genkit nel tuo progetto:

  • genkit fornisce le funzionalità di base di Genkit.
  • @genkit-ai/googleai consente di accedere ai modelli Gemini di Google AI.
npm install genkit @genkit-ai/googleai

Configura la chiave API del modello

In questa guida ti mostreremo come utilizzare l'API Gemini, che offre un generoso livello senza costi e non richiede una carta di credito per iniziare. Per utilizzare l'API Gemini, devi avere una chiave API. Se non ne hai già una, crea una chiave in Google AI Studio.

Ottenere una chiave API da Google AI Studio

Dopo aver creato una 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>

Nota: anche se questo tutorial utilizza l'API Gemini di AI Studio, Genkit supporta una vasta gamma di fornitori di modelli, tra cui: * Gemini di Vertex AI * I modelli Claude 3 di Anthropic e Llama 3.1 tramite Vertex AI Model Garden * Modelli open source tramite Ollama * Fornitori supportati dalla community come OpenAI e Cohere.

Importa e inizializza Genkit

  1. Crea una nuova cartella src e al suo interno un nuovo file index.ts. Aggiungi le seguenti righe per importare Genkit e il plug-in Google AI.

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. Aggiungi le seguenti righe per configurare Genkit e impostare Gemini 1.5 Flash come modello predefinito.

    const ai = genkit({
      plugins: [googleAI()],
      model: gemini15Flash,
    });
    
  3. Aggiungi il corpo principale dell'app.

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

Caricare e analizzare un file PDF

In questo passaggio scriverai il codice per caricare e analizzare un file PDF.

  1. Installa pdf-parse.

    npm i pdf-parse
    
  2. Importa la raccolta di PDF nella tua app.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. Leggi il nome del file PDF passato dalla riga di comando.

      // 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. Carica i contenuti del file PDF.

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

Configurare il prompt

Per configurare il prompt, segui questi passaggi.

  1. Consenti all'utente di fornire un prompt personalizzato tramite la riga di comando. Se non forniscono un prompt, utilizza un valore predefinito.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. Inserisci il prefisso del prompt e il testo completo del file PDF nel prompt per il modello.

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

Implementare il loop di chat

  1. Avvia la chat con il modello chiamando il metodo chat, passando il prompt (che include il testo completo del file PDF).

    const chat = ai.chat({ system: prompt })
    
  2. Importa createInterface per creare un'interfaccia utente basata su testo.

    import {createInterface} from "node:readline/promises";
    
  3. Crea un'istanza di un input di testo, quindi mostra un messaggio all'utente.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. Leggi l'input dell'utente, quindi invialo al modello utilizzando chat.send. Questa parte dell'app verrà ripetuta fino a quando l'utente non preme CTRL + C.

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

Esegui l'app

Ora puoi eseguire l'app dal terminale. Apri il terminale nella directory principale del progetto, quindi esegui il seguente comando:

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

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