Een antwoord over uw documenten is slechts zo goed als de tekst waaruit het is opgebouwd, en wanneer u volledige bestanden in een chat plakt, kunt u niet zien welk deel het model daadwerkelijk heeft gebruikt. GroupDocs.Search.Mcp, lokaal draaiend in Docker, geeft Claude Desktop, Cursor of Copilot een ander primitief: get_text_fragments retourneert alleen de passages die overeenkomen met een query, met een paar woorden context en het bestand waar ze vandaan komen, zodat de agent antwoordt met citaten:

Wat zeggen mijn contracten over boetes? Citeer de passages, met voldoende context om elk van hen te begrijpen.

De stapsgewijze versie met configuratie en probleemoplossing staat in de documentatie: Hoe de overeenkomende passages te krijgen in plaats van hele bestanden te lezen.

Waarom drijven antwoorden af van de documenten?

Omdat het contextvenster een budget is, en volledige documenten het slecht besteden. Een vraag over boetes heeft misschien drie zinnen nodig uit vijftig pagina’s. Plak de vijftig pagina’s en het model moet zelf die drie zinnen vinden tussen al het andere, en ze vervolgens vasthouden terwijl het schrijft. Lange contexten worden samengevat, vroeg materiaal verliest gewicht, en het antwoord leunt steeds meer op het algemene gevoel van het model over wat contracten meestal zeggen in plaats van op wat de uwe zeggen. De industrie noemt de discipline van het beheren hiervan context engineering; de eenvoudigste vorm is geen tekst laden die u niet nodig heeft.

Hoe ziet een fragment eruit?

De index bevat al de tekst van elk document, zodat de server de passage rond elke match kan knippen. Dit zijn echte reacties uit onze test, tegen vijf synthetische contracten. De standaardinstelling, acht woorden aan elke kant, geeft een frase:

-> 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…

Twintig woorden aan elke kant geven de volledige clausule:

-> 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 en termsAfter vormen een regelaar: klein voor “welke bestanden en ongeveer waar”, groot voor “citeer de clausule”. maxFragmentsPerDocument en maxDocuments beperken de grootte van het antwoord, zodat een woord dat tweehonderd keer voorkomt de context niet overspoelt.

Het budget, naast elkaar

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

Het verschil groeit met de corpus. Voor drie korte bestanden maakt het nauwelijks uit. Voor een map met lange contracten, rapporten en e‑mail is het aantal fragmenten voor één vraag enkele honderden woorden, tegenover de volledige tekst van elk kandidaat‑document.

Wanneer de woorden verschillen

Volledige‑tekst zoeken matcht woorden, wat een eigenschap is voor verankering (elke hit is verklaarbaar) en een beperking voor recall (een synoniem is een misser). Het werk van de agent is om varianten te proberen, en hij kan zien wat elke variant daadwerkelijk heeft gematcht:

-> 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"]

Fuzzy matching redde een spelfout en haalde ook rent binnen. Omdat de respons de termen opsomt die gematcht zijn, kan een agent, of u, de over‑match zien in plaats van er blind op te vertrouwen. Die transparantie is wat “gegrond” zou moeten betekenen: niet alleen “het antwoord citeert een bron”, maar “u kunt zien hoe de bron is gevonden”.

Hoe een gegrond antwoord eruitziet

Vraag om citaten, en het antwoord verschijnt in een vorm die u in één oogopslag kunt verifiëren:

Twee contracten bevatten een beëindigingsboete. Acme MSA, clausule 12.3: “a termination penalty of three monthly fees applies, payable within 30 days of the termination date.” Globex consulting agreement, sectie 9: “the Client pays 50 percent of the fees remaining for the current phase.” De Initech NDA vermeldt beëindiging en boete maar stelt dat er geen boete is.

Als een samenvatting een citaat verkeerd leest, staat de misinterpretatie direct naast het citaat.

Eerlijke beperkingen

  • In evaluatiemodus bevat een index maximaal 100 documenten en een zoekopdracht retourneert maximaal 10. Evaluatiemodus voegt ook een “Evaluation only…” regel toe aan de geïndexeerde tekst van sommige formaten, die in fragmenten kan verschijnen; licentieer de server en bouw de index opnieuw om dit te verwijderen. Roep eerst get_license_status aan.
  • Fragment‑context wordt geteld in woorden, niet in zinnen, dus een passage kan midden in een zin beginnen; verhoog termsBefore wanneer dat van belang is.
  • Geen OCR: scans zonder een tekstlaag hebben geen passages om terug te geven.
  • Alleen Docker; op Linux voeg --user "$(id -u):$(id -g)" toe.

FAQ

Hoe laat ik Claude bronnen uit mijn documenten citeren?
Geef hem een tool die de brontekst met de bestandsnaam retourneert. get_text_fragments doet precies dat, en een instructie zoals “citeer de passage en het bestand” maakt het een gewoonte.

Vermindert dit het token‑gebruik?
Het voorkomt het laden van volledige documenten om een vraag te beantwoorden: de agent leest alleen de overeenkomende passages. Hoeveel dat bespaart hangt af van de grootte van uw bestanden.

Kan de agent nog steeds een heel bestand lezen wanneer dat nodig is?
Ja, met zijn eigen bestands‑tools. Fragmenten zijn voor vinden en citeren; lees het volledige bestand wanneer de passage niet voldoende is.

Dieper duiken