{"id":27408,"date":"2024-04-29T12:53:36","date_gmt":"2024-04-29T10:53:36","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=27408"},"modified":"2024-08-06T10:58:23","modified_gmt":"2024-08-06T08:58:23","slug":"modello-ai-client-side-nel-browser","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/","title":{"rendered":"Eseguire Modelli di AI Client-Side nel Browser"},"content":{"rendered":"\n<p>Normalmente quando parliamo di integrare in una Web App un modello di Intelligenza Artificiale pensiamo immediatamente a server in Python o, ancora pi\u00f9 spesso, a API di piattaforme in cloud. In questa piccola guida vogliamo per\u00f2 esplorare un terreno poco battuto: la possibilit\u00e0 di includere modelli AI direttamente nelle Web App per usarle gi\u00e0 oggi client-side grazie a Javascript e gli attuali Standard Web!<\/p>\n\n\n\n<p>Ma prima di lanciarci con la fantasia e il codice, \u00e8 necessario che vi introduca i protagonisti della storia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vi-presento-i-transformers\">Vi Presento i Transformers&#8230;<\/h2>\n\n\n\n<p>I &#8220;Transformers&#8221; hanno rivoluzionato il campo dell&#8217;elaborazione del linguaggio naturale (NLP) e dell&#8217;intelligenza artificiale: questa architettura, basata sul concetto di &#8220;auto-attenzione&#8221;, consente ai modelli di prestare attenzione a&nbsp;<strong>diverse parti di un testo contemporaneamente<\/strong>, catturando cos\u00ec le&nbsp;<em>relazioni tra le parole<\/em>&nbsp;anche se sono distanti nella sequenza.<\/p>\n\n\n\n<p><strong>Ma cosa rende i &#8220;Transformers&#8221; cos\u00ec speciali?<\/strong><\/p>\n\n\n\n<p>A differenza dei tradizionali modelli di <a href=\"https:\/\/www.codemotion.com\/magazine\/video\/deep-neural-networks\/\" class=\"ek-link\">rete neurale sequenziale<\/a>, come le reti neurali ricorrenti (RNN) o le reti neurali convoluzionali (CNN), che elaborano i dati in modo sequenziale, i &#8220;Transformers&#8221; sono in grado di elaborare le sequenze in parallelo, rendendo l&#8217;elaborazione molto pi\u00f9 efficiente e rapida.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"transformersjs---la-libreria-per-eseguire-quasi-tutti-i-modelli-disponibili-su-huggingface-nel-browser\">Transformers.js &#8211; La Libreria per eseguire [quasi] tutti i Modelli disponibili su Huggingface nel Browser!<\/h2>\n\n\n\n<p>Tra i tanti nuovi tool e software legati alle IA potrebbe esserti sfuggita una soluzione che unisce i &#8220;Transformers&#8221; ed il mondo web: \u00e8 la libreria Transformers.js!<\/p>\n\n\n\n<p>Questa libreria ti permette di eseguire modelli di intelligenza artificiale disponibili nel mondo Python direttamente nel tuo browser, aprendo cos\u00ec nuove possibilit\u00e0 nel campo dello sviluppo web e non solo.<\/p>\n\n\n\n<p>Con Transformers.js, puoi incorporare facilmente potenti modelli di NLP, come GPT e BERT ma anche task di Computer Vision come image-to-text, depth-estimation e molto altro, nelle tue applicazioni web, Node.js o Electron!<\/p>\n\n\n\n<p>Tutto senza la necessit\u00e0 di dipendere da server esterni o servizi cloud poich\u00e9 tutto&nbsp;<strong>viene eseguito all&#8217;interno del browser<\/strong>.<\/p>\n\n\n\n<p>Questa caratteristica, oltre all&#8217;evidente basso costo di infrastruttura introduce un livello di privacy completo: i dati (informazioni sensibili come lo stato di salute o le immagini della webcam) possono non lasciare il dispositivo dell&#8217;utente: addirittura, dopo aver scaricato il modello, la tua web app funzioner\u00e0 anche offline!<\/p>\n\n\n\n<p>Ma come possiamo iniziare a utilizzare Transformers.js nei nostri progetti JavaScript? Continua a leggere per scoprirlo!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ora-proviamo-lebbrezza-di-creare-una-vera-web-app-basata-su-ai\">Ora Proviamo l&#8217;Ebbrezza di Creare una Vera Web App Basata su AI&#8230;<\/h2>\n\n\n\n<p>Ecco la parte pi\u00f9 emozionante: mettere in pratica ci\u00f2 che abbiamo discusso e creare una vera web app basata su intelligenza artificiale utilizzando Transformers.js!<\/p>\n\n\n\n<p>In questo tutorial, ti guideremo passo dopo passo attraverso la creazione di una semplice applicazione web che utilizza un modello di generazione di testo basato su &#8220;Transformers&#8221; per tradurre dall&#8217;italiano all&#8217;inglese le frasi inserite dall&#8217;utente. Vedrai come \u00e8 facile integrare Transformers.js nel tuo progetto ed iniziare ad esplorare il mondo dell&#8217;Intelligenza Artificiale in modo creativo e familiare.<\/p>\n\n\n\n<p>Prepara il tuo editor di codice preferito ed affrontiamo questa sfida passo passo&#8230; come in una ricetta di cucina!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ricetta-pratica-per-traduttore-basato-su-intelligenza-artificiale-integrato-in-pagina-web\">Ricetta pratica per&nbsp;<em>Traduttore basato su Intelligenza Artificiale<\/em>&nbsp;integrato in pagina web<\/h2>\n\n\n\n<p>A titolo di esempio svilupperemo un semplice traduttore che user\u00e0 un <a href=\"https:\/\/huggingface.co\/Xenova\/opus-mt-it-en\" target=\"_blank\" aria-label=\"modello IA per tradurre dall'Italiano all'Inglese (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">modello IA per tradurre dall&#8217;Italiano all&#8217;Inglese<\/a> con un click!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"requisiti\">Requisiti<\/h3>\n\n\n\n<p>Non serve saperne di IA, Python o data-science, basta cavarsela con vanilla JavaScript, HTML5 e CSS: la ricetta \u00e8 pensata per essere chiara ed <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/dev-community\/laccessibilita-digitale-porta-vantaggi-a-tutti\/\" class=\"ek-link\">accessibile<\/a>!<\/p>\n\n\n\n<p>Ad esempio, non useremo nessun bundler ma una semplice cartella&nbsp;<code>\/public<\/code>&nbsp;da servire con il vostro web server preferito.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ingredienti\">Ingredienti<\/h3>\n\n\n\n<p>Per la nostra webapp avremo bisogno di tre ingredienti principali:<\/p>\n\n\n\n<p>Una&nbsp;<strong>UI minimalista<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54-1024x576.png\" alt=\"Interfaccia grafica minimalista per traduzione con modello IA\" class=\"wp-image-27413 size-full\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54-1024x576.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54-300x169.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54-768x432.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54-1536x864.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54-896x504.png 896w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54-400x225.png 400w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Screenshot_2024-04-29_11-16-54.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<ul class=\"wp-block-list\">\n<li><code>textarea<\/code>&nbsp;dove l&#8217;utente scriver\u00e0 il testo da tradurre<\/li>\n\n\n\n<li><code>button<\/code>&nbsp;per avviare la traduzione<\/li>\n\n\n\n<li><code>textarea<\/code>&nbsp;per visualizzare l&#8217;output tradotto<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p>Un&nbsp;<strong>web worker<\/strong>&nbsp;(caricato come modulo): conterr\u00e0 il nostro modello di IA e ci permetter\u00e0 di interrogarlo senza bloccare l&#8217;interfaccia utente del main thread.<\/p>\n\n\n\n<p>Una semplice&nbsp;<strong>logica applicativa<\/strong>: sar\u00e0 responsabile di legare insieme la UI, il web worker e il processo di traduzione.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"procedura\">Procedura<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"preparazione-dellui\">Preparazione dell&#8217;UI<\/h4>\n\n\n\n<p>Creiamo una semplice pagina HTML con le textarea per l&#8217;input e l&#8217;output, insieme a un bottone per avviare la traduzione.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span> <span class=\"hljs-attr\">lang<\/span>=<span class=\"hljs-string\">\"en\"<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">charset<\/span>=<span class=\"hljs-string\">\"UTF-8\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"viewport\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"width=device-width, initial-scale=1.0\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Web based AI Translator<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">rel<\/span>=<span class=\"hljs-string\">\"stylesheet\"<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\".\/style.css\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"module\"<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\".\/app.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"translation-form\"<\/span>&gt;<\/span>\n            <span class=\"hljs-comment\">&lt;!-- input da tradurre --&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">textarea<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"italian-text\"<\/span> <span class=\"hljs-attr\">rows<\/span>=<span class=\"hljs-string\">\"6\"<\/span> <span class=\"hljs-attr\">spellcheck<\/span>=<span class=\"hljs-string\">\"false\"<\/span> <span class=\"hljs-attr\">required<\/span> <span class=\"hljs-attr\">disabled<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Italian text\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">textarea<\/span>&gt;<\/span>\n            <span class=\"hljs-comment\">&lt;!-- bottone a cui attaccheremo l'evento per tradurre --&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"translate-button\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"button\"<\/span> <span class=\"hljs-attr\">disabled<\/span>&gt;<\/span>Loading model...<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n            <span class=\"hljs-comment\">&lt;!-- output tradotto (sola lettura) --&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">textarea<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"english-text\"<\/span> <span class=\"hljs-attr\">rows<\/span>=<span class=\"hljs-string\">\"6\"<\/span> <span class=\"hljs-attr\">spellcheck<\/span>=<span class=\"hljs-string\">\"false\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"English text\"<\/span> <span class=\"hljs-attr\">readonly<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">textarea<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-comment\">&lt;!-- includiamo una progress bar per indicare quando scarichiamo il modello IA (spesso &gt; 50Mb) --&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"progress-bar\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"preparazione-dellesperienza-utente\">Preparazione dell&#8217;esperienza Utente<\/h4>\n\n\n\n<p>Ora che abbiamo pronto il nostro&nbsp;<code>index.html<\/code>&nbsp;\u00e8 il momento di abbozzare la nostra&nbsp;<code>app.js<\/code>!<\/p>\n\n\n\n<p>Ci limiteremo a definire&nbsp;<strong>due funzioni per abilitare e disabilitare l&#8217;interazione<\/strong>&nbsp;con l&#8217;interfaccia utente (facendo attenzione ad aspettare che la pagina html sia caricata).<\/p>\n\n\n\n<p>\ud83d\udd2e Ci servir\u00e0 in seguito quando saremo in attesa di risultati di processi lunghi fatti dal Web Worker.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">document<\/span>.addEventListener(<span class=\"hljs-string\">\"DOMContentLoaded\"<\/span>, () =&gt; {\n\n    <span class=\"hljs-keyword\">const<\/span> translateButton = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'translate-button'<\/span>);\n    <span class=\"hljs-keyword\">const<\/span> italianTextarea = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'italian-text'<\/span>);\n    <span class=\"hljs-keyword\">const<\/span> englishTextarea = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'english-text'<\/span>);\n    <span class=\"hljs-keyword\">const<\/span> progressBar = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'progress-bar'<\/span>);\n\n    <span class=\"hljs-keyword\">const<\/span> disableUI = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n        italianTextarea.setAttribute(<span class=\"hljs-string\">'disabled'<\/span>, <span class=\"hljs-literal\">true<\/span>);\n        englishTextarea.setAttribute(<span class=\"hljs-string\">'disabled'<\/span>, <span class=\"hljs-literal\">true<\/span>);\n        translateButton.setAttribute(<span class=\"hljs-string\">'disabled'<\/span>, <span class=\"hljs-literal\">true<\/span>);\n        translateButton.innerText = <span class=\"hljs-string\">'Translating...'<\/span>\n    }\n\n    <span class=\"hljs-keyword\">const<\/span> enableUI = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n        italianTextarea.removeAttribute(<span class=\"hljs-string\">'disabled'<\/span>);\n        englishTextarea.removeAttribute(<span class=\"hljs-string\">'disabled'<\/span>);\n        translateButton.removeAttribute(<span class=\"hljs-string\">'disabled'<\/span>);\n        translateButton.innerText = <span class=\"hljs-string\">'Translate'<\/span>\n    }\n    <span class=\"hljs-comment\">\/\/ ...<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"creazione-di-un-web-worker-per-scaricare-ed-eseguire-il-modello-ia\">Creazione di un Web Worker per scaricare ed eseguire il modello IA<\/h4>\n\n\n\n<p>Poich\u00e9 il download dei file del modello IA da Huggingface pu\u00f2 essere lungo e soprattutto sar\u00e0 la CPU dell&#8217;utente ad eseguirlo, non possiamo non includere un Web Worker al nostro progetto!<\/p>\n\n\n\n<p>\ud83c\udf36\ufe0f Questa \u00e8 la parte pi\u00f9 piccante della ricetta ma il concetto \u00e8 molto semplice e basato su messaggi tra la App ed il Web Worker:<\/p>\n\n\n\n<p>Quando si carica la pagina&#8230;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">App: <span class=\"hljs-string\">\"Scarica i file del modello\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>&#8230;qualche secondo o minuto dopo&#8230;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Worker: <span class=\"hljs-string\">\"Fatto\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mentre quando premo il bottone&#8230;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">App: <span class=\"hljs-string\">\"Traduci questo testo\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>&#8230;qualche secondo o minuto dopo&#8230;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Worker: <span class=\"hljs-string\">\"Ecco il risultato\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questo semplice meccanismo separa in due thread l&#8217;esecuzione liberando l&#8217;UI di spiecevoli blocchi!<\/p>\n\n\n\n<p>Creiamo quindi un nuovo file JavaScript dedicato esclusivamente al web worker, e che all&#8217;interno carica il modello di IA che desideriamo utilizzare per la traduzione.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"> <span class=\"hljs-keyword\">import<\/span> {\n     pipeline,\n     env\n } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"https:\/\/cdn.jsdelivr.net\/npm\/@xenova\/transformers@2.17.1\"<\/span>;\n\n env.allowLocalModels = <span class=\"hljs-literal\">false<\/span>; <span class=\"hljs-comment\">\/\/se si usano i modelli da Huggingface questo deve essere impostato<\/span>\n\n <span class=\"hljs-keyword\">var<\/span> translator; <span class=\"hljs-comment\">\/\/questa \u00e8 effettivamente la nostra funzione basata su AI<\/span>\n <span class=\"hljs-keyword\">var<\/span> task; <span class=\"hljs-comment\">\/\/ogni modello appartiene ad un task, in questo caso \u00e8 \"translation\"<\/span>\n <span class=\"hljs-keyword\">var<\/span> model; <span class=\"hljs-comment\">\/\/il nome del modello che stiamo usando<\/span>\n\n <span class=\"hljs-keyword\">const<\/span> progressCallback = <span class=\"hljs-function\">(<span class=\"hljs-params\">data<\/span>) =&gt;<\/span> {\n     self.postMessage({\n         <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-string\">'downloading'<\/span>,\n         <span class=\"hljs-attr\">result<\/span>: data\n     });\n }\n\n <span class=\"hljs-keyword\">const<\/span> updateCallback = <span class=\"hljs-function\">(<span class=\"hljs-params\">beams<\/span>) =&gt;<\/span> {\n     <span class=\"hljs-keyword\">const<\/span> decodedText = translator.tokenizer.decode(beams&#91;<span class=\"hljs-number\">0<\/span>].output_token_ids, {\n         <span class=\"hljs-attr\">skip_special_tokens<\/span>: <span class=\"hljs-literal\">true<\/span>,\n     })\n\n     self.postMessage({\n         <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-string\">'update'<\/span>,\n         <span class=\"hljs-attr\">result<\/span>: decodedText\n     });\n }\n\n <span class=\"hljs-keyword\">const<\/span> resultCallback = <span class=\"hljs-function\">(<span class=\"hljs-params\">output<\/span>) =&gt;<\/span> {\n     self.postMessage({\n         <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-string\">'result'<\/span>,\n         <span class=\"hljs-attr\">result<\/span>: output\n     })\n }\n\n self.addEventListener(<span class=\"hljs-string\">'message'<\/span>, <span class=\"hljs-keyword\">async<\/span> (event) =&gt; {\n     <span class=\"hljs-keyword\">const<\/span> message = event.data;\n\n     <span class=\"hljs-keyword\">if<\/span> (message.action == <span class=\"hljs-string\">'download'<\/span>) {\n         task = message.task;\n         model = message.model;\n\n         translator = <span class=\"hljs-keyword\">await<\/span> pipeline(task, model, {\n             <span class=\"hljs-attr\">progress_callback<\/span>: progressCallback\n         });\n\n         self.postMessage({\n             <span class=\"hljs-attr\">status<\/span>: <span class=\"hljs-string\">'ready'<\/span>,\n             <span class=\"hljs-attr\">task<\/span>: task,\n             <span class=\"hljs-attr\">model<\/span>: model\n         });\n\n     } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (message.action == <span class=\"hljs-string\">'translate'<\/span>) {\n\n         <span class=\"hljs-keyword\">const<\/span> output = <span class=\"hljs-keyword\">await<\/span> translator(message.input,\n             { <span class=\"hljs-comment\">\/\/ ingrediente segreto<\/span>\n                 ...message.generation,\n                 <span class=\"hljs-attr\">callback_function<\/span>: updateCallback\n             }\n         );\n\n         resultCallback(output&#91;<span class=\"hljs-number\">0<\/span>].translation_text);\n\n     }\n });\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"aggiungiamo-il-web-worker-alla-app\">Aggiungiamo il Web Worker alla App<\/h4>\n\n\n\n<p>Torniamo nel nostro&nbsp;<code>app.js<\/code>&nbsp;dove:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Caricheremo il file&nbsp;<code>worker.js<\/code>&nbsp;facendo attenzione a passare come opzione&nbsp;<code>type: \"module\"<\/code>&nbsp;permettendoci di caricare&nbsp;<strong>Translator.js come modulo ES6<\/strong>&nbsp;\ud83d\udc69\u200d\ud83c\udfa4<\/li>\n\n\n\n<li>Definiremo due funzioni per mandare al&nbsp;<em>web worker<\/em>&nbsp;due messaggi o azioni:&nbsp;<code>download<\/code>&nbsp;e&nbsp;<code>translate<\/code><\/li>\n\n\n\n<li>Definiremo cosa fare quando le nostre azioni producono i rispettivi risultati:&nbsp;<code>ready<\/code>&nbsp;quando il modello e pronto e&nbsp;<code>result<\/code>&nbsp;quando \u00e8 pronto il risultato dell&#8217;esecuzione del modello IA (testo tradotto in questo caso)<\/li>\n\n\n\n<li>Includiamo le funzioni&nbsp;<code>enableUI()<\/code>&nbsp;e&nbsp;<code>disableUI()<\/code>&nbsp;per informare l&#8217;utente quando la APP pu\u00f2 interagire e quando no<\/li>\n\n\n\n<li><strong>Extra<\/strong>: il web worker ci informa anche del progresso nei download e per far capire che la APP sta facendo qualcosa aggiornando una sua propriet\u00e0 in funzione della percentuale di download&nbsp;<code>--progress-bar-percentage<\/code><\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">var<\/span> aiWorker = <span class=\"hljs-keyword\">new<\/span> Worker(<span class=\"hljs-string\">'worker.js'<\/span>, {\n     <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"module\"<\/span> <span class=\"hljs-comment\">\/\/ essenziale per poter caricare moduli Javascript all'interno del Web Worker<\/span>\n });\n\n\n <span class=\"hljs-comment\">\/\/ un wrapper che manda come messaggio l'input dell'utente al Web Worker<\/span>\n <span class=\"hljs-keyword\">const<\/span> translate = <span class=\"hljs-function\">(<span class=\"hljs-params\">text<\/span>) =&gt;<\/span> {\n     disableUI(); <span class=\"hljs-comment\">\/\/ci metteremo un po'...<\/span>\n     aiWorker.postMessage({\n         <span class=\"hljs-attr\">action<\/span>: <span class=\"hljs-string\">'translate'<\/span>,\n         <span class=\"hljs-attr\">input<\/span>: text\n     })\n }\n\n <span class=\"hljs-comment\">\/\/ un wrapper che manda come messaggio il nome del modello da far scaricare al Web Worker<\/span>\n <span class=\"hljs-keyword\">const<\/span> download = <span class=\"hljs-function\">(<span class=\"hljs-params\">model<\/span>) =&gt;<\/span> {\n     disableUI(); <span class=\"hljs-comment\">\/\/ci metteremo un po'...<\/span>\n     aiWorker.postMessage({\n         <span class=\"hljs-attr\">action<\/span>: <span class=\"hljs-string\">'download'<\/span>,\n         <span class=\"hljs-attr\">task<\/span>: <span class=\"hljs-string\">'translation'<\/span>,\n         <span class=\"hljs-attr\">model<\/span>: model\n     });\n }\n\n <span class=\"hljs-comment\">\/\/ per ricevere le risposte del Web Worker useremo l'evento 'message'<\/span>\n\n aiWorker.addEventListener(<span class=\"hljs-string\">'message'<\/span>, (event) =&gt; {\n     <span class=\"hljs-comment\">\/\/ il contenuto di event.data lo decidi in worker.js<\/span>\n     <span class=\"hljs-keyword\">const<\/span> { status, result } = event.data;\n\n     <span class=\"hljs-comment\">\/\/ Il Web Worker ci informa che...<\/span>\n\n\n     \n     <span class=\"hljs-keyword\">if<\/span> (status == <span class=\"hljs-string\">'downloading'<\/span>) {\n         <span class=\"hljs-comment\">\/\/ I file del modello si stanno scaricando da Huggingface<\/span>\n\n         <span class=\"hljs-keyword\">if<\/span> (result.status == <span class=\"hljs-string\">'progress'<\/span>) {\n             <span class=\"hljs-comment\">\/\/ usiamo una variabile CSS per animare la progress bar quando veniamo informati dello stato del download<\/span>\n             progressBar.style.setProperty(<span class=\"hljs-string\">\"--progress-bar-percentage\"<\/span>, result.progress + <span class=\"hljs-string\">\"%\"<\/span>);\n         }\n\n     }  <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (status == <span class=\"hljs-string\">'ready'<\/span>) {\n         <span class=\"hljs-comment\">\/\/ Tutto \u00e8 pronto per tradurre quindi agganciamo al bottone l'azione della traduzione<\/span>\n         translateButton.addEventListener(<span class=\"hljs-string\">'click'<\/span>, () =&gt; {\n             translate(italianTextarea.value);\n         })\n\n         <span class=\"hljs-comment\">\/\/ Ora possiamo attivare la UI<\/span>\n         enableUI();\n     } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (status == <span class=\"hljs-string\">'update'<\/span>) {\n         <span class=\"hljs-comment\">\/\/ ingrediente segreto<\/span>\n         englishTextarea.value = result;\n     } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (status == <span class=\"hljs-string\">'result'<\/span>) {\n         englishTextarea.value = result;\n         enableUI();\n         \n     }\n })\n\n download(<span class=\"hljs-string\">'Xenova\/opus-mt-it-en'<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\" id=\"lingrediente-segreto\">L&#8217;ingrediente segreto<\/h4>\n\n\n\n<p>Noi commenti del Web Worker e della App ci sono due punti indicati come&nbsp;<code>ingrediente segreto<\/code>&#8230; di cosa si tratta?<\/p>\n\n\n\n<p>Quando creiamo la nostra &#8220;<em>pipeline<\/em>&#8221; possiamo aggiungere una <strong>callback<\/strong> che ci informa dei progressi nell&#8217;esecuzione del modello dandoci l&#8217;output parziale della risposta. Questo \u00e8 un ingrediente essenziale perch\u00e9 altrimenti l&#8217;utente non vedrebbe l&#8217;output se non alla fine dell&#8217;esecuzione che pu\u00f2 metterci anche minuti.<\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile has-media-on-the-top\" style=\"grid-template-columns:57% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"772\" height=\"388\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/Peek-2024-04-29-11-16.gif\" alt=\"Animazione che mostra le parole del nostro traduttore uscire una per volta\" class=\"wp-image-27414 size-full\"\/><\/figure><div class=\"wp-block-media-text__content\">\n<p><strong>Dal punto di vista dell&#8217;esperienza utente sar\u00e0 essenziale trovare modi interessanti e creativi per dare l&#8217;illusione alle persone che la nostra Intelligenza Artificiale sia viva e pensante! \ud83c\udfa9\u2728\ud83d\udc07<\/strong><\/p>\n<\/div><\/div>\n\n\n\n<p>Seguendo questi passaggi, sarai in grado di creare una webapp per tradurre testo basata su intelligenza artificiale!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusioni\">Modello AI Client-Side: Conclusioni<\/h2>\n\n\n\n<p>Ci sono tantissimi limiti all&#8217;utilizzo di questa tecnologia in questo momento: i file dei modelli molto pesanti e la lentezza di una semplice CPU sono sicuramente i pi\u00f9 evidenti! Inoltre tantissimi modelli non posso proprio essere eseguiti nel contesto del browser.<\/p>\n\n\n\n<p>Tuttavia credo ci siano degli importanti aspetti che rendono Transformers.js una grande opportunit\u00e0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si basa sulla tecnologia forse pi\u00f9 ubiqua del momento, i Transformers, ed \u00e8 anch&#8217;essa sviluppata all&#8217;interno di Huggingface&#8230; \u00e8 proprio la&nbsp;<em>cugina Javascript<\/em>&nbsp;della libreria Python \ud83e\udd17<\/li>\n\n\n\n<li>Puoi rendere compatibile qualsiasi modello normalmente per Python con uno script (che lo trasforma in un formato ottimizzato <a href=\"https:\/\/onnx.ai\/onnx\/intro\/\" target=\"_blank\" aria-label=\"ONNX (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">ONNX<\/a>): questo significa avere potenzialmente tutti i modelli appena escono!<\/li>\n\n\n\n<li>I parametri dei modelli Python sono <a href=\"https:\/\/huggingface.co\/docs\/transformers.js\/pipelines\" target=\"_blank\" aria-label=\"gli stessi in Transformers.js (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">gli stessi in Transformers.js<\/a> quindi la documentazione, appena imparati i concetti chiave, \u00e8 valida anche per i programmatori Javascript<\/li>\n\n\n\n<li>Allarga tantissimo l&#8217;ecosistema dei modelli IA portandoli nelle PWA, nei <a href=\"https:\/\/huggingface.co\/docs\/transformers.js\/tutorials\/node\" target=\"_blank\" aria-label=\"server Node.js (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">server Node.js<\/a> e addirittura nelle <a aria-label=\"Applicazioni per Desktop con ElectronJS (opens in a new tab)\" href=\"https:\/\/github.com\/xenova\/transformers.js\/tree\/main\/examples\/electron\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Applicazioni AI based<\/a><a href=\"https:\/\/github.com\/xenova\/transformers.js\/tree\/main\/examples\/electron\" target=\"_blank\" aria-label=\"Applicazioni per Desktop con ElectronJS (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\"> <\/a><a aria-label=\"Applicazioni per Desktop con ElectronJS (opens in a new tab)\" href=\"https:\/\/github.com\/xenova\/transformers.js\/tree\/main\/examples\/electron\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">per Desktop con ElectronJS<\/a>&#8230; il tutto <a aria-label=\"ben documentato (opens in a new tab)\" href=\"https:\/\/huggingface.co\/docs\/transformers.js\/index\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">ben documentato<\/a> persino con casi d&#8217;uso di React e altri framework<\/li>\n\n\n\n<li>Zero costi extra per piattaforme esterne ed API<\/li>\n\n\n\n<li>Il suo autore,&nbsp;<a href=\"https:\/\/twitter.com\/Xenovacom\" class=\"ek-link\">Xenova<\/a>, sembra avere le idee molto chiare e da <a href=\"https:\/\/youtu.be\/GVY__H89Ysk?si=ZuOP8SvM7ozFkTS-\" target=\"_blank\" aria-label=\"questa intervista (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">questa intervista<\/a> sembra assolutamente sul pezzo&#8230; e questo mi sembra un aspetto molto promettente \ud83c\udf1f<\/li>\n<\/ul>\n\n\n\n<p>Ma soprattutto stiamo tutti aspettando il vero supereroe della storia: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/WebGPU_API\" target=\"_blank\" aria-label=\"WebGPU (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">WebGPU<\/a><\/p>\n\n\n\n<p>Ma di questo parleremo in futuri articoli gi\u00e0 a partire dal prossimo di questa serie: Eseguiamo un vero Large Language Model (LLM) client-side nel browser!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Normalmente quando parliamo di integrare in una Web App un modello di Intelligenza Artificiale pensiamo immediatamente a server in Python o, ancora pi\u00f9 spesso, a API di piattaforme in cloud. In questa piccola guida vogliamo per\u00f2 esplorare un terreno poco battuto: la possibilit\u00e0 di includere modelli AI direttamente nelle Web App per usarle gi\u00e0 oggi&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\">Read more<\/a><\/p>\n","protected":false},"author":255,"featured_media":27410,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10261],"tags":[10327,12069,12072],"collections":[12402],"class_list":{"0":"post-27408","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-intelligenza-artificiale","8":"tag-javascript-it","9":"tag-llm-it","10":"tag-tutorial-it","11":"collections-codemotion-guides-it","12":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Eseguire Modelli di AI Client-Side nel Browser - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Guida introduttiva a Transformers.js la libreria Javascript che permette eseguire modelli AI direttamente nel browser e offline\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Eseguire Modelli di AI Client-Side nel Browser\" \/>\n<meta property=\"og:description\" content=\"Guida introduttiva a Transformers.js la libreria Javascript che permette eseguire modelli AI direttamente nel browser e offline\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-29T10:53:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-06T08:58:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1216\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Massimo Avvisati\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MassimoAvvisati\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Massimo Avvisati\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\"},\"author\":{\"name\":\"Massimo Avvisati\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/7d033c17576f9bdfec9dab783e58976a\"},\"headline\":\"Eseguire Modelli di AI Client-Side nel Browser\",\"datePublished\":\"2024-04-29T10:53:36+00:00\",\"dateModified\":\"2024-08-06T08:58:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\"},\"wordCount\":1356,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png\",\"keywords\":[\"JavaScript\",\"LLM\",\"tutorial\"],\"articleSection\":[\"Intelligenza artificiale\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\",\"name\":\"Eseguire Modelli di AI Client-Side nel Browser - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png\",\"datePublished\":\"2024-04-29T10:53:36+00:00\",\"dateModified\":\"2024-08-06T08:58:23+00:00\",\"description\":\"Guida introduttiva a Transformers.js la libreria Javascript che permette eseguire modelli AI direttamente nel browser e offline\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png\",\"width\":1216,\"height\":640,\"caption\":\"a robot, digital painting, dark orange and brown palette on light grey background\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Intelligenza artificiale\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Eseguire Modelli di AI Client-Side nel Browser\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/7d033c17576f9bdfec9dab783e58976a\",\"name\":\"Massimo Avvisati\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/massimo-100x100.jpeg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/massimo-100x100.jpeg\",\"caption\":\"Massimo Avvisati\"},\"description\":\"I am a full-stack developer, digital artist, maker, and educator with a passion for Artificial Intelligence. I create immersive installations and develop educational software, pushing the boundaries of technology. I believe in Free Software and Creative Commons licensing as a foundation for knowledge sharing. My goal is to craft unique and engaging educational experiences using cutting-edge technology, showcasing the potential of AI in education. Currently, my focus is on Educational Technology, where I strive to create innovative software and hardware tools that engage and inspire learners. I firmly believe in the power of Free Software and Creative Commons, utilizing these open platforms to ensure my work is accessible and reusable by others. I actively reject restrictive platforms that limit creativity and collaboration. By combining my artistic vision with cutting-edge technology, I aim to develop unique educational experiences that spark curiosity and foster a love of learning. Through my work, I strive to demonstrate the incredible potential of AI in education and the arts.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/massimo-avvisati-7220312\/\",\"https:\/\/x.com\/MassimoAvvisati\"],\"knowsAbout\":[\"Javascript\",\"Node.js\",\"PHP\",\"AI\",\"Machine Learning\",\"Web Development\",\"Free Software\"],\"knowsLanguage\":[\"English\",\"Spanish\",\"Italian\"],\"jobTitle\":\"Head of EdTech R&D\",\"worksFor\":\"Codemotion spa\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/massimo-avvisati\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Eseguire Modelli di AI Client-Side nel Browser - Codemotion Magazine","description":"Guida introduttiva a Transformers.js la libreria Javascript che permette eseguire modelli AI direttamente nel browser e offline","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/","og_locale":"en_US","og_type":"article","og_title":"Eseguire Modelli di AI Client-Side nel Browser","og_description":"Guida introduttiva a Transformers.js la libreria Javascript che permette eseguire modelli AI direttamente nel browser e offline","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-04-29T10:53:36+00:00","article_modified_time":"2024-08-06T08:58:23+00:00","og_image":[{"width":1216,"height":640,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png","type":"image\/png"}],"author":"Massimo Avvisati","twitter_card":"summary_large_image","twitter_creator":"@MassimoAvvisati","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Massimo Avvisati","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/"},"author":{"name":"Massimo Avvisati","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/7d033c17576f9bdfec9dab783e58976a"},"headline":"Eseguire Modelli di AI Client-Side nel Browser","datePublished":"2024-04-29T10:53:36+00:00","dateModified":"2024-08-06T08:58:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/"},"wordCount":1356,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png","keywords":["JavaScript","LLM","tutorial"],"articleSection":["Intelligenza artificiale"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/","name":"Eseguire Modelli di AI Client-Side nel Browser - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png","datePublished":"2024-04-29T10:53:36+00:00","dateModified":"2024-08-06T08:58:23+00:00","description":"Guida introduttiva a Transformers.js la libreria Javascript che permette eseguire modelli AI direttamente nel browser e offline","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png","width":1216,"height":640,"caption":"a robot, digital painting, dark orange and brown palette on light grey background"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/modello-ai-client-side-nel-browser\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Intelligenza artificiale","item":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/"},{"@type":"ListItem","position":3,"name":"Eseguire Modelli di AI Client-Side nel Browser"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/7d033c17576f9bdfec9dab783e58976a","name":"Massimo Avvisati","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/massimo-100x100.jpeg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/massimo-100x100.jpeg","caption":"Massimo Avvisati"},"description":"I am a full-stack developer, digital artist, maker, and educator with a passion for Artificial Intelligence. I create immersive installations and develop educational software, pushing the boundaries of technology. I believe in Free Software and Creative Commons licensing as a foundation for knowledge sharing. My goal is to craft unique and engaging educational experiences using cutting-edge technology, showcasing the potential of AI in education. Currently, my focus is on Educational Technology, where I strive to create innovative software and hardware tools that engage and inspire learners. I firmly believe in the power of Free Software and Creative Commons, utilizing these open platforms to ensure my work is accessible and reusable by others. I actively reject restrictive platforms that limit creativity and collaboration. By combining my artistic vision with cutting-edge technology, I aim to develop unique educational experiences that spark curiosity and foster a love of learning. Through my work, I strive to demonstrate the incredible potential of AI in education and the arts.","sameAs":["https:\/\/www.linkedin.com\/in\/massimo-avvisati-7220312\/","https:\/\/x.com\/MassimoAvvisati"],"knowsAbout":["Javascript","Node.js","PHP","AI","Machine Learning","Web Development","Free Software"],"knowsLanguage":["English","Spanish","Italian"],"jobTitle":"Head of EdTech R&D","worksFor":"Codemotion spa","url":"https:\/\/www.codemotion.com\/magazine\/author\/massimo-avvisati\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-600x400.png","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-600x600.png","author_info":{"display_name":"Massimo Avvisati","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/massimo-avvisati\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png",1216,640,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-150x150.png",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-300x158.png",300,158,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-768x404.png",768,404,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-1024x539.png",1024,539,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png",1216,640,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd.png",1216,640,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-100x100.png",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-180x128.png",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-896x504.png",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-400x225.png",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-600x400.png",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/04\/50c0c4f3-8c6e-4f8b-8f16-9503e08c7ccd-600x600.png",600,600,true]},"uagb_author_info":{"display_name":"Massimo Avvisati","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/massimo-avvisati\/"},"uagb_comment_info":0,"uagb_excerpt":"Normalmente quando parliamo di integrare in una Web App un modello di Intelligenza Artificiale pensiamo immediatamente a server in Python o, ancora pi\u00f9 spesso, a API di piattaforme in cloud. In questa piccola guida vogliamo per\u00f2 esplorare un terreno poco battuto: la possibilit\u00e0 di includere modelli AI direttamente nelle Web App per usarle gi\u00e0 oggi&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/27408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/255"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=27408"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/27408\/revisions"}],"predecessor-version":[{"id":29070,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/27408\/revisions\/29070"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/27410"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=27408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=27408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=27408"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=27408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}