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.
Paso 1: Nuevas dependencias
Sección titulada «Paso 1: Nuevas dependencias»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):
npm install pdf-parsePaso 2: Documento de conocimiento
Sección titulada «Paso 2: Documento de conocimiento»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.Paso 3: Script de ingesta (ingest.js)
Sección titulada «Paso 3: Script de ingesta (ingest.js)»Este script hará tres cosas:
- Leer el archivo de texto.
- Dividir el texto en trozos (chunks).
- 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:
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();Paso 4: Ejecutar la ingesta
Sección titulada «Paso 4: Ejecutar la ingesta»Corre el script en tu terminal:
node src/ingest.js