Integrazione di componenti di intelligenza artificiale in Elasticsearch

L’integrazione di componenti di intelligenza artificiale in Elasticsearch è stata significativamente avanzata con l’introduzione del Elasticsearch Relevance Engine (ESRE). Questo motore combina algoritmi sofisticati di recupero e modelli di linguaggio di grandi dimensioni (LLM), come GPT-3 e GPT-4, fornendo agli sviluppatori un set completo di strumenti per creare applicazioni di ricerca avanzate. ESRE migliora la rilevanza delle ricerche attraverso diverse funzionalità:

1) Creare applicazioni di ricerca avanzate
2) Che cos’è ESRE e come viene utilizzato in Elasticsearch
3) Un caso concreto


Creare applicazioni di ricerca avanzate

Per creare applicazioni di ricerca avanzate tramite Elasticsearch sono a disposizione i seguenti tools:

    1. Ranking Avanzato e Indici Densi: Utilizza funzionalità avanzate di ranking come BM25f e la creazione, memorizzazione e ricerca di indici densi tramite il database vettoriale di Elastic​​.
    2. Elaborazione NLP e Integrazione con Modelli Esterni: Supporta un’ampia gamma di task di elaborazione del linguaggio naturale (NLP) e permette l’integrazione con modelli trasformativi di terze parti, come quelli di OpenAI, per riepiloghi intuitivi basati sui dati dell’utente​​.
    3. Rilevanza e Contestualizzazione: ESRE (Elasticsearch Relevance Engine) migliora la rilevanza della ricerca integrando dati da fonti private, generando e memorizzando vettori di embedding per recuperare contesto tramite ricerca semantica​​.
    4. Supporto alla Privacy e Sicurezza: Include il supporto per il controllo degli accessi basato su ruoli e attributi, assicurando che solo le persone autorizzate possano accedere a determinati dati​​.
    5. Facilità d’Uso e Applicabilità: ESRE è facilmente accessibile e utilizzabile con corpus di ricerca esistenti, senza la necessità di adattamenti o addestramenti specifici​​.
    6. Superamento delle Sfide ML: Affronta le sfide di costo, complessità e risorse richieste dal machine learning, fornendo agli sviluppatori strumenti immediatamente utilizzabili per migliorare la rilevanza della ricerca con contesto semantico​​.

Che cos’è ESRE e come viene utilizzato in Elasticsearch

ESRE, acronimo di Elasticsearch Relevance Engine, è una funzionalità avanzata di Elasticsearch che integra algoritmi sofisticati di recupero e grandi modelli di linguaggio (LLM) per creare applicazioni di ricerca AI altamente rilevanti. Ecco come funziona e come viene utilizzato in Elasticsearch:

Funzionalità di ESRE

  1. Algoritmi di Recupero Avanzati: ESRE include algoritmi sofisticati come BM25f, che è un componente critico nella ricerca ibrida, migliorando la rilevanza dei risultati di ricerca.
    Database Vettoriale: Utilizza un database vettoriale per creare, memorizzare e cercare embedding densi, che sono rappresentazioni numeriche di parole, frasi o documenti. Questi aiutano a comprendere i significati delle parole e le loro relazioni.
  2. Elaborazione del Linguaggio Naturale (NLP): ESRE supporta una vasta gamma di compiti NLP, consentendo agli sviluppatori di gestire e utilizzare i propri modelli trasformativi o di integrare modelli di terze parti come GPT-3 e GPT-4.
  3. Ricerca Potenziata da ML Senza Addestramento Specifico: Include il modello Learned Sparse Encoder di Elastic, che fornisce ricerca semantica ad alta rilevanza senza la necessità di addestramento o manutenzione specifici.
  4. Fusione del Ranking Reciproco (RRF): Combina facilmente recupero sparso e denso usando RRF, permettendo agli sviluppatori di ottimizzare la loro ricerca AI alle esigenze specifiche.
  5. Privacy e Sicurezza: Garantisce la privacy e la sicurezza dei dati, supportando controlli di accesso basati su ruoli e attributi.

Utilizzo in Elasticsearch

  1. Integrazione con Dati Proprietari: ESRE rende semplice l’integrazione di dati da fonti private, migliorando la rilevanza e contestualizzazione dei risultati di ricerca.
  2. Ricerca Semantica: I vettori di embedding migliorano il modello trasformativo, consentendo una ricerca semantica più efficace e specifica.
  3. Supporto alla Personalizzazione: Gli sviluppatori possono integrare i propri modelli trasformativi o utilizzare modelli di terze parti per personalizzare ulteriormente la ricerca.
  4. Ricerca Ibrida: L’uso di RRF permette una ricerca ibrida, combinando ricerca basata su parole chiave e semantica.
  5. Risultati di Ricerca Contestualizzati: ESRE consente di fornire risultati di ricerca contestualizzati, comprendendo meglio l’intenzione dell’utente e fornendo risposte specifiche.

In sintesi, ESRE è una potente aggiunta a Elasticsearch, offrendo agli sviluppatori gli strumenti per creare esperienze di ricerca avanzate, pertinenti e personalizzate, utilizzando il potere dell’AI e del NLP

Un caso concreto

Ecco un esempio concreto che illustra come Elasticsearch e il suo Relevance Engine (ESRE) possono essere utilizzati per migliorare la ricerca di documenti in un contesto legislativo:

Scenario

Immagina di avere un sito web specializzato in documentazione legislativa. Gli utenti di questo sito, principalmente professionisti non specializzati in legge, cercano spesso informazioni specifiche su leggi, regolamenti o casi giuridici.

Obiettivo

Vuoi fornire agli utenti un modo per fare domande in linguaggio naturale e ricevere risposte precise e pertinenti basate sui documenti legislativi nel tuo database.

Implementazione con Elasticsearch e ESRE

  1. Caricamento dei Documenti: Carichi tutti i documenti legislativi nel tuo sistema Elasticsearch. Questo include leggi, regolamenti, annotazioni, e forse anche casi giuridici rilevanti.
  2. Utilizzo del Database Vettoriale: Utilizzi il database vettoriale di ESRE per analizzare e memorizzare questi documenti sotto forma di embedding densi. Questo processo trasforma i testi in rappresentazioni numeriche che catturano il significato e i contesti delle parole.
  3. Integrazione con Modelli di LLM: Integri modelli di linguaggio di grandi dimensioni come GPT-3 o GPT-4 per elaborare le query in linguaggio naturale degli utenti. Questi modelli sono addestrati per comprendere e generare testi umani, il che li rende ideali per interpretare le domande degli utenti e per cercare risposte pertinenti.
  4. Ricerca Semantica: Quando un utente fa una domanda, il sistema utilizza sia la ricerca semantica (basata sugli embedding densi) sia la ricerca basata su parole chiave per trovare i documenti più rilevanti. Questo approccio ibrido assicura che la ricerca non si basi solo sulle parole chiave, ma anche sul contesto e sul significato dietro la domanda.
  5. Presentazione dei Risultati: I documenti ritenuti più pertinenti vengono poi presentati all’utente. Grazie all’integrazione con LLM, il sistema può anche generare un breve riepilogo o una spiegazione, rendendo i risultati più accessibili per gli utenti non specializzati.

Vantaggi

  1. Migliore Comprensione delle Query: Grazie ai modelli LLM, il sistema comprende meglio le query in linguaggio naturale, anche se non sono formulate con termini tecnici precisi.
  2. Risultati Più Rilevanti: L’uso di embedding densi e ricerca semantica assicura che i risultati siano rilevanti non solo a livello di parole chiave, ma anche a livello di significato.
  3. Esperienza Utente Migliorata: Gli utenti ottengono risposte più precise e contestualizzate, migliorando la loro esperienza sul sito.

Questo esempio mostra come Elasticsearch e ESRE possono essere utilizzati per trasformare un sistema di ricerca documentale in uno strumento potente e intuitivo, particolarmente utile in campi complessi come quello legislativo.

Ovviamente, maggiori dettagli su tutto questo li potrete trovare sul sito ufficiale di Elastic.

Strategie per distribuire automaticamente gli aggiornamenti verso installazioni on-premise da repository Git

Nell’era del cloud e delle soluzioni SaaS, molte software houses si trovano a gestire applicazioni distribuite on-premise, ovvero direttamente sulle infrastrutture dei propri clienti. Una delle sfide principali di questo approccio riguarda la gestione degli aggiornamenti: come garantire che ogni installazione rimanga sempre aggiornata, in sicurezza e senza richiedere un intervento manuale ad ogni release? Soprattutto quando il codice sorgente è ospitato su piattaforme basate su Git, la necessità di un sistema efficiente e centralizzato diventa fondamentale. Nelle prossime righe, esploreremo alcune soluzioni pratiche per affrontare questa sfida e garantire un flusso continuo di aggiornamenti alle vostre applicazioni on-premise.

1) L’Updater Centralizzato
2) Containerizzazione con Docker
3) Strumenti di Configurazione e Automazione
3) Webhooks
4) Sicurezza


L’Updater Centralizzato: Una Visione Generale

Nell’ambito della moderna gestione delle applicazioni, l’idea di disporre di un sistema di aggiornamento automatico è ormai divenuta quasi imprescindibile. Al centro di questa dinamica troviamo l’Updater Centralizzato, una componente strategica che potrebbe semplificare enormemente la vita degli amministratori IT.

Funzionamento dell’Updater

La proposta è di sviluppare un updater, che può manifestarsi sia come script leggero che come applicazione completa, progettato per operare direttamente sulle macchine dei clienti. La sua funzione primaria? Controllare a intervalli regolari la presenza di nuove versioni o aggiornamenti su un server centrale o su una fonte che si ritiene affidabile.

Riconoscimento e Implementazione degli Aggiornamenti

Nel momento in cui questo sistema identifica una nuova versione, entra subito in azione. L’updater si incarica non solo di scaricare il nuovo pacchetto, ma anche di installarlo, assicurando così che l’applicazione o il sistema sia sempre all’avanguardia e aggiornato alle ultime novità.

Automatizzazione del Processo

Una delle bellezze dell’Updater Centralizzato risiede nella sua capacità di operare in maniera quasi autonoma. Questo processo di verifica e aggiornamento può essere infatti automatizzato attraverso diversi metodi, quali cron jobs o servizi analoghi, modulando la sua operatività in base al sistema operativo su cui è in esecuzione. In questo modo, le vostre macchine clienti ricevono gli aggiornamenti necessari in tempo reale, senza richiedere interventi manuali continui.

La Scelta del Linguaggio di Programmazione

La decisione su quale linguaggio di programmazione utilizzare per creare un updater centralizzato dipende da una serie di considerazioni. In primo luogo, è essenziale considerare l’ambiente target. Se, ad esempio, le macchine dei vostri clienti operano principalmente su Windows, potrebbe essere conveniente optare per un linguaggio come C# con .NET. D’altro canto, se si punta a sistemi UNIX-like come Linux o macOS, Python o Bash potrebbero risultare le scelte più idonee. Tuttavia, se il vostro obiettivo è di sviluppare una soluzione veramente cross-platform, Java o Node.js sono alternative valide.

Inoltre, la complessità dell’operazione di aggiornamento è un altro fattore critico. Per operazioni semplici, come il download e la sostituzione di file, uno script potrebbe essere perfettamente adeguato. Tuttavia, per operazioni più intricate, come aggiornamenti di database o modifiche a file di configurazione, una soluzione basata su un’applicazione completa potrebbe essere più appropriata.

Infine, non dimentichiamo la sicurezza. Se si ritiene necessario cifrare l’aggiornamento o fornire una firma digitale per garantire l’integrità e l’autenticità, alcuni linguaggi offrono librerie specializzate che facilitano questo processo.

L’Architettura di un Updater Centralizzato

Il cuore del sistema è rappresentato dal server centrale. Questa componente ha il compito di ospitare tutte le informazioni essenziali relative alla versione corrente dell’applicazione, che include dettagli come il numero di versione, un checksum e l’URL per il download. Oltre a ciò, il server fornisce il pacchetto di aggiornamento, come un file compresso, pronto per il download. Una caratteristica avanzata potrebbe anche essere l’integrazione di un meccanismo di firma digitale, al fine di garantire l’integrità e l’autenticità del pacchetto fornito.

Parallelamente, abbiamo l’Updater. Questo strumento è progettato per essere eseguito con una certa regolarità sulle macchine client, verificando costantemente la presenza di aggiornamenti sul server centrale. Una volta identificato un nuovo aggiornamento, l’Updater si occupa di scaricare, verificare ed applicare l’aggiornamento, seguendo una serie di operazioni che possono variare dalla semplice sostituzione di file, fino all’esecuzione di script più complessi.

Un’ulteriore funzionalità, che potrebbe rivelarsi preziosa in determinati contesti, è il sistema di notifiche. Attraverso questo, l’Updater potrebbe informare gli amministratori di sistema o i responsabili IT riguardo l’esito delle operazioni di aggiornamento, segnalando sia i successi che gli eventuali problemi.

Considerazioni sulla Sicurezza

È fondamentale sottolineare che, se da un lato un updater centralizzato può semplificare significativamente il processo di aggiornamento, dall’altro può introdurre nuovi rischi. Un attacco al server centrale potrebbe, in teoria, permettere la distribuzione di software dannoso a tutti i vostri clienti. Pertanto, è di cruciale importanza assicurarsi che siano implementati adeguati controlli di sicurezza.

Containerizzazione con Docker: Un Nuovo Orizzonte per Gli Aggiornamenti

L’avvento della containerizzazione ha introdotto una rivoluzione nel modo in cui le applicazioni vengono distribuite e gestite. Docker, in particolare, ha aperto nuove opportunità per garantire che le applicazioni siano sempre all’avanguardia.

Sfruttare la Potenza dei Container

La proposta è quella di utilizzare Docker per “containerizzare” la vostra applicazione, a patto che i clienti lo supportino. La natura isolata dei container assicura che ogni implementazione dell’applicazione sia consistente e priva di interferenze da fattori esterni, rendendo il processo di aggiornamento fluido e privo di sorprese.

Gestione degli Aggiornamenti tramite Immagini

Quando si parla di aggiornamenti in un contesto Docker, si tratta essenzialmente di creare una nuova immagine Docker. Questa nuova immagine incarna la versione aggiornata dell’applicazione. Una volta creata, può essere facilmente distribuita ai clienti, che possono sostituire l’immagine precedente con la nuova, garantendo un aggiornamento senza soluzione di continuità.

Automatizzazione con Strumenti Specializzati

Ma cosa succede se desideriamo che questo processo di rilevamento e aggiornamento avvenga automaticamente? Ecco dove intervengono strumenti come Watchtower. Questi strumenti sono progettati per tenere d’occhio registri come Docker Hub, rilevando automaticamente la presenza di nuove immagini. Una volta identificata una nuova versione, questi strumenti si occupano di aggiornare i container in esecuzione, rendendo l’intero processo altamente automatizzato e riducendo al minimo l’intervento manuale.

Strumenti di Configurazione e Automazione: Garantire la Consistenza in Ogni Installazione

In un mondo sempre più complesso e interconnesso, garantire che le applicazioni siano consistenti e aggiornate attraverso molteplici installazioni può rappresentare una vera sfida. Tuttavia, la risposta a tale sfida potrebbe risiedere negli strumenti di configurazione e automazione che sono emersi negli ultimi anni.

Un Mondo di Strumenti a Vostra Disposizione

Parlando di automazione e gestione delle configurazioni, non possiamo non menzionare giganti del settore come Ansible, Puppet e Chef. Questi strumenti sono stati progettati con un obiettivo chiaro in mente: semplificare e automatizzare la gestione e la configurazione di sistemi su larga scala.

Distribuzione Automatica e Senza Intoppi

La magia di questi strumenti risiede nella loro capacità di definire configurazioni “desiderate” e di garantire che le macchine target rispettino tali configurazioni. Questo significa che, quando è il momento di distribuire un aggiornamento, strumenti come Ansible possono assicurarsi che ogni macchina riceva l’aggiornamento in modo appropriato e uniforme. Non solo ciò riduce gli errori umani, ma assicura anche che ogni installazione sia esattamente come desiderato, indipendentemente dal numero di macchine coinvolte.

Una Soluzione Scalabile per Ogni Esigenza

Quindi, se la vostra organizzazione sta cercando un modo per distribuire aggiornamenti in maniera efficiente e scalabile, gli strumenti di configurazione e automazione potrebbero rappresentare la soluzione ideale. Essi offrono un controllo granulare, riducono la necessità di interventi manuali e garantiscono una distribuzione omogenea su tutti i fronti.

Webhooks: La Sinergia tra l’Applicazione Web e il Sistema di Controllo Versione

Nell’era moderna dello sviluppo software, la rapidità e l’efficienza nella distribuzione degli aggiornamenti sono diventate essenziali. Una delle strategie emergenti che abilita tale rapidità è l’uso di webhooks, specialmente quando l’applicazione ha una componente web o un’API.

L’Integrazione con GitHub e Altri Sistemi di Controllo Versione

Immaginate di avere un’applicazione il cui codice sorgente è ospitato su GitHub o su qualsiasi altro sistema di controllo versione. Ogni volta che uno sviluppatore effettua un commit, si verifica una modifica. Ora, invece di controllare manualmente la presenza di nuove modifiche, possiamo automatizzare questo processo. Qui entrano in gioco i webhooks. Attraverso l’utilizzo dei webhooks di GitHub, è possibile ricevere notifiche in tempo reale ogni volta che si verifica un cambiamento.

Il Ponte tra il Commit e l’Aggiornamento Cliente

Ma come si traduce tutto ciò in un aggiornamento per il cliente finale? Una volta che il sistema centrale riceve la notifica di un nuovo commit, può intraprendere diverse azioni. Può semplicemente informare gli amministratori o gli utenti finali della presenza di un aggiornamento. In scenari più avanzati, potrebbe anche iniziare automaticamente il processo di distribuzione, garantendo che le installazioni dei clienti vengano aggiornate con la versione più recente.

Massimizzare l’Efficienza con l’Automazione

In sintesi, i webhooks rappresentano un potente strumento di automazione. Consentono alle organizzazioni di reagire rapidamente ai cambiamenti, garantendo che gli aggiornamenti vengano distribuiti in modo tempestivo e coerente. In un mondo in cui ogni minuto conta, l’automazione offerta dai webhooks può fare la differenza tra rimanere indietro o stare al passo con le esigenze degli utenti.

Sicurezza: Un Elemento Fondamentale nell’Aggiornamento delle Applicazioni

In un mondo sempre più connesso, la sicurezza delle informazioni è diventata una priorità. Quando si tratta di aggiornare applicazioni, la sicurezza non dovrebbe essere mai trascurata, ma piuttosto considerata come un pilastro fondamentale del processo.

La Firma Digitale: Una Garanzia di Autenticità

Uno degli aspetti cruciali nell’assicurarsi che gli aggiornamenti siano sicuri è l’uso della firma digitale. Gli aggiornamenti delle applicazioni possono contenere nuove funzionalità, correzioni di bug o miglioramenti delle prestazioni. Tuttavia, se un malintenzionato dovesse intervenire, potrebbe anche inserire codice dannoso. Per evitare ciò, gli aggiornamenti dovrebbero essere firmati digitalmente. Questo garantisce che l’aggiornamento provenga effettivamente dalla fonte legittima e non sia stato alterato durante il trasferimento.

Trasferimenti Sicuri: La Necessità della Cifratura

Un altro aspetto da non sottovalutare è il mezzo attraverso il quale gli aggiornamenti vengono distribuiti. Evitare l’uso di connessioni non cifrate è essenziale. Trasferire aggiornamenti attraverso connessioni non protette espone l’aggiornamento al rischio di intercettazioni o manipolazioni. Utilizzando connessioni cifrate, si assicura che l’aggiornamento raggiunga la destinazione finale senza alterazioni indesiderate.

In Conclusione

L’aggiornamento delle applicazioni è un processo che va oltre la mera distribuzione di nuove versioni. Richiede un’attenta considerazione della sicurezza, garantendo che ogni passo, dalla creazione dell’aggiornamento alla sua distribuzione, sia eseguito con la massima attenzione alla protezione delle informazioni. In un contesto in cui le minacce informatiche sono sempre in agguato, la sicurezza non è solo una best practice, ma una necessità.

Conclusione sull’Aggiornamento delle Applicazioni On-Premise

La gestione degli aggiornamenti delle applicazioni on-premise può rappresentare una sfida complessa. Le strategie che abbiamo analizzato offrono diverse soluzioni: dall’uso di un updater centralizzato, che offre un controllo diretto sul processo, alla containerizzazione con Docker, che sfrutta le potenzialità dell’isolamento e della portabilità. Gli strumenti di configurazione e automazione, come Ansible e Puppet, permettono di distribuire aggiornamenti su larga scala, mentre i webhooks offrono una soluzione reattiva basata sugli eventi di commit nel sistema di version control.

Un elemento cruciale da considerare in ogni strategia è la sicurezza. Assicurarsi che gli aggiornamenti siano firmati digitalmente, e che le connessioni siano cifrate, è fondamentale per proteggere sia l’applicazione che i dati dei clienti.

In sintesi, l’aggiornamento delle applicazioni on-premise richiede una pianificazione attenta e l’adozione delle giuste tecnologie, per garantire efficienza e sicurezza in ogni fase del processo.

MySolution.it

MySolutions è un un quotidiano on-line riguarda il mondo dell’imprenditoria analizzato dal lato fiscale. I membri della redazione di MySolution , che sono tutti esperti di fiscalità ciascuno secondo la sua specializzazione, analizzano e pubblicano quotidianamente centinaia di articoli, documenti e libri riguardanti la fiscalità.

Avevamo pubblicato dei dettagli sulla teconologia con cui il sistema di ricerca fosse stato riscritto, ma  abbiamo preferito in seguito ritirare le informazioni precedentemente diffuse.

Questa pagine resta per mantenere efficiente la SEO di questo sito.

Vi consigliamo di leggere quancuno dei nuovi articoli che abbiamo pubblicato:

Vendiamolibri.it

Il marchio vendiamo libri rappresenta un network di siti di vendita libri e-commerce. In questo network vengono proposti alla vendita i libri specifici di ogni settore rappresentato dal sito come per esempio i libri scolastici, i libri universitari, i libri italiani in vendita all’estero più un sito generalista dove ogni testo può essere ritrovato.


Il catalogo completo è rappresentato da circa tre milioni di items che vengono desunti da diverse Fonti ciascuna di esse di diverso formato e con diversi tempi di aggiornamento.

Tali items vengono distribuiti al network tramite la selezione del catalogo completo degli elementi interessati e l’inserimento in appositi database dove gli e-commerce possono effettuare le loro interrogazioni con maggiore precisione e velocità.

STACK

Ci è stato assegnato Woocommerce come motore di e-commerce. Abbiamo scelto di lavorare con un database esterno non SQL per quel che riguarda il rifornimento dei dati ai siti mentre il database unico dove convergono tutti i dati sui libri a disposizione per la vendita è un database MySql.

La piattaforma su cui tutto il processo di sincronizzazione funziona è Linux ubuntu 22.4, le varie procedure sono scritte in Php o python ed eseguite da cron.

IL COLLETTORE

Esiste una terza parte da noi sviluppata che fornisce al network dei siti tutta una serie di servizi comuni, a partire dalla funzione di identity provider per tutti gli elementi del network, alla gestione centralizzata dei programmi di fidelizzazione e gamification, al centralizzazione dei processi di acquisto dei libri e dell’integrazione con il magazzino dello spedizioniere.

Come implementare la ricerca full-text in un progetto Laravel

Al giorno d’oggi, l’implementazione della ricerca full-text è una delle parti più importanti dello sviluppo di applicazioni. Nelle applicazioni che fanno molto affidamento sulla funzionalità di ricerca, come servizi musicali o negozi online, la configurazione e la personalizzazione della classificazione delle risposte è vitale. Per capire meglio perché è necessario implementare una soluzione del genere, consideriamo i problemi in sua assenza. Il framework PHP Laravel, nella sua magnifica completezza offre per la ricerca uno strumento eccezionale.

Miglioramento della funzionalità di ricerca

Spesso gli sviluppatori hanno il compito di migliorare la ricerca in un’applicazione e, in molti casi, viene dedicato molto tempo a mettere insieme una serie chiara di perfezionamenti per il progetto.

Le attività comuni per migliorare la ricerca potrebbero includere quanto segue:

  • Accelerare le prestazioni di ricerca
  • Aggiungere tolleranza agli errori
  • Aggiungere la possibilità di cercare oltre il nome dell’articolo
  • Aggiungere la possibilità di cercare per parole non necessariamente nello stesso ordine
  • Aggiungere la possibilità di cercare altre forme di parole da una query
  • Aggiungere la possibilità di gestire regole di ricerca per la stessa parola con valori diversi

Criteri di valutazione

I criteri principali per valutare le prestazioni della ricerca possono essere definiti come velocità di risposta, completezza e accuratezza. Mentre i tassi di risposta possono essere facilmente misurati e valutati, gli altri due sono un po’ più difficili da calcolare.

La completezza della ricerca è il risultato della divisione del numero di elementi restituiti per il numero di elementi corrispondenti. Quando si risolve un problema del primo tipo, con l’esclusione degli articoli corrispondenti, spesso viene risolto anche il problema di una query errata con un errore o un errore di battitura.

La precisione della ricerca è il risultato della divisione del numero di elementi corrispondenti nella risposta per il numero di elementi nella risposta. Quegli elementi che sono stati inclusi nella risposta, ma che non avrebbero dovuto figurare, sono chiamati errori del secondo tipo.

Di conseguenza, abbiamo bisogno della risposta più rapida, con le più alte percentuali di completezza e accuratezza della ricerca. L’equilibrio tra questi elementi è unico per ogni progetto. Proviamo a considerare le possibili soluzioni a questo problema senza implementare la ricerca full-text.

Tentativo di soluzione tramite SQL LIKE

La soluzione più semplice potrebbe essere l’uso di LIKE in SQL.Tuttavia, questa non è la soluzione ottimale e se i record nella tabella dei post sono più di 1000, anche considerando che gli indici siano correttamente impostati, le query verranno comunque elaborate sull’orlo del timeout.

Inoltre, questo tipo di query è appropriato esclusivamente per affrontare un compito specifico, in cui tutti i campi vengono utilizzati nella ricerca. Tuttavia, altri compiti, in particolare riorganizzare l’ordine delle parole all’interno della query, dare priorità agli elementi e migliorare la velocità di ricerca della query, rimangono in gran parte irrisolti.

Ricerca full-text in PostgreSQL/MySQL

La seconda soluzione con il set di strumenti esistente nell’applicazione può consistere nell’utilizzare le funzionalità di ricerca full-text di PostgreSQL e MySQL. In questo caso, la query avrà la seguente forma: SELECT … MATCH (campo) CONTRO (‘parola’).

La decisione di utilizzare SQL ci garantisce il 100% di precisione e completezza della ricerca, ma presenta anche numerosi svantaggi. Tra questi ci sono la necessità di una costante personalizzazione del database e le limitazioni sulla tipologia dei campi e la mancanza di classificazione, nonché il costo finale di tale soluzione in termini di risorse macchina che producono oltretutto un’insostenibile lentezza nell’esecuzione della query.

Laravel Scout

Per risolvere tutti i problemi descritti sino ad ora esistono servizi di terze parti che producono rapidamente ricerche full-text e risolvono problemi con la tokenizzazione e l’analisi morfologica. Laravel Scout ti consente di lavorare con molti di questi servizi e fornisce un’interfaccia unificata per lavorare con la ricerca, oltre a collegare la ricerca di entità con i modelli Laravel.

Di seguito è riportato un elenco di servizi che funzionano con la ricerca full-text di Laravel Scout

 

Il principio di lavorare con il full-text in Laravel non differisce molto a seconda del driver. Facendo riferimento ad Algolia, Laravel Scout semplifica l’aggiunta di dati all’indice Algolia e rende altrettanto facile recuperarli effettuando la ricerca in molti campi. Naturalmente, quando si sceglie un fornitore, il progetto acquisirà una dipendenza che deve essere tenuta presente. Laravel Scout contribuirà a ridurre la dipendenza, grazie alle sue interfacce.

Ottimizzazione delle Prestazioni in Flutter: 6 Trucchi per un’App Più Veloce

Nell’era digitale odierna, le applicazioni mobili hanno rivoluzionato il modo in cui viviamo la nostra vita. Dal ordinare cibo al prenotare un taxi, dalla gestione delle finanze all’accesso alle cure sanitarie – c’è un’app per quasi tutto. Man mano che sempre più imprese e imprenditori si rendono conto del potenziale delle applicazioni mobili, cresce l’interesse nello sviluppo di un Prodotto Minimo Viabile (MVP). Un MVP è una versione semplificata di un’applicazione sviluppata con abbastanza funzionalità per soddisfare gli early adopters e fornire feedback per lo sviluppo futuro del prodotto.

Flutter di Google è emerso come un framework popolare per lo sviluppo di MVP. Flutter è un kit di sviluppo software UI open-source che permette agli sviluppatori di costruire applicazioni compilate in modo nativo per mobile, web e desktop da un unico codice sorgente. Ma come si garantisce il successo nello sviluppo di un MVP utilizzando Flutter? Come agenzia leader specializzata nello sviluppo di app Flutter, abbiamo visto quali sono le migliori pratiche di sviluppo app con Flutter.

Queste pratiche oltre ad aumentare l’efficienza della tua app sono consigliate per l’ottimizzazione del codice in ottica di aderenza agli standard della Green Software Foundation.

1) Esegui in modalità profilo su un dispositivo reale
2) Utilizza il performance overlay e altri strumenti
3) Minimizza le operazioni costose
4) Utilizza il lazy loading e la paginazione
5) Usa il tree shaking per il tuo codice
6) Usa il caricamento differito per il tuo codice


1 Esegui in modalità profilo su un dispositivo reale

Il primo trucco per l’ottimizzazione delle prestazioni in Flutter è eseguire la tua app in modalità profilo su un dispositivo reale. La modalità profilo è una modalità speciale che esegue la tua app con ottimizzazioni simili alla modalità di rilascio, ma consente anche alcune strumenti di misurazione delle prestazioni. La modalità profilo ti aiuta a identificare potenziali problemi di prestazione e a misurare l’impatto delle tue ottimizzazioni.

Per eseguire la tua app in modalità profilo, utilizza il comando flutter run –profile o seleziona l’opzione profilo nel tuo IDE. Puoi anche utilizzare il comando flutter build –profile per creare una compilazione profilo per la tua app.

Eseguire la tua app su un dispositivo reale è importante perché i simulatori e gli emulatori non utilizzano lo stesso hardware dei dispositivi reali, il che porta a differenze nelle loro prestazioni. Rispetto ai dispositivi reali, alcune operazioni del simulatore sono più veloci, mentre altre sono più lente. Inoltre, la modalità di debug attiva controlli aggiuntivi (come gli assert) che non vengono eseguiti nelle compilazioni di profilo o rilascio, e questi controlli possono essere onerosi.

Dovresti considerare di controllare le prestazioni sul dispositivo più lento che i tuoi utenti potrebbero ragionevolmente utilizzare. In questo modo, puoi garantire che la tua app funzioni senza problemi su tutti i dispositivi.

2 Utilizza il performance overlay e altri strumenti

Il secondo trucco per l’ottimizzazione delle prestazioni in Flutter è utilizzare la sovrapposizione delle prestazioni (performance overlay) e altri strumenti per diagnosticare problemi di prestazione. La sovrapposizione delle prestazioni è un widget che mostra due grafici sopra l’interfaccia utente della tua app. I grafici mostrano quanto tempo ogni frame impiega per essere renderizzato sul thread dell’interfaccia utente (grafico superiore) e sul thread raster (grafico inferiore). Il thread raster era precedentemente noto come thread GPU.

Per attivare la sovrapposizione delle prestazioni, utilizza il comando flutter run –profile –show-performance-overlay o premi P mentre esegui la tua app in modalità profilo. Puoi anche attivarlo programmaticamente utilizzando il widget PerformanceOverlay o dalla riga di comando usando il parametro showPerformanceOverlay.

La sovrapposizione delle prestazioni ti aiuta a identificare frame scattosi mostrando picchi nei grafici. Idealmente, ogni frame dovrebbe impiegare meno di 16 ms per essere renderizzato per una prestazione di 60 fps. Se un frame impiega più di 16 ms, significa che non ha rispettato la scadenza e ha causato uno scatto.

3 Minimizza le operazioni costose

Il terzo Hack per l’ottimizzazione delle prestazioni di Flutter consiste nel ridurre al minimo le operazioni costose nel codice. Le operazioni costose sono quelle che consumano molte risorse, come CPU, memoria o rete. Alcuni esempi di operazioni costose sono:

Layout e rendering: layout e rendering sono i processi di calcolo delle dimensioni e della posizione di ciascun widget sullo schermo e di disegno sul display. Il layout e il rendering possono essere costosi se disponi di widget complessi o nidificati, widget grandi o dinamici o widget che cambiano frequentemente. Per ottimizzare il layout e il rendering, dovresti utilizzare widget semplici e piatti, evitare ricostruzioni non necessarie, memorizzare nella cache o riutilizzare i widget ed evitare livelli fuori schermo.

Animazione: l’animazione è il processo di modifica dell’aspetto o della posizione di un widget nel tempo. L’animazione può essere costosa se le animazioni sono troppe o troppo complesse oppure se si utilizzano tecniche di animazione non ottimizzate. Per ottimizzare l’animazione, dovresti utilizzare widget di animazione integrati, evitare di animare widget grandi o costosi, utilizzare l’opacità e il ritaglio con parsimonia e utilizzare il pattern TransitionBuilder per evitare di ricostruire i discendenti.

Caricamento delle immagini: il caricamento delle immagini è il processo di recupero e decodifica dei file di immagine dalla rete o dalla memoria del dispositivo. Il caricamento delle immagini può essere costoso se hai troppe immagini o troppo grandi o se non le memorizzi nella cache o non le ridimensioni correttamente. Per ottimizzare il caricamento delle immagini, è necessario utilizzare formati di immagine compressi, memorizzare nella cache le immagini in memoria o su disco, ridimensionare le immagini per adattarle alle dimensioni del display e utilizzare segnaposto o precaching per migliorare le prestazioni percepite.

Operazioni intrinseche: le operazioni intrinseche sono quelle che dipendono dalla dimensione intrinseca di un widget, come la sua larghezza o altezza naturale. Le operazioni intrinseche possono essere costose perché richiedono un passaggio di layout aggiuntivo per calcolare la dimensione del widget prima di renderizzarlo. Alcuni esempi di operazioni intrinseche utilizzano widget IntrinsicWidth o IntrinsicHeight, utilizzando widget Riga o Colonna con MainAxisSize.min o utilizzando widget di testo con softWrap: true. Per ottimizzare le operazioni intrinseche, dovresti evitarle quando possibile, utilizzare dimensioni fisse anziché dimensioni intrinseche o utilizzare widget alternativi che non richiedono operazioni intrinseche.

4 Utilizza il lazy loading e la paginazione

Il quarto Hack per l’ottimizzazione delle prestazioni di Flutter consiste nell’utilizzare il caricamento lento e l’impaginazione per i tuoi dati. Il caricamento lento è una tecnica che carica i dati solo quando è necessario, invece di caricarli tutti in una volta. La paginazione è una tecnica che divide i dati in blocchi o pagine più piccoli e li carica uno per uno mentre l’utente scorre.

Il caricamento lento e l’impaginazione possono migliorare le prestazioni della tua app riducendo la quantità di dati che devono essere recuperati dalla rete o dall’archiviazione del dispositivo, riducendo l’utilizzo della memoria dell’app e la complessità dell’interfaccia utente della tua app.

Per implementare il caricamento lento e l’impaginazione in Flutter, puoi utilizzare vari widget e plugin, come:

ListView: un widget che visualizza un elenco scorrevole di elementi. È possibile utilizzare ListView con il costruttore del builder per creare elementi pigramente mentre vengono fatti scorrere per essere visualizzati. È inoltre possibile utilizzare ListView con la proprietà controller per ascoltare gli eventi di scorrimento e caricare più dati quando l’utente raggiunge la fine dell’elenco.

GridView: un widget che visualizza una griglia scorrevole di elementi. È possibile utilizzare GridView con le stesse tecniche di ListView per creare elementi in modo pigro e caricare più dati durante lo scorrimento.

PaginatedDataTable: un widget che visualizza una tabella di dati con controlli di impaginazione. Puoi utilizzare PaginatedDataTable con una proprietà di origine personalizzata per recuperare i dati da un’origine remota o locale nelle pagine.

Paginazione a scorrimento infinito: un plugin che fornisce un widget e un controller per implementare l’impaginazione a scorrimento infinito con ListView o GridView. È possibile utilizzare la paginazione a scorrimento infinito con una proprietà pagingController personalizzata per recuperare i dati da un’origine remota o locale nelle pagine.

5. Usa il tree shaking per il tuo codice

Il quinto Hack per l’ottimizzazione delle prestazioni di Flutter consiste nell’utilizzare il tree shaking per il codice. Il il tree shaking è una tecnica che rimuove il codice inutilizzato dal file binario della tua app, riducendone le dimensioni e migliorandone il tempo di avvio.

Il il tree shaking funziona analizzando il codice e determinando quali parti sono raggiungibili e quali no. Solo le parti raggiungibili vengono incluse nell’output finale, mentre le parti irraggiungibili vengono scartate. In questo modo puoi evitare di inviare codice non necessario che non verrà mai eseguito.

Il il tree shaking può essere utile quando nella tua app sono presenti funzionalità di grandi dimensioni o opzionali che non sono necessarie a tutti gli utenti. Ad esempio, puoi utilizzare Il il tree shaking per:

Localizzazione: puoi rimuovere i file di lingua non rilevanti per le impostazioni locali dell’utente, invece di includere tutte le lingue supportate.

Temi: puoi rimuovere i file dei temi che non sono rilevanti per le preferenze dell’utente, invece di includere tutti i temi disponibili.

Funzionalità: puoi rimuovere i moduli di funzionalità che non sono rilevanti per l’azione dell’utente, invece di includere tutte le funzionalità possibili.

Per abilitare il tree shaking in Flutter, non devi fare nulla di speciale. Flutter esegue automaticamente il tree shaking durante la creazione dell’app in modalità di rilascio.

Scopri di più sul tree shaking in Flutter qui.

6 Usa il caricamento differito per il tuo codice

Il sesto Hack per l’ottimizzazione delle prestazioni di Flutter consiste nell’utilizzare il caricamento differito per il codice. Il caricamento differito (deferred loading) è una tecnica che consente di caricare parti del codice su richiesta, invece di caricarle tutte in una volta. Ciò può ridurre le dimensioni del download iniziale e l’utilizzo della memoria dell’app e migliorarne il tempo di avvio.

Per utilizzare il caricamento differito in Flutter, devi utilizzare la parola chiave deferred dopo l’istruzione import e specificare un alias per la libreria importata. Quindi, devi chiamare il metodo loadLibrary() sull’alias per caricare la libreria quando ne hai bisogno.

Il caricamento differito può essere utile quando nella tua app sono presenti funzionalità di grandi dimensioni o facoltative che non sono necessarie all’avvio o a tutti gli utenti. Ad esempio, puoi utilizzare il caricamento differito per:

Localizzazione: puoi caricare solo i file di lingua rilevanti per le impostazioni locali dell’utente, invece di caricare tutte le lingue supportate.

Temi: puoi caricare solo i file dei temi rilevanti per le preferenze dell’utente, invece di caricare tutti i temi disponibili.

Funzionalità: puoi caricare solo i moduli di funzionalità rilevanti per l’azione dell’utente, invece di caricare tutte le funzionalità possibili.

Efficienza Energetica del Data Center

Abbiamo scelto di ospitare le nostre applicazioni su un datacenter che potesse fornire progressi significativi e misurabili rispetto agli obiettivi di sostenibilità in modo da avere un impatto positivo sui nostri clienti, partner, investitori e dipendenti.

Possiamo offrire soluzioni di hosting managed su datacenter che garantisca:

1) Sistemi di controllo adattativi
2) Linee guida termiche ASHRAE
3) Contenimento del corridoio freddo/caldo
4) Sistemi di illuminazione ad alta efficienza energetica
5) Celle a combustibile
6) Punti di settaggio dell’acqua refrigerata ad alta temperatura


1. Sistemi di controllo adattativi

Riduzione dell consumo energetico e aumento della capacità di raffreddamento attraverso la gestione attiva del flusso d’aria utilizzando sensori intelligenti e distribuiti e criteri di controllo innovativi

2. Linee guida termiche ASHRAE

Riduzione del consumo energetico per il raffreddamento, mantenendo al tempo stesso una temperatura operativa sicura per le apparecchiature informatiche

3. Contenimento del corridoio freddo/caldo

Riduzione del consumo di energia, consente un raffreddamento più efficiente utilizzando barriere fisiche per ridurre la miscelazione di aria fredda nei corridoi di alimentazione del data center con l’aria calda nei corridoi di scarico

4. Sistemi di illuminazione ad alta efficienza energetica

Utilizzo di controlli attivati dal movimento e/o LED per ridurre il consumo di energia e il calore ambientale delle luci operatorie

5. Celle a combustibile

Posizionare l’elettricità in prossimità del nostro consumo energetico consentendo la massima efficienza e una maggiore resilienza;

6. Punti di settaggio dell’acqua refrigerata ad alta temperatura

Migliora i valori PUE (power usage efficiency efficiency) e di progettazione aumentando la temperatura dell’acqua refrigerata per risparmiare energia

7 metodi di ottimizzazione del codice secondo gli standards ISO 5055

Scrivere codice efficiente e ottimizzato è un aspetto cruciale per ridurre il consumo di risorse e di energia durante l’esecuzione del software. Ciò non solo migliora le prestazioni complessive dell’applicazione, ma contribuisce anche a ridurre l’impatto ambientale, secondo i dettami della Green Software Foundation.

ISO/IEC 5055:2021 (di seguito denominato ISO 5055) è uno standard ISO per misurare la struttura interna di un prodotto software su quattro fattori critici per l’azienda: sicurezza, affidabilità, efficienza delle prestazioni e manutenibilità. Questi sono i fattori che determinano quanto affidabile, resiliente sia un sistema software.

Scrivere codice efficiente si riferisce alla pratica di creare software che utilizzi in modo ottimale le risorse disponibili, come la CPU, la memoria e altre risorse di sistema. L’obiettivo è massimizzare l’efficienza delle operazioni eseguite dal software, riducendo al minimo lo spreco di risorse e di energia.

Per alcuni consigli pratici su come ottimizzare il codice nelle app mobile in flutter vi rimandiamo a quest’articolo.

Ecco una lista di pratiche con descrizione ed esempi:

1) Minimizzare l’Utilizzo di Cicli
2) Gestione Efficiente della Memoria
3) Cache Awareness
4) Evitare Chiamate di Funzioni Ridondanti
5) Ottimizzare le Query al Database
6) Parallelismo e Concorrenza
7) Gestione delle Risorse Esterne
8) Ridurre l’Overhead


1. Minimizzare l’Utilizzo di Cicli

Evitare cicli eccessivamente complessi o ripetitivi può ridurre il carico sulla CPU e migliorare le prestazioni. Ad esempio, preferire l’uso di operazioni vettorialiali anziché cicli espliciti.

2. Gestione Efficiente della Memoria

Allocare e deallocare la memoria in modo appropriato per evitare perdite di memoria o frammentazione. Utilizzare strutture dati ottimizzate può migliorare l’efficienza e ridurre il consumo di memoria.

3. Cache Awareness

Sfruttare la gerarchia della cache per ottimizzare l’accesso alla memoria. Mantenere i dati locali ai registri o alla cache può ridurre i tempi di accesso alla memoria principale.

4. Evitare Chiamate di Funzioni Ridondanti

Ridurre il numero di chiamate di funzioni ridondanti o non necessarie può migliorare le prestazioni. Ad esempio, evitare chiamate costose in loop.

5. Ottimizzare le Query al Database

Scrivere query SQL efficienti, evitando la selezione di colonne non necessarie o l’uso eccessivo di JOIN, può migliorare le prestazioni del software.

6. Parallelismo e Concorrenza

Sfruttare il parallelismo e la concorrenza quando possibile per suddividere il carico di lavoro tra più thread o processi. Ciò può migliorare l’utilizzo della CPU e accelerare l’esecuzione.

7. Gestione delle Risorse Esterne

Assicurarsi di chiudere e rilasciare correttamente le risorse esterne, come file e connessioni di rete, per evitare sprechi e consumi inutili.

8. Ridurre l’Overhead

Come imparai molti anni fa in un vecchio manuale di marketing: dare al cliente sempre di piu’ di cio’ che si aspetta. Ecco un ottavo elemento:minimizzare l’overhead generato da operazioni accessorie o da strutture dati complesse può migliorare le prestazioni e l’efficienza.

Cos’è il software green

Il software green è il software concepito per garantire la minore quantità possibile di gas serra. Da sottolineare che l’ obiettivo è la riduzione, non la neutralizzazione.

L’argomento di quest’articolo è l’individuazione di criteri per la creazione di un ecosistema affidabile di persone, standard, strumenti e migliori pratiche per la creazione di software green tenendo in considerazione che esistono due concenzioni per considerare il software dal punto di vista ecologico: il software come parte del problema climatico e il software come parte della soluzione climatica.

Costruire software green e farlo su larga scala richiede la creazione di un ecosistema affidabile di persone, standard, strumenti e migliori pratiche. La missione della Green Software Foundation è proprio questa.

1) Software e anidride carbonica
2) Software Green: Riduzione
3) Azioni possibili


1. Software e anidride carbonica

Vorremmo che il software diventi parte della soluzione climatica, anziché essere parte del problema climatico. Ecco perché ci concentriamo sulla riduzione degli impatti negativi del software sul nostro clima, diminuendo le emissioni di carbonio di cui il software è responsabile.

Il software può anche essere un catalizzatore di soluzioni climatiche. Il software può essere sviluppato per contribuire ad accelerare la decarbonizzazione in tutti i settori dell’industria e della società. Abbiamo bisogno che persone e organizzazioni si concentrino su entrambi gli aspetti: creare software green e software abilitante per il verde. Tuttavia, il nostro focus principale è sulla creazione di un ecosistema per lo sviluppo di software green.

Per questo partecipiamo alle iniziative della Green Software Foundation, un’organizzazione senza di lucro, creata per le persone che si occupano di sviluppare software che si propone il compito di fornire risposte su cosa si puo’ fare per ridurre le emissioni di CO2 del software di cui sono responsabili.

2. Software Green: Riduzione

L’obiettivo del software green è la riduzione, non la neutralizzazione. Un grammo di carbonio che non viene emesso nell’atmosfera non è equivalente a un grammo di carbonio che è stato compensato. Di gran lunga, l’obiettivo preferibile è evitare completamente l’emissione di carbonio in primo luogo.

La riduzione è più sfidante della neutralizzazione. Comporta maggiori rischi e maggiori investimenti. Per mitigare tale rischio e incentivare gli investimenti nella riduzione, dobbiamo sviluppare un ecosistema di persone, standard, strumenti e migliori pratiche per la riduzione delle emissioni di carbonio del software. La missione della Fondazione a cui partecipiamo è coltivare questo ecosistema.

3. Azioni possibili

La nostra visione è che ci siano solo tre azioni che riducono le emissioni di carbonio del software:

1) Utilizzare meno risorse fisiche
2) Utilizzare meno energia
3) Utilizzare l’energia in modo più intelligente

Utilizzare l’energia in modo più intelligente significa consumare fonti di energia a basse emissioni di carbonio o consumare elettricità in modo che acceleri la transizione energetica verso un futuro a basse emissioni di carbonio.

Tutto ciò che si puo’ fare per ridurre le emissioni di carbonio del software rientra in una o più delle categorie sopra indicate. La missione della Fondazione per il software green di cui siamo fautori è incoraggiare l’adozione di più di queste azioni nell’industria del software.

Vi invitiamo a consultare il sito della Green Software Foundation per approfondire questi temi.

Quello che noi proponiamo per realizzare tali obiettivi sono interventi in diversi campi, e precisamente questi:

1. **Ottimizzazione del Codice:** Scrivere codice più efficiente e ottimizzato può ridurre il consumo di risorse e di energia durante l’esecuzione del software.

2. **Utilizzo di Algoritmi Efficienti:** Scegliere algoritmi che richiedono meno risorse computazionali può contribuire a ridurre il consumo di energia.

3. **Virtualizzazione e Consolidamento:** L’utilizzo di tecnologie di virtualizzazione e il consolidamento di server possono ridurre il consumo di energia e l’impatto ambientale dei data center.

4. **Efficienza Energetica del Data Center:** Migliorare l’efficienza energetica dei data center attraverso il raffreddamento efficiente, l’uso di energia rinnovabile e altre strategie può contribuire a ridurre le emissioni.

5. **Ottimizzazione delle Risorse di Calcolo:** Utilizzare le risorse di calcolo in modo più efficiente, ad esempio attraverso il bilanciamento del carico e l’allocazione intelligente delle risorse, può ridurre l’energia utilizzata.

6. **Strategie di Deployment:** Ottimizzare le strategie di deployment e distribuzione del software può contribuire a ridurre l’uso di risorse e l’impatto ambientale.

7. **Misurazione e Monitoraggio:** Implementare sistemi di monitoraggio per valutare l’utilizzo delle risorse e l’impatto ambientale del software, consentendo l’identificazione di aree di miglioramento.

8. **Utilizzo di Energia Rinnovabile:** Scegliere fornitori di servizi cloud e data center che utilizzano energia rinnovabile può contribuire a ridurre l’impatto delle emissioni.

9. **Riduzione del Consumo di Memoria:** Ottimizzare l’uso della memoria può ridurre il consumo di energia e migliorare le prestazioni complessive del software.

10. **Sviluppo Sostenibile:** Integrare principi di sostenibilità e responsabilità ambientale nello sviluppo del software, compresa la considerazione delle implicazioni ambientali durante le fasi di progettazione e sviluppo.

Ricorda che le pratiche specifiche possono variare a seconda del contesto e delle tecnologie coinvolte. Da ottobre 2021 potrebbero esserci state ulteriori sviluppi e nuove pratiche introdotte nell’ambito della riduzione dell’impatto del software sulle emissioni di CO2.

Miglioramento del recupero delle informazioni nello stack elastico: passaggi per migliorare la pertinenza della ricerca

A partire dalla versione 8.0 e dal rilascio di modelli di elaborazione del linguaggio naturale (NLP) di terze parti per l’incorporamento di testo, gli utenti di Elastic Stack hanno accesso a un’ampia varietà di modelli per incorporare i propri documenti di testo ed eseguire il recupero di informazioni basato su query utilizzando la ricerca vettoriale.

Dati tutti questi componenti e i relativi parametri, ea seconda del corpus di testo in cui si desidera effettuare la ricerca, può essere complicato scegliere quali impostazioni forniranno la migliore pertinenza della ricerca.

In questa serie di post sul blog, introdurremo una serie di test che abbiamo eseguito utilizzando vari set di dati pubblicamente disponibili e tecniche di recupero delle informazioni disponibili nello Stack elastico. Forniremo quindi consigli sulle migliori tecniche da utilizzare a seconda della configurazione.

Per dare il via a questa serie di blog, vogliamo preparare il terreno descrivendo il problema che stiamo affrontando e descrivendo alcuni metodi che approfondiremo in un articolo successivo sull’ integrazione di componenti di intelligenza artificiale in Elasticsearch.

Contesto e terminologia

BM25: un modello sparso e non supervisionato per la ricerca lessicale

Il modo classico in cui i documenti vengono classificati per rilevanza da Elasticsearch in base a una query di testo utilizza l’implementazione Lucene del modello Okapi BM25. Sebbene alcuni iperparametri di questo modello siano stati messi a punto per ottimizzare i risultati nella maggior parte degli scenari, questa tecnica è considerata non supervisionata poiché query etichettate e documenti non sono necessari per utilizzarla: è molto probabile che il modello funzionerà ragionevolmente bene su qualsiasi corpus di testo, senza basarsi su dati annotati. BM25 è noto per essere una solida linea di base nelle impostazioni di recupero a colpo zero.

Sotto il cofano, questo tipo di modello costruisce una matrice di frequenze dei termini (quante volte un termine appare in ciascun documento) e frequenze inverse dei documenti (l’inverso di quanti documenti contengono ciascun termine). Quindi assegna un punteggio a ogni termine di query per ogni documento che è stato indicizzato in base a tali frequenze. Poiché ogni documento contiene in genere una piccola frazione di tutte le parole utilizzate nel corpus, la matrice contiene molti zeri. Questo è il motivo per cui questo tipo di rappresentazione è chiamato “sparse”.

Inoltre, questo modello somma il punteggio di pertinenza di ogni singolo termine all’interno di una query per un documento, senza tener conto di alcuna conoscenza semantica (sinonimi, contesto, ecc.). Questa è chiamata ricerca lessicale (al contrario della ricerca semantica). Il suo difetto è il cosiddetto problema di mancata corrispondenza del vocabolario, che il vocabolario della query è leggermente diverso dal vocabolario del documento. Ciò motiva altri modelli di punteggio che cercano di incorporare la conoscenza semantica per evitare questo problema.

Modelli densi: un modello denso e supervisionato per la ricerca semantica

Più recentemente, i modelli basati su trasformatore hanno consentito una rappresentazione del testo densa e consapevole del contesto, affrontando le principali carenze sopra menzionate.

Per costruire tali modelli, sono necessari i seguenti passaggi:

1. Pre-formazione

Per prima cosa dobbiamo addestrare una rete neurale per comprendere la sintassi di base del linguaggio naturale.

Utilizzando un enorme corpus di testo, il modello apprende la conoscenza semantica addestrandosi su attività non supervisionate (come la previsione della parola mascherata o la previsione della frase successiva).
BERT è probabilmente l’esempio più noto di questi modelli: è stato addestrato su Wikipedia (2,5 miliardi di parole) e BookCorpus (800 milioni di parole) utilizzando Masked Word Prediction.

Questo si chiama pre-allenamento. Il modello apprende rappresentazioni vettoriali di token linguistici, che possono essere adattati per altre attività con molto meno addestramento.

Si noti che in questa fase, il modello non funzionerebbe bene nelle attività di PNL a valle.

Questo passaggio è molto costoso, ma esistono molti di questi modelli fondamentali che possono essere utilizzati immediatamente.

2. Formazione specifica per compito

Ora che il modello ha costruito una rappresentazione del linguaggio naturale, si addestrerà in modo molto più efficace su un’attività specifica come Dense Passage Retrieval (DPR) che consente la risposta alle domande.

Per fare ciò, dobbiamo adattare leggermente l’architettura del modello e quindi addestrarlo su un gran numero di istanze del compito, che, per DPR, consiste nell’abbinare un passaggio rilevante tratto da un documento rilevante.

Quindi questo richiede un set di dati etichettato, ovvero una raccolta di terzine:

Una domanda: “What is gold formed in?”
Un documento o brano tratto da un documento: “The core of large stars, especially during a nova”

Facoltativamente, un punteggio del grado di rilevanza per questa coppia (query, documento) (se non viene assegnato alcun punteggio, assumiamo che il punteggio sia binario e che tutti gli altri documenti possano essere considerati irrilevanti per la query data).
Un set di dati molto popolare e pubblicamente disponibile per eseguire tale formazione per DPR è il set di dati MS MARCO.

Questo set di dati è stato creato utilizzando le query e i migliori risultati del motore di ricerca Bing di Microsoft. Pertanto, le query e i documenti che contiene rientrano nel dominio linguistico della conoscenza generale, in contrasto con il dominio linguistico specifico (si pensi ai documenti di ricerca o al linguaggio utilizzato nella legge).

Questa nozione di dominio linguistico è importante, poiché la conoscenza semantica appresa da quei modelli sta dando loro un importante vantaggio “in-domain”: quando BERT è uscito, ha migliorato i precedenti modelli allo stato dell’arte su questo set di dati MS MARCO di un enorme margine.

3. Formazione specifica del dominio

A seconda della differenza tra i dati e il set di dati utilizzato per l’addestramento specifico dell’attività, potrebbe essere necessario addestrare il modello utilizzando un set di dati con etichetta specifico del dominio. Questo passaggio viene anche definito messa a punto per l’adattamento del dominio o “domain-adaptation”.

La buona notizia è che non è necessario un set di dati così grande come richiesto per i passaggi precedenti: alcune migliaia o decine di migliaia di istanze delle attività possono essere sufficienti.

La cattiva notizia è che queste coppie query-documento devono essere create da esperti di dominio, quindi di solito è un’opzione costosa.

L’adattamento del dominio è più o meno simile alla formazione specifica per attività.

Dopo aver introdotto queste varie tecniche, misureremo le loro prestazioni su un’ampia varietà di set di dati. Questo tipo di attività di recupero di informazioni generiche è di particolare interesse per noi. Vogliamo fornire strumenti e indicazioni per una vasta gamma di utenti, compresi quelli che non vogliono addestrare i modelli stessi per ottenere alcuni dei vantaggi che apportano alla ricerca. Nel prossimo post del blog di questa serie, descriveremo la metodologia e la suite di benchmark che utilizzeremo.