Ir al contenido

Preparando el laboratorio

Antes de poder “chatear” con un documento, necesitamos procesarlo. A este paso se le llama Ingesta.

En un sistema profesional usaríamos bases de datos vectoriales como Pinecone o ChromaDB, pero para entender realmente qué está pasando, construiremos nuestra propia Base de Datos Vectorial en un archivo JSON.

Necesitamos una librería para leer archivos PDF (si quieres usar PDFs reales) o simplemente trabajaremos con texto plano para simplificar. Vamos a instalar pdf-parse para hacerlo realista.

Abre tu terminal en la carpeta del proyecto (gemini-lab):

Ventana de terminal
npm install pdf-parse

Necesitamos algo que la IA “no sepa”. Vamos a crear un manual ficticio sobre un producto imaginario.

Crea un archivo llamado manual.txt en la raíz:

# Manual del Usuario: AeroBoard X3000
El AeroBoard X3000 es el primer monopatín volador de consumo masivo.
Batería: Utiliza una celda de fusión fría que dura 400 años. No intente recargarla en un enchufe de pared.
Seguridad: Si la luz roja parpadea, significa que el estabilizador gravitacional está fallando. Bájese inmediatamente y corra.
Garantía: La garantía cubre defectos de fábrica por 10 años, excepto si el usuario intenta hacer "loopings" en gravedad cero.
Soporte: Para contactar a soporte, grite "Ayuda AeroBoard" tres veces al espejo a medianoche.
Precio: El costo de lanzamiento es de 50.000 créditos galácticos.

Este script hará tres cosas:

  1. Leer el archivo de texto.
  2. Dividir el texto en trozos (chunks).
  3. Vectorizar cada trozo usando el modelo de embeddings de Gemini (text-embedding-004) y guardar el resultado.

Crea el archivo src/ingest.js:

  • Directoriogemini-lab
    • manual.txt
    • Directoriosrc
      • config.js
      • ingest.js Nuevo archivo

Copia este código:

src/ingest.js
import { client } from "./config.js";
import fs from "fs";
import path from "path";
// Función simple para trocear texto (Chunking)
function chunkText(text) {
return text.split('\n').filter(line => line.length > 10);
}
async function ingest() {
console.log("Iniciando proceso de ingesta...");
// 1. Leer el archivo. Asumimos que manual.txt está en la raíz del proyecto
const filePath = path.join(process.cwd(), "manual.txt");
try {
const text = fs.readFileSync(filePath, "utf-8");
// 2. Trocear (Chunking)
const chunks = chunkText(text);
console.log(`Documento dividido en ${chunks.length} fragmentos.`);
const database = [];
// 3. Vectorizar cada trozo
for (const chunk of chunks) {
console.log(`Vectorizando: ${chunk.substring(0, 30)}...`);
// Llamada a la API
const result = await client.models.embedContent({
model: "text-embedding-004",
contents: [chunk],
});
// Accedemos a los valores del vector
const vector = result.embeddings[0].values;
// Guardamos: Texto original + representación vectorial
database.push({
content: chunk,
vector: vector
});
}
// 4. Guardar la base de datos
fs.writeFileSync("vector-db.json", JSON.stringify(database, null, 2));
console.log(`\nBase de datos vectorial guardada en 'vector-db.json'`);
} catch (error) {
console.error(`Error durante la ingesta: ${error}`);
}
}
ingest();

Corre el script en tu terminal:

Ventana de terminal
node src/ingest.js