Chatea con un archivo PDF

En este codelab, se muestra cómo compilar una aplicación de conversación que les permita a los usuarios extraer información de documentos PDF con lenguaje natural.

  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

Requisitos previos

Antes de comenzar a trabajar, debes configurar los siguientes requisitos previos:

Pasos de implementación

Después de configurar las dependencias, puedes compilar el proyecto.

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 && \
    touch src/index.ts
    
  2. Inicializa un nuevo proyecto de TypeScript.

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

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

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

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 { 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 primera línea importa el modelo gemini20Flash y el complemento googleAI del paquete @genkit-ai/googleai, lo que permite el acceso a los modelos de Gemini de Google.
  • Las siguientes dos líneas importan la biblioteca pdf-parse para analizar archivos PDF y el módulo fs para las operaciones del sistema de archivos.
  • La línea final importa la función createInterface del módulo node:readline/promises, que se usa para crear una interfaz de línea de comandos para la interacción del usuario.

3. Configura Genkit y el modelo predeterminado

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

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

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. Agrega código para leer el nombre del archivo PDF que se pasó desde la línea de comandos.

        // 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. Agrega código para cargar el contenido del archivo PDF.

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

5. Configura la instrucción

Agrega código para configurar la instrucción:

    // 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 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

Agrega el siguiente código para iniciar el chat y implementar la IU:

    // 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 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.

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

8. Ejecuta la app

Para ejecutar la app, 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.