{"id":2777,"date":"2025-05-05T20:26:45","date_gmt":"2025-05-05T18:26:45","guid":{"rendered":"https:\/\/www.giuseppebriganti.it\/wordpress\/?p=2777"},"modified":"2025-05-25T22:09:32","modified_gmt":"2025-05-25T20:09:32","slug":"ia-e-avvocati-9-motore-rag-base","status":"publish","type":"post","link":"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/05\/ia-e-avvocati-9-motore-rag-base\/","title":{"rendered":"IA e Avvocati (9): creare un motore RAG base"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/tag\/ia-e-avvocati\/\">Intelligenza artificiale e Avvocati<\/a><\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9. Implementazione locale di un motore RAG base per studi legali<\/h3>\n\n\n\n<p>Questo nono post della guida pratica accompagna gli studi legali nell\u2019adozione concreta dell\u2019Intelligenza Artificiale generativa.<\/p>\n\n\n\n<p>In particolare, ci concentriamo sull\u2019implementazione in ambiente Windows di un <strong>semplice sistema RAG (Retrieval-Augmented Generation) locale<\/strong> di esempio, utilizzando <a href=\"https:\/\/www.langchain.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">LangChain<\/a>, <a href=\"https:\/\/faiss.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">FAISS<\/a> e <a href=\"https:\/\/ollama.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ollama<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f3af; Obiettivo del post<\/h3>\n\n\n\n<p>Fornire una guida chiara e commentata per costruire un semplice motore RAG locale d&#8217;esempio in grado di interrogare <strong>archivi interni di documenti legali<\/strong> e <strong>generare risposte pertinenti<\/strong>, con attenzione a riservatezza, semplicit\u00e0 e riutilizzabilit\u00e0 del codice.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f9e9; Concetti chiave<\/h3>\n\n\n\n<ul>\n<li><strong>RAG<\/strong>: sistema che unisce il recupero semantico da un archivio indicizzato con la generazione di testo tramite LLM.<\/li>\n\n\n\n<li><strong>LangChain<\/strong>: framework per creare <em>pipeline<\/em> tra LLM, archivi e altri strumenti <a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/05\/ia-e-avvocati-8-parsing-dei-pdf-legali-con-ocr-e-pulizia-del-testo\/\">NLP<\/a>.<\/li>\n\n\n\n<li><strong>FAISS<\/strong>: libreria per l\u2019indicizzazione e la ricerca veloce di vettori.<\/li>\n\n\n\n<li><strong>Ollama<\/strong>: ambiente locale per eseguire <a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/04\/ia-e-avvocati-7-utilizzare-un-llm-locale-con-ollama\/\">LLM su dispositivi propri<\/a>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f4bc; Prerequisiti<\/h3>\n\n\n\n<p>Per poter utilizzare correttamente lo <em>script<\/em> che crea un motore RAG base, \u00e8 necessario predisporre l&#8217;ambiente nel modo seguente (vedi <a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/04\/ia-e-avvocati-sistema-rag-locale\/\">post 6<\/a>):<\/p>\n\n\n\n<ul>\n<li>Un computer con <strong>Windows 10 o superiore<\/strong>.<\/li>\n\n\n\n<li><strong>Python 3.10 o versione compatibile<\/strong> installato.<\/li>\n\n\n\n<li><strong>Visual Studio Code<\/strong> configurato con ambiente virtuale attivo.<\/li>\n\n\n\n<li>Il software <strong>Ollama<\/strong> installato e funzionante.<\/li>\n\n\n\n<li>I seguenti modelli scaricati con Ollama tramite terminale:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ollama pull llama3.1:8b\nollama pull nomic-embed-text\n<\/code><\/pre>\n\n\n\n<ul>\n<li>Una cartella locale che contenga i documenti PDF legali da interrogare. Questa cartella pu\u00f2 essere:\n<ul>\n<li>denominata <code>documenti_legali<\/code> e posizionata <strong>nella stessa cartella del file python (.py)<\/strong> dello script;<\/li>\n\n\n\n<li>oppure configurata usando un <strong>percorso assoluto in formato Windows<\/strong>, preferibilmente come <strong>raw string<\/strong>, ad esempio:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>directory = r\"C:\\Users\\NomeUtente\\Documents\\StudioLegale\\documenti_legali\"\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>&#x1f50d; <strong>Nota per utenti non esperti<\/strong>: per sapere qual \u00e8 il percorso esatto della cartella, fai clic con il tasto destro su di essa in Esplora File e seleziona &#8220;Copia come percorso&#8221;. Ricordati di anteporre <code>r<\/code> alla stringa incollata nello script, oppure di raddoppiare ogni barra <code>\\<\/code> per evitare errori.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f6e0;&#xfe0f; Installazione dei pacchetti necessari<\/h3>\n\n\n\n<p>Se stai utilizzando Visual Studio Code e non hai familiarit\u00e0 con il terminale, segui questi semplici passaggi:<\/p>\n\n\n\n<ol>\n<li>Apri Visual Studio Code e assicurati di avere attivato l&#8217;ambiente virtuale come spiegato nel <strong><a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/04\/ia-e-avvocati-sistema-rag-locale\/\">post 6<\/a><\/strong>.<\/li>\n\n\n\n<li>Clicca sul menu <strong>Visualizza &gt; Terminale<\/strong>.<\/li>\n\n\n\n<li>Nella parte inferiore dello schermo si aprir\u00e0 il terminale.<\/li>\n\n\n\n<li>Copia e incolla il comando seguente nel terminale e premi <code>Invio<\/code>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install langchain langchain-community faiss-cpu langchain-ollama PyMuPDF langchain-text-splitters\n<\/code><\/pre>\n\n\n\n<p>Queste librerie servono per:<\/p>\n\n\n\n<ul>\n<li>orchestrare il sistema (LangChain);<\/li>\n\n\n\n<li>creare rappresentazioni numeriche dei testi (<em>embedding<\/em>);<\/li>\n\n\n\n<li>effettuare ricerche semantiche (FAISS);<\/li>\n\n\n\n<li>far funzionare i modelli in locale (Ollama);<\/li>\n\n\n\n<li>leggere i contenuti dei PDF (PyMuPDF).<\/li>\n<\/ul>\n\n\n\n<p>Una volta completata l&#8217;installazione, puoi passare direttamente allo script di esempio.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Script completo con spiegazioni per il motore RAG base<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Esecuzione di esempio<\/h4>\n\n\n\n<p>Immagina di avere nella cartella <code>.\/documenti_legali<\/code>&nbsp;un file PDF contenente il testo della Costituzione italiana. Se esegui lo script e scrivi nel terminale la domanda:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p><em>Quali sono i principi fondamentali della Costituzione italiana?<\/em><\/p>\n<\/blockquote>\n\n\n\n<p>il sistema estrae il testo dal documento PDF, lo analizza semanticamente, individua i blocchi rilevanti e, tramite LLM, fornisce una risposta come questa:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p><em>Secondo l&#8217;articolo 1 della Costituzione italiana, i principi fondamentali sono:<\/em><\/p>\n\n\n\n<p><em>* L&#8217;Italia \u00e8 una Repubblica democratica, fondata sul lavoro.<\/em><\/p>\n\n\n\n<p><em>* La sovranit\u00e0 appartiene al popolo, che la esercita nelle forme e nei limiti della Costituzione.<\/em><\/p>\n\n\n\n<p><em>Inoltre, l&#8217;articolo 2 precisa che la Repubblica riconosce e garantisce i diritti inviolabili dell&#8217;uomo, sia come singolo sia nelle formazioni sociali ove si svolge la sua personalit\u00e0, e richiede l&#8217;adempimento dei doveri inderogabili di solidariet\u00e0 politica, economica e sociale.<\/em><\/p>\n\n\n\n<p><em>Infine, l&#8217;articolo 3 afferma che tutti i cittadini hanno pari dignit\u00e0 sociale e sono eguali davanti alla legge, senza discriminazioni di sorta.<\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Confrontiamo questa risposta con quella data alla medesima domanda dallo stesso LLM &#8220;generalista&#8221; prima di &#8220;conoscere&#8221; il file contenente la Costituzione (<a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/04\/ia-e-avvocati-7-utilizzare-un-llm-locale-con-ollama\/\">post 7<\/a>).<\/p>\n\n\n\n<p>Ora il modello fornisce una risposta pi\u00f9 precisa e pertinente.<\/p>\n\n\n\n<p><strong>Lo script<\/strong><\/p>\n\n\n\n<p>Lo script seguente costruisce un motore RAG locale, passo dopo passo. I documenti PDF vengono letti, segmentati in blocchi, trasformati in vettori semantici, indicizzati e interrogati tramite un LLM locale.<\/p>\n\n\n\n<p>Lo script lavora con <em>PDF nativi<\/em>. Per l&#8217;estrazione del testo da file immagine o PDF scannerizzati, e per la pulizia preliminare del testo, si rimanda al <a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/05\/ia-e-avvocati-8-parsing-dei-pdf-legali-con-ocr-e-pulizia-del-testo\/\">post 8<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -- a) Importazioni --\nimport os\nimport fitz  # PyMuPDF per leggere PDF\nfrom langchain_core.documents import Document\nfrom langchain_ollama import OllamaEmbeddings\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\nfrom langchain_community.vectorstores import FAISS\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_ollama.llms import OllamaLLM\n\n# -- b) Caricamento PDF --\ndirectory = \".\/documenti_legali\"\ndocuments = &#91;]\nfor filename in os.listdir(directory):\n    if filename.endswith(\".pdf\"):\n        filepath = os.path.join(directory, filename)\n        with fitz.open(filepath) as pdf:\n            text = \"\\n\".join(page.get_text() for page in pdf)\n            documents.append(Document(page_content=text, metadata={\"source\": filename}))\n\n# -- c) Segmentazione in chunk --\nsplitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)\nsplit_docs = splitter.split_documents(documents)\n\n# -- d) Embedding semantico --\nembeddings = OllamaEmbeddings(model=\"nomic-embed-text\")\n\n# -- e) Vector store con FAISS --\nvector_store = FAISS.from_documents(split_docs, embeddings)\n\n# -- f) Query e recupero documenti simili --\nquery = input(\"Ciao, sono il tuo assistente legale. Inserisci la tua domanda: \")\ndocs = vector_store.similarity_search(query)\n\n# Estrai il contenuto testuale dai documenti\ncontext = \"\\n\\n\".join(&#91;f\"FONTE: {doc.metadata&#91;'source']}\\nCONTENUTO: {doc.page_content}\" for doc in docs])\n\n# -- g) Generazione risposta con LLM --\nprompt = ChatPromptTemplate.from_template (\"\"\"\nSei un assistente giuridico specializzato in diritto italiano. \nUsa esclusivamente il testo fornito come contesto per elaborare le tue risposte.\n\nCONTESTO:\n{context}\n\nDOMANDA: {question}\nRISPOSTA:\n\"\"\")\n\nmodel = OllamaLLM(model=\"llama3.1:8b\")\nchain = prompt | model\nresponse = chain.invoke({\"question\": query, \"context\": context})\nprint(response)\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p><strong>Glossario essenziale:<\/strong><\/p>\n\n\n\n<ul>\n<li>Chunk: un frammento di testo (es. 1000 caratteri) in cui viene suddiviso il documento per facilitare l\u2019elaborazione da parte dell\u2019IA. Serve per non superare i limiti del modello e per mantenere il contesto logico.<\/li>\n\n\n\n<li>Embedding: la trasformazione di un testo in un vettore numerico che ne rappresenta il significato. Pi\u00f9 due testi sono simili, pi\u00f9 i loro vettori saranno vicini nello spazio matematico.<\/li>\n\n\n\n<li>Vector store: un archivio indicizzato di vettori (testi trasformati in numeri) che permette di cercare i documenti pi\u00f9 simili a una domanda.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/04\/ia-e-avvocati\/\">LLM<\/a>: acronimo di &#8220;Large Language Model&#8221;. \u00c8 il cervello generativo che, dato un contesto (come i chunk trovati), formula una risposta in linguaggio naturale.<\/li>\n\n\n\n<li>LangChain: un framework Python che consente di mettere insieme tutti questi strumenti in modo fluido e strutturato.<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<p>Questo script \u00e8 composto da sette fasi principali:<\/p>\n\n\n\n<ol>\n<li><strong>Importazioni<\/strong>: in questa fase vengono caricate le librerie necessarie. Queste librerie permettono di:\n<ul>\n<li>leggere i PDF;<\/li>\n\n\n\n<li>dividere il testo in parti pi\u00f9 gestibili (<em>chunk<\/em>);<\/li>\n\n\n\n<li>trasformare i testi in vettori numerici comprensibili dal sistema;<\/li>\n\n\n\n<li>costruire una base dati semantica interrogabile;<\/li>\n\n\n\n<li>generare una risposta coerente tramite un modello di linguaggio.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Caricamento PDF<\/strong>: lo script accede a una cartella locale contenente i PDF e li apre uno a uno. Utilizza PyMuPDF per leggere il testo da ogni pagina. Ogni file viene trasformato in un oggetto strutturato che conserva sia il contenuto testuale che informazioni utili (es. il nome del file).<\/li>\n\n\n\n<li><strong>Segmentazione<\/strong> in <strong>c<\/strong><em><strong>hunk<\/strong><\/em>: i testi estratti vengono suddivisi in blocchi da 1000 caratteri con 100 caratteri di sovrapposizione tra un blocco e l\u2019altro. Questo consente di preservare la continuit\u00e0 delle informazioni e ottenere risposte pi\u00f9 precise. \u00c8 come dividere un lungo paragrafo in sezioni leggibili senza perdere il filo logico.<\/li>\n\n\n\n<li><strong><em>Embedding<\/em> semantico<\/strong>: ogni blocco di testo viene convertito in un vettore numerico grazie al modello <code>nomic-embed-text<\/code>. Questo passaggio \u00e8 essenziale per consentire al sistema di confrontare testi in modo &#8220;intelligente&#8221;, basandosi sul significato e non solo sulle parole.<\/li>\n\n\n\n<li>Creazione del <em><strong>vector store<\/strong><\/em>: i vettori ottenuti vengono inseriti in un archivio indicizzato chiamato <em>vector store<\/em>, grazie alla libreria FAISS. Questo archivio consente di effettuare ricerche veloci e accurate, trovando i blocchi di testo pi\u00f9 simili a una domanda posta in linguaggio naturale.<\/li>\n\n\n\n<li><strong>Ricerca<\/strong>: quando l\u2019utente formula una domanda, il sistema cerca nel vector store i blocchi di testo pi\u00f9 pertinenti. Non si tratta di una ricerca per parole chiave, ma di una ricerca semantica: il sistema capisce il significato della domanda e recupera ci\u00f2 che realmente serve.<\/li>\n\n\n\n<li><strong>Generazione della risposta<\/strong>: i risultati recuperati vengono passati a un LLM locale (llama3.1:8b), che genera una risposta strutturata e in linguaggio naturale alla domanda posta. In questa fase, i documenti trovati non vengono semplicemente copiati, ma vengono usati come &#8220;contesto&#8221; per istruire il modello. Il modello prende la domanda dell\u2019utente e costruisce una risposta sfruttando le informazioni recuperate. Questo \u00e8 il cuore del sistema RAG: il recupero (<em><strong>retrieval<\/strong><\/em>) trova ci\u00f2 che serve, e la generazione (<em><strong>generation<\/strong><\/em>) riformula in modo chiaro e coerente. \u00c8 come se un assistente legale umano, leggendo i documenti pi\u00f9 rilevanti, producesse una sintesi precisa su misura per la domanda ricevuta. L\u2019intelligenza artificiale, grazie a questo meccanismo, diventa realmente utile e affidabile, offrendo risposte basate sui contenuti reali dell\u2019archivio legale interno dello studio.<\/li>\n<\/ol>\n\n\n\n<p>Questa sequenza consente di costruire un semplice assistente giuridico che consulta archivi interni e fornisce risposte basate su fonti testuali reali.<\/p>\n\n\n\n<p>Si tratta ovviamente di un semplice esempio, un punto di partenza.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f527; Come usare lo script per il motore RAG base in Visual Studio Code<\/h3>\n\n\n\n<p>Questo script pu\u00f2 essere copiato in un file <code>motore_rag.py<\/code> ed eseguito in Visual Studio Code (VS Code).<\/p>\n\n\n\n<p>Nel <strong><a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/04\/ia-e-avvocati-sistema-rag-locale\/\">post 6<\/a><\/strong> abbiamo gi\u00e0 spiegato:<\/p>\n\n\n\n<ul>\n<li>come installare VS Code,<\/li>\n\n\n\n<li>come creare un progetto python,<\/li>\n\n\n\n<li>e come attivare un ambiente virtuale.<\/li>\n<\/ul>\n\n\n\n<p>Una volta completati quei passaggi:<\/p>\n\n\n\n<ol>\n<li>Crea un nuovo file <code>motore_rag.py<\/code><\/li>\n\n\n\n<li>Incolla il codice dello script e salva il file<\/li>\n\n\n\n<li>Installa i pacchetti nel terminale virtuale<\/li>\n\n\n\n<li>Esegui lo script con il comando <code>python motore_rag.py<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x2696;&#xfe0f; Vantaggi e limiti di un sistema RAG locale per lo studio legale<\/h3>\n\n\n\n<p>Un sistema RAG locale costruito su misura per uno studio legale italiano presenta numerosi vantaggi, ma va considerato nel contesto di altre soluzioni disponibili, come quelle <strong>ibride (parzialmente su cloud)<\/strong> o <strong>verticali (pensate specificamente per il settore legale)<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">&#x2705; Vantaggi principali<\/h4>\n\n\n\n<ul>\n<li><strong>Privacy garantita<\/strong>: tutti i documenti, le domande e le risposte restano all\u2019interno della macchina locale dello studio. Questo \u00e8 fondamentale per rispettare il segreto professionale, il GDPR e l\u2019etica forense. Nessun dato viene inviato a server esterni.<\/li>\n\n\n\n<li><strong>Velocit\u00e0 di consultazione<\/strong>: il sistema lavora su archivi interni indicizzati semanticamente, consentendo interrogazioni rapide anche su grandi quantit\u00e0 di testi. Le domande possono essere formulate in linguaggio naturale e ottenere risposte centrate.<\/li>\n\n\n\n<li><strong>Flessibilit\u00e0 e controllo<\/strong>: il sistema \u00e8 completamente personalizzabile. Si pu\u00f2 adattare a vari ambiti del diritto (es. immigrazione, civile, penale, lavoro) semplicemente caricando i documenti relativi. Inoltre, pu\u00f2 essere esteso con nuove funzionalit\u00e0, prompt specifici, o interfacce utente.<\/li>\n\n\n\n<li><strong>Indipendenza tecnologica<\/strong>: l&#8217;uso di strumenti open-source e l&#8217;esecuzione locale svincolano lo studio da licenze costose o soluzioni chiuse. Lo strumento resta pienamente controllabile e modificabile.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">&#x26a0;&#xfe0f; Limiti da considerare<\/h4>\n\n\n\n<ul>\n<li><strong>Maggiori responsabilit\u00e0 di gestione<\/strong>: serve un minimo di competenza tecnica per mantenere aggiornato il sistema e garantire il buon funzionamento (es. aggiornamento dei modelli, indicizzazione documenti).<\/li>\n\n\n\n<li><strong>Assenza di ottimizzazioni legali verticali<\/strong>: rispetto a piattaforme commerciali verticali, un sistema generico RAG locale non include per default modelli addestrati sul diritto italiano o su giurisprudenza specifica (ma si pu\u00f2 arrivare a quel livello con estensioni mirate).<\/li>\n\n\n\n<li><strong>Accessibilit\u00e0 limitata<\/strong>: un sistema locale funziona solo nel contesto dove \u00e8 stato installato. Le soluzioni ibride offrono invece l\u2019accesso multi-dispositivo o da remoto.<\/li>\n<\/ul>\n\n\n\n<p>In sintesi, un RAG locale \u00e8 una scelta ottima per studi legali che vogliono autonomia, privacy e personalizzazione, ma va valutato attentamente rispetto a bisogni specifici, risorse disponibili e alternative sul mercato.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f680; Come migliorare e potenziare l\u2019assistente legale AI di base<\/h3>\n\n\n\n<p>Una volta compreso e testato il sistema RAG d&#8217;esempio presentato in questo post, \u00e8 possibile ampliarlo gradualmente per ottenere un assistente legale ancora pi\u00f9 completo, efficiente e utile nello studio. Ecco i principali miglioramenti che consigliamo, spiegati in modo semplice:<\/p>\n\n\n\n<ol>\n<li><strong>Espandere la base documentale<\/strong>: puoi aggiungere nuove categorie di documenti (atti, pareri, giurisprudenza, normativa), anche suddividendole in sottocartelle tematiche. Il motore RAG potr\u00e0 essere istruito a distinguere tra le fonti e a usare quella pi\u00f9 adatta alla domanda.<\/li>\n\n\n\n<li><strong>Interfaccia utente<\/strong>: puoi costruire una semplice interfaccia grafica (GUI) con Streamlit o Gradio, cos\u00ec da non dover usare il terminale.<\/li>\n\n\n\n<li><strong>Controllo della pertinenza<\/strong>: puoi configurare il sistema per restituire, oltre alla risposta, anche i documenti effettivamente consultati, cos\u00ec da garantire la massima trasparenza e verificabilit\u00e0 delle risposte.<\/li>\n\n\n\n<li><strong>Aggiungere sempre un livello di verifica umana<\/strong>: prima che una risposta venga utilizzata per finalit\u00e0 professionali occorre proporla sempre a un avvocato dello studio per la <strong>validazione<\/strong>. Questo garantisce rigore e tutela da errori.<\/li>\n\n\n\n<li><strong>Prompt personalizzati<\/strong>: \u00e8 possibile costruire prompt su misura per ogni tipo di richiesta: redazione di pareri, confronto normativo, sintesi di sentenze, ecc. Questo rende il sistema ancora pi\u00f9 flessibile.<\/li>\n\n\n\n<li><strong>Salvataggio e riutilizzo delle sessioni<\/strong>: con opportune modifiche, si pu\u00f2 tenere traccia delle domande e delle risposte fornite, cos\u00ec da creare un archivio consultabile delle ricerche effettuate in studio.<\/li>\n<\/ol>\n\n\n\n<p>Questi miglioramenti possono essere introdotti anche uno per volta, a seconda delle competenze disponibili e del tempo che si vuole investire. L\u2019importante \u00e8 partire da una base solida e locale come quella presentata qui: ogni estensione diventer\u00e0 poi un naturale passo successivo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f9e0; Come migliorare la qualit\u00e0 delle risposte generate dal motore RAG base<\/h3>\n\n\n\n<p>Anche partendo da uno script di base, \u00e8 possibile ottenere risposte pi\u00f9 pertinenti, affidabili e formalmente corrette. Ecco alcune strategie semplici ma efficaci per migliorare la qualit\u00e0 delle risposte fornite dal sistema:<\/p>\n\n\n\n<ol>\n<li><strong>Curare la qualit\u00e0 del testo nei PDF<\/strong>: il sistema RAG pu\u00f2 restituire buone risposte solo se i documenti da cui apprende sono scritti chiaramente. Evita PDF con testo malformattato o OCR impreciso. \u00c8 utile usare strumenti come Tesseract (vedi <a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/05\/ia-e-avvocati-8-parsing-dei-pdf-legali-con-ocr-e-pulizia-del-testo\/\">post 8<\/a>) per pulire e standardizzare i contenuti.<\/li>\n\n\n\n<li><strong>Ottimizzare i prompt<\/strong>: istruzioni chiare nel prompt (es. &#8220;Usa un linguaggio giuridico formale&#8221;, oppure &#8220;Cita gli articoli pertinenti&#8221;) orientano il modello verso uno stile pi\u00f9 preciso e contestuale. Il prompt attuale pu\u00f2 essere ulteriormente raffinato in base al tipo di richiesta (pareri, analisi normativa, sintesi giurisprudenziale). Si affronter\u00e0 in seguito nel dettaglio il tema del <em>legal prompting<\/em>.<\/li>\n\n\n\n<li><strong>Limitare il contesto<\/strong>: invece di passare tutti i chunk trovati, si possono limitare a quelli con maggiore similarit\u00e0 (es. top 3). Questo aiuta il modello a concentrarsi sulle informazioni pi\u00f9 rilevanti, evitando risposte vaghe.<\/li>\n\n\n\n<li><strong>Impostare il modello con un tono specifico<\/strong>: tramite parametri del modello (come <code>system<\/code> in <code>OllamaLLM<\/code>) si pu\u00f2 chiedere di mantenere sempre un tono formale, con terminologia legale e senza generalizzazioni.<\/li>\n\n\n\n<li><strong>Controllare i limiti di token<\/strong>: se il contesto \u00e8 troppo lungo, pu\u00f2 essere tagliato. \u00c8 importante monitorare quanto testo si fornisce al modello per rimanere entro i limiti e garantire risposte complete.<\/li>\n\n\n\n<li><strong>Testare pi\u00f9 modelli<\/strong>: LLaMA&nbsp;\u00e8 un buon modello generale, ma si pu\u00f2 valutare l\u2019uso di LLM giuridici addestrati su <em>corpora<\/em> legali (es. modelli basati su sentenze, diritto italiano o europeo).<\/li>\n<\/ol>\n\n\n\n<p>Applicando anche solo alcune di queste strategie, la qualit\u00e0 delle risposte migliora sensibilmente, rendendo il sistema pi\u00f9 utile e affidabile nello studio.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f4ca; Come migliorare l\u2019indicizzazione con FAISS e ottenere recuperi pi\u00f9 efficaci<\/h3>\n\n\n\n<p>Per rendere il sistema ancora pi\u00f9 potente ed efficiente, \u00e8 possibile ottimizzare l&#8217;indicizzazione dei documenti e le ricerche nel vector store FAISS. Ecco alcune strategie, spiegate in modo semplice:<\/p>\n\n\n\n<ol>\n<li><strong>Pre-elaborazione del testo<\/strong>: prima di generare i chunk e gli embeddings, \u00e8 utile rimuovere elementi superflui come caratteri speciali, numerazioni inutili o note a pi\u00e8 di pagina (si veda il <a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/2025\/05\/ia-e-avvocati-8-parsing-dei-pdf-legali-con-ocr-e-pulizia-del-testo\/\">post 8<\/a>). Standardizzare punteggiatura e maiuscole\/minuscole migliora la consistenza e quindi anche la qualit\u00e0 dell\u2019indice vettoriale.<\/li>\n\n\n\n<li><strong>Aggiunta di metadati rilevanti<\/strong>: ogni documento indicizzato pu\u00f2 includere metadati (come fonte normativa, anno, ambito tematico), che aiutano a filtrare e contestualizzare meglio i risultati. Ad esempio, potresti recuperare solo i documenti di diritto civile o solo le versioni pi\u00f9 aggiornate.<\/li>\n\n\n\n<li><strong>Salvataggio e aggiornamento dell\u2019indice FAISS<\/strong>: salvare l\u2019indice su disco consente di riutilizzarlo senza doverlo ricostruire ogni volta. \u00c8 anche possibile aggiornarlo periodicamente con nuovi documenti, mantenendo il sistema sempre aggiornato.<\/li>\n\n\n\n<li><strong>Regolare i parametri di ricerca<\/strong>: limitare il numero di risultati restituiti (ad esempio i 3 pi\u00f9 simili) aiuta il modello generativo a concentrarsi sul contesto davvero utile, migliorando la precisione della risposta.<\/li>\n\n\n\n<li><strong>Sovrapposizione tra chunk ben calibrata<\/strong>: una buona sovrapposizione evita che concetti importanti vengano tagliati tra due segmenti. Pu\u00f2 essere utile aumentarla per testi normativi complessi e ridurla per testi pi\u00f9 narrativi.<\/li>\n\n\n\n<li><strong>Ricerca ibrida (semantica + keyword)<\/strong>: per una copertura pi\u00f9 completa, si pu\u00f2 combinare la ricerca semantica con una ricerca per parole chiave. Questo approccio \u00e8 particolarmente utile in ambito giuridico, dove il significato e il lessico specifico hanno entrambi valore. LangChain supporta la combinazione di pi\u00f9 meccanismi di retrieval in modo coordinato.<\/li>\n<\/ol>\n\n\n\n<p>Con questi accorgimenti, il tuo vector store diventa pi\u00f9 efficiente, le ricerche pi\u00f9 intelligenti e il sistema complessivamente pi\u00f9 reattivo e affidabile.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x1f4cc; Cosa puoi fare ora con il motore RAG base<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>&#x2705; Puoi caricare copia di documenti di prova nella cartella <code>.\/documenti_legali<\/code><\/p>\n\n\n\n<p>&#x2705; Esegui lo script di base in VS Code con una domanda reale<\/p>\n\n\n\n<p>&#x2705; Verifica la qualit\u00e0 della risposta<\/p>\n\n\n\n<p>&#x2705; Applica uno o pi\u00f9 miglioramenti suggeriti nei paragrafi precedenti (es. prompt personalizzati, aggiunta metadati, ricerca ibrida)<\/p>\n\n\n\n<p>&#x2705; Considera di salvare l\u2019indice FAISS per riutilizzarlo e migliorare la velocit\u00e0<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">&#x2705; Conclusione<\/h3>\n\n\n\n<p>Il sistema RAG locale presentato in questo post rappresenta un semplice e mero esempio, un punto di partenza per comprendere l&#8217;IA applicata al settore legale e sperimentare l&#8217;implementazione di un assistente legale basato sull&#8217;intelligenza artificiale.<\/p>\n\n\n\n<p>\u00c8 semplice, estendibile, e rispettoso delle esigenze di privacy e controllo dei dati.<\/p>\n\n\n\n<p>Ogni parte del codice \u00e8 documentata per consentire agli Avvocati, anche senza esperienza tecnica, di comprendere e personalizzare lo strumento.<\/p>\n\n\n\n<p>Non \u00e8 ovviamente idoneo a un uso professionale.<\/p>\n\n\n\n<p>Nel prossimo post vedremo come migliorare le performance del RAG costruendo prompt intelligenti e su misura per lo studio legale.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright\"><a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-content\/uploads\/2025\/04\/logo-tech.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-content\/uploads\/2025\/04\/logo-tech-150x150.png\" alt=\"\" class=\"wp-image-2760\" srcset=\"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-content\/uploads\/2025\/04\/logo-tech-150x150.png 150w, https:\/\/www.giuseppebriganti.it\/wordpress\/wp-content\/uploads\/2025\/04\/logo-tech-300x300.png 300w, https:\/\/www.giuseppebriganti.it\/wordpress\/wp-content\/uploads\/2025\/04\/logo-tech.png 512w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/a><\/figure><\/div>\n\n\n<p><strong>Per un aiuto e per approfondire<\/strong><\/p>\n\n\n\n<p>Per un aiuto e per approfondire i temi dell\u2019intelligenza artificiale nello studio legale, del&nbsp;<em>legal tech&nbsp;<\/em>e del&nbsp;<em>legal design&nbsp;<\/em>\u00e8 online il GPT&nbsp;<strong><a href=\"https:\/\/chatgpt.com\/g\/g-bGqFiNPWp-iusreporter-tech\" target=\"_blank\" rel=\"noreferrer noopener\">Iusreporter.tech<\/a>&nbsp;<\/strong><em>(link esterno, richiede ChatGPT)<\/em><\/p>\n\n\n\n<p>Per gli altri articoli pubblicati su questo blog sul tema:<br><strong><a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/tag\/ia-e-avvocati\/\">Intelligenza artificiale e Avvocati<\/a><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><em>Scritto con l\u2019aiuto di&nbsp;<a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/iusreporter-it-il-motore-di-ricerca-giuridico\/\">Iusreporter<\/a>, il tuo assistente per la ricerca giuridica online&nbsp;<\/em><\/p>\n\n\n\n<p><a href=\"https:\/\/www.giuseppebriganti.it\/wordpress\/diritto-dellimmigrazione\/\">Studio legale Avvocato Giuseppe Briganti<\/a><\/p>\n\n\n\n<p>Pesaro \u2013 Urbino<\/p>\n\n\n\n<p><em>Post aggiornato alla data di pubblicazione<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">&#x1f4c4; Disclaimer<\/h2>\n\n\n\n<p><em>Gli script Python e i contenuti di questo testo sono forniti esclusivamente a scopo informativo, didattico e sperimentale in ambienti di test controllati. Non costituiscono consulenza legale o tecnica e non sostituiscono il parere di un professionista qualificato.<\/em><\/p>\n\n\n\n<p><em>L\u2019autore declina ogni responsabilit\u00e0 per eventuali errori, omissioni, malfunzionamenti, danni diretti o indiretti, incidentali, consequenziali o di altro tipo derivanti dall\u2019uso, dall\u2019uso improprio o dall\u2019impossibilit\u00e0 di utilizzo degli script o delle informazioni contenute nel presente testo. Gli script sono forniti \u201ccos\u00ec come sono\u201d (AS IS), senza garanzie esplicite o implicite, incluse, ma non limitate a, garanzie di commerciabilit\u00e0, idoneit\u00e0 a uno scopo particolare o assenza di violazioni.<\/em><\/p>\n\n\n\n<p><em>L\u2019utilizzo degli strumenti \u00e8 sotto la piena responsabilit\u00e0 dell\u2019utente, che \u00e8 tenuto a verificarne, in particolare:<\/em><\/p>\n\n\n\n<ul>\n<li><em>la correttezza tecnica e funzionale,<\/em><\/li>\n\n\n\n<li><em>la conformit\u00e0 alle normative vigenti, incluse, a titolo esemplificativo, l&#8217;AI Act, il GDPR, il Codice Deontologico Forense,<\/em><\/li>\n\n\n\n<li><em>il rispetto delle licenze delle librerie e dei componenti e software di terze parti eventualmente utilizzati, inclusi quelli distribuiti con licenze open source.<\/em><\/li>\n<\/ul>\n\n\n\n<p><em>Gli script non sono progettati n\u00e9 validati per l\u2019uso in ambienti produttivi o per l\u2019elaborazione di dati personali. Qualsiasi utilizzo in tali contesti \u00e8 esclusiva responsabilit\u00e0 dell\u2019utente, che deve adottare le opportune misure di sicurezza e valutare l\u2019impatto normativo.<\/em><\/p>\n\n\n\n<p><em>Gli script sono stati testati su Python 3.10 in ambiente Windows. Non \u00e8 garantita la compatibilit\u00e0 con versioni diverse del linguaggio o con altri sistemi operativi. L\u2019autore non fornisce assistenza tecnica, aggiornamenti periodici o correzione dei malfunzionamenti.<\/em><\/p>\n\n\n\n<p><em>Tutti i contenuti di questo ebook, inclusi i testi e il codice sorgente, sono protetti dal diritto d\u2019autore ai sensi della Legge 22 aprile 1941, n. 633 e successive modificazioni. \u00c8 vietata la riproduzione, distribuzione, pubblicazione, comunicazione o modifica, totale o parziale, in qualsiasi forma, dei contenuti senza autorizzazione scritta dell\u2019autore, salvo espressa indicazione contraria.<\/em><\/p>\n\n\n\n<p><em>L\u2019uso di questo testo e degli script in esso contenuti implica l\u2019accettazione integrale del presente disclaimer. Se non si accettano tali condizioni, si prega di non utilizzare il materiale fornito.<\/em><\/p>\n\n\n\n<p><em>Eventuali errori, osservazioni o segnalazioni possono essere comunicati all\u2019autore, che si riserva di valutarli senza alcun obbligo di risposta o correzione.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intelligenza artificiale e Avvocati 9. Implementazione locale di un motore RAG base per studi legali Questo nono post della guida pratica accompagna gli studi legali nell\u2019adozione concreta dell\u2019Intelligenza Artificiale generativa. In particolare, ci concentriamo sull\u2019implementazione in ambiente Windows di un semplice sistema RAG (Retrieval-Augmented Generation) locale di esempio, utilizzando LangChain, FAISS e Ollama. &#x1f3af; Obiettivo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2779,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[190,215,216],"_links":{"self":[{"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/posts\/2777"}],"collection":[{"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/comments?post=2777"}],"version-history":[{"count":9,"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/posts\/2777\/revisions"}],"predecessor-version":[{"id":2935,"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/posts\/2777\/revisions\/2935"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/media\/2779"}],"wp:attachment":[{"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/media?parent=2777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/categories?post=2777"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giuseppebriganti.it\/wordpress\/wp-json\/wp\/v2\/tags?post=2777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}