“Quale dei nostri contratti prevede una penale di risoluzione?” suona come un compito per un agente IA, e lo è, ma non leggendo i contratti. Un agente che apre ogni file per rispondere spende il suo contesto su 297 documenti irrilevanti e deve ancora fidarsi di aver notato la clausola negli altri tre. Con GroupDocs.Search.Mcp in esecuzione localmente in Docker, Claude Desktop, Cursor o Copilot indicizza la cartella una volta, chiede all’indice quali contratti corrispondono e legge solo le clausole:

Quali dei miei contratti menzionano una penale di risoluzione? Cita la clausola per ciascuno.

La versione passo‑passo con configurazione e risoluzione dei problemi è nella documentazione: Come porre domande su una cartella di contratti con un agente IA.

Cosa va storto quando l’agente legge tutto?

Tre cose, in ordine crescente di pericolo. È lento e costoso: ogni contratto passa attraverso la finestra di contesto, ogni volta che chiedi. Esaurisce lo spazio: dopo qualche decina di documenti lunghi, i primi escono dalla finestra o vengono riassunti, e un riassunto è dove una clausola può mancare. E fallisce silenziosamente: “Ho trovato due contratti con una penale di risoluzione” suona allo stesso modo che l’agente abbia controllato tutti e 300 o ne abbia sfogliati 40. Nulla nella risposta ti dice quali.

Un indice elimina il primo problema e mette in evidenza il terzo. La domanda “quali file contengono queste parole” ha una risposta esatta, e uno strumento di ricerca la restituisce con un conteggio che puoi verificare.

Come appare la sequenza corretta?

Indicizza una volta, cerca, poi leggi i risultati. Ecco cosa ha restituito il server nel nostro test, su cinque contratti sintetici: due con una clausola di penale e un NDA che menziona entrambe le parole ma esclude la penale.

-> add_to_index {"documentsPath":"contracts","indexName":"contracts"}
<- Indexed 'contracts' into index 'contracts': 5 document(s) added,
   5 in the index.

-> search {"query":"termination penalty","indexName":"contracts"}
<- { "documentsFound": 0,
     "hint": "Unquoted words separated by spaces do not match. Search the
              phrase as \"termination penalty\", or combine the words with
              AND / OR, e.g. termination AND penalty." }

-> search {"query":"termination AND penalty","indexName":"contracts"}
<- documentsFound 3: acme-master-services-agreement.pdf,
   globex-consulting-agreement.docx, initech-nda.docx

-> get_text_fragments {"query":"\"termination penalty\"",...}
<- === contracts/acme-master-services-agreement.pdf ===
     …a termination penalty of three monthly fees applies, payable
     within 30…
   === contracts/globex-consulting-agreement.docx ===
     …Early termination penalty: the Client pays 50 percent of the fees…

Cosa insegnano i tre risultati?

La prima query è fallita, e il server ha spiegato il motivo. In GroupDocs.Search, le parole separate da spazi senza virgolette non corrispondono a una frase. Invece di restituire semplicemente zero, il server aggiunge un hint che spiega la correzione, e gli agenti si correggono nella chiamata successiva. Questo è l’errore più comune al primo tentativo, ed è gestito direttamente nella risposta.

AND ha trovato tre, la frase ne ha trovati due. AND viene valutato per documento. L’NDA di Initech contiene entrambe le parole nella frase “There is no fee and no penalty associated with termination of this NDA”. Un modello che legge solo il risultato della ricerca lo conterebbe; leggendo il passaggio, segnala l’NDA separatamente come un contratto che esclude esplicitamente la penale. Questa distinzione è il valore intero della terza chiamata.

I formati non hanno importanza. I risultati provengono da un PDF e da un DOCX, e un contratto TXT era nello stesso indice. Il motore indicizza 82 formati, quindi una cartella che è cresciuta in dieci anni con strumenti diversi risponde a una singola query.

Le chiamate, in ordine

user              agent                         Search MCP server
 |  "Which contracts mention a termination penalty?"           |
 |---------------->|                                           |
 |                 |-- add_to_index (once) ------------------>|
 |                 |-- search {"query":"termination AND       |
 |                 |           penalty"} -------------------->|
 |                 |<- 3 files --------------------------------|
 |                 |-- get_text_fragments {"query":           |
 |                 |   "\"termination penalty\""} ----------->|
 |                 |<- the two clauses, with context ----------|
 |<- "Acme: 3 monthly fees (12.3). Globex: 50% of remaining    |
 |    fees. Initech NDA: explicitly no penalty."               |

Dopo il primo indicizzamento, ogni nuova domanda costa due chiamate indipendentemente dal numero di contratti. “Quali contratti hanno una clausola di forza maggiore?” è "force majeure". “Quali locazioni si rinnovano automaticamente?” è renewal OR renews, e il passaggio dice “renews automatically for 12 months unless notice is given”. Una clausola sui periodi di preavviso è terminat? AND notice, dove ? rappresenta un carattere e corrisponde a terminate.

Dove l’umano rimane nel ciclo

Questo non è una revisione di contratti, e non dovrebbe fingere di esserlo. L’indice trova e cita il testo; l’agente riassume ciò che ha citato. Due abitudini lo mantengono onesto. Chiedi la citazione per ogni affermazione, così un riassunto errato è visibile accanto alla frase che ha frainteso. E chiedi anche i quasi‑casi, “elenca i contratti che menzionano le parole senza la clausola”, perché è lì che il giudizio del lettore è più importante.

Limiti onesti

  • In modalità valutazione un indice contiene al massimo 100 documenti e una ricerca restituisce al massimo 10, e ogni risposta lo indica. Esegui get_license_status prima di un’esecuzione reale, perché una risposta limitata sembra completa.
  • I contratti scansionati senza livello di testo vengono indicizzati solo dalle proprietà del file; non c’è OCR.
  • La ricerca full‑text corrisponde alle parole: un agente deve usare il vocabolario del contratto, o provare varianti.
  • Rimuovere un singolo file da una cartella indicizzata non è supportato; rimuovi la cartella e aggiungi nuovamente ciò che desideri.

FAQ

Un agente IA può cercare tutti i miei contratti senza caricarli?
Sì. L’indice viene creato e ricercato in un container sulla tua macchina; solo le clausole che l’agente cita raggiungono il modello.

Quanti contratti può gestire?
Con licenza, quanti ne consentono il tuo disco e la tua memoria; l’indice viene creato una volta e aggiornato in modo incrementale. La modalità valutazione si ferma a 100 per indice.

Perché la mia ricerca di due parole non ha restituito risultati?
Le parole non citate non corrispondono a una frase. Cita la ricerca, "termination penalty", o unisci le parole con AND; il hint del server dice lo stesso.

Approfondisci