{"id":2174,"date":"2026-05-27T12:52:54","date_gmt":"2026-05-27T10:52:54","guid":{"rendered":"https:\/\/userbot.ai\/blog\/?p=2174"},"modified":"2026-05-27T12:52:55","modified_gmt":"2026-05-27T10:52:55","slug":"le-immagini-nei-documenti-ocr-embeddings-e-limiti","status":"publish","type":"post","link":"https:\/\/userbot.ai\/blog\/le-immagini-nei-documenti-ocr-embeddings-e-limiti\/","title":{"rendered":"Come leggiamo le immagini nei documenti: OCR, embeddings e limiti reali"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Leggere un PDF<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quando si parla di document processing in un contesto AI, la maggior parte delle persone pensa a una semplice estrazione di testo. La realt\u00e0 \u00e8 molto diversa: i documenti contengono tabelle sotto forma di immagini, grafici, diagrammi, loghi decorativi e layout complessi che un parser testuale non pu\u00f2 nemmeno vedere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In questo articolo raccontiamo come abbiamo costruito una pipeline di document processing che combina OCR, modelli vision e post-processing intelligente, e soprattutto dove abbiamo incontrato i limiti reali di queste tecnologie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>L&#8217;architettura: estrazione e strutturazione del documento<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il cuore della nostra pipeline \u00e8 un sistema di componenti OCR e di layout analysis che trasforma i PDF in una rappresentazione pi\u00f9 strutturata, separando testo, immagini e tabelle. Questo processo richiede risorse computazionali dedicate, ma \u00e8 il presupposto necessario per integrare effettivamente immagini e tabelle nelle risposte dei nostri Agenti AI.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"716\" height=\"502\" src=\"https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-27-alle-12.47.27.png\" alt=\"esempio di document processing per le immagini\" class=\"wp-image-2266\" srcset=\"https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-27-alle-12.47.27.png 716w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-27-alle-12.47.27-300x210.png 300w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-27-alle-12.47.27-542x380.png 542w\" sizes=\"auto, (max-width: 716px) 100vw, 716px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo insieme come le cose si fanno interessanti.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Il problema delle immagini: non tutto ci\u00f2 che \u00e8 immagine \u00e8 utile<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Durante l&#8217;estrazione, vengono individuate <em>tutte<\/em> le immagini dal PDF. Ma in un documento tipico, la maggior parte delle &#8220;immagini&#8221; sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>indicatori di layout (linee, separatori)<\/li>\n\n\n\n<li>icone decorative<\/li>\n\n\n\n<li>loghi ripetuti in header\/footer<\/li>\n\n\n\n<li>artefatti grafici senza valore informativo<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"655\" src=\"https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-1200x655.png\" alt=\"\" class=\"wp-image-2251\" srcset=\"https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-1200x655.png 1200w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-300x164.png 300w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-768x419.png 768w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-542x296.png 542w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-1084x591.png 1084w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-792x432.png 792w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p-1230x671.png 1230w, https:\/\/userbot.ai\/blog\/wp-content\/uploads\/2026\/05\/Gemini_Generated_Image_9x8pgk9x8pgk9x8p.png 1408w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tenere tutte queste immagini ha un costo: occupano spazio, confondono i modelli di embedding downstream, e rallentano il processing. Passare ogni immagine al modello di embedding cos\u00ec com&#8217;\u00e8, quindi, non \u00e8 una strategia sostenibile: \u00e8 costoso, lento e introduce rumore nel knowledge base. Avevamo bisogno di un sistema che capisse per ogni immagine, se vale la pena tenerla, e se s\u00ec, come trattarla.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>La soluzione: filtro <\/strong>visuale intelligente<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo costruito un sistema di post-processing che usa modelli multimodali per classificare ogni immagine estratta. Il modello riceve l&#8217;immagine e il testo circostante, e deve rispondere a tre domande precise:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. <strong>\u00c8 un artefatto di layout?<\/strong> Questa domanda serve a scartare subito tutto ci\u00f2 che non porta informazione reale: linee divisorie, frecce decorative, loghi ripetuti in ogni pagina, icone di navigazione. Un&#8217;immagine classificata come artefatto viene eliminata prima ancora di generare una descrizione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. <strong>\u00c8 una tabella?<\/strong> Questa classificazione innesca un percorso di trattamento completamente diverso. Le tabelle non possono essere gestite come immagini generiche: il loro valore sta nella struttura, nelle relazioni tra righe e colonne, nei dati che contengono. Se il modello riconosce una tabella, quella immagine non viene descritta a parole, bens\u00ec il suo contenuto viene ricostruito in modo strutturato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. <strong>Qual \u00e8 la descrizione?<\/strong> Per tutte le immagini che non sono artefatti n\u00e9 tabelle &#8211; grafici, diagrammi, screenshot, infografiche &#8211; il modello genera un breve riassunto del contenuto visivo. Questa descrizione diventa il punto di accesso all&#8217;immagine per i sistemi di retrieval. La qualit\u00e0 di questa risposta determina direttamente la qualit\u00e0 del retrieval downstream.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Il contesto \u00e8 tutto<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un&#8217;immagine senza contesto \u00e8 ambigua. Un grafico a torta potrebbe essere irrilevante o fondamentale, dipende da cosa dice il testo intorno. Per questo, per ogni immagine il modello vision riceve anche il testo che la circonda nel documento, usato come contesto per produrre una descrizione pi\u00f9 accurata e coerente con il contenuto complessivo.<br><br>Questo approccio ha un side-effect positivo: la descrizione generata usa la stessa lingua del documento, perch\u00e9 il contesto &#8220;ancora&#8221; il modello al linguaggio corretto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tuttavia non c&#8217;\u00e8 nessuna garanzia che la posizione dell&#8217;immagine sia effettivamente vicino al testo a cui fa riferimento e questo avr\u00e0 effetti negativi downstream.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Tabelle: il caso pi\u00f9 insidioso<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le tabelle sono il nemico numero uno dell&#8217;OCR tradizionale. I sistemi di layout detection le riconoscono come immagini, ma il testo al loro interno viene perso. La nostra soluzione \u00e8 un secondo passaggio in cui un modello vision ricostruisce la struttura della tabella in formato testuale strutturato, che viene poi reinserito nel documento elaborato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo \u00e8 un <strong>game-changer per la qualit\u00e0 del testo finale<\/strong>: le tabelle diventano ricercabili, <em>embeddable<\/em> e comprensibili da un LLM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tuttavia tabelle molto complesse (merge di celle, tabelle nested, layout non standard, o una tabella composta da immagini) rimangono problematiche. Il modello a volte inventa dati o perde l&#8217;allineamento delle colonne. Non c&#8217;\u00e8 una soluzione perfetta, solo mitigazione.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Embeddings: come si &#8220;vettorializza&#8221; un&#8217;immagine<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le immagini ritenute valide vengono salvate con la loro descrizione testuale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Perch\u00e9 \u00e8 importante? I modelli di embedding testuale che usiamo per il RAG non possono &#8220;vedere&#8221; le immagini, ma possono leggere le descrizioni associate. La descrizione generata dal modello vision, insieme alla sua posizione all&#8217;interno del testo, diventano <strong>il ponte tra mondo visuale e mondo vettoriale<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La qualit\u00e0 dell&#8217;embedding, quindi, dipende interamente dalla qualit\u00e0 della descrizione. Una descrizione generica (&#8220;un grafico&#8221;) \u00e8 quasi inutile. Una descrizione ricca (&#8220;grafico a barre che confronta revenue Q1 vs Q2, mostrando un incremento del 23%&#8221;) \u00e8 oro per il retrieval.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>I limiti reali che abbiamo incontrato<\/strong><\/h2>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>1. Tempi di processing<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Il processing di documenti complessi richiede tempo: l&#8217;estrazione, la classificazione visuale e la ricostruzione delle tabelle sono fasi sequenziali, ognuna con il proprio peso. Per documenti lunghi o ricchi di immagini, il tempo totale pu\u00f2 essere significativo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2. Errori del modello vision<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">I modelli multimodali non sono infallibili: a volte classificano come &#8220;invalide&#8221; immagini che contengono informazioni utili, altre creano descrizioni che possono essere troppo generiche o contenere allucinazioni, altre ancora le tabelle ricostruite possono avere errori di allineamento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Insomma, come tutte le volte che si usa un modello AI, i risultati non possono per loro natura essere deterministici ed avere il 100% di precisione e accuratezza.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. <strong>La catena di errori<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Ogni step della pipeline pu\u00f2 introdurre errori che si propagano: se l&#8217;estrazione del layout non \u00e8 precisa, le immagini risultano tagliate male; se il filtro visuale scarta un&#8217;immagine importante, l&#8217;informazione viene persa; se la descrizione \u00e8 inaccurata, gli embedding sono di bassa qualit\u00e0 e il retrieval peggiora. La qualit\u00e0 finale \u00e8 il prodotto di tutte le probabilit\u00e0 di successo di ogni step.<\/p>\n\n\n\n<h4 id=\"scalabilita-GPU-document-processing\" class=\"wp-block-heading\"><strong>4. Scalabilit\u00e0<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Il processing di documenti complessi richiede un equilibrio tra qualit\u00e0, performance e sostenibilit\u00e0 operativa. Non \u00e8 un servizio che si pu\u00f2 semplicemente &#8220;tenere sempre acceso&#8221;: le risorse computazionali devono essere allocate in modo intelligente, bilanciando velocit\u00e0 di risposta ed efficienza complessiva. <br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cosa abbiamo imparato<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>L&#8217;OCR da solo non basta<\/strong>: servono modelli vision per capire <em>cosa<\/em> c&#8217;\u00e8 nelle immagini e se vale la pena tenerle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Il contesto salva la qualit\u00e0<\/strong>: passare il testo circostante al modello vision migliora drasticamente le descrizioni. Ma attenzione: un documento non progettato per essere indicizzato semanticamente produrr\u00e0 comunque risultati limitati.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le tabelle richiedono un trattamento speciale<\/strong>: non puoi trattarle come immagini normali n\u00e9 come testo OCR. Serve un passaggio dedicato.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusione<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Leggere immagini nei documenti nel 2026 \u00e8 ancora un problema aperto. Non esiste una soluzione end-to-end che funzioni sempre. Abbiamo sviluppato un approccio che combina estrazione documentale, analisi visuale e post-processing intelligente, con l&#8217;obiettivo di rendere i contenuti pi\u00f9 accessibili ai sistemi AI; consapevoli che ogni componente ha i propri limiti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il consiglio pi\u00f9 onesto che posso dare: <strong>non bisogna cercare di adattare i docuemnti esistenti al retrieval, ma bisogna produrre documenti pensati din dall&#8217;inizio per la ricerca semantica. <\/strong>La nostra soluzione \u00e8 un buon punto di partenza, per permettere di utilizzare documenti pre-esistenti, ma non pu\u00f2 essere il punto di arrivo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<style>\n  .ub4 {\n    font-family: 'Inter', -apple-system, sans-serif;\n    background: #0d1b3e;\n    background-image: radial-gradient(ellipse at 70% 30%, #122b6b 0%, #0d1b3e 70%);\n    border-radius: 16px;\n    padding: 44px 48px;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    text-align: center;\n    position: relative;\n    overflow: hidden;\n    max-width: 520px;\n    margin: 8px auto;\n  }\n  .ub4-deco1 {\n    position: absolute; top: -80px; right: -80px;\n    width: 260px; height: 260px; border-radius: 50%;\n    background: rgba(62,174,255,0.07); pointer-events: none;\n  }\n  .ub4-deco2 {\n    position: absolute; bottom: -60px; left: -60px;\n    width: 200px; height: 200px; border-radius: 50%;\n    background: rgba(62,174,255,0.05); pointer-events: none;\n  }\n  .ub4-icon {\n    width: 48px; height: 48px;\n    background: rgba(62,174,255,0.12);\n    border: 1.5px solid rgba(62,174,255,0.28);\n    border-radius: 12px;\n    display: flex; align-items: center; justify-content: center;\n    margin-bottom: 20px;\n    position: relative;\n  }\n  .ub4-eyebrow {\n    font-size: 11px; font-weight: 600;\n    letter-spacing: 0.13em; text-transform: uppercase;\n    color: #3EAEFF;\n    margin-bottom: 10px;\n    position: relative;\n  }\n  .ub4-title {\n    font-size: 24px; font-weight: 700;\n    color: #ffffff;\n    line-height: 1.3; margin-bottom: 10px;\n    position: relative;\n  }\n  .ub4-sub {\n    font-size: 15px;\n    color: rgba(255,255,255,0.62);\n    line-height: 1.6;\n    margin-bottom: 28px;\n    position: relative;\n  }\n  .ub4-btn {\n    display: inline-flex !important;\n    visibility: visible !important;\n    opacity: 1 !important;\n    align-items: center;\n    gap: 8px;\n    background: #3EAEFF !important;\n    color: #ffffff !important;\n    font-size: 15px;\n    font-weight: 700;\n    padding: 15px 36px;\n    border-radius: 10px;\n    border: none;\n    cursor: pointer;\n    white-space: nowrap;\n    font-family: inherit;\n    position: relative;\n    z-index: 10;\n    box-shadow: 0 0 0 3px rgba(62,174,255,0.3);\n  }\n  .ub4-btn:hover {\n    background: #2298f0 !important;\n    transform: translateY(-1px);\n  }\n  .ub4-btn:active { transform: scale(0.98); }\n<\/style>\n\n<div class=\"ub4\" role=\"complementary\" aria-label=\"Banner demo Userbot\">\n  <div class=\"ub4-deco1\"><\/div>\n  <div class=\"ub4-deco2\"><\/div>\n\n  <div class=\"ub4-icon\">\n    <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\">\n      <rect x=\"2\" y=\"5\" width=\"18\" height=\"13\" rx=\"3\" stroke=\"#3EAEFF\" stroke-width=\"1.6\"><\/rect>\n      <path d=\"M7 9h8M7 12.5h5\" stroke=\"#3EAEFF\" stroke-width=\"1.6\" stroke-linecap=\"round\"><\/path>\n      <circle cx=\"17\" cy=\"4\" r=\"3\" fill=\"#3EAEFF\"><\/circle>\n    <\/svg>\n  <\/div>\n\n  <div class=\"ub4-eyebrow\">Scopri Userbot<\/div>\n  <div class=\"ub4-title\">Pronto a scoprire come<br>possiamo aiutarti?<\/div>\n  <div class=\"ub4-sub\">Richiedi una demo gratuita o contattaci:<br>il nostro team \u00e8 a tua disposizione.<\/div>\n\n  <a href=\"https:\/\/userbot.typeform.com\/to\/ctnyuoTq?_gl=1*jrn3dk*_gcl_au*NDU3NjU4NTAwLjE3NzI3MTc1Mzg.&amp;typeform-embed=popup-classic&amp;typeform-source=userbot.ai&amp;typeform-medium=embed-sdk&amp;embed-hide-headers=true&amp;typeform-embed-id=qjr2w\" target=\"_blank\" class=\"ub4-btn\">\n\n  <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\n    <path d=\"M2 8h10M8 4l4 4-4 4\" stroke=\"#ffffff\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\n\n  <\/svg>\n\n  Contattaci\n\n<\/a>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"Leggere un PDF Quando si parla di document processing in un contesto AI, la maggior parte delle persone&hellip;","protected":false},"author":9,"featured_media":2247,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"csco_display_header_overlay":false,"csco_singular_sidebar":"","csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_reading_time":"","csco_page_toc_navigation":"","csco_post_video_location":[],"csco_post_video_location_hash":"","csco_post_video_url":"","csco_post_video_bg_start_time":0,"csco_post_video_bg_end_time":0,"csco_post_video_bg_volume":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2174","post","type-post","status-publish","format-standard","has-post-thumbnail","category-senza-categoria","cs-entry","cs-video-wrap"],"_links":{"self":[{"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/posts\/2174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/comments?post=2174"}],"version-history":[{"count":16,"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/posts\/2174\/revisions"}],"predecessor-version":[{"id":2269,"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/posts\/2174\/revisions\/2269"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/media\/2247"}],"wp:attachment":[{"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/media?parent=2174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/categories?post=2174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/userbot.ai\/blog\/wp-json\/wp\/v2\/tags?post=2174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}