Salesforce içindeki yerel LLM'lerle deneyler yapıyordum ve sonuç olarak geliştirdiğim bileşenden bahsetmek istiyorum. Bağlam için Salesforce kayıtlarını kullanan zaten bilindik sohbet arayüzüne sahip. Bilgisayarınızda yerel olarak çalışır, bu nedenle işlenmiş veriler herhangi bir üçüncü taraf hizmetine gönderilmez.
Agentforce'un tanıtımı, bileşeni geliştirmem konusunda beni etkileyen şeydi. Agentforce, kararlar alabilen ve çeşitli eylemler gerçekleştirebilen sistemler olan ajanları kullanır. Buna karşın, yardımcılar yalnızca bilgileri tepkisel olarak işler. Pico LLM kullanarak yerel bir ajan oluşturmanın mümkün olduğuna inansam da, bu muazzam bir çaba gerektirir. Bu nedenle, bunun yerine bir yardımcı geliştirmeye karar verdim.
Bir LLM'nin çalışmasını beklediğiniz gibi, geniş bir veri kümesi üzerinde önceden eğitildiği için herhangi bir konu hakkında yanıtlar üretir. Dahası, ek bağlam için Salesforce kayıtlarını kullanabilir. Bileşenin özellikleri şunlardır:
Son kullanıcı açısından süreç basittir. Bir model yüklersiniz, bir sistem istemi seçersiniz, kayıtları seçersiniz, bir kullanıcı istemi yazarsınız ve üretilen sonuca bakarsınız.
LLM'leri bir tarayıcıda çalıştırmak, modelin boyutu, bant genişliği gereksinimleri ve RAM ihtiyaçları nedeniyle kaynak tüketen bir görevdir. Bu nedenle, Pico ekibi, LLM'lerin bilgisayarlar için yerel olarak kullanımını çok daha verimli hale getiren picoLLM Sıkıştırma tekniğini geliştirdi. Ön uç geliştiricilerin LLM'leri tarayıcılar arasında yerel olarak çalıştırmasını sağlamak için bir JavaScript SDK'sı olarak picoLLM Çıkarım Motorunu sağladılar. Chrome, Safari, Edge, Firefox ve Opera dahil tüm modern tarayıcıları destekler. picoLLM Çıkarım Motorunun nasıl çalıştığı hakkında daha fazla bilgi edinmek için makalelerini okuyabilirsiniz.
Bileşen, bir kullanıcı ile PicoLLM arayüzü arasında bir köprü görevi görür. Bileşenin özünde, bir iframe olarak gömülü bir Visualforce sayfası bulunur. Sayfa, PicoLLM SDK'sini yükler ve sonuncunun SDK'yi post mesajları aracılığıyla kullanmasına izin vererek LWC ile iletişim kurar. Tüm öğelerin birleşimi aşağıdakileri işler:
System_Prompt__c
nesnesinin kaydedilmiş herhangi bir kaydını seçmek kolaydır. Düğmeye basıldığında, seçilebilecek mevcut sistem istemlerinin bulunduğu bir açılır pencere gösterilir.İşin arka tarafında gösterişli bir şey yok. Apex kodu, kayıt sayfasından bir kayıt kimliği kullanarak nesneler arasındaki ilişkileri tespit etmekle ilgili tüm ağır işleri yapar. Ayrıca, birkaç SOQL sorgusu gerçekleştirir ve böylece görevi burada yapılır.
Daha önce, LWC bileşenindeki node modülünden kodu yürütmek için unpkg aracını kullandım. Bu yaklaşım ek yapılandırma adımlarına yol açtı ve çalışmasını sağlamanın daha az güvenli bir yoluydu. Bu sefer, PicoLLM modülünü doğrudan Salesforce'tan ve yalnızca daha önce yaptığım Experience Cloud sitesinden değil, Lightning Experience arayüzünden yürütmek istedim.
PicoLLM, perde arkasında paralel işleme için web işçileri kullanır ve bu, LWC'den çalıştırılmasına izin verilmemesi nedeniyle ana sorundu. Neyse ki, kimse web işçilerini bir visualforce sayfasından çalıştırmamıza izin vermeyi reddetmedi ve kullandığım yaklaşım buydu.
Ham PicoLLM kodunu indirdim ve onu visualforce sayfasına statik bir kaynak olarak ekledim. LWC'de visualforce sayfasını içeren bir iframe kullandım. LWC ile iframe içindeki sayfa arasındaki iletişim, web çalışanlarını kullanmama olanak sağladı. Sayfa, Lightning web bileşeninden PicoLLM ile ilgili kodu tetikler.
Salesforce kayıtlarını JSON veya CSV formatında kopyalayıp yapıştırın, herhangi bir çevrimiçi LLM'ye atın ve izleyin. Kayıtları tüketecek, bunları ekstra bağlam için kullanacak ve bir yanıt üretecektir. Yerel işleme için sıkıştırılmış modeller kullanıldığında bunun o kadar kolay olmadığı ortaya çıktı.
İlk başta, kayıtları JSON formatında, doğrudan kullanıcı istemine koyuyordum. Sonra şeyin istemin kendisini sağladığım ek bağlamdan ayırt edebilecek kadar akıllı olmasını bekledim. Çeşitli boyutlarda farklı modeller kullandım ve yanıtları oluşturmak için neden JSON'u kullanmadığını anlamadım. Çoğunlukla istemime yanıt vermeyi reddetmeleri veya yapmasını istediğim şeyle ilgili olmayan kurgusal verilerin oluşturulmasıydı. Bağlam verilerinin farklı biçimlerini denemeye başladım: CSV kullanma, JSON kullanma, istemi bağlamdan kesin olarak ayırmak için istem ayraçları kullanma - hiçbiri işe yaramadı.
Ana özellik çalışmadığı için neredeyse bu fikri terk edecektim. Birkaç ay sonra, aniden aptalca basit bir fikir geldi aklıma. Peki ya komut istemi parçalarının sırasını tersine çevirsem? Kullanıcı komut isteminin önce, bağlamın sonra gelmesinden, bağlamın önce, komut isteminin sonra gelmesine. Şaşırtıcı bir şekilde işe yaradı ve kullandığım her model Salesforce kayıtlarını hemen bağlam olarak anlamaya başladı.
Bileşenin işlevselliği şu makinelerde test edildi:
Bileşeni kullanmanın en çok zaman alan kısmı ilk model yüklemesidir. 9900X'in Snapdragon X-Elite'ı kolayca geride bırakmasını bekleyebilirsiniz, ancak yanılıyorsunuz. Şaşırtıcı bir şekilde, ikincisi daha hızlı. Daha hızlı belleğe sahip olduğundan, RAM'iniz ne kadar hızlıysa, modelin de o kadar hızlı yüklendiğini varsayıyorum. İşte referans olması için bir model yükleme hızı karşılaştırma tablosu:
Tepki oluşturma hızıyla ilgili aynı hikaye. Anladığım kadarıyla, mümkün olan en hızlı üretimi elde etmek için hızlı bir CPU ve RAM kombinasyonuna sahip olmanız gerekiyor. Tepki oluşturma aynı komutla değiştiği için, kesin hız testleri yapmadım. Yine de, üretim hızı son derece hızlı, neredeyse çevrimiçi alternatifler kadar hızlı.
Gerçekten de, yanıtları üretmek için bir GPU kullanmak çok daha verimli olurdu. PicoLLM ile bir GPU kullanmak mümkün olsa da, bu yapılandırmayı kendim test etmedim. Bunun birkaç nedeni var. İlk olarak, çoğu tarayıcıda (Edge hariç) varsayılan olarak etkin olmayan WebGPU özelliğini kullandığına inanıyorum. İkinci olarak, modeli yüklemek için muhtemelen birkaç gigabayt VRAM'e ihtiyaç duyuyor ve bende yok.
Bu asistanı geliştirmek büyüleyici bir keşif yolculuğu oldu. Web çalışanı sınırlamalarıyla boğuşmaktan bağlam sağlamada hızlı siparişin kritik rolünü keşfetmeye kadar, zorluklar hem teşvik edici hem de ödüllendirici oldu. Sonuç, Salesforce ekosistemi içinde Büyük Dil Modellerinin gücünden yararlanmak için benzersiz bir yaklaşım sunan bir Lightning Web Bileşeni oldu.
İlk model yükleme süresi, özellikle daha büyük modeller için bir değerlendirme konusu olabilirken, verileri yerel olarak işleme yeteneği, veri güvenliği, yanıt verme ve maliyet etkinliği açısından önemli avantajlar sunar. İçerik oluşturmayı otomatikleştirmekten akıllı yardım sağlamaya kadar potansiyel kullanım durumları çok geniştir ve keşfedilmeyi beklemektedir.
GitHub deposuna göz atın.