{"id":2607,"date":"2023-12-20T16:05:46","date_gmt":"2023-12-20T14:05:46","guid":{"rendered":"https:\/\/davidka.net\/ru\/?p=2607"},"modified":"2025-09-20T20:33:32","modified_gmt":"2025-09-20T18:33:32","slug":"personalizing-llms-prompts-fine-tuning-models-code-examples","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/personalizing-llms-prompts-fine-tuning-models-code-examples\/","title":{"rendered":"Personalizzazione di LLM: prompt, ottimizzazione dei modelli, esempi di codice."},"content":{"rendered":"\n<p class=\"has-neve-link-color-color has-text-color has-link-color has-medium-font-size wp-elements-3d3b2e3b4a82c2091761b077b3f8c09a wp-block-paragraph\">La personalizzazione dei LLM pu\u00f2 avvenire in diversi modi: dai <em>prompt<\/em> accuratamente progettati e dalla gestione del contesto fino al <em>fine-tuning<\/em> sui propri dataset. Il <em>fine-tuning<\/em> consente di consolidare stile, terminologia e formato delle risposte, migliorando anche la precisione nelle attivit\u00e0 specifiche di un dominio. Tuttavia, questo approccio ha dei limiti e richiede dati di alta qualit\u00e0 \u2014 altrimenti i risultati possono essere peggiori rispetto al modello base.<\/p>\n\n\n\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"2607\" data-theme=\"Neve - Davidka\">\n\t\t\t<div id=\"rtoc-mokuji-title\" class=\"rtoc_btn_none rtoc_left\">\n\t\t\t\n\t\t\t<span>In Questo Articolo<\/span>\n\t\t\t<\/div><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-1\">1. Come LLM &#8220;ricorda&#8221; e &#8220;si adatta&#8221;: L&#8217;illusione del contesto<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-2\">2. Perch\u00e9 e quando \u00e8 necessaria l&#8217;ottimizzazione (Fine-tuning) di un modello.<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-3\">3. Quando l&#8217;ottimizzazione non \u00e8 la soluzione migliore.<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-4\">4. Preparazione dei dati.<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-5\">5. Modelli e piattaforme<\/a><ul class=\"rtoc-mokuji mokuji_none level-3\"><li class=\"rtoc-item\"><a href=\"#rtoc-6\">5.1. OpenAI<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-7\">5.2. Anthropic<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-8\">5.3. Google (Gemini)<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ol><\/div><h3 id=\"rtoc-1\"  class=\"wp-block-heading\">1. Come LLM &#8220;ricorda&#8221; e &#8220;si adatta&#8221;: L&#8217;illusione del contesto<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di parlare di ottimizzazione, \u00e8 importante capire come LLM riesca a creare un senso di personalizzazione.<br>Questo \u00e8 importante per non affrettarsi a un&#8217;ottimizzazione costosa se il compito pu\u00f2 essere risolto con metodi pi\u00f9 semplici:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tramite la <strong>Finestra di contesto (Memoria a breve termine):<\/strong> All&#8217;interno di un singolo dialogo, si invia al modello non solo una nuova domanda, ma anche <strong>tutta o parte della corrispondenza precedente<\/strong>. Il modello elabora tutto questo testo come un unico &#8220;contesto&#8221;. \u00c8 grazie a questo che &#8220;ricorda&#8221; le osservazioni precedenti e continua il pensiero. La limitazione qui \u00e8 la lunghezza della finestra di contesto (numero di token).<\/li>\n\n\n\n<li>Composizione delle <strong>Istruzioni di sistema (System Prompt):<\/strong> \u00c8 possibile impostare il ruolo, il tono e le regole di comportamento del modello all&#8217;inizio di ogni dialogo. Ad esempio: &#8220;Sei un esperto di Python, rispondi brevemente.&#8221;<\/li>\n\n\n\n<li>Inclusione di diversi esempi del comportamento desiderato nella richiesta <strong>Apprendimento Few-Shot:<\/strong> (coppie input\/output) consente al modello di &#8220;imparare&#8221; questo pattern direttamente all&#8217;interno della richiesta corrente.<\/li>\n\n\n\n<li><strong>Gestione dello stato lato applicazione:<\/strong> Il modo pi\u00f9 potente. L&#8217;applicazione (che accede all&#8217;API) pu\u00f2 memorizzare le informazioni dell&#8217;utente (preferenze, cronologia, dati del profilo) e aggiungerle dinamicamente al prompt prima di inviarle al modello.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-2\"  class=\"wp-block-heading\">2. Perch\u00e9 e quando \u00e8 necessaria l&#8217;ottimizzazione (Fine-tuning) di un modello.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;ottimizzazione \u00e8 il processo di ulteriore addestramento di un LLM di base gi\u00e0 preparato sul proprio set di dati specifico. Ci\u00f2 consente al modello di:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Adattare stile e tono:<\/strong> Il modello parler\u00e0 &#8220;la tua lingua&#8221; \u2013 che si tratti di un linguaggio scientifico rigoroso, di marketing amichevole o del gergo di una comunit\u00e0 specifica.<\/li>\n\n\n\n<li><strong>Seguire istruzioni e formati specifici:<\/strong> Se hai bisogno di risposte in una struttura JSON strettamente definita, o sempre con un set specifico di campi.<\/li>\n\n\n\n<li><strong>Comprendere il linguaggio specifico del dominio:<\/strong> L&#8217;addestramento sulla tua documentazione interna o sui testi del settore aiuter\u00e0 il modello a gestire meglio la terminologia della tua nicchia.<\/li>\n\n\n\n<li><strong>Migliorare le prestazioni su compiti specifici:<\/strong> Per alcuni tipi di query (ad esempio, classificazione del sentiment, generazione di codice in un framework specifico), l&#8217;ottimizzazione pu\u00f2 fornire risposte pi\u00f9 accurate e pertinenti rispetto al modello di base.<\/li>\n\n\n\n<li><strong>Ridurre la lunghezza dei prompt:<\/strong> Se il modello &#8220;conosce&#8221; gi\u00e0 il comportamento desiderato tramite l&#8217;ottimizzazione, non \u00e8 necessario ricordarglielo ogni volta nel prompt, il che consente di risparmiare token e ridurre la latenza.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-3\"  class=\"wp-block-heading\">3. Quando l&#8217;ottimizzazione non \u00e8 la soluzione migliore.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;ottimizzazione \u00e8 uno strumento potente ma non universale. Non dovresti usarla se:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Il modello deve accedere a nuove conoscenze:<\/strong> L&#8217;ottimizzazione modifica i pesi del modello, ma non &#8220;carica&#8221; nuovi fatti in esso in tempo reale. Se il tuo compito \u00e8 rispondere a domande basate su una base di conoscenze in continua evoluzione (documenti aziendali, ultime notizie), \u00e8 meglio usare la <strong>Generazione Aumentata da Recupero (RAG)<\/strong>. Qui, il modello di base ottiene il contesto dal tuo database <em>durante l&#8217;esecuzione della query<\/em>.<\/li>\n\n\n\n<li><strong>Un compito semplice pu\u00f2 essere risolto con l&#8217;ingegneria dei prompt:<\/strong> Inizia sempre con l&#8217;ingegneria dei prompt pi\u00f9 efficace. Se il compito pu\u00f2 essere risolto con istruzioni semplici e pochi esempi, l&#8217;ottimizzazione \u00e8 ridondante e pi\u00f9 costosa.<\/li>\n\n\n\n<li><strong>Non hai abbastanza dati di alta qualit\u00e0:<\/strong> Dati scadenti = modello ottimizzato male.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-4\"  class=\"wp-block-heading\">4. Preparazione dei dati.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La qualit\u00e0 e la quantit\u00e0 dei tuoi dati sono di fondamentale importanza. Il modello impara dai tuoi esempi, quindi devono essere accurati, diversi e coerenti.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Formato:<\/strong> Molto spesso JSON Lines (<code class=\"\" data-line=\"\">.jsonl<\/code>) o CSV (<code class=\"\" data-line=\"\">.csv<\/code>).<\/li>\n\n\n\n<li><strong>Struttura dei dati:<\/strong> Dipende dal compito.\n<ul class=\"wp-block-list\">\n<li><strong>Ottimizzazione delle istruzioni (Instruction Tuning &#8211; Istruzione-Risposta):<\/strong> Adatto per compiti generalizzati come domande-risposte, riformulazione, riassunto.<br>json<br>{<br>         &#8220;input_text&#8221;: &#8220;Riformula la frase: &#8216;La tecnologia AI si sta sviluppando rapidamente.'&#8221;,<br>         &#8220;output_text&#8221;: &#8220;L&#8217;intelligenza artificiale sta dimostrando rapidi progressi.&#8221;<br>} {<br>         &#8220;input_text&#8221;: &#8220;Nomina la capitale della Francia.&#8221;,<br><code class=\"\" data-line=\"\">    <\/code> <code class=\"\" data-line=\"\">&quot;output_text&quot;: &quot;La capitale della Francia \u00e8 Parigi.&quot;<\/code><br>}<\/li>\n\n\n\n<li><strong>Ottimizzazione della chat (Chat Tuning &#8211; Chat):<\/strong> Ideale per addestrare il modello a condurre un dialogo in un ruolo o stile specifico.<br><code class=\"\" data-line=\"\">json <\/code><br><code class=\"\" data-line=\"\">{<\/code><br>         <code class=\"\" data-line=\"\">&quot;messages&quot;: [<\/code><br>                  <code class=\"\" data-line=\"\">{&quot;author&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Ciao! Cosa mi consigli per cena?&quot;}, <\/code><br>                  <code class=\"\" data-line=\"\">{&quot;author&quot;: &quot;model&quot;, &quot;content&quot;: &quot;Buonasera! Oggi \u00e8 un ottimo giorno per la pasta Carbonara, o, se preferisci qualcosa di leggero, un&#039;insalata Caesar.&quot;}<\/code><br>         <code class=\"\" data-line=\"\">]<\/code><br><code class=\"\" data-line=\"\">} <\/code><br><code class=\"\" data-line=\"\">{<\/code><br>         <code class=\"\" data-line=\"\">&quot;messages&quot;: [<\/code><br>                  <code class=\"\" data-line=\"\">{&quot;author&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Parlami delle nuove funzionalit\u00e0 di Python 3.12.&quot;}, <\/code><br>                  <code class=\"\" data-line=\"\">{&quot;author&quot;: &quot;model&quot;, &quot;content&quot;: &quot;In Python 3.12 sono state introdotte le f-string con indentazione, una nuova sintassi per i generici universali e una migliore gestione degli errori Unicode.&quot;}<\/code><br>         <code class=\"\" data-line=\"\">]<\/code><br><code class=\"\" data-line=\"\">}<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Quantit\u00e0:<\/strong> Minimo 100-200 esempi di alta qualit\u00e0, ma pi\u00f9 ce ne sono, meglio \u00e8 (migliaia per compiti seri).<\/li>\n\n\n\n<li><strong>Qualit\u00e0:<\/strong> Accuratezza, coerenza di stile, tono e formato in tutto il set di dati.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-5\"  class=\"wp-block-heading\">5. Modelli e piattaforme<\/h3>\n\n\n\n<h4 id=\"rtoc-6\"  class=\"wp-block-heading\">5.1. OpenAI<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">OpenAI fornisce un&#8217;API abbastanza semplice e intuitiva per l&#8217;ottimizzazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Processo:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Prepara i dati in formato JSONL, dove ogni riga \u00e8 un oggetto con un array di <code class=\"\" data-line=\"\">messages<\/code> (come nell&#8217;API Chat Completions).<\/li>\n\n\n\n<li>Carica il file di dati tramite API.<\/li>\n\n\n\n<li>Crea un lavoro di ottimizzazione, specificando il file caricato e il modello di base.<\/li>\n\n\n\n<li>Monitora i progressi.<\/li>\n\n\n\n<li>Usa il nuovo modello ottimizzato tramite il suo ID.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esempio di dati (file <code class=\"\" data-line=\"\">training_data.jsonl<\/code>):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n     &quot;messages&quot;: &#091;\n          {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;Sei un assistente amichevole per il supporto clienti di un&#039;azienda IT.&quot;}, \n          {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;La mia connessione internet non funziona.&quot;}, \n          {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;Oh, mi scuso per l&#039;inconveniente! Cerchiamo di capire. Come sei connesso a internet \u2013 tramite Wi-Fi o via cavo?&quot;}\n     ]\n}\n{\n     &quot;messages&quot;: &#091;\n          {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;Sei un assistente amichevole per il supporto                clienti di un&#039;azienda IT.&quot;}, \n          {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Come posso reimpostare la mia password?&quot;},\n          {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;Certo! Per reimpostare la tua password, vai alla pagina di accesso e clicca su &#039;Password dimenticata?&#039; sotto il campo di input. Quindi segui le istruzioni sullo schermo.&quot;}\n     ]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esempio di codice Python:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Installa in anticipo: <code class=\"\" data-line=\"\">pip install openai<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import openai\nfrom openai import OpenAI\nimport os\n\n# Imposta la tua chiave API OpenAI. Si consiglia di utilizzare una variabile d&#039;ambiente.\n# os.environ&#091;&quot;OPENAI_API_KEY&quot;] = &quot;sk-...&quot;\nclient = OpenAI()\n\n# 1. Caricamento del file di dati\ntry:\n    file_response = client.files.create(\n        file=open(&quot;training_data.jsonl&quot;, &quot;rb&quot;),\n        purpose=&quot;fine-tune&quot;\n    )\n    file_id = file_response.id\n    print(f&quot;File caricato con successo. ID file: {file_id}&quot;)\nexcept openai.APIStatusError as e:\n    print(f&quot;Errore di caricamento del file: {e.status_code} - {e.response}&quot;)\n    exit()\n\n# 2. Creazione del lavoro di ottimizzazione\ntry:\n    ft_job_response = client.fine_tuning.jobs.create(\n        training_file=file_id,\n        model=&quot;gpt-3.5-turbo&quot; # Puoi specificare una versione specifica, ad esempio, &quot;gpt-3.5-turbo-0125&quot;\n    )\n    job_id = ft_job_response.id\n    print(f&quot;Lavoro di ottimizzazione creato. ID lavoro: {job_id}&quot;)\n    print(&quot;Monitora lo stato del lavoro tramite API o in OpenAI Playground.&quot;)\nexcept openai.APIStatusError as e:\n    print(f&quot;Errore di creazione del lavoro: {e.status_code} - {e.response}&quot;)\n    exit()\n\n# Esempio di monitoraggio dello stato e ottenimento del nome del modello (da eseguire dopo la creazione del lavoro):\n# # job_id = &quot;ftjob-...&quot; # Sostituisci con l&#039;ID del tuo lavoro\n# # job_status = client.fine_tuning.jobs.retrieve(job_id)\n# # print(f&quot;Stato attuale del lavoro: {job_status.status}&quot;)\n# # if job_status.status == &quot;succeeded&quot;:\n# #     fine_tuned_model_name = job_status.fine_tuned_model\n# #     print(f&quot;Nome del modello ottimizzato: {fine_tuned_model_name}&quot;)\n\n# 3. Utilizzo del modello ottimizzato (dopo che \u00e8 pronto)\n# # Sostituisci con il nome reale del tuo modello, ottenuto dopo l&#039;ottimizzazione riuscita\n# # fine_tuned_model_name = &quot;ft:gpt-3.5-turbo-0125:my-org::abcd123&quot;\n\n# # if &#039;fine_tuned_model_name&#039; in locals() and fine_tuned_model_name:\n# #     try:\n# #         response = client.chat.completions.create(\n# #             model=fine_tuned_model_name,\n# #             messages=&#091;\n# #                 {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Ho un problema di accesso.&quot;}\n# #             ]\n# #         )\n# #         print(&quot;\\nRisposta del modello ottimizzato:&quot;)\n# #         print(response.choices&#091;0].message.content)\n# #     except openai.APIStatusError as e:\n# #         print(f&quot;Errore durante l&#039;utilizzo del modello: {e.status_code} - {e.response}&quot;)<\/code><\/pre>\n\n\n\n<h4 id=\"rtoc-7\"  class=\"wp-block-heading\">5.2. Anthropic<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Anthropic <strong>non fornisce un&#8217;API pubblica per l&#8217;ottimizzazione dei suoi modelli Claude 3 (Opus, Sonnet, Haiku) nello stesso senso di OpenAI o Google.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anthropic si concentra sulla creazione di modelli di base molto potenti che, a loro dire, funzionano in modo eccellente con l&#8217;ingegneria dei prompt avanzata e i pattern RAG, minimizzando la necessit\u00e0 di ottimizzazione nella maggior parte dei casi.<br>Per i grandi clienti aziendali o i partner, potrebbero esistere programmi per la creazione di modelli &#8220;personalizzati&#8221; o integrazioni specializzate, ma questa non \u00e8 una funzione di ottimizzazione disponibile pubblicamente tramite API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se stai lavorando con Claude 3, il tuo obiettivo principale dovrebbe essere:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ingegneria dei prompt di alta qualit\u00e0:<\/strong> Sperimenta con le istruzioni di sistema, gli esempi few-shot, la formattazione chiara delle richieste. Claude \u00e8 noto per la sua capacit\u00e0 di seguire rigorosamente le istruzioni, specialmente nei tag XML.<\/li>\n\n\n\n<li><strong>Sistemi RAG:<\/strong> Utilizza basi di conoscenza esterne per fornire al modello un contesto pertinente.<\/li>\n<\/ul>\n\n\n\n<h4 id=\"rtoc-8\"  class=\"wp-block-heading\">5.3. Google (Gemini)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Google sta sviluppando attivamente le capacit\u00e0 di ottimizzazione tramite la sua piattaforma <strong>Google Cloud Vertex AI<\/strong>.<br>Questa \u00e8 una piattaforma ML completa che fornisce strumenti per la preparazione dei dati, l&#8217;esecuzione di lavori di addestramento e la distribuzione dei modelli.<br>L&#8217;ottimizzazione \u00e8 disponibile per i modelli della famiglia Gemini.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Processo:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Prepara i dati (JSONL o CSV) in formato <code class=\"\" data-line=\"\">input_text<\/code>\/<code class=\"\" data-line=\"\">output_text<\/code> (per l&#8217;ottimizzazione delle istruzioni) o <code class=\"\" data-line=\"\">messages<\/code> (per l&#8217;ottimizzazione della chat).<\/li>\n\n\n\n<li>Carica i dati su Google Cloud Storage (GCS).<\/li>\n\n\n\n<li>Crea ed esegui un lavoro di ottimizzazione tramite la console Vertex AI o l&#8217;SDK.<\/li>\n\n\n\n<li>Distribuisci il modello ottimizzato su un Endpoint.<\/li>\n\n\n\n<li>Utilizza il modello ottimizzato tramite questo Endpoint.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esempio di dati (file <code class=\"\" data-line=\"\">gemini_tuning_data.jsonl<\/code>):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{&quot;input_text&quot;: &quot;Riassumi le idee principali di questo libro: &#039;Il libro parla del viaggio di un eroe che supera gli ostacoli e trova se stesso.&#039;&quot;, &quot;output_text&quot;: &quot;Il personaggio principale del libro intraprende un viaggio trasformativo, affrontando sfide e acquisendo la scoperta di s\u00e9.&quot;}\n{&quot;input_text&quot;: &quot;Spiega il principio di un reattore termonucleare in termini semplici.&quot;, &quot;output_text&quot;: &quot;Un reattore termonucleare tenta di riprodurre il processo che avviene sul Sole: la fusione di nuclei atomici leggeri a temperature molto elevate, rilasciando enormi quantit\u00e0 di energia.&quot;}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esempio di codice Python (richiede <code class=\"\" data-line=\"\">google-cloud-aiplatform<\/code>):<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Installa in anticipo: <code class=\"\" data-line=\"\">pip install google-cloud-aiplatform<\/code> e <code class=\"\" data-line=\"\">pip install google-cloud-storage<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import os\nfrom google.cloud import aiplatform\nfrom google.cloud import storage\n\n# --- Impostazioni ---\n# SOSTITUISCI con i tuoi valori:\nPROJECT_ID = &quot;your-gcp-project-id&quot;\nREGION = &quot;us-central1&quot;               # Scegli una regione che supporti Gemini e Vertex AI\nBUCKET_NAME = &quot;your-gcs-bucket-for-tuning&quot; # Nome del tuo bucket GCS (deve essere creato in anticipo)\nDATA_FILE_LOCAL_PATH = &quot;gemini_tuning_data.jsonl&quot;\nGCS_DATA_URI = f&quot;gs:\/\/{BUCKET_NAME}\/{DATA_FILE_LOCAL_PATH}&quot;\nTUNED_MODEL_DISPLAY_NAME = &quot;my-tuned-gemini-model&quot;\n# --- Fine delle impostazioni ---\n\n# Inizializzazione di Vertex AI\naiplatform.init(project=PROJECT_ID, location=REGION)\n\n# 1. Creazione del file di dati (se non esiste)\nwith open(DATA_FILE_LOCAL_PATH, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f:\n    f.write(&#039;{&quot;input_text&quot;: &quot;Riassumi le idee principali di questo libro: \\&#039;Il libro parla del viaggio di un eroe che supera gli ostacoli e trova se stesso.\\&#039;&quot;, &quot;output_text&quot;: &quot;Il personaggio principale del libro intraprende un viaggio trasformativo, affrontando sfide e acquisendo la scoperta di s\\u00E9.&quot;}\\n&#039;)\n    f.write(&#039;{&quot;input_text&quot;: &quot;Spiega il principio di un reattore termonucleare in termini semplici.&quot;, &quot;output_text&quot;: &quot;Un reattore termonucleare tenta di riprodurre il processo che avviene sul Sole: la fusione di nuclei atomici leggeri a temperature molto elevate, rilasciando enormi quantit\\u00E0 di energia.&quot;}\\n&#039;)\nprint(f&quot;File di dati &#039;{DATA_FILE_LOCAL_PATH}&#039; creato.&quot;)\n\n\n# 2. Caricamento dei dati su Google Cloud Storage\ndef upload_blob(bucket_name, source_file_name, destination_blob_name):\n    &quot;&quot;&quot;Carica un file in un bucket GCS.&quot;&quot;&quot;\n    storage_client = storage.Client(project=PROJECT_ID)\n    bucket = storage_client.bucket(bucket_name)\n    blob = bucket.blob(destination_blob_name)\n    blob.upload_from_filename(source_file_name)\n    print(f&quot;File &#039;{source_file_name}&#039; caricato su &#039;gs:\/\/{bucket_name}\/{destination_blob_name}&#039;.&quot;)\n\ntry:\n    upload_blob(BUCKET_NAME, DATA_FILE_LOCAL_PATH, DATA_FILE_LOCAL_PATH)\nexcept Exception as e:\n    print(f&quot;Errore durante il caricamento del file su GCS. Assicurati che il bucket esista e che tu abbia i permessi: {e}&quot;)\n    exit()\n\n# 3. Creazione ed esecuzione del lavoro di ottimizzazione\nprint(f&quot;\\nAvvio dell&#039;ottimizzazione del modello &#039;{TUNED_MODEL_DISPLAY_NAME}&#039;...&quot;)\ntry:\n    # `tune_model` avvia il lavoro e restituisce il modello ottimizzato al completamento\n    tuned_model = aiplatform.Model.tune_model(\n        model_display_name=TUNED_MODEL_DISPLAY_NAME,\n        source_model_name=&quot;gemini-1.0-pro-001&quot;, # Modello base Gemini Pro\n        training_data_path=GCS_DATA_URI,\n        tuning_method=&quot;SUPERVISED_TUNING&quot;,\n        train_steps=100, # Numero di passaggi di addestramento. Il valore ottimale dipende dalla dimensione dei dati.\n        # batch_size=16, # Pu\u00f2 essere specificato\n        # learning_rate_multiplier=1.0 # Pu\u00f2 essere specificato\n    )\n    print(f&quot;Modello &#039;{TUNED_MODEL_DISPLAY_NAME}&#039; ottimizzato con successo. ID modello: {tuned_model.name}&quot;)\n    print(&quot;Il processo di ottimizzazione potrebbe richiedere un tempo significativo.&quot;)\nexcept Exception as e:\n    print(f&quot;Errore di ottimizzazione. Controlla i log nella console Vertex AI: {e}&quot;)\n    exit()\n\n# 4. Distribuzione del modello ottimizzato (per l&#039;uso)\nprint(f&quot;\\nDistribuzione del modello ottimizzato &#039;{TUNED_MODEL_DISPLAY_NAME}&#039; all&#039;endpoint...&quot;)\ntry:\n    endpoint = tuned_model.deploy(\n        machine_type=&quot;n1-standard-4&quot;, # Tipo di macchina per l&#039;endpoint. Scegli quello appropriato.\n        min_replica_count=1,\n        max_replica_count=1\n    )\n    print(f&quot;Modello distribuito all&#039;endpoint: {endpoint.name}&quot;)\n    print(&quot;La distribuzione potrebbe richiedere anche diversi minuti.&quot;)\nexcept Exception as e:\n    print(f&quot;Errore durante la distribuzione del modello: {e}&quot;)\n    exit()\n\n# 5. Utilizzo del modello ottimizzato\nprint(&quot;\\nTest del modello ottimizzato...&quot;)\nprompt = &quot;Parlami delle tue capacit\u00e0 dopo l&#039;addestramento.&quot;\ninstances = &#091;{&quot;prompt&quot;: prompt}] # Per l&#039;ottimizzazione delle istruzioni. Se ottimizzazione della chat, allora {&quot;messages&quot;: &#091;...]}\n\ntry:\n    response = endpoint.predict(instances=instances)\n    print(&quot;\\nRisposta del modello ottimizzato:&quot;)\n    print(response.predictions&#091;0])\nexcept Exception as e:\n    print(f&quot;Errore durante l&#039;utilizzo del modello ottimizzato: {e}&quot;)\n\n# Dopo aver terminato, non dimenticare di eliminare l&#039;endpoint e il modello per evitare costi inutili:\n# # endpoint.delete()\n# # tuned_model.delete()<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>La personalizzazione dei LLM pu\u00f2 avvenire in diversi modi: dai *prompt* accuratamente progettati e dalla gestione del contesto fino al *fine-tuning* sui propri dataset. Il *fine-tuning* consente di consolidare stile, terminologia e formato delle risposte, migliorando anche la precisione nelle attivit\u00e0 specifiche di un dominio. Tuttavia, questo approccio ha dei limiti e richiede dati di alta qualit\u00e0 \u2014 altrimenti i risultati possono essere peggiori rispetto al modello base.<\/p>\n","protected":false},"author":1,"featured_media":2683,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[1],"tags":[308,169],"class_list":["post-2607","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-tag-artificial-intelligence","tag-169"],"acf":[],"_links":{"self":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/2607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/comments?post=2607"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/2607\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media\/2683"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=2607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=2607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=2607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}