Far leggere un decreto legislativo all'AI: pipeline da .docx a Word
Mi è arrivato un decreto legislativo da 270 KB in formato .docx con 26 articoli e centinaia di reati richiamati, da mappare sui processi aziendali. Ho costruito una pipeline che lo macina dall'estrazione XML al documento Word finale.
In una PMI manifatturiera del Nordest il management mi gira un .docx da 270 KB: l'elenco aggiornato dei reati previsti dal D.Lgs. 231/01, ventisei articoli del decreto e dentro ciascuno da uno a quindici reati presupposto richiamati. La domanda è semplice e fastidiosa: per ogni reato, in quali processi aziendali si potrebbe configurare, e abbiamo già procedure interne che lo coprono?
Una mappatura manuale onesta sono due giorni di lavoro. Il punto è che il primo strato — struttura, ipotesi di rischio, riconciliazione con le procedure esistenti — è esattamente il tipo di lavoro in cui l'AI è utile, purché le si dia il contesto giusto.
Step uno, estrazione del testo. Un .docx è uno zip con XML dentro, non serve Word per leggerlo:
[System.IO.Compression.ZipFile]::ExtractToDirectory($docxPath, $tempDir)
$xml = [xml](Get-Content "$tempDir\word\document.xml" -Raw)
$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")
$xml.SelectNodes("//w:p", $ns) |
ForEach-Object { ($_.SelectNodes(".//w:t", $ns) | % { $_.InnerText }) -join "" } |
Where-Object { $_.Trim() } | Out-File $txtPath -Encoding utf8
In tre comandi ho 1.900 righe di testo lavorabile.
Step due, indice navigabile. Un grep mirato sui pattern degli articoli mi dà la mappa con i numeri di riga:
grep -nE "^\d+\.?\s*Art\.\s*\d+" elenco_reati.txt
Questo sommario è l'ancoraggio che do all'AI per evitare che si perda nel documento.
Step tre, contesto reale dall'azienda. È il dettaglio che fa la differenza. Il sistema documentale interno ha due tabelle (documenti_procedure e documenti_istruzioni_operative) con i flag dei reparti coinvolti — acquisti, produzione, qualità, verniciatura, magazzino. Una query mi dice quali procedure esistono davvero. Senza questo passo l'AI inventa procedure plausibili ma fantasma: un Modello 231 popolato da PR-IT-XX mai scritte serve a poco.
Step quattro, generazione strutturata. Contesto aziendale (settore, posizionamento B2B, organigramma reale) + testo normativo + indice articoli → output Markdown gerarchico: per ogni articolo del decreto, livello di rischio motivato, fattispecie concreta calata sul business, procedure esistenti vs da redigere. Per le aree sensibili (sicurezza sul lavoro, ambiente, reati tributari) allegati di dettaglio reato-per-reato. Per le aree non significative (terrorismo, beni culturali, mutilazioni, frode sportiva) giudizio sintetico con motivazione di esclusione.
Step cinque, output consegnabile. Il consulente esterno vuole un Word, non un Markdown. PowerShell 7 ha ConvertFrom-Markdown nativo, Word ha un'interfaccia COM:
$html = (ConvertFrom-Markdown -Path $mdPath).Html
# wrap in <html> con CSS inline per tabelle e heading
$word = New-Object -ComObject Word.Application
$doc = $word.Documents.Open($htmlPath)
$doc.SaveAs([ref]$docxPath, [ref]16) # wdFormatDocumentDefault = .docx
Output: 79 KB di Word pulito, tabelle formattate, gerarchia titoli, zero artefatti HTML.
Due ore al posto di due giorni. L'AI non sostituisce il consulente 231 — il giudizio sui rischi specifici, l'applicazione della giurisprudenza recente, la difesa nelle ispezioni restano lavoro umano. Ma le consegno un punto di partenza già allineato all'azienda reale, non un boilerplate generico. Il pattern è replicabile per qualunque normativa lunga: decreti legislativi, capitolati, norme tecniche UNI/ISO. Quando il documento è strutturato, l'AI è bravissima a strutturarlo ancora meglio.