Ajusta el resumen del cliente en ventanas de contexto pequeñas

Fecha de publicación: 12 de marzo de 2025; última actualización: 28 de mayo de 2025

Explicación Web Extensiones Estado de Chrome Intent
MDN Chrome 138 Chrome 138 Ver Intención de enviar

La API de Summarizer te ayuda a generar resúmenes de información en varios formatos y longitudes. Úsala con Gemini Nano en Chrome o con otros modelos de lenguaje integrados en los navegadores para explicar de forma concisa textos largos o complicados.

Cuando se realiza del lado del cliente, puedes trabajar con los datos de forma local, lo que te permite mantener seguros los datos sensibles y ofrecer disponibilidad a gran escala. Sin embargo, la ventana de contexto es mucho más pequeña que con los modelos del servidor, lo que significa que podría ser difícil resumir documentos muy grandes. Para resolver este problema, puedes usar la técnica de resumen de resúmenes.

¿Qué es el resumen de resúmenes?

Para usar la técnica de resumen de resúmenes, divide el contenido de entrada en puntos clave y, luego, resume cada parte de forma independiente. Puedes concatenar los resultados de cada parte y, luego, resumir este texto concatenado en un resumen final.

Por ejemplo, si un documento se divide en tres partes, se resume cada una de ellas. Esos tres resúmenes se combinan y se vuelven a resumir para obtener el resultado final.

Divide tu contenido de forma reflexiva

Es importante tener en cuenta cómo dividirás un texto grande, ya que las diferentes estrategias pueden generar resultados distintos en los LLM. Lo ideal es dividir el texto cuando hay un cambio de tema, como una nueva sección de un artículo o un párrafo. Es importante evitar dividir el texto en medio de una palabra o una oración, lo que significa que no puedes usar un recuento de caracteres como única guía de división.

Puedes hacerlo de muchas maneras. En el siguiente ejemplo, usamos el Recursive Text Splitter de LangChain.js, que equilibra el rendimiento y la calidad del resultado. Esto debería funcionar para la mayoría de las cargas de trabajo.

Cuando creas una instancia nueva, hay dos parámetros clave:

  • chunkSize es la cantidad máxima de caracteres permitidos en cada división.
  • chunkOverlap es la cantidad de caracteres que se superponen entre dos divisiones consecutivas. Esto garantiza que cada fragmento tenga parte del contexto del fragmento anterior.

Divide el texto con splitText() para devolver un array de cadenas con cada fragmento.

La mayoría de los LLMs tienen su ventana de contexto expresada como una cantidad de tokens, en lugar de una cantidad de caracteres. En promedio, un token contiene 4 caracteres. En nuestro ejemplo, el elemento chunkSize tiene 3,000 caracteres, lo que equivale a aproximadamente 750 tokens.

Determina la disponibilidad del token

Para determinar cuántos tokens están disponibles para una entrada, usa el método measureInputUsage() y la propiedad inputQuota. En este caso, la implementación es ilimitada, ya que no puedes saber cuántas veces se ejecutará el resumidor para procesar todo el texto.

Genera resúmenes para cada división

Una vez que hayas configurado cómo se divide el contenido, puedes generar resúmenes para cada parte con la API de Summarizer.

Crea una instancia del resumidor con la función create(). Para conservar la mayor cantidad de contexto posible, establecimos el parámetro format en plain-text, type en tldr y length en long.

Luego, genera el resumen de cada división creada por RecursiveCharacterTextSplitter y concatena los resultados en una cadena nueva. Separamos cada resumen con una línea nueva para identificar claramente el resumen de cada parte.

Si bien esta línea nueva no importa cuando se ejecuta este bucle solo una vez, es útil para determinar cómo cada resumen agrega valor de token al resumen final. En la mayoría de los casos, esta solución debería funcionar para el contenido de duración media y larga.

Resumen recursivo de resúmenes

Cuando tienes una cantidad de texto extremadamente larga, la longitud del resumen concatenado puede ser mayor que la ventana de contexto disponible, lo que provoca que falle el resumen. Para solucionar este problema, puedes resumir los resúmenes de forma recursiva.

Si tu resumen de resúmenes sigue siendo demasiado largo, puedes repetir el proceso. En teoría, podrías repetir el proceso de forma indefinida hasta obtener la longitud adecuada.

Aún recopilamos las divisiones iniciales que genera RecursiveCharacterTextSplitter. Luego, en la función recursiveSummarizer(), iteramos el proceso de resumen según la longitud de caracteres de las divisiones concatenadas. Si la longitud de los resúmenes supera 3000, los concatenamos en fullSummaries. Si no se alcanza el límite, el resumen se guarda como partialSummaries.

Una vez que se generan todos los resúmenes, los resúmenes parciales finales se agregan al resumen completo. Si solo hay 1 resumen en fullSummaries, no se necesita recursión adicional. La función devuelve un resumen final. Si hay más de un resumen, la función se repite y sigue resumiendo los resúmenes parciales.

Probamos esta solución con el RFC de Internet Relay Chat (IRC), que tiene la increíble cantidad de 110,030 caracteres, incluidos 17,560 palabras. La API de Summarizer proporcionó el siguiente resumen:

Internet Relay Chat (IRC) es una forma de comunicarse en línea en tiempo real a través de mensajes de texto. Puedes chatear en canales o enviar mensajes privados, y usar comandos para controlar el chat y interactuar con el servidor. Es como una sala de chat en Internet en la que puedes escribir y ver los mensajes de otras personas al instante.

¡Es bastante eficaz! Además, solo tiene 309 caracteres.

Limitaciones

La técnica de resumen de resúmenes te ayuda a operar dentro de la ventana de contexto de un modelo del tamaño del cliente. Si bien hay muchos beneficios de la IA del cliente, es posible que te encuentres con lo siguiente:

  • Resúmenes menos precisos: Con la recursión, la repetición del proceso de resumen puede ser infinita, y cada resumen está más lejos del texto original. Esto significa que el modelo puede generar un resumen final demasiado superficial como para ser útil.
  • Rendimiento más lento: Cada resumen lleva tiempo generarlo. Una vez más, con una cantidad infinita de resúmenes posibles en textos más largos, este enfoque puede tardar varios minutos en finalizar.

Tenemos una demostración del resumidor disponible, y puedes ver el código fuente completo.

Comparte tus comentarios

Intenta usar la técnica de resumen de resúmenes con diferentes longitudes de texto de entrada, diferentes tamaños de división y diferentes longitudes de superposición con la API de Summarizer.