Una respuesta en una hoja larga
Dividir un documento en trozos (en inglés chunking) es partirlo en piezas lo bastante pequeñas para encontrarlas y leerlas una a una. Importa porque la recuperación devuelve trozos enteros, y su tamaño decide lo que recibes.
Una biblioteca tiene una sola hoja con el horario, las normas de préstamo y las salas. Alguien pregunta por las multas. La respuesta cabe en una frase. Darle la hoja entera la entierra.
Al final de esta lección
Nota
Puedo dividir un documento para que cada trozo se pueda encontrar.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Trozo | una pieza de un documento dividido | |
| Tamaño | cuántas palabras tiene un trozo | 8 |
| Solapamiento | las palabras que comparten dos trozos seguidos | |
| Encabezado | una línea de título que abre una sección | |
| Recuperación | encontrar los trozos que responden a una pregunta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Por qué se corta un documento en trozos
Un solo vector para toda una hoja mezcla todos sus temas en un promedio. Una pregunta sobre multas no parece entonces más cercana a la hoja que una pregunta sobre salas.
Un trozo pequeño trata de una sola cosa, y su vector apunta con claridad. Además es lo bastante corto para meterlo después en un prompt, junto a unos pocos más.
Tamaño y solapamiento
La división más sencilla cuenta palabras. Un trozo de 8 palabras tiene 8 palabras. El siguiente empieza unas palabras antes de donde terminó el anterior. Esas palabras compartidas son el solapamiento.
El solapamiento evita cortar una idea por la mitad. Una frase en el borde de un trozo aparece también al principio del siguiente.
Ejemplo resuelto: solapamiento en diez palabras
| Trozo | Empieza en la palabra | Palabras |
|---|---|---|
| 1 | 1 | a b c d |
| 2 | 4 | d e f g |
| 3 | 7 | g h i j |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cortar en los encabezados mantiene unida una idea
Un recuento de palabras no sabe dónde acaba una idea. Un encabezado sí. Si el documento tiene encabezados, empieza un trozo nuevo en cada uno.
El script de abajo hace las dos cosas. Divide la hoja de la biblioteca por sus encabezados y luego corta una sección por palabras con solapamiento.
Escribe el script de división, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const sheet = \"# Horario\nLa biblioteca abre a las 9:00 de lunes a viernes. El sábado abre a las 10:00. El domingo está cerrada.\n# Préstamo\nSe pueden prestar 8 libros durante 3 semanas. Cada día de retraso cuesta 20 céntimos. Cada libro se puede renovar dos veces por internet.\n# Salas de estudio\nUna sala admite a 6 personas. Se reserva en el mostrador o por internet. Una reserva dura 2 horas.\";' 'function byHeading(text) {' ' const parts = [];' ' const lines = text.split(\"\n\");' ' for (let i = 0; i < lines.length; i++) {' ' if (lines[i].startsWith(\"# \")) {' ' parts.push({ heading: lines[i].slice(2), text: \"\" });' ' } else {' ' const last = parts[parts.length - 1];' ' last.text = (last.text + \" \" + lines[i]).trim();' ' }' ' }' ' return parts;' '}' > chunk.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el script de división, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function byWords(text, size, overlap) {' ' const words = text.split(\" \");' ' const chunks = [];' ' let start = 0;' ' while (start < words.length) {' ' chunks.push(words.slice(start, start + size).join(\" \"));' ' if (start + size >= words.length) break;' ' start = start + size - overlap;' ' }' ' return chunks;' '}' 'const parts = byHeading(sheet);' 'console.log(\"Por encabezado:\", parts.length, \"trozos\");' 'parts.forEach(function (part) { console.log(\"-\", part.heading + \":\", part.text.split(\" \").length, \"palabras\"); });' 'const pieces = byWords(parts[1].text, 8, 3);' 'console.log(\"Por palabras, tamaño 8, solapamiento 3:\", pieces.length, \"trozos\");' 'pieces.forEach(function (piece) { console.log(\"-\", piece); });' >> chunk.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecútalo y lee los trozos
docker exec -w /home/node/project agent node chunk.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lo que muestra
| Línea | Qué indica |
|---|---|
| Por encabezado: 3 trozos | Un trozo por encabezado |
| - Préstamo: 24 palabras | El tamaño del trozo del medio |
| Por palabras, tamaño 8, solapamiento 3: 5 trozos | El texto del préstamo cortado en cinco |
| - dos veces por internet. | Sus tres primeras palabras acaban también el trozo anterior |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que los trozos grandes son más seguros porque contienen más. Un trozo grande tiene un vector que mezcla varios temas, y llena el prompt. Elige el trozo más pequeño que aún contenga una respuesta entera.