Odpowiedź na temat twoich dokumentów jest tak dobra, jak tekst, z którego została zbudowana, a gdy wklejasz całe pliki do czatu, nie możesz stwierdzić, którą część model faktycznie użył. GroupDocs.Search.Mcp, uruchamiany lokalnie w Dockerze, daje Claude Desktop, Cursor lub Copilot inną prymitywę: get_text_fragments zwraca tylko fragmenty pasujące do zapytania, z kilkoma słowami kontekstu i nazwą pliku, z którego pochodzą, więc agent odpowiada na podstawie cytatów:

Co mówią moje umowy o karach? Cytuj fragmenty, z wystarczającym kontekstem, aby zrozumieć każdy z nich.

Wersja krok po kroku z konfiguracją i rozwiązywaniem problemów znajduje się w dokumentacji: How to get the matching passages instead of reading whole files.

Dlaczego odpowiedzi odchodzą od dokumentów?

Ponieważ okno kontekstu jest ograniczonym budżetem, a całe dokumenty zużywają go nieefektywnie. Pytanie o kary może wymagać jedynie trzech zdań z pięćdziesięciu stron. Wklejasz pięćdziesiąt stron, a model musi sam znaleźć te trzy zdania wśród wszystkiego, a następnie je utrzymać podczas pisania. Długie konteksty są podsumowywane, wczesny materiał traci na znaczeniu, a odpowiedź zaczyna opierać się na ogólnym wyczuciu modelu, co zwykle mówią umowy, zamiast na tym, co mówią twoje. Branża nazywa tę dyscyplinę zarządzania tym inżynierią kontekstu; najprostszą formą jest nieładowanie tekstu, którego nie potrzebujesz.

Jak wygląda fragment?

Indeks już przechowuje tekst każdego dokumentu, więc serwer może wyciąć fragment wokół każdego dopasowania. To są rzeczywiste odpowiedzi z naszego testu, na pięciu syntetycznych umowach. Domyślne ustawienie, osiem słów po obu stronach, daje frazę:

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

Dwadzieścia słów po obu stronach daje całą klauzulę:

-> 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 i termsAfter to ustawienie: małe dla „które pliki i mniej więcej gdzie”, duże dla „zacytuj mi klauzulę”. maxFragmentsPerDocument i maxDocuments ograniczają rozmiar odpowiedzi, więc słowo, które występuje dwieście razy, nie zalewa kontekstu.

Budżet, obok siebie

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

Różnica rośnie wraz z korpusem. Dla trzech krótkich plików ma to niewielkie znaczenie. Dla folderu z długimi umowami, raportami i pocztą, fragmenty dla jednego pytania liczą kilka set słów, w porównaniu do pełnego tekstu każdego dokumentu kandydującego.

Kiedy słowa się różnią

Wyszukiwanie pełnotekstowe dopasowuje słowa, co jest zaletą dla uzasadniania (każde trafienie jest wyjaśnialne) i ograniczeniem dla przywoływania (synonim to brak dopasowania). Zadaniem agenta jest wypróbowanie wariantów i może zobaczyć, co każdy wariant faktycznie dopasował:

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

Dopasowanie rozmyte uratowało literówkę i także wciągnęło rent. Ponieważ odpowiedź wymienia terminy, które dopasowano, agent, a także ty, możecie zobaczyć nadmierne dopasowanie zamiast mu ufać. Ta przejrzystość to to, co powinno oznaczać „uzasadnione”: nie tylko „odpowiedź cytuje źródło”, ale „możesz zobaczyć, jak źródło zostało znalezione”.

Jak wygląda uzasadniona odpowiedź

Poproś o cytaty, a odpowiedź przyjdzie w formie, którą możesz zweryfikować na pierwszy rzut oka:

Dwie umowy zawierają karę za rozwiązanie. Acme MSA, klauzula 12.3: “kara za rozwiązanie w wysokości trzech miesięcznych opłat jest stosowana, płatna w ciągu 30 dni od daty rozwiązania.” Umowa konsultingowa Globex, sekcja 9: “Klient płaci 50 procent pozostałych opłat za bieżącą fazę.” NDA Initech wspomina o rozwiązaniu i karze, ale stwierdza, że nie ma kary.

Jeśli podsumowanie błędnie interpretuje cytat, błąd znajduje się tuż obok cytatu.

Szczere ograniczenia

  • W trybie oceny indeks przechowuje maksymalnie 100 dokumentów, a wyszukiwanie zwraca maksymalnie 10. Tryb oceny dodaje również wiersz „Evaluation only…” do zindeksowanego tekstu niektórych formatów, który może pojawić się w fragmentach; licencjonuj serwer i odbuduj indeks, aby go usunąć. Najpierw wywołaj get_license_status.
  • Kontekst fragmentu jest liczony w słowach, nie w zdaniach, więc fragment może zaczynać się w połowie zdania; zwiększ termsBefore, gdy ma to znaczenie.
  • Brak OCR: skany bez warstwy tekstowej nie mają fragmentów do zwrócenia.
  • Tylko Docker; na Linuxie dodaj --user "$(id -u):$(id -g)".

FAQ

Jak sprawić, aby Claude cytował źródła z moich dokumentów?
Daj mu narzędzie, które zwraca tekst źródłowy wraz z nazwą pliku. get_text_fragments robi dokładnie to, a instrukcja typu „zacytuj fragment i jego plik” sprawia, że staje się to nawykiem.

Czy to zmniejsza zużycie tokenów?
Unika ładowania całych dokumentów w celu odpowiedzi na pytanie: agent czyta tylko pasujące fragmenty. Ile to oszczędza, zależy od rozmiaru twoich plików.

Czy agent nadal może przeczytać cały plik, gdy tego potrzebuje?
Tak, przy użyciu własnych narzędzi do plików. Fragmenty służą do znajdowania i cytowania; przeczytaj cały plik, gdy fragment nie wystarcza.

Zagłęb się