Chatea con un archivo PDF

Puedes usar Genkit para compilar una app que le permita al usuario chatear con un archivo PDF. Para ello, sigue estos pasos:

  1. Configura tu proyecto
  2. Importa las dependencias requeridas
  3. Configura Genkit y el modelo predeterminado
  4. Carga y analiza el archivo PDF
  5. Configura la instrucción
  6. Implementa la IU
  7. Implementa el bucle de chat
  8. Ejecuta la app

En esta guía, se explica cómo realizar cada una de estas tareas.

Dependencias

Antes de comenzar a trabajar, debes configurar estas dependencias:

Tasks

Después de configurar tus dependencias, puedes compilar el proyecto en sí.

1. Configura tu proyecto

  1. Crea una estructura de directorio y un archivo para almacenar tu código fuente.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf/src && \
    touch index.ts
    
  2. Inicializa un nuevo proyecto de TypeScript.

    $ npm init -y
    
  3. Instala el módulo pdf-parse:

    $ npm i pdf-parse
    
  4. Instala las siguientes dependencias de Genkit para usar Genkit en tu proyecto:

    $ npm install genkit @genkit-ai/googleai
    
  • genkit proporciona las funciones principales de Genkit.
  • @genkit-ai/googleai proporciona acceso a los modelos de Gemini de la IA de Google.

      5. Obtén y configura la clave de API de tu modelo

    Para usar la API de Gemini, que usa este codelab, primero debes configurar una clave de API. Si aún no tienes una, crea una clave en Google AI Studio. La API de Gemini ofrece un nivel generoso sin costo y no requiere una tarjeta de crédito para comenzar. Después de crear tu clave de API, establece la variable de entorno GOOGLE_GENAI_API_KEY` en tu clave con el siguiente comando:
    $ export GOOGLE_GENAI_API_KEY=<your API key>


Nota: Si bien en este instructivo se usa la API de Gemini de AI Studio, Genkit admite una amplia variedad de proveedores de modelos, incluidos los siguientes:

2. Importa las dependencias requeridas

En el archivo index.ts que creaste, agrega las siguientes líneas para importar las dependencias necesarias para este proyecto:

   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";
  • Las dos primeras líneas importan Genkit y el complemento de Google AI.
  • Las dos líneas siguientes son para el analizador de PDF.
  • La quinta línea es para implementar tu IU.

3. Configura Genkit y el modelo predeterminado

Agrega las siguientes líneas para configurar Genkit y establecer Gemini 1.5 Flash como el modelo predeterminado.

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

Luego, puedes agregar un esqueleto para el código y el manejo de errores.

   (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. Carga y analiza el PDF

  1. En el paso 1, agrega código para leer el nombre del archivo PDF que se pasó desde la línea de comandos.

      const filename = process.argv[2];
      if (!filename) {
        console.error("Please provide a filename as a command line argument.");
        process.exit(1);
      }
    
  2. En el paso 2, agrega código para cargar el contenido del archivo PDF.

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

5. Configura la instrucción

En el paso 3, agrega código para configurar la instrucción:

   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 primera declaración const define un mensaje predeterminado si el usuario no pasa uno de los suyos desde la línea de comandos.
  • La segunda declaración const interpola el prefijo de la instrucción y el texto completo del archivo PDF en la instrucción del modelo.

6. Implementa la IU

En el paso 4, agrega el siguiente código para iniciar el chat y implementar la IU:

   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 primera declaración de const inicia el chat con el modelo llamando al método chat y pasando la instrucción (que incluye el texto completo del archivo PDF). El resto del código crea una instancia de una entrada de texto y, luego, muestra un mensaje al usuario.

7. Implementa el bucle de chat

En el paso 5, agrega código para recibir la entrada del usuario y enviarla al modelo con chat.send. Esta parte de la app se repite hasta que el usuario presiona CTRL + C.

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

8. Ejecuta la app

Ejecuta la app desde la terminal. Abre la terminal en la carpeta raíz de tu proyecto y, luego, ejecuta el siguiente comando:

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

Luego, puedes comenzar a chatear con el archivo PDF.