Nelle applicazioni 4D, i documenti di grandi dimensioni sono comuni: relazioni finanziarie, linee guida interne, manuali tecnici… La ricerca di una parola chiave esatta spesso non è sufficiente. Scorrere rapporti di 30 pagine per trovare un paragrafo non solo richiede molto tempo, ma è anche soggetto a errori. È qui che l’intelligenza artificiale può aiutare.
L’approccio semantico basato sui vettori, introdotto in 4D 20 R10, consente già di trovare un documento 4D Write Pro pertinente anche quando vengono utilizzate parole diverse (ad esempio, “inserire immagine” rispetto a “aggiungere immagine”).
Ma cosa succede quando un documento si estende su più pagine e copre vari argomenti? Anche se l’intero testo può essere convertito in un unico vettore, spesso i risultati sono migliori se si lavora su una scala più fine. È questa l’idea alla base del chunking: dividere un documento in segmenti coerenti, ciascuno rappresentato da un proprio vettore.
È proprio questo che ci permette di andare oltre: recuperare non solo il documento giusto, ma anche il passaggio esatto che corrisponde alla ricerca.
Dividere per cercare meglio: la strategia del chunking
Invece di indicizzare un intero documento come un unico vettore, lo dividiamo in segmenti coerenti (chunks), in genere un paragrafo o un blocco di 400-800 caratteri.
Ogni chunk viene memorizzato con
- un identificatore unico del chunk,
- l’identificatore del documento
- la sua posizione nel testo (startOffset, endOffset), utilizzata per un’evidenziazione precisa,
- il suo incorporamento vettoriale,
- e, facoltativamente, un breve estratto di testo per una rapida verifica.
Questo livello di granularità apre nuove possibilità:
- Ricerca più precisa,
- Selezione diretta del passaggio pertinente,
- Evidenziazione contestuale in 4D Write Pro.
Flusso di lavoro illustrato: Dalla ricerca all’evidenziazione automatica
Ecco come si svolge il processo di ricerca dal punto di vista dell’utente:
1. Interrogazione dell’utente
L’utente inserisce un testo (ad esempio, formazione professionale) e avvia una ricerca di documenti.
2. Ricerca vettoriale
Il testo viene vettorializzato e confrontato con le incorporazioni memorizzate. Il sistema restituisce i k chunk più vicini (ad esempio, docID=42, chunkID=3, startOffset=1200, endOffset=1600).
3. Visualizzazione dei paragrafi rilevanti
L’applicazione mostra un elenco di paragrafi rilevanti, insieme al nome del documento e allo snippet.
4. Visualizzazione automatica e selezione del paragrafo
Facendo clic su un estratto dell’elenco, l’utente viene reindirizzato al documento completo e vede il passaggio evidenziato, circondato dai paragrafi vicini. Grazie agli offset del testo memorizzati, è possibile selezionare la parte esatta del documento.
Perché questo approccio è efficace
- Prestazioni: le incorporazioni sono più accurate su brevi frammenti che su un testo intero.
- Esperienza utente: l’utente viene portato direttamente al passaggio di interesse, risparmiando tempo ed evitando di scorrere decine di pagine.
- Flessibilità: il chunking può essere regolato (dimensione fissa, per paragrafo, con o senza sovrapposizione del 10-15%).
- Scalabilità: questo metodo funziona in modo efficiente anche con centinaia o migliaia di documenti.
Dettagli tecnici
Un database dimostrativo illustra questa funzione utilizzando diversi documenti di 4D Write Pro.
1. Suddivisione di un documento in pezzi
Ogni chunk corrisponde a un intervallo di testo all’interno di un documento.
Per ogni chunk, memorizziamo:
- il suo embedding vettoriale: embedding,
- il suo riferimento al documento: ID_Documento,
- un identificatore univoco: ID,
- i suoi confini di testo: startOffset, endOffset.

Quando si salva un documento 4D Write Pro, 4D calcola i diversi vettori che compongono il documento:
$colRange:=WP Get elements($doc.WP; wk type paragraph)
// For each paragraph, create a chunk
For each ($paragraph; $colRange)
$chunk :=ds.Chunk.new()
$chunk .ID_Document:=$doc.ID
$chunk .startOffset:=WP Paragraph range($paragraph).start
$chunk.endOffset:=WP Paragraph range($paragraph).end
$chunk.textExtract:=WP Get text($paragraph)
// Generate vector embedding using AIManagement
$chunk .embedding:=cs.AIManagement.new($apiKey).generateVector($chunk.textExtract)
$chunk .save()
End for each
2. Ricerca vettoriale all’interno dei chunk
Confrontiamo il prompt dell’utente con tutti i vettori della tabella Chunk:
// Generate a vector from the custom prompt using the AIManagement class
var $vector:=cs.AIManagement.new($apiKey).generateVector($prompt)
// Sort entity by cosine similarity
return ds.Chunk.all().orderByFormula(Formula(This.embedding.cosineSimilarity($vector)); dk descending).slice(0; 5)
Limitiamo i risultati ai cinque paragrafi più rilevanti.
3. Selezionare il paragrafo trovato in 4D Write Pro
Quando l’utente seleziona un passaggio nella casella di riepilogo, 4D visualizza il documento nell’area 4D Write Pro ed evidenzia il paragrafo corrispondente:
Case of
WP SELECT: (Form event code=On Selection Change)
// Load the selected document in the 4D Write Pro area
WParea :=WP New(Form.currentItem.document.WP)
GOTO OBJECT (WParea)
// Select the text range defined by startOffset and endOffset
(WParea; Form.currentItem.startOffset; Form.currentItem.endOffset)
End case
Conclusione
Questo approccio combina il meglio dei due mondi: la ricerca semantica identifica i documenti rilevanti, mentre la granularità dei chunk consente di individuare il passaggio esatto. Il risultato è un assistente di ricerca 4D Write Pro che non si limita a trovare un buon documento, ma guida l’utente direttamente alla risposta di cui ha bisogno.
Immaginate il tempo risparmiato e il miglioramento dell’esperienza dell’utente quando il vostro team può saltare direttamente al passaggio pertinente. In che modo questo livello di precisione potrebbe cambiare il modo in cui voi o i vostri utenti esplorate e interagite con i vostri contenuti? Condividete i vostri pensieri sul Forum 4D!
