Відповідь щодо ваших документів є лише настільки доброю, наскільки якісний текст, на якому вона побудована, і коли ви вставляєте цілі файли у чат, ви не можете визначити, яку саме частину модель фактично використала. GroupDocs.Search.Mcp, що працює локально в Docker, надає Claude Desktop, Cursor або Copilot інший примітив: get_text_fragments повертає лише ті уривки, які відповідають запиту, з кількома словами контексту та файлом, з якого вони взяті, тому агент відповідає, цитуючи:
Що мої контракти говорять про штрафи? Наведіть уривки, з достатнім контекстом, щоб зрозуміти кожен з них.
Покрокова інструкція з налаштуванням та усуненням проблем знаходиться в документації: Як отримати відповідні уривки замість читання цілих файлів.
Чому відповіді відхиляються від документів?
Тому що вікно контексту — це обмежений ресурс, і цілі документи витрачають його неефективно. Питання про штрафи може потребувати лише три речення з п’ятдесяти сторінок. Якщо вставити всі п’ятдесят сторінок, модель повинна сама знайти ті три речення серед усього іншого, а потім утримувати їх під час написання. Довгі контексти підсумовуються, ранній матеріал втрачає вагу, і відповідь починає базуватись на загальному уявленні моделі про те, що зазвичай говорять контракти, а не на тому, що говорять ваші. У галузі цю дисципліну називають context engineering; найпростіша її форма — не завантажувати текст, який вам не потрібен.
Як виглядає фрагмент?
Індекс вже містить текст кожного документа, тому сервер може вирізати уривок навколо кожного збігу. Це реальні відповіді з нашого тесту, проведеного на п’яти синтетичних контрактах. За замовчуванням, по вісім слів з кожного боку, отримується фраза:
-> 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…
Двадцять слів з кожного боку дає цілий пункт:
-> 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 і termsAfter — це регулятор: маленьке значення для «які файли і приблизно де», велике — для «процитуй мені пункт». maxFragmentsPerDocument і maxDocuments обмежують розмір відповіді, тому слово, яке зустрічається двісті разів, не заповнює контекст.
Бюджет, порівняння
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
Різниця збільшується зі збільшенням корпусу. Для трьох коротких файлів це майже не має значення. Для папки з довгими контрактами, звітами та листами фрагменти для одного питання становлять кілька сотень слів, у порівнянні з повним текстом кожного кандидатного документа.
Коли слова різняться
Повнотекстовий пошук збігає слова, що є перевагою для обґрунтування (кожен збіг можна пояснити) і обмеженням для повноти (синонім — це пропуск). Завдання агента — спробувати варіанти, і він може бачити, що саме кожен варіант збіг.
-> 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"]
Нечітке зіставлення виправило помилку в написанні і також включило rent. Оскільки відповідь перераховує терміни, які збіглися, агент або ви можете бачити надмірний збіг замість того, щоб просто довіряти йому. Така прозорість і має означати «обґрунтований»: не лише «відповідь посилається на джерело», а й «ви можете бачити, як було знайдено джерело».
Як виглядає обґрунтована відповідь
Попросіть навести цитати, і відповідь прийде у вигляді, який ви можете одразу перевірити:
Два контракти містять штраф за розірвання. Acme MSA, пункт 12.3: “штраф за розірвання у розмірі трьох місячних платежів застосовується, підлягає сплаті протягом 30 днів з дати розірвання.” Угоду про консультування Globex, розділ 9: “Клієнт сплачує 50 відсотків залишкових платежів за поточну фазу.” NDA Initech згадує про розірвання та штраф, але зазначає, що штрафу немає.
Якщо резюме неправильно інтерпретує цитату, помилка розташовується одразу поруч із цитатою.
Чесні обмеження
- У режимі оцінки індекс містить не більше 100 документів, а пошук повертає не більше 10. Режим оцінки також додає рядок «Evaluation only…» до індексованого тексту деяких форматів, який може з’явитися у фрагментах; ліцензуйте сервер і перебудуйте індекс, щоб його прибрати. Спочатку викличте
get_license_status. - Контекст фрагмента рахується у словах, а не у реченнях, тому уривок може починатися посередині речення; збільшуйте
termsBefore, коли це важливо. - OCR відсутній: скани без текстового шару не мають уривків для повернення.
- Тільки Docker; у Linux додайте
--user "$(id -u):$(id -g)".
Питання та відповіді
Як змусити Claude посилатися на джерела з моїх документів?
Надайте йому інструмент, який повертає текст джерела разом з назвою файлу. get_text_fragments робить саме це, а інструкція типу «процитуй уривок і його файл» робить це звичкою.
Чи зменшує це використання токенів?
Воно уникає завантаження цілих документів для відповіді на питання: агент читає лише відповідні уривки. Скільки це заощаджує, залежить від розміру ваших файлів.
Чи може агент все ще читати цілий файл, коли це потрібно?
Так, за допомогою власних інструментів роботи з файлами. Фрагменти призначені для пошуку та цитування; читайте цілий файл, коли уривка недостатньо.
Поглиблене вивчення
- Документація, канонічний посібник: Як отримати відповідні уривки замість читання цілих файлів
- Центр документації: GroupDocs.Search MCP Server
- Почніть тут: Чи потрібна вам векторна база даних, щоб ставити питання щодо папки документів?
- Пов’язано: Чому AI‑агент не повинен читати 300 контрактів, щоб відповісти на одне питання
- Пов’язано: grep не може читати PDF: дайте вашому кодуючому агенту індекс документів
- Пов’язано: Пошук у вашому архіві електронної пошти за допомогою AI‑агента: PST, MSG, EML та вкладення всередині
- Пов’язано: Пам’ять проєкту для AI‑агентів: один індекс на проєкт, актуальний
- On‑premise та модель безпеки: 3 архітектури для AI‑обробки документів, і та, що зберігає файли у вашій мережі
- Питання: GroupDocs Search forum
- Джерело: GroupDocs.Search.Mcp on GitHub