Schaal samenvattingen aan de clientzijde in kleine contextvensters

Gepubliceerd: 12 maart 2025, Laatst bijgewerkt: 28 mei 2025

Uitlegger Web Uitbreidingen Chrome-status Intentie
MDN Chroom 138 Chroom 138 Weergave Intentie tot verzending

Met de Summarizer API kunt u samenvattingen van informatie genereren in verschillende lengtes en formaten. Gebruik de API met Gemini Nano in Chrome of andere taalmodellen die in browsers zijn ingebouwd om lange of ingewikkelde tekst beknopt uit te leggen.

Wanneer u dit client-side uitvoert, kunt u lokaal met gegevens werken, waardoor u gevoelige gegevens veilig kunt houden en beschikbaarheid op schaal kunt bieden. Het contextvenster is echter veel kleiner dan bij server-side modellen, waardoor het lastig kan zijn om zeer grote documenten samen te vatten. Om dit probleem op te lossen, kunt u de samenvatting van samenvattingen- techniek gebruiken.

Wat is een samenvatting van samenvattingen?

Om de samenvatting van samenvattingentechniek te gebruiken, splitst u de invoer op belangrijke punten en vat u vervolgens elk onderdeel afzonderlijk samen. U kunt de uitvoer van elk onderdeel samenvoegen en deze samengevoegde tekst vervolgens samenvatten tot één definitieve samenvatting.

Als een document bijvoorbeeld in drie delen is gesplitst, wordt elk deel samengevat. Die drie samenvattingen worden samengevoegd en opnieuw samengevat voor het eindresultaat.

Splits uw inhoud zorgvuldig op

Het is belangrijk om goed na te denken over hoe je een groot stuk tekst opsplitst, aangezien verschillende strategieën tot verschillende resultaten kunnen leiden binnen verschillende LLM's. Idealiter splits je tekst bij een onderwerpsverandering, zoals een nieuwe sectie in een artikel of bij een alinea. Het is belangrijk om te voorkomen dat je de tekst midden in een woord of zin splitst. Je kunt het aantal tekens dus niet als enige richtlijn gebruiken.

Er zijn veel manieren om dit te doen. In het volgende voorbeeld hebben we de Recursive Text Splitter van LangChain.js gebruikt, die een balans vindt tussen prestaties en outputkwaliteit. Dit zou voor de meeste workloads moeten werken.

Bij het maken van een nieuw exemplaar zijn er twee belangrijke parameters:

  • chunkSize is het maximale aantal tekens dat is toegestaan ​​in elke splitsing.
  • chunkOverlap is het aantal tekens dat overlapt tussen twee opeenvolgende splitsingen. Dit zorgt ervoor dat elk fragment een deel van de context van het vorige fragment bevat.

Splits de tekst met splitText() om bij elk fragment een reeks strings te retourneren.

De meeste LLM's hebben een contextvenster dat wordt uitgedrukt in een aantal tokens in plaats van een aantal tekens. Gemiddeld bevat een token 4 tekens. In ons voorbeeld is de chunkSize 3000 tekens, wat neerkomt op ongeveer 750 tokens.

Bepaal de beschikbaarheid van tokens

Om te bepalen hoeveel tokens beschikbaar zijn voor een invoer, gebruikt u de methode measureInputUsage() en de eigenschap inputQuota . In dit geval is de implementatie onbeperkt, omdat u niet kunt weten hoe vaak de samenvatting zal worden uitgevoerd om alle tekst te verwerken.

Genereer samenvattingen voor elke splitsing

Nadat u hebt ingesteld hoe de inhoud wordt gesplitst, kunt u met de Summarizer API samenvattingen voor elk onderdeel genereren.

Maak een instantie van de summar met de create() functie . Om zoveel mogelijk context te behouden, hebben we de format parameter ingesteld op plain-text , type op tldr en length op long .

Genereer vervolgens de samenvatting voor elke splitsing die door de RecursiveCharacterTextSplitter is gemaakt en voeg de resultaten samen tot een nieuwe string. We hebben elke samenvatting gescheiden met een nieuwe regel om de samenvatting voor elk onderdeel duidelijk te identificeren.

Hoewel deze nieuwe regel er niet toe doet wanneer deze lus slechts één keer wordt uitgevoerd, is hij nuttig om te bepalen hoe elke samenvatting bijdraagt ​​aan de tokenwaarde voor de uiteindelijke samenvatting. In de meeste gevallen zou deze oplossing moeten werken voor middellange en lange content.

Recursieve samenvatting van samenvattingen

Bij een extreem lange tekst kan de lengte van de gecombineerde samenvatting groter zijn dan het beschikbare contextvenster, waardoor de samenvatting mislukt. Om dit probleem op te lossen, kunt u de samenvattingen recursief samenvatten.

Als je samenvatting van samenvattingen nog steeds te lang is, kun je het proces herhalen. In theorie kun je het proces eindeloos herhalen, totdat je een passende lengte hebt.

We verzamelen nog steeds de initiële splitsingen die gegenereerd zijn door RecursiveCharacterTextSplitter . Vervolgens herhalen we in de functie recursiveSummarizer() het samenvattingsproces op basis van de tekenlengte van de aaneengeschakelde splitsingen. Als de tekenlengte van de samenvattingen groter is dan 3000 , voegen we de samenvatting samen tot fullSummaries . Als de limiet niet bereikt wordt, wordt de samenvatting opgeslagen als partialSummaries .

Zodra alle samenvattingen zijn gegenereerd, worden de laatste gedeeltelijke samenvattingen toegevoegd aan de volledige samenvatting. Als er slechts één samenvatting in fullSummaries staat, is er geen extra recursie nodig. De functie retourneert een definitieve samenvatting. Als er meer dan één samenvatting aanwezig is, herhaalt de functie de samenvatting en gaat verder met het samenvatten van de gedeeltelijke samenvattingen.

We hebben deze oplossing getest met Internet Relay Chat (IRC) RFC , dat maar liefst 110.030 tekens bevat, waaronder 17.560 woorden. De Summarizer API leverde de volgende samenvatting:

Internet Relay Chat (IRC) is een manier om online in realtime te communiceren via tekstberichten. Je kunt chatten in kanalen of privéberichten sturen, en je kunt commando's gebruiken om de chat te besturen en met de server te communiceren. Het is vergelijkbaar met een chatroom op internet waar je berichten kunt typen en direct kunt zien wat anderen zeggen.

Dat is behoorlijk effectief! En het zijn maar 309 tekens.

Beperkingen

De samenvatting van samenvattingen-techniek helpt u te werken binnen het contextvenster van een model op clientformaat. Hoewel client-side AI veel voordelen biedt, kunt u de volgende tegenkomen:

  • Minder nauwkeurige samenvattingen : bij recursie is de herhaling van het samenvattingsproces mogelijk oneindig, en elke samenvatting staat verder af van de oorspronkelijke tekst. Dit betekent dat het model een uiteindelijke samenvatting kan genereren die te oppervlakkig is om bruikbaar te zijn.
  • Tragere prestaties : het genereren van elke samenvatting kost tijd. Ook hier geldt dat, met een oneindig aantal mogelijke samenvattingen in grotere teksten, deze aanpak enkele minuten kan duren.

Er is een samenvattingsdemo beschikbaar en u kunt de volledige broncode bekijken.

Deel uw feedback

Probeer de samenvatting van samenvattingentechniek te gebruiken met verschillende lengtes invoertekst, verschillende splitsingsgroottes en verschillende overlappingslengtes, met behulp van de Summarizer API .