Échellez la synthèse côté client dans les petites fenêtres de contexte

Publié le 12 mars 2025

Vidéo explicative Web Extensions État de Chrome Intention
GitHub Derrière un indicateur Essai Origin Derrière un indicateur Essai Origin Afficher Intent to Experiment

L'API Summarizer vous aide à générer des résumés d'informations dans différents formats et longueurs. Utilisez-le avec Gemini Nano dans Chrome pour effectuer des inférences côté client et expliquer de manière concise des textes complexes ou longs.

Lorsqu'elle est effectuée côté client, vous pouvez travailler avec des données localement, ce qui vous permet de protéger les données sensibles et de proposer une disponibilité à grande échelle. Toutefois, la fenêtre de contexte est beaucoup plus petite que celle des modèles côté serveur, ce qui signifie que les documents très volumineux peuvent être difficiles à résumer. Pour résoudre ce problème, vous pouvez utiliser la technique de récapitulatif des récapitulatifs.

Qu'est-ce qu'un résumé de résumés ?

Pour utiliser la technique de résumé des résumés, divisez le contenu d'entrée en points clés, puis résumez chaque partie indépendamment. Vous pouvez concaténer les sorties de chaque partie, puis résumer ce texte concaténé en un résumé final.

Par exemple, si un document est divisé en trois parties, chaque partie est résumée. Ces trois résumés sont combinés et résumés à nouveau pour obtenir le résultat final.

Diviser judicieusement votre contenu

Il est important de réfléchir à la façon dont vous allez diviser un long texte, car le fractionnement à différents endroits peut entraîner des résultats radicalement différents de la part de Gemini Nano ou d'autres LLM. Idéalement, les textes doivent être divisés en cas de changement de sujet, comme une nouvelle section d'un article ou un paragraphe. Il est important d'éviter de diviser le texte au milieu d'un mot ou d'une phrase. Vous ne pouvez donc pas définir un nombre de caractères comme seule consigne de division.

Pour ce faire, vous pouvez utiliser de nombreuses méthodes, sans effort manuel. Dans l'exemple suivant, nous avons utilisé le séparateur de texte récursif de LangChain.js, qui équilibre les performances et la qualité de sortie. Cela devrait fonctionner pour la plupart des charges de travail.

Lorsque vous créez une instance, deux paramètres clés sont disponibles:

  • chunkSize correspond au nombre maximal de caractères autorisés dans chaque fractionnement.
  • chunkOverlap correspond au nombre de caractères à chevaucher entre deux fractionnements consécutifs. Cela garantit que chaque bloc contient une partie du contexte du bloc précédent.

Divisez le texte avec splitText() pour renvoyer un tableau de chaînes avec chaque segment.

La fenêtre de contexte de la plupart des LLM est exprimée en nombre de jetons, et non en nombre de caractères. En moyenne, un jeton contient quatre caractères. Vous pouvez donc estimer le nombre de jetons utilisés par une entrée en divisant le nombre de caractères par quatre.

Dans notre exemple, le chunkSize est composé de 3 000 caractères, soit environ 750 jetons.

Générer des récapitulatifs pour chaque fractionnement

Une fois que vous avez configuré la répartition du contenu, vous pouvez générer des résumés pour chaque partie à l'aide de l'API Summarizer.

Créez une instance du récapitulatif avec la fonction create(). Pour conserver autant de contexte que possible, nous avons défini le paramètre format sur plain-text, type sur tl;dr et length sur long.

Ensuite, générez le résumé pour chaque fractionnement créé par RecursiveCharacterTextSplitter et concaténez les résultats dans une nouvelle chaîne. Nous avons séparé chaque résumé par une nouvelle ligne pour identifier clairement le résumé de chaque partie.

Bien que cette nouvelle ligne n'ait pas d'importance lorsque vous exécutez cette boucle une seule fois, elle est utile pour déterminer comment chaque résumé ajoute à la valeur du jeton pour le résumé final. Dans la plupart des cas, cette solution devrait fonctionner pour les contenus de taille moyenne et longue.

Résumé récursif des résumés

Lorsque vous disposez d'un texte extrêmement long, la longueur du résumé concaténé peut être supérieure à la fenêtre de contexte disponible, ce qui entraîne l'échec de la synthèse. Pour résoudre ce problème, vous pouvez résumer de manière récursive les résumés.

Si votre résumé des résumés est toujours trop long, vous pouvez répéter la procédure. En théorie, vous pouvez répéter le processus indéfiniment jusqu'à ce que vous obteniez une longueur appropriée.

Nous collectons toujours les divisions initiales générées par RecursiveCharacterTextSplitter. Ensuite, dans la fonction recursiveSummarizer(), nous bouclons le processus de résumé en fonction de la longueur des coupures concaténées. Si la longueur des résumés dépasse 3000, nous les concaténons dans fullSummaries. Si la limite n'est pas atteinte, le récapitulatif est enregistré en tant que partialSummaries.

Une fois tous les récapitulatifs générés, les récapitulatifs partiels finaux sont ajoutés au récapitulatif complet. S'il n'y a qu'un seul résumé dans fullSummaries, aucune récursion supplémentaire n'est nécessaire. La fonction renvoie un résumé final. Si plusieurs récapitulatifs sont présents, la fonction se répète et continue de résumer les récapitulatifs partiels.

Nous avons testé cette solution avec la RFC IRC (Internet Relay Chat), qui compte 110 030 caractères, dont 17 560 mots. L'API Summarizer a fourni le résumé suivant:

Internet Relay Chat (IRC) est un moyen de communiquer en ligne en temps réel à l'aide de messages texte. Vous pouvez discuter dans des canaux ou envoyer des messages privés, et vous pouvez utiliser des commandes pour contrôler la discussion et interagir avec le serveur. Il s'agit d'une salle de chat sur Internet où vous pouvez saisir et voir instantanément les messages des autres utilisateurs.

C'est très efficace ! Et il ne comporte que 309 caractères.

Limites

La technique de résumé des résumés vous aide à travailler dans la fenêtre de contexte d'un modèle de taille client. Bien que l'IA côté client présente de nombreux avantages, vous pouvez rencontrer les problèmes suivants:

  • Résumés moins précis: avec la récursion, la répétition du processus de résumé est potentiellement infinie, et chaque résumé est plus éloigné du texte d'origine. Cela signifie que le modèle peut générer un résumé final trop superficiel pour être utile.
  • Performances plus lentes: la génération de chaque résumé prend du temps. Là encore, avec un nombre infini de résumés possibles dans les textes plus longs, cette approche peut prendre plusieurs minutes.

Une démonstration du récapitulatif est disponible, et vous pouvez consulter le code source complet.

Envoyer des commentaires

Essayez d'utiliser la technique de résumé des résumés avec différentes longueurs de texte d'entrée, différentes tailles de fractionnement et différentes longueurs de chevauchement pour déterminer ce qui fonctionne le mieux pour vos cas d'utilisation.

Commencez à tester l'API Summarizer dès maintenant en participant à la phase d'évaluation et envoyez-nous vos commentaires. Vos commentaires peuvent avoir un impact direct sur la manière dont nous concevons et implémentons les futures versions de cette API, ainsi que toutes les API d'IA intégrées.