Corso
Una domanda comune nel mondo dell’AI self-hosted è come chattare con documenti privati senza inviarli a un’API cloud.
AnythingLLM è una risposta diffusa. Gestisce tutto (upload dei documenti, embedding, ricerca e chat) in un’unica interfaccia e si collega a un’ampia gamma di provider LLM. Ti permette di creare workflow di AI privati senza dipendere da servizi cloud.
In questa guida ti spiego cos’è AnythingLLM, ne illustro l’architettura, ti mostro come installarlo con Docker e Ollama e ti mostro una pipeline Retrieval-Augmented Generation (RAG) funzionante. Lo confronterò anche con Open WebUI e ChatGPT.
Che cos’è AnythingLLM?
AnythingLLM è un’applicazione open-source sviluppata da Mintplex Labs sotto licenza MIT. Ha una community attiva su GitHub, rilasci frequenti ed è ampiamente utilizzata nello spazio AI self-hosted.
Cosa fa in pratica: trasforma i tuoi documenti in contesto che un large language model (LLM) può utilizzare durante le conversazioni. Carichi i file, il sistema li elabora e li memorizza, e poi l’LLM può rispondere alle domande basandosi sui tuoi dati. Il progetto è cresciuto rapidamente, con una community Discord attiva e aggiornamenti mensili che aggiungono nuovi provider LLM e funzionalità.
Due cose da capire subito. Primo: AnythingLLM non è di per sé un modello. È un ponte che ti collega a provider LLM esterni, sia locali (come Ollama) che cloud (come OpenAI o Anthropic).
Secondo: la piattaforma organizza tutto in workspace. Pensali come stanze separate per progetti diversi. Ogni workspace ha i propri documenti e conversazioni che restano isolate, a meno che tu non configuri esplicitamente la condivisione.

Interfaccia del workspace di AnythingLLM con documenti. Immagine dell’autore.
AnythingLLM su desktop vs. Docker
L’app desktop (macOS, Windows, Linux) è pensata per singoli utenti che eseguono tutto in locale. Include un motore LLM integrato, un embedder basato su CPU e LanceDB in bundle. Installazione in un clic, nessuna configurazione necessaria.
La versione Docker è pensata per team e server. Aggiunge un controllo degli accessi completo con ruoli Admin, Manager e Default, oltre a widget di chat incorporabili per siti web e white-labeling. Se ti serve accesso di team o widget di chat pubblici, Docker è l’unica opzione.
|
Funzionalità |
Desktop |
Docker |
|
Supporto multi-utente |
No |
Sì (ruoli Admin, Manager, Default) |
|
Motore LLM integrato |
Sì |
No (collegati a provider esterni) |
|
Widget di chat incorporabili |
No |
Sì |
|
White-labeling |
No |
Sì |
|
Complessità di setup |
Installazione in un clic |
Richiede conoscenze di Docker |
Funzionalità principali di AnythingLLM
Ora che sai cos’è AnythingLLM e come scegliere tra Desktop e Docker, vediamo le funzionalità che lo rendono utile per workflow di AI basati sui documenti.
Ingestione dei documenti
Funziona con PDF, DOCX, TXT, Markdown, CSV, XLSX, PPTX, HTML, oltre 50 tipi di file di codice e file audio (usando la trascrizione Whisper). Puoi anche importare contenuti direttamente da repository GitHub, transcript YouTube, pagine Confluence e siti web tramite lo scraper integrato.
Database vettoriale
LanceDB è integrato e non richiede setup. Se ti servono funzionalità enterprise, puoi passare a Chroma, Milvus, Pinecone, Qdrant, Weaviate, Zilliz, AstraDB o PGVector.
Supporto per più LLM
Supporta un’ampia gamma di provider, tra cui Ollama, LM Studio, OpenAI, Anthropic, Azure OpenAI, Google Gemini, AWS Bedrock, Groq e DeepSeek. Scegli i modelli per workspace, così un workspace può usare un modello locale di Ollama per dati sensibili mentre un altro usa GPT-4o tramite OpenAI.
Agent AI
Digita @agent in qualsiasi chat per attivare il builder di agent no-code. Include skill integrate per cercare nei documenti, riassumere e fare web scraping. Agent Flows ti offre una canvas visuale per concatenare chiamate API, istruzioni LLM e operazioni sui file. Supporta anche il Model Context Protocol (MCP) per collegare strumenti esterni.
Accesso API
La developer API è disponibile su /api/docs (documentazione Swagger). Puoi gestire i workspace in modo programmatico, incorporare documenti e inviare messaggi in chat.
Come funziona AnythingLLM (panoramica dell’architettura)
L’applicazione ha tre parti: il frontend (React/ViteJS) fornisce l’interfaccia con cui interagisci. Il server (backend Express) gestisce tutte le interazioni con gli LLM, il lavoro sul database vettoriale e le richieste API. Usa SQLite per memorizzare la configurazione. Il collector è un servizio separato che esegue il parsing e l’elaborazione dei documenti caricati. Quando carichi un PDF, il collector estrae il testo e poi il server lo segmenta, lo embedded e lo memorizza.
La pipeline RAG
La pipeline funziona in due fasi.
Ingestione: i tuoi documenti arrivano al collector, che estrae il testo. Il server poi divide questo testo in chunk (fino a 1.000 caratteri con una piccola sovrapposizione per mantenere il contesto). Ogni chunk viene convertito in un vettore dal modello di embedding e quindi salvato nel database vettoriale. Una cartella vector-cache/ riduce in molti casi re-embedding inutili.
Query: la tua domanda viene convertita in un vettore usando lo stesso modello di embedding. Il sistema cerca quindi i chunk più simili (di solito da quattro a sei). Dopo il filtraggio per punteggio di similarità, il testo corrispondente viene aggiunto al prompt dell’LLM insieme alla tua domanda e alla cronologia della chat. L’LLM legge tutto (istruzioni di sistema, contesto recuperato, tua domanda e messaggi precedenti) e genera la risposta.

Panoramica dell’architettura della pipeline RAG di AnythingLLM. Immagine dell’autore.
Installare AnythingLLM con Docker
Come vedrai nelle FAQ, AnythingLLM è leggero: circa 2 GB di RAM, una CPU a 2 core e circa 5 GB di storage. Eseguire un LLM locale insieme ad esso richiede di più (un modello 7B tipicamente necessita di 8 GB+ di RAM/VRAM). Per questo tutorial uso un modello 3B che funziona su hardware limitato. Assicurati che Docker sia installato e in esecuzione prima di iniziare. Gli utenti Windows necessitano anche di WSL.
Passaggio 1: Installa Ollama e scarica i modelli
Scarica Ollama da ollama.com/download, poi scarica un modello di chat e un modello di embedding:
ollama pull llama3.2:3b
ollama pull nomic-embed-text
ollama serve
Uso llama3.2:3b perché gira bene su macchine con VRAM limitata (come una RTX 3050 con 6 GB). Per una qualità migliore, prova llama3.2:8b o deepseek-r1:7b se l’hardware lo consente. Dai un’occhiata alla nostra guida su eseguire LLM in locale per ulteriori opzioni di modelli.
Passaggio 2: Crea il file Docker Compose
mkdir anythingllm-setup && cd anythingllm-setup
touch .env
Crea docker-compose.yml:
services:
anythingllm:
image: mintplexlabs/anythingllm:latest
container_name: anythingllm
ports:
- "3001:3001"
cap_add:
- SYS_ADMIN
volumes:
- anythingllm_storage:/app/server/storage
- ./.env:/app/server/.env
environment:
- STORAGE_DIR=/app/server/storage
extra_hosts:
- "host.docker.internal:host-gateway"
restart: unless-stopped
volumes:
anythingllm_storage:
Alcune note su questa configurazione. Il flag cap_add: SYS_ADMIN è richiesto per lo scraper web integrato basato su PuppeteerJS, che usa un browser Chromium in sandbox.
La riga extra_hosts risolve il problema di networking Docker più comune: consente al container di raggiungere Ollama in esecuzione sulla tua macchina host. Senza questo, qualsiasi tentativo di connettersi a localhost:11434 dall’interno del container fallirà perché i container Docker hanno il proprio namespace di rete.
Uso un volume Docker nominato (anythingllm_storage) invece di un bind mount per una migliore compatibilità cross-platform, soprattutto su Windows e macOS, dove i permessi dei bind mount possono creare problemi.
Passaggio 3: Avvio e configurazione
Attendi circa 30 secondi per l’inizializzazione del container, poi apri http://localhost:3001. Vedrai la procedura guidata di primo avvio. Ma prima, esegui questo comando:
docker compose up -d

Procedura guidata iniziale di AnythingLLM su Docker. Immagine dell’autore.
Durante la procedura guidata, seleziona Ollama sia come LLM che come provider di embedding, imposta la base URL su http://host.docker.internal:11434, scegli llama3.2:3b come modello di chat e nomic-embed-text come embedder. Mantieni LanceDB come database vettoriale predefinito.
Per l’alternativa Desktop, scarica l’app da anythingllm.com. Include tutto il necessario e funziona subito senza configurazioni. È ideale per uso personale ma, come accennato prima, manca delle funzionalità multi-utente ed enterprise disponibili su Docker.
Collegare i provider LLM
Oltre a Ollama, puoi collegare provider cloud tramite Settings (come indicato nella FAQ 1, utile se il tuo hardware è limitato).
OpenAI
Scegli OpenAI come provider LLM, inserisci la tua API key da platform.openai.com e scegli un modello (GPT-4o, GPT-4o-mini, ecc.). Il tuo account deve avere la fatturazione attiva, altrimenti non funzionerà (e il messaggio di errore non sarà chiaro).
Anthropic
Inserisci la tua chiave da console.anthropic.com. Tutti i modelli Claude funzionano per la chat, ma Anthropic non ha modelli di embedding, quindi ti serve comunque un embedder separato come nomic-embed-text di Ollama.
Configurazione di Ollama
Se hai configurato Ollama durante l’installazione come mostrato sopra, sei già a posto. Per altri setup, usa http://host.docker.internal:11434 su Windows/macOS, o http://172.17.0.1:11434 su Linux. Se Ollama non è raggiungibile, imposta OLLAMA_HOST=0.0.0.0:11434 prima di avviarlo.
Usare AnythingLLM per chattare sui documenti
Clicca “New Workspace” nella barra laterale e assegnagli un nome. Carica i file usando il pulsante nella barra laterale o tramite drag-and-drop.
AnythingLLM supporta due modalità per i documenti. Attach (trascinare nella chat) inserisce il testo completo nella conversazione, ma solo per quel thread specifico. Il modello vede tutto, ma sei limitato dalla capacità di token. Embedding (l’approccio RAG standard) suddivide il documento in chunk, li converte in vettori e li salva nel workspace. Una volta eseguito l’embedding, i documenti funzionano in tutte le chat di quel workspace. Nella maggior parte dei casi, l’embedding è la scelta migliore. Clicca “Move to Workspace” per avviare il processo di embedding.
Ottimizzare la qualità del retrieval
Scrivi la tua domanda e il sistema trova automaticamente i chunk pertinenti e li invia all’LLM. Se le risposte non sono buone, ecco le impostazioni chiave da regolare:
Soglia di similarità
Come indicato nella FAQ 5, inizia con “No Restriction” se riscontri problemi, poi alzala gradualmente per filtrare il rumore.
Numero massimo di snippet di contesto
L’impostazione predefinita è da quattro a sei chunk. Aumenta a 10 o 12 per modelli con finestre di contesto ampie come Claude.
Preferenza di ricerca
“Accuracy Optimized” su LanceDB attiva il reranking, che migliora i risultati ma può aggiungere latenza a seconda del modello e dell’hardware.
Blocco dei documenti
Blocca i documenti critici per saltare del tutto il chunking. Il testo completo viene aggiunto a ogni query (se rientra nei limiti di token).
AnythingLLM vs. Open WebUI
Entrambi gli strumenti sono validi, ma sono pensati per utent i diversi.
|
Dimensione |
AnythingLLM |
Open WebUI |
|
Pubblico principale |
Utenti business, piccoli team |
Sviluppatori, utenti tecnici |
|
App desktop |
Sì (macOS, Windows, Linux) |
No (solo web) |
|
Complessità di setup |
Desktop: un clic; Docker: lineare |
Richiede Docker o setup server |
|
Implementazione RAG |
Integrata con supporto multi-vector DB, reranking |
RAG esteso, estendibilità basata su plugin |
|
Multi-utente |
Solo Docker; tre ruoli RBAC |
Funzionalità di collaborazione limitate |
|
Ecosistema di plugin |
In crescita; skill personalizzate via Node.js |
Più maturo ed esteso |
|
Licenza |
MIT |
BSD-3-Clause modificata con protezione del brand dalla v0.6.6 |
AnythingLLM tende a calzare per i team che danno priorità alla gestione dei workspace e ai widget incorporabili, mentre Open WebUI è più adatto a chi vuole un ecosistema di plugin più ampio e maggiore estendibilità orientata agli sviluppatori. Alcuni team usano entrambi: Open WebUI per i dev che vogliono controllo fine, e AnythingLLM per gli utenti business che hanno bisogno di workspace sui documenti rapidi.
AnythingLLM vs. ChatGPT
Questo confronto riguarda le priorità, non quale strumento sia "migliore".
|
Dimensione |
AnythingLLM |
ChatGPT |
|
Privacy dei dati |
Pieno controllo con modelli locali |
Dati inviati ai server OpenAI |
|
Costo |
Gratis (self-hosted); cloud da $50/mese |
Piano gratuito; Plus $20/mese; Pro $200/mese |
|
Personalizzazione |
Qualsiasi LLM, embedder, vector DB, agent |
Limitato ai modelli OpenAI |
|
Funzionamento offline |
Sì (con modelli locali) |
No |
|
Sforzo di setup |
Richiede installazione |
Nessun setup, via browser |
|
Chat sui documenti |
Controllo RAG completo (soglie, chunking, reranking) |
Upload di file con limiti d’uso |
ChatGPT punta su un’esperienza completamente ospitata e su un’alta qualità del modello di default, mentre AnythingLLM privilegia privacy, flessibilità e controllo sulle impostazioni RAG. Puoi anche collegare GPT-4o ad AnythingLLM tramite l’API OpenAI. In questo modo ottieni la qualità dei modelli di ChatGPT con le funzionalità di workspace e RAG di AnythingLLM.
Casi d’uso di AnythingLLM
Ecco dove AnythingLLM dà il meglio:
Basi di conoscenza interne
I dipendenti possono fare domande sui documenti aziendali invece di cercare tra le cartelle. Carica policy, procedure e documentazione, poi lascia che le persone cerchino in linguaggio naturale.
Workflow di ricerca
Gli accademici possono cercare all’istante tra centinaia di articoli. Esegui l’embedding della tua libreria di ricerca e fai emergere risultati pertinenti senza ricerche manuali per keyword.
Deployment enterprise privati
Sanità, finanza e team legali possono usare l’AI mantenendo tutti i dati sui propri server. Comune nei settori regolamentati in cui i dati devono restare on-premise.
Test per sviluppatori
Prova diversi LLM (Ollama, OpenAI, Claude) sugli stessi documenti cambiando modello per workspace. Nessuna modifica all’infrastruttura richiesta.
Widget di chat per i clienti
Incorpora un’interfaccia di chat sul tuo sito con Docker. Configura allowlist di domini e limiti per sessione per l’uso pubblico.
Trascrizione delle riunioni
La funzione Meeting Assistant funziona come gli strumenti di note in cloud ma gira in locale. Per funzionare in modo fluido servono circa 16 GB di RAM.
Limitazioni
Come discusso, Desktop e Docker hanno funzionalità diverse, cosa che può confondere i nuovi utenti.
La qualità del RAG richiede messa a punto (ho già coperto le impostazioni principali) perché la ricerca per similarità è basata sulla matematica e non comprende davvero il significato.
Il sistema di plugin è più piccolo rispetto a quello di Open WebUI e creare skill personalizzate per gli agent richiede conoscenza di Node.js.
Infine, non c’è un fine-tuning integrato. Puoi personalizzare solo tramite system prompt, temperatura e limiti di token.
Sicurezza e privacy in AnythingLLM
Un deployment locale mantiene tutti i dati sul tuo dispositivo. (Ho più dettagli nella terza FAQ qui sotto.) Quando usi provider cloud, solo i prompt e il contesto recuperato vengono inviati durante l’inferenza. Vettori ed embedding restano sul tuo server. Sii intenzionale nel decidere quali workspace usano modelli cloud e quali locali.
La versione Docker include Simple SSO tramite SIMPLE_SSO_ENABLED, che crea token di accesso temporanei. Le API key danno accesso completo senza permessi granulari, quindi trattale come password admin e cambiale regolarmente. Se esponi AnythingLLM a internet, metti davanti un reverse proxy Nginx con SSL (l’app non gestisce l’HTTPS da sola). Puoi disabilitare la telemetria con DISABLE_TELEMETRY=true nel file .env.
Conclusione
AnythingLLM risolve un problema reale nello spazio AI self-hosted. Ti offre un’interfaccia per chattare con i tuoi documenti, si connette a quasi qualsiasi provider LLM e mantiene il controllo dei dati nelle tue mani. Come detto, scegli Desktop per l’uso personale o Docker per i deployment di team.
Come ogni strumento, ha dei trade-off. La qualità del RAG dipende da come lo configuri e le differenze di funzionalità tra Desktop e Docker possono confondere i nuovi utenti.
Come prossimo passo, dai un’occhiata al nostro percorso AI Fundamentals o al tutorial su creare AI locali con Docker e n8n.
Sono un data engineer e community builder: lavoro su pipeline dati, cloud e strumenti di AI, e scrivo tutorial pratici e ad alto impatto per DataCamp e per sviluppatori alle prime armi.
FAQ
Posso eseguirlo sul mio vecchio laptop senza GPU?
Sì! AnythingLLM in sé è leggero: circa 2 GB di RAM, una CPU a 2 core e circa 5 GB di storage. La parte pesante è eseguire l’LLM in locale tramite Ollama. Se il tuo hardware è limitato, collega invece un provider cloud come OpenAI o Groq. Ottieni le stesse funzionalità di workspace e RAG, ma l’inferenza avviene nel cloud. In altre parole, AnythingLLM gestisce il workflow e tu scegli se il modello gira in locale o nel cloud.
Cosa succede se in seguito cambio database vettoriale?
Pianifica in anticipo. Non c’è migrazione automatica tra database vettoriali. Passare da LanceDB a Pinecone significa rifare l’embedding di tutti i documenti. I tuoi file originali restano al sicuro, ma i vettori vanno rigenerati. Nota pratica: resta su LanceDB a meno che tu non abbia un’esigenza enterprise specifica. È in genere a bassa configurazione e adatto a molti deployment per piccoli team.
I miei dati sono davvero privati se uso OpenAI come LLM?
Il punto chiave è questo: i tuoi documenti e gli embedding non lasciano mai il tuo server. Ma quando fai domande, i chunk di testo recuperati e il tuo prompt vengono inviati all’API di OpenAI per l’inferenza. Per dati davvero sensibili, usa invece Ollama. Tutto resta in locale. Per documenti di lavoro generici, AnythingLLM con OpenAI è comunque più privato che caricare file direttamente su ChatGPT.
Il mio team può condividere un’unica installazione di AnythingLLM?
Sì, ma solo con la versione Docker. Supporta il multi-utente con tre ruoli: Admin, Manager e Default. L’app Desktop è solo per singolo utente. Importante: la modalità multi-utente è pensata come modifica di configurazione one-way. Decidi se ti serve l’accesso di team prima di abilitarla.
Perché a volte ignora i miei documenti quando risponde?
Di solito per tre motivi: soglia di similarità troppo alta, query vaghe o documenti non in inglese con l’embedder inglese predefinito. Soluzione rapida: prova prima “No Restriction” per la soglia. Se i tuoi documenti non sono in inglese, passa a un modello di embedding multilingue disponibile in Ollama (ad esempio uno dei modelli basati su e5) per risultati molto migliori.


