Yayınlanma tarihi: 13 Ocak 2024
Bu, LLM'ler ve chatbot'lar hakkında üç bölümden oluşan bir serinin ikinci bölümüdür. Önceki makalede, cihaz üzerinde ve tarayıcıda LLM'lerin avantajları ve dezavantajları ele alınmıştı.
İstemci tarafı yapay zekayı daha iyi anladığınıza göre, WebLLM'yi yapılacaklar listesi web uygulamasına eklemeye hazırsınız. Kodu, GitHub deposunun web-llm
kolunda bulabilirsiniz.
WebLLM, Makine Öğrenimi Derlemesi tarafından sağlanan LLM'ler için web tabanlı bir çalışma ortamıdır. WebLLM'yi bağımsız bir uygulama olarak deneyebilirsiniz. Uygulama, Gemini gibi bulut destekli sohbet uygulamalarından ilham alır ancak LLM çıkarım işlemi bulut yerine cihazınızda çalıştırılır. İstemleriniz ve verileriniz hiçbir zaman cihazınızdan çıkmaz ve modelleri eğitmek için kullanılmaz.
WebLLM, cihazda model çıkarım işlemi gerçekleştirmek için WebAssembly ve WebGPU'yu birleştirir. WebAssembly, merkezi işlem biriminde (CPU) verimli hesaplamalar yapılmasına olanak tanır. WebGPU ise geliştiricilere cihazın grafik işleme birimine (GPU) düşük düzeyde erişim sağlar.
WebLLM'yi yükleme
WebLLM, npm paketi olarak kullanılabilir.
npm install @mlc-ai/web-llm
komutunu çalıştırarak bu paketi yapılacaklar listesi uygulamanıza ekleyebilirsiniz.
Model seçme
Ardından, yerel olarak çalıştırılacak bir LLM'ye karar vermeniz gerekir. Çeşitli modeller mevcuttur.
Karar vermek için aşağıdaki temel terimleri ve rakamları bilmeniz gerekir:
- Jeton: LLM'nin işleyebileceği en küçük metin birimidir.
- Bağlam penceresi: Modelin işleyebileceği maksimum jeton sayısı.
- Parametreler veya ağırlıklar: Eğitim sırasında öğrenilen ve milyarlarca olarak sayılan dahili değişkenler.
- Kantizasyon: Ağırlıkları temsil eden bit sayısı. Daha fazla bit, daha yüksek hassasiyet anlamına gelir ancak aynı zamanda daha yüksek bellek kullanımı da demektir.
- Kayan nokta sayı biçimleri: 32 bitlik kayan sayılar (tam hassasiyet, F32) daha iyi doğruluk sunarken 16 bitlik kayan sayılar (yarım hassasiyet, F16) daha yüksek hıza ve daha az bellek kullanımına sahiptir ancak uyumlu donanım gerektirir.
Bu anahtar terimler genellikle model adının bir parçasıdır. Örneğin,
Llama-3.2-3B-Instruct-q4f32_1-MLC
aşağıdaki bilgileri içerir:
- Model LLaMa 3.2'dir.
- Modelin 3 milyar parametresi vardır.
- Talimat ve istem tarzı asistanlar (Talimat) için hassas ayarlanmıştır.
- 4 bit (q4) tek tip (_1) örnekleme kullanılır.
- Tam hassasiyetli, 32 bitlik kayan nokta sayılarına sahiptir.
- Makine Öğrenimi Derlemesi tarafından oluşturulan özel bir sürümdür.
Kullanım alanınıza en uygun modeli belirlemek için farklı modelleri test etmeniz gerekebilir.
3 milyar parametre ve parametre başına 4 bit içeren bir modelin, bu makalenin yazıldığı sırada 1,4 GB kadar büyük bir dosya boyutu olabilir.Uygulamanın, ilk kullanımdan önce bu modeli kullanıcının cihazına indirmesi gerekir. 3B modellerle çalışmak mümkündür ancak çeviri özellikleri veya bilgi yarışması bilgileri söz konusu olduğunda 7B modeller daha iyi sonuçlar verir. Ancak 3,3 GB ve üzeri boyutlarda bu dosyalar çok daha büyüktür.
WebLLM motorunu oluşturmak ve yapılacaklar listesi sohbet botunuz için model indirme işlemini başlatmak üzere uygulamanıza aşağıdaki kodu ekleyin:
import {CreateMLCEngine} from '@mlc-ai/web-llm';
const engine = await CreateMLCEngine('Llama-3.2-3B-Instruct-q4f32_1-MLC', {
initProgressCallback: ({progress}) => console.log(progress);
});
CreateMLCEngine
yöntemi, model dizesini ve isteğe bağlı bir yapılandırma nesnesini alır. initProgressCallback
yöntemini kullanarak modelin indirme ilerleme durumunu sorgulayabilir ve kullanıcılar beklerken bu durumu onlara gösterebilirsiniz.
Cache API: LLM'nizi çevrimdışı çalıştırma
Model, web sitenizin önbelleğe alma depolama alanına indirilir. Cache API, web sitenizin veya web uygulamanızın çevrimdışı çalışmasını sağlamak için Hizmet Çalışanlarıyla birlikte kullanıma sunulmuştur. Yapay zeka modellerini önbelleğe almak için en iyi depolama mekanizmasıdır. HTTP önbelleğe alma işleminin aksine, Cache API tamamen geliştiricinin kontrolü altında olan programlanabilir bir önbellektir.
WebLLM, indirilen model dosyalarını ağ üzerinden istemek yerine Cache API'den okur. Bu sayede WebLLM tamamen çevrimdışı kullanılabilir.
Tüm web sitesi depolama alanlarında olduğu gibi, önbellek de kaynak başına izole edilir. Bu, example.com ve example.net adlı iki kaynağın aynı depolama alanını paylaşamayacağı anlamına gelir. Bu iki web sitesi aynı modeli kullanmak isterse modeli ayrı olarak indirmesi gerekir.
Uygulama > Depolama'ya gidip Önbellek depolama alanını açarak DevTools'u kullanarak önbelleği inceleyebilirsiniz.
İleti dizisini ayarlama
Model, bir dizi ilk istemle başlatılabilir. Genellikle üç ileti rolü vardır:
- Sistem istemi: Bu istem, modelin davranışını, rolünü ve karakterini tanımlar. Ayrıca, modele eğitim veri kümesinin parçası olmayan özel veriler (ör. alanınızla ilgili veriler) beslemek için de kullanılabilir. Yalnızca bir sistem istemi belirtebilirsiniz.
- Kullanıcı istemi: Kullanıcı tarafından girilen istemler.
- Asistan istemi: Asistandan gelen yanıtlar (isteğe bağlı).
Kullanıcı ve asistan istemleri, LLM'ye nasıl davranması veya yanıt vermesi gerektiğine dair doğal dil örnekleri sağlayarak N-shot istem için kullanılabilir.
To-do listesi uygulaması için görüşmeyi ayarlamaya dair basit bir örnek aşağıda verilmiştir:
const messages = [
{ role: "system",
content: `You are a helpful assistant. You will answer questions related to
the user's to-do list. Decline all other requests not related to the user's
todos. This is the to-do list in JSON: ${JSON.stringify(todos)}`
},
{role: "user", content: "How many open todos do I have?"}
];
İlk sorunuzu yanıtlayın
Sohbet tamamlama özelliği, daha önce oluşturulan WebLLM motorunda bir mülk olarak gösterilir (engine.chat.completions
). Model indirildikten sonra bu mülkte create()
yöntemini çağırarak model çıkarım işlemini çalıştırabilirsiniz. Kullanım alanınızda, kullanıcının yanıt oluşturulurken okumaya başlayabilmesi için yanıtları aktarmak istiyorsunuz. Böylece, kullanıcının bekleme süresini kısaltabilirsiniz:
const chunks = await engine.chat.completions.create({ messages, stream: true, });
Bu yöntem, gizli AsyncIterator
sınıfının alt sınıfı olan bir AsyncGenerator
döndürür. Parçaların gelmesini beklemek için bir for await...of
döngüsü kullanın. Ancak yanıt yalnızca yeni jetonları (delta
) içerir. Bu nedenle, yanıtın tamamını kendiniz oluşturmanız gerekir.
let reply = '';
for await (const chunk of chunks) {
reply += chunk.choices[0]?.delta.content ?? '';
console.log(reply);
}
Web'in her zaman akış yanıtlarıyla uğraşması gerektiği ortaya çıktı. Bu akış yanıtlarıyla çalışmak ve HTML'inizi verimli bir şekilde güncellemek için DOMImplementation gibi API'leri kullanabilirsiniz.
Sonuçlar tamamen dize tabanlı olur. Bunları JSON veya diğer dosya biçimleri olarak yorumlamak istiyorsanız önce ayrıştırmanız gerekir.
Ancak WebLLM'nin bazı kısıtlamaları vardır: Uygulamanın ilk kullanımdan önce büyük bir model indirmesi gerekir. Bu model farklı kaynaklar arasında paylaşılamaz. Bu nedenle, başka bir web uygulamasının aynı modeli tekrar indirmesi gerekebilir. WebGPU, yerele yakın çıkarım performansı elde etse de tam yerel hıza ulaşamaz.
Demo
Bu dezavantajlar, Google tarafından önerilen ve istemci tarafında da çalışan ancak Chrome'a indirilen merkezi bir model kullanan keşif amaçlı bir API olan Prompt API ile giderilir. Bu sayede birden fazla uygulama, aynı modeli tam yürütme hızında kullanabilir.
Sonraki makalede, Prompt API'yi kullanarak chatbot özellikleri ekleme hakkında daha fazla bilgi edinin.