Chatea con un archivo PDF

En este codelab, se muestra cómo usar Genkit para implementar una app que te permite chatear con un archivo PDF.

Requisitos previos

En este codelab, se supone que conoces la compilación de aplicaciones con Node.js. Para completar este codelab, asegúrate de que tu entorno de desarrollo cumpla con los siguientes requisitos:

  • Node.js v20 o versiones posteriores
  • npm

Crea un nuevo proyecto

  1. Crea una carpeta nueva y vacía.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. Inicializa un nuevo proyecto de TypeScript.

    npm init -y
    

Instala Genkit

Instala las siguientes dependencias de Genkit para usar Genkit en tu proyecto:

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

Configura la clave de API de tu modelo

En esta guía, te mostraremos cómo usar la API de Gemini, que ofrece una cuota generosa sin cargo y no requiere una tarjeta de crédito para comenzar. Para usar la API de Gemini, necesitarás una clave de API. Si aún no tienes una, crea una clave en Google AI Studio.

Obtén una clave de API en Google AI Studio

Después de crear una clave de API, establece tu clave para la variable de entorno GOOGLE_GENAI_API_KEY con el siguiente comando:

export GOOGLE_GENAI_API_KEY=<your API key>

Nota: Si bien este instructivo usa la API de Gemini de AI Studio, Genkit admite una amplia variedad de proveedores de modelos, incluidos los siguientes: * Gemini de Vertex AI * Los modelos Claude 3 y Llama 3.1 de Anthropic a través de Vertex AI Model Garden * Modelos de código abierto a través de Ollama * Proveedores compatibles con la comunidad, como OpenAI y Cohere.

Importa e inicializa Genkit

  1. Crea una carpeta nueva src y, dentro de ella, un archivo nuevo index.ts. Agrega las siguientes líneas para importar Genkit y el complemento de Google AI.

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. 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,
    });
    
  3. Agrega el cuerpo principal de tu 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!
    

Carga y analiza un archivo PDF

En este paso, escribirás código para cargar y analizar un archivo PDF.

  1. Instala pdf-parse.

    npm i pdf-parse
    
  2. Importa la biblioteca de PDF a tu app.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. Lee el nombre del archivo PDF que se pasó desde la línea de comandos.

      // 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. Carga el contenido del archivo PDF.

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

Configura la instrucción

Sigue estos pasos para configurar la instrucción.

  1. Permite que el usuario proporcione un mensaje personalizado a través de la línea de comandos. Si no proporcionan una instrucción, usa una predeterminada.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. Inserta el prefijo de la instrucción y el texto completo del archivo PDF en la instrucción del modelo.

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

Implementa el bucle de chat

  1. Para iniciar el chat con el modelo, llama al método chat y pasa la instrucción (que incluye el texto completo del archivo PDF).

    const chat = ai.chat({ system: prompt })
    
  2. Importa createInterface, lo que te permitirá compilar una IU basada en texto.

    import {createInterface} from "node:readline/promises";
    
  3. Crea una instancia de una entrada de texto y, luego, muéstrale un mensaje al usuario.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. Lee la entrada del usuario y, luego, envíala al modelo con chat.send. Esta parte de la app se repetirá hasta que el usuario presione CTRL + C.

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

Ejecuta la app

Ahora puedes ejecutar 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.