Odpověď o vašich dokumentech je jen tak dobrá, jak dobrý je text, ze kterého byla vytvořena, a když vložíte celé soubory do chatu, nemůžete zjistit, kterou část model skutečně použil. GroupDocs.Search.Mcp, běžící lokálně v Dockeru, poskytuje Claude Desktop, Cursor nebo Copilot jiný primitiv: get_text_fragments vrací pouze úryvky, které odpovídají dotazu, s několika slovy kontextu a souborem, ze kterého pocházejí, takže agent odpovídá z citací:

Co říkají mé smlouvy o sankcích? Citujte úryvky s dostatečným kontextem pro pochopení každého.

Verze krok za krokem s konfigurací a řešením problémů je v dokumentaci: Jak získat odpovídající úryvky místo čtení celých souborů.

Proč odpovědi odbočují od dokumentů?

Protože okno kontextu je rozpočet a celé dokumenty ho špatně využívají. Otázka o sankcích potřebuje možná tři věty z padesáti stran. Vložíte padesát stran a model musí najít ty tři věty sám, mezi vším ostatním, a pak je udržet, zatímco píše. Dlouhé kontexty jsou shrnuty, raný materiál ztrácí váhu a odpověď se opírá o obecný smysl modelu o tom, co smlouvy obvykle říkají, místo o to, co říkají vaše. Průmysl nazývá disciplínu řízení toho context engineering; nejjednodušší forma je nenačítat text, který nepotřebujete.

Jak vypadá úryvek?

Index již obsahuje text každého dokumentu, takže server může vyříznout úryvek kolem každé shody. Toto jsou skutečné odpovědi z našeho testu, proti pěti syntetickým smlouvám. Výchozí nastavení, osm slov na každé straně, dává frázi:

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

Dvacet slov na každé straně dává celou klauzuli:

-> 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 a termsAfter jsou nastavitelný posuvník: malé pro „které soubory a přibližně kde“, velké pro „citujte mi klauzuli“. maxFragmentsPerDocument a maxDocuments omezují velikost odpovědi, takže slovo, které se vyskytuje dvě stěkrát, nezahlcuje kontext.

Rozpočet, vedle sebe

Čtení souborů                        Prohledávání indexu
-------------------------------------    -------------------------------------
agent otevírá každý dokument          search: které soubory odpovídají (JSON)
  kontext roste s korpusem            get_text_fragments: úryvky
  dlouhé soubory vytlačují otázku    (~8 slov na každé straně, na soubor)
  opakováno pro každou otázku         odpověď cituje soubor + úryvek
                                      index je znovu použit příště

Rozdíl roste s korpusem. Pro tři krátké soubory to téměř nevadí. Pro složku s dlouhými smlouvami, zprávami a poštou jsou úryvky pro jednu otázku několik stovek slov, oproti celému textu každého kandidátního dokumentu.

Když se slova liší

Full-text vyhledávání odpovídá slovům, což je výhoda pro zakotvení (každý výsledek je vysvětlitelný) a omezení pro úplnost (synonymum je minulé). Úkolem agenta je zkoušet varianty a může vidět, co každá varianta skutečně našla:

-> 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 shoda zachránila překlep a také přidala rent. Protože odpověď uvádí termíny, které našla, může agent, nebo vy, vidět přehnané shody místo aby mu důvěřoval. Tato transparentnost je to, co by mělo znamenat „zakotvený“: nejen „odpověď cituje zdroj“, ale „můžete vidět, jak byl zdroj nalezen“.

Jak vypadá zakotvená odpověď

Požádejte o citace a odpověď přijde ve formě, kterou můžete na první pohled ověřit:

Dvě smlouvy obsahují ukončovací sankci. Acme MSA, klauzule 12.3: „ukončovací sankce ve výši tří měsíčních poplatků se uplatní, splatná do 30 dnů od data ukončení.“ Globex consulting agreement, sekce 9: „Klient platí 50 procent poplatků zbývajících pro aktuální fázi.“ Initech NDA zmiňuje ukončení a sankci, ale uvádí, že žádná sankce není.*

Pokud souhrn špatně přečte citaci, chyba bude přímo vedle citace.

Upřímná omezení

  • V režimu hodnocení index obsahuje maximálně 100 dokumentů a vyhledávání vrací maximálně 10. Režim hodnocení také přidává řádek „Evaluation only…“ do indexovaného textu některých formátů, který se může objevit v úryvcích; zakupte licenci serveru a přestavěte index, aby byl odstraněn. Nejprve zavolejte get_license_status.
  • Kontext úryvku se počítá ve slovech, ne ve větách, takže úryvek může začínat uprostřed věty; zvyšte termsBefore, když je to důležité.
  • Žádné OCR: skeny bez textové vrstvy nemají žádné úryvky k vrácení.
  • Pouze Docker; na Linuxu přidejte --user \"$(id -u):$(id -g)\".

Často kladené otázky

Jak mohu přimět Claude citovat zdroje z mých dokumentů?
Dejte mu nástroj, který vrací text zdroje s názvem souboru. get_text_fragments dělá přesně to a instrukce jako „citujte úryvek a jeho soubor“ z toho udělá zvyk.

Snižuje to spotřebu tokenů?
Zabraňuje načítání celých dokumentů pro odpověď na otázku: agent čte pouze odpovídající úryvky. Kolik to ušetří, závisí na velikosti vašich souborů.

Může agent stále načíst celý soubor, když to potřebuje?
Ano, pomocí svých vlastních nástrojů pro soubory. Úryvky slouží k vyhledávání a citování; načtěte celý soubor, když úryvek není dostatečný.

Ponořte se hlouběji