Küçük bağlam pencerelerinde istemci tarafı özetleme özelliğini ölçeklendirme

Yayınlanma tarihi: 12 Mart 2025, Son güncelleme: 28 Mayıs 2025

Açıklayıcı Web Uzantılar Chrome Durumu Amaç
MDN Bayrak arkasında Chrome 138 beta Bayrak arkasında Chrome 138 beta Görünüm Gönderim Amacı

Summarizer API, çeşitli uzunluk ve biçimlerde bilgi özetleri oluşturmanıza yardımcı olur. Uzun veya karmaşık metinleri kısaca açıklamak için Chrome'daki Gemini Nano ile veya tarayıcılara yerleştirilmiş diğer dil modelleriyle kullanın.

İşlem istemci tarafında yapıldığında verilerle yerel olarak çalışabilirsiniz. Bu sayede hassas verileri güvende tutabilir ve geniş ölçekte kullanılabilirlik sunabilirsiniz. Ancak bağlam penceresi, sunucu tarafı modellere kıyasla çok daha küçüktür. Bu nedenle, çok büyük belgeleri özetlemek zor olabilir. Bu sorunu çözmek için özetlerin özeti tekniğini kullanabilirsiniz.

Özetlerin özeti nedir?

Özetlerin özeti tekniğini kullanmak için giriş içeriğini önemli noktalarda bölün ve ardından her bölümü bağımsız olarak özetleyin. Her bir bölümden gelen çıkışları birleştirebilir ve ardından bu birleştirilmiş metni tek bir nihai özet halinde toplayabilirsiniz.

Örneğin, bir doküman üç bölüme ayrılmışsa her bölüm özetlenir. Bu üç özet bir araya getirilir ve nihai sonuç için tekrar özetlenir.

İçeriğinizi dikkatli bir şekilde bölme

Farklı stratejiler LLM'lerde farklı sonuçlara yol açabileceğinden, büyük bir metni nasıl böleceğinizi düşünmeniz önemlidir. İdeal olarak, metin bir makalenin yeni bir bölümü veya paragrafı gibi konu değişikliği olduğunda bölünmelidir. Metni bir kelimenin veya cümlenin ortasında bölmekten kaçınmanız önemlidir. Yani, tek bölme kuralınız olarak karakter sayısını kullanamazsınız.

Bunu yapmanın birçok yolu vardır. Aşağıdaki örnekte, performans ile çıkış kalitesini dengeleyen LangChain.js'den Yinelenen Metin Bölme işlevini kullandık. Bu, çoğu iş yükü için işe yarayacaktır.

Yeni bir örnek oluştururken iki önemli parametre vardır:

  • chunkSize, her bölme için izin verilen maksimum karakter sayısıdır.
  • chunkOverlap, art arda iki bölme arasında çakışma yapacak karakter miktarıdır. Bu sayede her bir parçada önceki parçanın bağlamının bir kısmı bulunur.

Her bir parçayı içeren bir dize dizisi döndürmek için metni splitText() ile bölün.

Çoğu büyük dil modelinin bağlam penceresi, karakter sayısı yerine jeton sayısı olarak ifade edilir. Bir jeton ortalama 4 karakter içerir. Örneğimizde chunkSize 3.000 karakter uzunluğundadır ve yaklaşık 750 jetondan oluşur.

Jeton kullanılabilirliğini belirleme

Bir giriş için kaç jeton kullanılabileceğini belirlemek üzere measureInputUsage() yöntemini ve inputQuota özelliğini kullanın. Bu durumda, özetleyicinin tüm metni işlemek için kaç kez çalışacağını bilemeyeceğiniz için uygulama sınırsızdır.

Her bölme için özet oluşturma

İçeriğin nasıl bölüneceğini ayarladıktan sonra Summarizer API ile her bölümün özetini oluşturabilirsiniz.

create() işlevini kullanarak özetleyici örneği oluşturun. Mümkün olduğunca fazla bağlam bilgisini korumak için format parametresini plain-text, type parametresini tldr ve length parametresini long olarak ayarladık.

Ardından, RecursiveCharacterTextSplitter tarafından oluşturulan her bölme için özeti oluşturun ve sonuçları yeni bir dize halinde birleştirin. Her bölümün özetini net bir şekilde tanımlamak için her özeti yeni bir satırla ayırdık.

Bu yeni satır, bu döngüyü yalnızca bir kez çalıştırırken önemli olmasa da her özetin nihai özet için jeton değerine nasıl katkıda bulunduğunu belirlemek için yararlıdır. Bu çözüm, çoğu durumda orta ve uzun içerikler için işe yarayacaktır.

Özetlerin yinelenen özeti

Çok uzun bir metniniz varsa birleştirilmiş özetin uzunluğu, mevcut bağlam penceresinden daha büyük olabilir. Bu da özetleme işleminin başarısız olmasına neden olur. Bu sorunu gidermek için özetlerin özetini yinelemeli olarak alabilirsiniz.

Özet özetiniz hâlâ çok uzunsa işlemi tekrarlayabilirsiniz. Teorik olarak, uygun bir uzunluk elde edene kadar işlemi süresiz olarak tekrarlayabilirsiniz.

RecursiveCharacterTextSplitter tarafından oluşturulan ilk bölmelerin toplanması devam eder. Ardından, recursiveSummarizer() işlevinde, birleştirilmiş bölmelerin karakter uzunluğuna göre özetleme işlemini döngüye alırız. Özetlerin karakter uzunluğu 3000'ü aşarsa fullSummaries olarak birleştirilir. Sınıra ulaşılmazsa özet partialSummaries olarak kaydedilir.

Tüm özetler oluşturulduktan sonra nihai kısmi özetler tam özete eklenir. fullSummaries içinde yalnızca 1 özet varsa ek yineleme gerekmez. İşlev, nihai bir özet döndürür. Birden fazla özet varsa işlev, kısmi özetlerin özetlenmesi işlemini tekrarlayarak devam eder.

Bu çözümü, 17.560 kelime içeren 110.030 karakterden oluşan Internet Relay Chat (IRC) RFC ile test ettik. Summarizer API aşağıdaki özeti sağladı:

Internet Relay Chat (IRC), kısa mesajları kullanarak internette gerçek zamanlı olarak iletişim kurmanın bir yoludur. Kanallarda sohbet edebilir veya özel mesaj gönderebilir, sohbeti kontrol etmek ve sunucuyla etkileşimde bulunmak için komutları kullanabilirsiniz. İnternetteki bir sohbet odası gibidir. Yazdığınız mesajlar ve diğer kullanıcıların mesajları anında gösterilir.

Bu oldukça etkili. Ayrıca, yalnızca 309 karakterden oluşuyor.

Sınırlamalar

Özetlerin özeti tekniği, müşteri boyutunda bir modelin bağlam penceresinde çalışmanıza yardımcı olur. İstemci tarafı yapay zekanın birçok avantajı olsa da aşağıdakilerle karşılaşabilirsiniz:

  • Daha az doğru özetler: Yinelemeli özetleme işleminde özetleme işleminin tekrarı sonsuz olabilir ve her özet, orijinal metinden daha uzak olur. Bu, modelin yararlı olamayacak kadar yüzeysel bir son özet oluşturabileceği anlamına gelir.
  • Daha yavaş performans: Her özetin oluşturulması zaman alır. Yine de, daha uzun metinlerde sonsuz sayıda özet oluşturma olasılığı olduğundan bu yaklaşımın tamamlanması birkaç dakika sürebilir.

Özetleyici demomuz mevcuttur ve tam kaynak kodunu görüntüleyebilirsiniz.

Görüşlerinizi paylaşın

Summarizer API ile farklı giriş metni uzunlukları, farklı bölme boyutları ve farklı çakışma uzunlukları kullanarak özetlerin özetini kullanmayı deneyin.