Discuter avec un fichier PDF

Vous pouvez utiliser Genkit pour créer une application qui permet à son utilisateur de discuter avec un fichier PDF. Pour ce faire, procédez comme suit :

  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

Ce guide explique comment effectuer chacune de ces tâches.

Dépendances

Avant de commencer, vous devez configurer les dépendances suivantes:

Tâches

Une fois vos dépendances configurées, vous pouvez créer le projet lui-même.

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/src && \
    touch index.ts
    
  2. Initialisez un nouveau projet TypeScript.

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

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

    $ npm install 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>


Remarque:Bien que ce tutoriel utilise l'API Gemini d'AI Studio, Genkit est compatible avec un large éventail de fournisseurs de modèles, y compris:

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 { gemini15Flash, googleAI } from '@genkit-ai/googleai';
   import { genkit } from 'genkit';
   import pdf from 'pdf-parse';
   import fs from 'fs';
   import { createInterface } from "node:readline/promises";
  • Les deux premières lignes importent Genkit et le plug-in Google AI.
  • Les deux dernières lignes sont destinées à l'analyseur PDF.
  • La cinquième ligne est destinée à implémenter votre UI.

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

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

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

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. Sous l'étape 1, ajoutez du code pour lire le nom de fichier PDF transmis à partir de la ligne de commande.

      const filename = process.argv[2];
      if (!filename) {
        console.error("Please provide a filename as a command line argument.");
        process.exit(1);
      }
    
  2. Sous l'étape 2, ajoutez du code pour charger le contenu du fichier PDF.

      let dataBuffer = fs.readFileSync(filename);
      const { text } = await pdf(dataBuffer);
    

5. Configurer l'invite

Sous l'étape 3, ajoutez du code pour configurer l'invite:

   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

Sous l'étape 4, ajoutez le code suivant pour démarrer le chat et implémenter l'UI:

   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.

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

8. Exécuter l'application

Exécutez l'application depuis votre terminal. 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.