Discuter avec un fichier PDF

Cet atelier de programmation explique comment créer une application conversationnelle qui permet aux utilisateurs d'extraire des informations à partir de documents PDF à l'aide du langage naturel.

  1. Configurer votre projet
  2. Importer les dépendances requises
  3. Configurer Genkit et le modèle par défaut
  4. Charger et analyser le fichier PDF
  5. Configurer l'invite
  6. Implémenter l'UI
  7. Implémenter la boucle de chat
  8. Exécuter l'application

Prérequis

Avant de commencer, vous devez configurer les conditions préalables suivantes:

Procédure d'implémentation

Une fois vos dépendances configurées, vous pouvez compiler le projet.

1. Configurer votre projet

  1. Créez une structure de répertoires et un fichier pour contenir votre code source.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. Initialisez un nouveau projet TypeScript.

    $ npm init -y
    
  3. Installez le module pdf-parse.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. Installez les dépendances Genkit suivantes pour utiliser Genkit dans votre projet :

    $ npm i genkit @genkit-ai/googleai
    
    • genkit fournit les fonctionnalités de base de Genkit.
    • @genkit-ai/googleai donne accès aux modèles Gemini de l'IA de Google.
  5. Obtenir et configurer la clé API de votre modèle

    Pour utiliser l'API Gemini, utilisée dans cet atelier de programmation, vous devez d'abord configurer une clé API. Si vous n'en avez pas encore, créez une clé dans Google AI Studio.

    L'API Gemini propose un niveau sans frais généreux et ne nécessite pas de carte de crédit pour commencer.

    Une fois que vous avez créé votre clé API, définissez la variable d'environnement GOOGLE_GENAI_API_KEY sur votre clé à l'aide de la commande suivante:

    $ export GOOGLE_GENAI_API_KEY=<your API key>
    

2. Importer les dépendances requises

Dans le fichier index.ts que vous avez créé, ajoutez les lignes suivantes pour importer les dépendances requises pour ce projet:

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 première ligne importe le modèle gemini20Flash et le plug-in googleAI à partir du package @genkit-ai/googleai, ce qui permet d'accéder aux modèles Gemini de Google.
  • Les deux lignes suivantes importent la bibliothèque pdf-parse pour l'analyse des fichiers PDF et le module fs pour les opérations de système de fichiers.
  • La dernière ligne importe la fonction createInterface à partir du module node:readline/promises, qui permet de créer une interface de ligne de commande pour l'interaction utilisateur.

3. Configurer Genkit et le modèle par défaut

Ajoutez les lignes suivantes pour configurer Genkit et définir Gemini 2.0 Flash comme modèle par défaut.

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

Vous pouvez ensuite ajouter un squelette pour le code et la gestion des erreurs.

(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. Charger et analyser le fichier PDF

  1. Ajoutez du code pour lire le nom de fichier PDF transmis à partir de la ligne de commande.

        // 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. Ajoutez du code pour charger le contenu du fichier PDF.

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

5. Configurer l'invite

Ajoutez du code pour configurer l'invite:

    // 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 première déclaration const définit une invite par défaut si l'utilisateur n'en transmet pas une à partir de la ligne de commande.
  • La deuxième déclaration const interpole le préfixe de requête et le texte complet du fichier PDF dans la requête du modèle.

6. Implémenter l'UI

Ajoutez le code suivant pour démarrer le chat et implémenter l'UI:

    // 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 première déclaration const lance la discussion avec le modèle en appelant la méthode chat, en transmettant l'invite (qui inclut le texte complet du fichier PDF). Le reste du code instancie une saisie de texte, puis affiche un message à l'utilisateur.

7. Implémenter la boucle de chat

À l'étape 5, ajoutez du code pour recevoir l'entrée utilisateur et l'envoyer au modèle à l'aide de chat.send. Cette partie de l'application s'exécute en boucle jusqu'à ce que l'utilisateur appuie sur CTRL+C.

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

8. Exécuter l'application

Pour exécuter l'application, ouvrez le terminal dans le dossier racine de votre projet, puis exécutez la commande suivante:

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

Vous pouvez alors commencer à discuter avec le fichier PDF.