Une réponse concernant vos documents n’est aussi bonne que le texte à partir duquel elle a été construite, et lorsque vous collez des fichiers entiers dans une discussion, vous ne pouvez pas savoir quelle partie le modèle a réellement utilisée. GroupDocs.Search.Mcp, exécuté localement dans Docker, fournit à Claude Desktop, Cursor ou Copilot un primitive différent : get_text_fragments ne renvoie que les passages qui correspondent à une requête, avec quelques mots de contexte et le fichier d’origine, de sorte que l’agent répond à partir de citations :
Que disent mes contrats à propos des pénalités ? Citez les passages, avec suffisamment de contexte pour comprendre chacun d’eux.
La version pas‑à‑pas avec configuration et dépannage se trouve dans la documentation : How to get the matching passages instead of reading whole files.
Pourquoi les réponses s’éloignent‑elles des documents ?
Parce que la fenêtre de contexte est un budget, et que les documents entiers le consomment mal. Une question sur les pénalités ne nécessite peut‑être que trois phrases sur cinquante pages. Collez les cinquante pages et le modèle doit trouver lui‑même les trois phrases parmi tout le reste, puis les retenir pendant qu’il écrit. Les contextes longs sont résumés, le matériel initial perd de l’importance, et la réponse commence à reposer sur le sens général du modèle de ce que les contrats disent habituellement plutôt que sur ce que les vôtres disent. L’industrie appelle cette discipline la context engineering ; la forme la plus simple consiste à ne pas charger le texte dont vous n’avez pas besoin.
À quoi ressemble un fragment ?
L’index contient déjà le texte de chaque document, de sorte que le serveur peut extraire le passage autour de chaque correspondance. Voici de vraies réponses issues de notre test, sur cinq contrats synthétiques. Les valeurs par défaut, huit mots de chaque côté, donnent une phrase :
-> get_text_fragments {"query":"penalty","indexName":"contracts"}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
[content] …before the end of the Term, a termination penalty of
three monthly fees applies, payable within 30…
Vingt mots de chaque côté donnent la clause complète :
-> get_text_fragments {"query":"penalty","indexName":"contracts",
"termsBefore":20,"termsAfter":20,"maxFragmentsPerDocument":1}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
…convenience on 90 days written notice.
12.3 If the Client terminates before the end of the Term, a termination
penalty of three monthly fees applies, payable within 30 days of the
termination date.
14.2 Force majeure: neither party is…
termsBefore et termsAfter sont un réglage : petit pour « quels fichiers et où approximativement », grand pour « citez-moi la clause ». maxFragmentsPerDocument et maxDocuments limitent la taille de la réponse, de sorte qu’un mot apparaissant deux cents fois n’inonde pas le contexte.
Le budget, côte à côte
Reading the files Searching the index
------------------------------------- -------------------------------------
agent opens every document search: which files match (JSON)
context grows with the corpus get_text_fragments: the passages
long files crowd out the question (~8 words either side, per file)
repeated for every question answer cites file + passage
the index is reused next time
La différence augmente avec la taille du corpus. Pour trois fichiers courts, cela importe peu. Pour un dossier contenant de longs contrats, rapports et courriels, les fragments pour une question représentent quelques centaines de mots, contre le texte complet de chaque document candidat.
Quand les mots diffèrent
La recherche en texte intégral correspond aux mots, ce qui est une fonctionnalité pour l’ancrage (chaque résultat est explicable) mais une limite pour le rappel (un synonyme est manqué). Le travail de l’agent est d’essayer des variantes, et il peut voir ce que chaque variante a réellement trouvé :
-> search {"query":"renewal OR renews","indexName":"contracts"}
<- umbrella-office-lease.pdf, terms ["renewal", "renews"]
-> search {"query":"renewl","indexName":"contracts","fuzzy":true}
<- umbrella-office-lease.pdf, terms ["renewal", "renews", "rent"]
La correspondance floue a sauvé une faute de frappe et a également fait apparaître rent. Parce que la réponse liste les termes correspondants, un agent, ou vous, pouvez voir le sur‑correspondance au lieu de simplement lui faire confiance. Cette transparence est ce que « grounded » devrait signifier : pas seulement « la réponse cite une source », mais « vous pouvez voir comment la source a été trouvée ».
À quoi ressemble une réponse ancrée
Demandez des citations, et la réponse arrive sous une forme que vous pouvez vérifier d’un coup d’œil :
Deux contrats prévoient une pénalité de résiliation. Acme MSA, clause 12.3 : « a termination penalty of three monthly fees applies, payable within 30 days of the termination date. » Accord de conseil Globex, section 9 : « the Client pays 50 percent of the fees remaining for the current phase. » Le NDA Initech mentionne la résiliation et la pénalité mais indique qu’il n’y a aucune pénalité.
Si un résumé interprète mal une citation, l’erreur se trouve juste à côté de la citation.
Limites honnêtes
- En mode évaluation, un index ne contient au maximum que 100 documents et une recherche renvoie au maximum 10 résultats. Le mode évaluation ajoute également une ligne « Evaluation only… » au texte indexé de certains formats, qui peut apparaître dans les fragments ; licencez le serveur et reconstruisez l’index pour la supprimer. Appelez
get_license_statusd’abord. - Le contexte d’un fragment est compté en mots, pas en phrases, ainsi un passage peut commencer en plein milieu d’une phrase ; augmentez
termsBeforelorsque cela compte. - Pas d’OCR : les scans sans couche texte n’ont aucun passage à renvoyer.
- Docker uniquement ; sous Linux ajoutez
--user "$(id -u):$(id -g)".
FAQ
Comment faire en sorte que Claude cite les sources de mes documents ?
Donnez‑lui un outil qui renvoie le texte source avec le nom du fichier. get_text_fragments fait exactement cela, et une instruction du type « citez le passage et son fichier » en fait une habitude.
Cela réduit‑il la consommation de tokens ?
Oui, cela évite de charger des documents entiers pour répondre à une question : l’agent ne lit que les passages correspondants. Le gain dépend de la taille de vos fichiers.
L’agent peut‑il encore lire un fichier complet lorsqu’il le faut ?
Oui, avec ses propres outils de fichiers. Les fragments servent à trouver et citer ; lisez le fichier complet lorsque le passage n’est pas suffisant.
Approfondir
- Documentation, guide canonique : How to get the matching passages instead of reading whole files
- Hub de documentation : GroupDocs.Search MCP Server
- Commencez ici : Do you need a vector database to ask questions about a folder of documents?
- Connexe : Why an AI agent should not read 300 contracts to answer one question
- Connexe : grep can’t read PDF: give your coding agent a document index
- Connexe : Search your email archive with an AI agent: PST, MSG, EML and the attachments inside
- Connexe : Project memory for AI agents: one index per project, kept current
- Modèle sur site et sécurité : 3 architectures for AI document processing, and the one that keeps files inside your network
- Questions : GroupDocs Search forum
- Source : GroupDocs.Search.Mcp on GitHub