Do this, do that.
Nag-eksperimento ako sa mga lokal na LLM sa loob ng Salesforce at gusto kong sabihin sa iyo ang tungkol sa bahaging binuo ko bilang resulta. Mayroon itong pamilyar na interface ng chat na gumagamit ng mga talaan ng Salesforce para sa konteksto. Gumagana ito nang lokal sa iyong computer, kaya hindi ipinapadala ang naprosesong data sa anumang serbisyo ng third-party.
Ang pagpapakilala ng Agentforce ang nakaimpluwensya sa akin na bumuo ng bahagi. Gumagamit ang Agentforce ng mga ahente — mga system na maaaring gumawa ng mga desisyon at magsagawa ng iba't ibang aksyon. Ang mga katulong, sa kabaligtaran, ay nagpoproseso lamang ng impormasyon nang reaktibo. Kahit na naniniwala akong posible na bumuo ng isang lokal na ahente gamit ang Pico LLM, kakailanganin ito ng napakalaking pagsisikap. Kaya, nagpasya akong bumuo ng isang katulong sa halip.
Tulad ng inaasahan mong gagana ang isang LLM, bumubuo ito ng mga tugon sa anumang paksa, dahil ito ay paunang sinanay sa isang malawak na hanay ng data. Bukod dito, nagagamit nito ang mga talaan ng Salesforce para sa karagdagang konteksto. Ang mga tampok ng sangkap ay:
Mula sa pananaw ng end user, diretso ang proseso. Mag-upload ka ng modelo, pumili ng system prompt, pumili ng mga tala, magsulat ng user prompt, at tingnan ang resultang nabuo.
Ang pagpapatakbo ng mga LLM sa isang browser ay isang gawaing umuubos ng mapagkukunan dahil sa laki ng modelo, mga kinakailangan sa bandwidth at mga pangangailangan ng RAM. Samakatuwid, binuo ng Pico team ang kanilang picoLLM Compression technique, na ginagawang mas mahusay ang paggamit ng mga LLM sa lokal para sa mga computer. Ibinigay nila ang picoLLM Inference Engine, bilang isang JavaScript SDK, upang payagan ang mga front-end na developer na magpatakbo ng mga LLM nang lokal sa mga browser. Sinusuportahan nito ang lahat ng modernong browser kabilang ang Chrome, Safari, Edge, Firefox, at Opera. Upang malaman ang higit pa tungkol sa kung paano gumagana ang picoLLM Inference Engine, maaari mong basahin ang kanilang artikulo .
Ang component ay nagsisilbing tulay sa pagitan ng user at PicoLLM interface. Sa core ng component ay isang Visualforce page na naka-embed bilang isang iframe. Nilo-load ng page ang PicoLLM SDK at nakikipag-ugnayan sa LWC na nagpapahintulot sa huling gumamit ng SDK sa pamamagitan ng mga post na mensahe. Ang buong kumbinasyon ng mga elemento ay humahawak sa mga sumusunod:
System_Prompt__c
object. Kapag pinindot ang button, magpapakita ito ng popup na may mga umiiral nang system prompt na mapagpipilian.Sa back-end na bahagi ng mga bagay ay walang magarbong. Ginagawa ng Apex code ang lahat ng mabigat na pag-angat na nauugnay sa pag-detect ng mga ugnayan sa pagitan ng mga bagay gamit ang isang record Id mula sa pahina ng talaan. Gayundin, nagsasagawa ito ng ilang mga query sa SOQL, at sa gayon ang tungkulin nito ay ginagawa dito.
Dati, ginamit ko ang tool na unpkg para magsagawa ng code mula sa node module sa LWC component. Ang diskarte na ito ay humantong sa karagdagang mga hakbang sa pagsasaayos, at isang hindi gaanong secure na paraan upang gawin itong gumana. Sa pagkakataong ito, gusto kong isagawa ang module ng PicoLLM nang direkta mula sa Salesforce at hindi lamang mula sa site ng Experience Cloud, na ginawa ko dati, ngunit ang interface ng Lightning Experience.
Sa ilalim ng hood, gumagamit ang PicoLLM ng mga web worker para sa parallel processing, at ito ang pangunahing problema dahil hindi ito pinapayagang patakbuhin ang mga ito mula sa LWC. Sa kabutihang palad, walang tumanggi na patakbuhin kami ng mga web worker mula sa isang visualforce page, at ito ang ginamit kong diskarte.
Na-download ko ang raw PicoLLM code at idinagdag ko ito bilang isang static na mapagkukunan sa pahina ng visualforce. Sa LWC gumamit ako ng iframe na naglalaman ng visualforce page. Ang komunikasyon sa pagitan ng LWC at ng pahina sa loob ng iframe ay nagpapahintulot sa akin na gumamit ng mga manggagawa sa web. Pinalitaw ng pahina ang code na nauugnay sa PicoLLM mula sa bahagi ng lightning web.
Kopyahin at i-paste ang mga tala ng Salesforce sa JSON o CSV na format, itapon ito sa anumang online na LLM at panoorin. Kakainin nito ang mga tala, gagamitin ang mga ito para sa karagdagang konteksto at bubuo ng tugon. Ito ay lumabas na hindi ganoon kadali kapag gumagamit ng mga naka-compress na modelo para sa lokal na pagproseso.
Noong una, inilalagay ko lang ang mga tala, sa format na JSON, sa prompt ng user. Pagkatapos ay inaasahan ko na ang bagay ay sapat na matalino upang makilala ang mismong prompt mula sa karagdagang kontekstong ibinigay ko. Gumamit ako ng iba't ibang modelo ng iba't ibang laki at hindi ko maintindihan kung bakit hindi nito ginagamit ang JSON upang makabuo ng mga tugon. Kadalasan ay ang mga pagtanggi na tumugon sa aking prompt o pagbuo ng fictional data na hindi nauugnay sa kung ano ang hiniling kong gawin nito. Nagsimula akong mag-eksperimento sa iba't ibang format ng data ng konteksto: gamit ang CSV, gamit ang JSON, gamit ang mga prompt divider upang mahigpit na maiba ang prompt mula sa konteksto — walang nakatulong.
Halos tinalikuran ko ang ideya dahil hindi gumagana ang pangunahing tampok. After a couple of months, bigla akong nagkaroon ng stupidly simple brainwave. Paano kung binaligtad ko lang ang pagkakasunud-sunod ng mga maagang bahagi? Mula sa pag-uuna ng user at pangalawa ang konteksto, hanggang sa mauna ang konteksto at pangalawa ang prompt. Sa aking sorpresa ay gumana ito, at anumang modelo na ginamit ko ay agad na nagsimulang maunawaan ang mga talaan ng Salesforce bilang konteksto.
Nasubok ang functionality ng component sa mga makinang ito:
Ang pinaka-nakakaubos ng oras na bahagi ng paggamit ng bahagi ay ang paunang pag-load ng modelo. Maaari mong asahan na madaling madaig ng 9900X ang Snapdragon X-Elite, ngunit magkakamali ka. Sa aking pagtataka, ang huli ay mas mabilis. Dahil mayroon itong mas mabilis na memorya, ipinapalagay ko na mas mabilis ang iyong RAM, mas mabilis ang pag-load ng modelo. Narito ang isang talahanayan ng paghahambing ng bilis ng paglo-load ng modelo para sa sanggunian:
Ang parehong kuwento na may bilis ng pagbuo ng tugon. Sa pagkakaintindi ko, kailangan mong magkaroon ng mabilis na kumbinasyon ng CPU at RAM para makuha ang pinakamabilis na henerasyong posible. Dahil nag-iiba ang pagbuo ng tugon sa parehong prompt, hindi ako nagsagawa ng mga tumpak na pagsubok sa bilis. Gayunpaman, ang bilis ng henerasyon ay napakabilis, halos kasing bilis ng mga online na alternatibo.
Sa katunayan, ang paggamit ng isang GPU upang makabuo ng mga tugon ay magiging mas mahusay. Bagama't posibleng gumamit ng GPU na may PicoLLM, hindi ko pa nasubukan ang configuration na iyon sa aking sarili. Mayroong ilang mga dahilan para dito. Una, naniniwala ako na ginagamit nito ang tampok na WebGPU, na hindi pinagana bilang default sa karamihan ng mga browser (maliban sa Edge). Pangalawa, malamang na nangangailangan ito ng ilang gigabytes ng VRAM upang mai-load ang modelo na wala ako.
Ang pagbuo ng katulong na ito ay naging isang kamangha-manghang paglalakbay ng paggalugad. Mula sa pakikipagbuno sa mga limitasyon ng manggagawa sa web hanggang sa pagtuklas ng mahalagang papel ng maagap na pagkakasunud-sunod sa pagbibigay ng konteksto, ang mga hamon ay parehong nakapagpapasigla at nagbibigay-kasiyahan. Ang resulta ay isang Lightning Web Component na nag-aalok ng natatanging diskarte sa paggamit ng kapangyarihan ng Large Language Models sa loob ng Salesforce ecosystem.
Bagama't maaaring isaalang-alang ang unang oras ng paglo-load ng modelo, lalo na para sa mas malalaking modelo, ang kakayahang magproseso ng data nang lokal ay nag-aalok ng makabuluhang mga pakinabang sa mga tuntunin ng seguridad ng data, pagtugon, at pagiging epektibo sa gastos. Ang mga potensyal na kaso ng paggamit, mula sa pag-automate ng pagbuo ng nilalaman hanggang sa pagbibigay ng matalinong tulong, ay malawak at naghihintay na tuklasin.
Tingnan ang GitHub repo .