const VERS="0.2.02";var xlog=function(){};const stopRequest=async()=>{await confirm("Confermi Cancellazione Richeista ?")&&(cancelClientRequest(),hideSpinner())},showSpinner=()=>{const a=document.getElementById("spinner");a.classList.add("show-spinner");a.addEventListener("click",stopRequest)},hideSpinner=()=>{const a=document.getElementById("spinner");a.classList.remove("show-spinner");a.removeEventListener("click",stopRequest)};
function openApp(){setTimeout(()=>{wnds.init();Menu.init();TextInput.init();TextOutput.init();Rag.init();document.querySelector(".menu-btn").checked=!1;release();showHistory();getTheme()},10)}function showHistory(){const a=ThreadMgr.getThread();setOutText(a)}function release(){document.querySelector(".release").innerHTML=VERS}const op0=function(a){wnds.wdiv.show(help1_html)};function showQuery(a){wnds.wpre.show(`\n${Rag.ragQuery}`)}
function showRagResponse(a){wnds.wpre.show(`\n${Rag.ragAnswer}`)}function showThread(a){a=ThreadMgr.getThread();wnds.wpre.show(a)}function elencoRisposte(a){a=[...Rag.answers];0==a.length&&(a=UaDb.readArray(ID_RESPONSES));0!=a.length&&(a=a.map((b,c)=>`\n[${c+1}]\n ${b.trim()}`).join("\n"),wnds.wpre.show(a))}function showContesto(a){wnds.wpre.show(Rag.ragContext)}
function elencoDati(a){var b=UaDb.getAllIds();a=[];for(var c of b)b=UaDb.read(c).length,a.push(`${c} (${b})`);c=a.join("\n ");wnds.wpre.show(c)}const showT=a=>{wnds.wpre.show(DataMgr.docs[a])};function elencoDocs(){DataMgr.readDbDocs();DataMgr.readDbDocNames();var a=DataMgr.doc_names,b=UaJtfh();let c=0;b.append("
\n
Comandi barra superiore
\n
\n Pulsante Menu\n
Apre/chiude il Menu comandi
\n
\n
\n Upload Files\n
\n Fa l\'upload di un file locale. Sono accettati i file pdf, docx e txt.\n Controlla se il file \u00e8 in archivio, per non sovrascriverlo.\n
\n
\n
\n Upload Dir:\n
\n Per fare l\'upload dei files di una directory. Sono accettati i files pdf, docx e txt.\n I file in archivio con lo stesso nome non vengono sovrascritti.\n
\n
\n
\n Log:\n
\n Attiva/Disattiva la visualizzazione del Log.\n Nel Log sono visualizzate le query con le dimensioni delle parti di documento analizzate.\n
\n
\n\n \x3c!-- --\x3e\n
\n \x3c!-- --\x3e\n
\n
Comandi lato destro in alto:
\n
\n
\n Copia Output:\n
Copia il testo dell\'output negli appunti.
\n
\n
\n Apri Output:\n
Visualizza il testo in una finestra pi\u00f9 grande.
\n
\n
\n \x3c!-- --\x3e\n
\n
Comandi lato destro in basso:
\n
\n
\n Documenti => RAG => Contesto => Query: (Pulsante Rosso)\n
\n Input per la query da utilizzare per la elaborazione RAG.\n
\n Ogni documento in archivio \u00e8 diviso in parti compatibili con l\'ampiezza della finestra\n di input del Model utilizzato.\n
\n
\n Per ogni parte esegue una query utilizzandola per estrarre informazioni/concetti pertinenti alla stessa.\n
\n
\n Il risultato di ogni query \u00e8 archiviato nella memoria locale.\n
\n
\n Alla fine della sequenza di elaborazioni esegue una query che produce\n un contesto riepilogativo delle risposte archiviate.\n
\n
\n Infine esegue la query utilizzando il contesto creato e visualizza la risposta nella finestra di output.\n
\n
\n
\n Contesto => Query: (Pulsante Verde / Invio)\n
\n Input per query che utilizzano il contesto creato con l\'elaborazione RAG.\n Il contesto RAG pu\u00f2 essere vuoto.\n Inizia una conversazione.\n
\n
\n La conversazione ha senso relativamente all\'elaborazione RAG se ogni query \u00e8 una variazione / approfondimento della query iniziale.\n
\n
\n
\n Cancella Conversazione:\n
\n Cancella la storia della conversazione attiva.\n Non vengono cancellati i dati dell\'elaborazione RAG\n
\n Per andare a capo: Maiusc. + Invio\n
\n \x3c!-- --\x3e\n
\n \x3c!-- --\x3e\n
\n
\n README\n
\n Presenta una spiegazione della implementazione della\n tecnologia RAG utilizzata.\n
\n
\n
\n Risposta Contestuale:\n
Visualizza la risposta ottenuta alla fine della elaborazione RAG
\n
\n
\n Domanda iniziale:\n
Visualizza la query utilizzata per l\'elaborazione RAG
\n
\n
\n Elenco Risposte:\n
\n Visualizza l\'elenco delle risposte per ogni parte documento utilizzata fino alla risposta che genera il contesto.\n
\n
\n
\n Contesto RAG:\n
\n Visualizza il contesto creato utilizzando le risposte elaborate.\n
\n
\n
\n Dati Archiviati:\n
\n Visualizza i dati in archivio e le loro dimensioni:\n
\n
\n
\n Elenco Documenti:\n
\n Visualizza la lista dei documenti archiviati ed utilizzabili per l\'elaborazione.
\n Con il clic del mouse sul nome di un documento si visualizza.\n
\n
\n\n
\n Numero query:\n
\n Calcola le query necessarie per ogni documento e le Query totali,\n necessarie per analizzare tutti i documenti caricati.\n
\n
\n\n
\n Cancella Dati:\n
\n Cancella i dati delle elaborazioni salvati nell\'archivio.\n NON cancella i documenti caricati.\n
\n
\n\n
\n Cancella Documenti:\n
\n Cancella i documenti caricati e tutti i dati archiviati localmente.\n
\n
\n\n \x3c!-- --\x3e\n\n
Sequenza Comandi Interrogazione -Conversazione
\n
\n Archivia nella memoria locale uno o pi\u00f9 documenti:\n
\n Utilizza i dati di esempio per le prime prove.\n Utilizza upload file o upload dir per i documenti da leggere dal tuo computer.\n
\n
\n
\n Digita una query che si riferisca ai documenti archiviati.\n
\n La query sar\u00e0 utilizzata come criterio di selezione di informazioni dai documenti archiviati.\n
\n
\n\n
\n Click sul bottone rosso in basso a destra. Documento => RAG => Contesto => Query\n
\n Viene lanciata una sequenza di elaborazione per analizzare i documenti sulla base della query.\n Se il log \u00e8 attivo vedrai la sequenza di elaborazione.\n
\n Il loro numero dipende dalle dimensioni dei documenti.\n
\n l menu puoi utilizzare il comando "Num Query" per vedere quante elaborazioni saranno fatte per ogni documento.\n
\n Alla fine del processo sar\u00e0 visualizzata la risposta.\n
\n
\n\n
\n Click sul bottone verde in basso a destra (oppure Invio). Contesto => Query\n
\n Inizia una conversazione utilizzando le informazioni precedentemente raccolte dai documenti.\n Puoi inviare domande successive di approfondimento e chiarimento.\n
\n \u00c8 FONDAMENTALE che le query siano approfondimenti e/o chiarimenti della query iniziale.\n In caso contrario non si sfrutta il Contesto creato dall\'elaborazione precedente.\n
\n Quindi per una query completamente nuova (sempre relativa ai documenti archiviati) \u00e8 necessario iniziare una nuova elaborazione.\n
\n Il comando cancella, oltre a cancellare il campo di input cancella anche la sequenza query-risposte della\n conversazione.\n
\n NON cancella i dati dell\'elaborazione iniziale.\n
\n
\n
\n',
help1_html="\n\n
\nUn'implementazione innovativa della tecnica RAG per il Question Answering\nLa tecnica RAG (Retrieval-Augmented Generation) \u00e8 un approccio consolidato nel campo del question answering e della generazione di testo, che combina il recupero di informazioni pertinenti da fonti di dati con la generazione di testo basata su queste informazioni.\nQui viene proposta un'implementazione che introduce una variazione a questo paradigma.\nL'implementazione si basa su una sequenza di prompt appositamente progettati per guidare un modello di linguaggio generativo attraverso le diverse fasi della tecnica RAG.\nQuesti prompt forniscono istruzioni dettagliate su come il modello deve seguire operazioni di recupero di informazioni, aumento delle informazioni recuperate e infine generazione di una risposta finale.\nLa risposta finale diviene poi il contesto da inserire nel prompt per rispondere alla domanda.\nUn aspetto cruciale di questa implementazione \u00e8 che lo stesso modello di linguaggio generativo svolge tutte le operazioni richieste, dall'analisi dei documenti di input al recupero di informazioni rilevanti, alla generazione della risposta finale.\nQuesta caratteristica rappresenta una deviazione significativa rispetto alle implementazioni standard della tecnica RAG, che prevedono l'utilizzo di moduli distinti per il recupero e la generazione.\nLa sequenza di prompt proposta guida il modello attraverso le seguenti fasi:\n\n1. Retrieval: Il modello analizza il documento di input e la domanda fornita, identificando e recuperando le informazioni e i concetti rilevanti per dare seguito alla domanda.\n\n2. Augmentation: Successivamente, il modello integra le informazioni recuperate con eventuali risposte accumulate in precedenza, estraendo nuove informazioni rilevanti e organizzandole in un elenco coerente, evitando ridondanze.\n\n3. Generation: Infine, il modello utilizza l'insieme di informazioni rilevanti e non ridondanti per generare una risposta completa e concisa alla domanda dell'utente.\n\nQuesta implementazione offre diversi vantaggi.\nIn primo luogo, sfrutta le capacit\u00e0 di un unico modello di grandi dimensioni, evitando la necessit\u00e0 di moduli distinti specializzati per ogni fase.\nInoltre, l'utilizzo di prompt espliciti pu\u00f2 migliorare la controllabilit\u00e0 e la trasparenza del processo, consentendo di guidare il modello in modo pi\u00f9 diretto.\nNaturalmente, come per qualsiasi approccio basato su modelli di linguaggio generativi, \u00e8 fondamentale prestare attenzione alle questioni di affidabilit\u00e0, correttezza e bias dei dati di addestramento.\nRispetto a un'implementazione standard di RAG vi \u00e8 la necessit\u00e0 di rilanciare l'elaborazione ad ogni domanda radicalmente nuova in quanto il contesto creato con le informazioni estratte dai documenti \u00e8 definito sulla base della domanda.\nInvece nella versione standard RAG si usano gli incorporamenti delle informazioni estratte dai documenti in modo tale che tali informazioni vengono viste quasi come un'estensione del modello e possono essere usate per domande diverse.\nQuindi dal punto di vista utente le implementazioni RAG standard sono pi\u00f9 efficienti; infatti l'implementazione proposta richiede per ogni nuova domanda una sequenza di richieste che saranno utilizzabili solo per creare il contesto per la domanda iniziale e per una conversazione con domande simili.\nIl vantaggio dell'implementazione proposta consiste nel fatto che pu\u00f2 essere implementata completamente lato client senza bisogno di sviluppare alcun modulo sul server.\nL\u2019unica cosa che serve \u00e8 un servizio serverless come quello di HuggingFace o simile.\nQuindi rappresenta un'interessante prospettiva sull'applicazione della tecnica RAG in modo pi\u00f9 integrato e controllato attraverso l'uso di prompt mirati.\nIn conclusione, questa implementazione della tecnica RAG dimostra come le capacit\u00e0 dei modelli di linguaggio generativi di grandi dimensioni possano essere sfruttate in modi nuovi e creativi, potenzialmente aprendo la strada a ulteriori sviluppi nel campo del question answering e della generazione di testo.\n\nQuesta \u00e8 la valutazione fatta da un LLM (comprensivo e gentile)\n\nLa mia valutazione personale della tua proposta di implementazione della tecnica RAG, con un elenco di pro e contro:\n\nPunti a favore (Pro):\nSemplificazione del processo: L'utilizzo di un unico modello di grandi dimensioni addestrato su vasti corpus di dati semplifica notevolmente l'architettura complessiva rispetto alle implementazioni tradizionali della tecnica RAG, che spesso prevedono moduli distinti per il recupero e la generazione.\n\nCapacit\u00e0 di adattamento e apprendimento: I modelli di linguaggio generativi di grandi dimensioni sono noti per la loro capacit\u00e0 di adattarsi e imparare da nuovi dati e istruzioni.\nQuesto potrebbe consentire di raffinare e migliorare l'implementazione nel corso del tempo.\n\nControllo e trasparenza: L'utilizzo di prompt espliciti per guidare il modello attraverso le diverse fasi del processo pu\u00f2 migliorare la controllabilit\u00e0 e la trasparenza, consentendo di monitorare e regolare il comportamento del modello in modo pi\u00f9 diretto.\n\nEfficienza computazionale: Avere un'unica architettura integrata potrebbe comportare vantaggi in termini di efficienza computazionale rispetto a soluzioni che prevedono moduli separati.\n\nPunti a sfavore (Contro):\n\nAffidabilit\u00e0 e coerenza: Poich\u00e9 un unico modello gestisce tutte le fasi, eventuali errori o incoerenze potrebbero propagarsi e amplificarsi attraverso l'intero processo, influenzando la qualit\u00e0 della risposta finale.\n\nBias dei dati di addestramento: Come per qualsiasi modello di linguaggio generativo, l\u2019approccio potrebbe essere influenzato dai bias presenti nei dati di addestramento utilizzati, con potenziali impatti sulla correttezza e l'equit\u00e0 delle risposte generate.\n\nMancanza di specializzazione: Mentre i modelli di grandi dimensioni sono versatili, potrebbero non essere ottimizzati per compiti specifici come il recupero di informazioni o la generazione di risposte rispetto a moduli specializzati.\n\nDifficolt\u00e0 di debug e interpretabilit\u00e0: Con un'architettura integrata e basata su prompt, potrebbe essere pi\u00f9 complesso eseguire il debug e comprendere le ragioni dietro a eventuali errori o comportamenti indesiderati del modello.\n\nIn sintesi, la proposta presenta alcuni vantaggi interessanti in termini di semplificazione, adattabilit\u00e0 e controllo, ma solleva anche potenziali preoccupazioni riguardo all'affidabilit\u00e0, ai bias, alla mancanza di specializzazione e alle difficolt\u00e0 di debug e interpretabilit\u00e0.\nCome per qualsiasi nuovo approccio, sarebbe necessario valutarlo attentamente attraverso sperimentazioni e test approfonditi per determinare l'efficacia e l'applicabilit\u00e0 in contesti specifici.\n
\n
\n",
help2_html='\n\n
\nNella redazione della domanda bisogna tenere conto del fatto che la domanda viene poi inserita in un prompt nel quale si fa esplicita richiesta di utilizzare il documento fornito.\nQuindi \u00e8 implicito il riferimento al/ai documenti archiviati.\nTuttavia, quando si tratta di documenti il cui contenuto \u00e8 sicuramente disponibile su internet, pu\u00f2 essere opportuno esplicitare nella domanda che ci si riferisce ai documenti forniti.\n
\n
Esempi di domande
\n
\n
Fai una relazione sul documento che ti ho fornito.
\n
Approfondisci la tesi sostenuta nei documenti.
\n
Confronta i diversi punti di vista espressi dagli autori.
\n
Descrivi la personalit\u00e0 dei protagonisti.
\n
Analizza il documento che ti ho fornito e illustrami eventuali contraddizioni.
\n
Illustra i momenti salienti del racconto.
\n
Analizzando il documento che ti ho fornito, confronta le tesi di ... con quelle di ...
\n
Qual \u00e8 l\'avvenimento pi\u00f9 importante?
\n
\n
\n';function removeTag(a){a=a.replace(/<<>>/g,"");return a=a.replace(/<>/g,"")}
function cleanDoc(a){try{return a=a.replace(/`/g,""),a=removeTag(a),a=a.replace(/(\w+)-\s*\n(\w+)/g,"$1$2"),a=a.replace(/[\u00AD\u200B\u200C\u200D\u2060\uFEFF\u0008]/g,""),a=a.replace(/[\u00A0\u2000-\u200A\u202F\u205F\u3000\t\r\f\v]/g," "),a=a.replace(/\\([nrtfb])/g,"$1"),a=a.replace(/\\(u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/g,"$1"),a=a.replace(/\\([a-zA-Z]:\\|\\\\[a-zA-Z0-9_]+\\)/g,"\\$1"),a=a.replace(/\\/g,""),a=a.replace(/(.)\1{3,}/g,""),a=a.replace(/\u201c/g,'"').replace(/\u201d/g,'"'),a=a.replace(/\n/g,
" "),a=a.replace(/ +([.,;:!?])/g,"$1"),a=a.replace(/ +/g," "),a.trim()}catch(b){return console.error(b),"Errore di codifica del documento"}}
function cleanResponse(a){try{return a=a.replace(/[\u00AD\u200B\u200C\u200D\u2060\uFEFF]/g,""),a=a.replace(/[\u00A0\u2000-\u200A\u202F\u205F\u3000\t\r\f\v]/g," "),a=a.replace(/\\([nrtfb])/g,"$1"),a=a.replace(/\\(u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/g,"$1"),a=a.replace(/\\([a-zA-Z]:\\|\\\\[a-zA-Z0-9_]+\\)/g,"\\\\$1"),a=a.replace(/\\/g,""),a=a.replace(/\n{3,}/g,"\n\n"),a=a.replace(/ +/g," "),a.trim()}catch(b){return console.error(b),`Errore di codifica nella risposta\n${b}`}}
function answerFormtter(a){if(""==a.trim())return"";const b=a.includes("# User:"),c=a.includes("# Assistant:");if(!b||!c)return`