“Which of our contracts carry a termination penalty?” звучить як завдання для AI‑агента, і це так, але не шляхом читання контрактів. Агент, який відкриває кожен файл, щоб відповісти, витрачає контекст на 297 нерелевантних документів і все одно мусить довіряти, що він помітив пункт у інших трьох. За допомогою GroupDocs.Search.Mcp, запущеного локально в Docker, Claude Desktop, Cursor або Copilot індексує папку один раз, запитує індекс, які контракти підходять, і читає лише відповідні пункти:

Які мої контракти містять пункт про штраф за дострокове розірвання? Наведіть пункт для кожного з них.

Покрокова версія з налаштуваннями та усуненням проблем знаходиться в документації: How to ask questions across a folder of contracts with an AI agent.

Що йде не так, коли агент читає все?

Три проблеми, у порядку зростання небезпеки. Це повільно і дорого: кожен контракт проходить через вікно контексту щоразу, коли ви задаєте питання. Закінчується простір: після кількох десятків довгих документів ранні випадають з вікна або підсумовуються, і саме в підсумку може зникнути пункт. І це тихо провалюється: «Я знайшов два контракти зі штрафом за дострокове розірвання» звучить однаково, чи агент перевірив усі 300, чи переглянув лише 40. У відповіді нічого не підказує, які саме.

Індекс усуває першу проблему і виявляє третю. Питання «які файли містять ці слова» має точну відповідь, і інструмент пошуку повертає її разом із кількістю, яку можна перевірити.

Яким має виглядати правильна послідовність?

Індексувати один раз, шукати, потім читати знайдені збіги. Ось що сервер повернув у нашому тесті за п’ять синтетичних контрактів: два з пунктом про штраф і один NDA, який згадує обидва слова, але виключає штраф.

-> add_to_index {"documentsPath":"contracts","indexName":"contracts"}
<- Indexed 'contracts' into index 'contracts': 5 document(s) added,
   5 in the index.

-> search {"query":"termination penalty","indexName":"contracts"}
<- { "documentsFound": 0,
     "hint": "Unquoted words separated by spaces do not match. Search the
              phrase as \"termination penalty\", or combine the words with
              AND / OR, e.g. termination AND penalty." }

-> search {"query":"termination AND penalty","indexName":"contracts"}
<- documentsFound 3: acme-master-services-agreement.pdf,
   globex-consulting-agreement.docx, initech-nda.docx

-> get_text_fragments {"query":"\"termination penalty\"",...}
<- === contracts/acme-master-services-agreement.pdf ===
     …a termination penalty of three monthly fees applies, payable
     within 30…
   === contracts/globex-consulting-agreement.docx ===
     …Early termination penalty: the Client pays 50 percent of the fees…

Чого навчає три результати?

Перший запит пропустив, і сервер пояснив чому. У GroupDocs.Search слова, розділені пробілами без лапок, не збігаються як фраза. Замість того, щоб повернути просто нуль, сервер додає hint, що пояснює, як виправити запит, і агенти коригують себе під час наступного виклику. Це найпоширеніша помилка при першому запиті, і вона обробляється безпосередньо у відповіді.

AND знайшов три, фраза — два. AND оцінюється за документом. У NDA Initech обидва слова присутні в реченні «There is no fee and no penalty associated with termination of this NDA». Модель, яка читає лише результат пошуку, порахує його; читаючи саму passage, вона повідомляє NDA окремо як контракт, який явно виключає штраф. Це розрізнення і є вся цінність третього виклику.

Формати не мали значення. Збіги були знайдені у PDF і DOCX, а TXT‑контракт теж був у тому ж індексі. Двигун індексує 82 формати, тому папка, що накопичувалась протягом десяти років різних інструментів, відповідає на одне запитання.

Виклики, у порядку

user              agent                         Search MCP server
 |  "Which contracts mention a termination penalty?"           |
 |---------------->|                                           |
 |                 |-- add_to_index (once) ------------------>|
 |                 |-- search {"query":"termination AND       |
 |                 |           penalty"} -------------------->|
 |                 |<- 3 files --------------------------------|
 |                 |-- get_text_fragments {"query":           |
 |                 |   "\"termination penalty\""} ----------->|
 |                 |<- the two clauses, with context ----------|
 |<- "Acme: 3 monthly fees (12.3). Globex: 50% of remaining    |
 |    fees. Initech NDA: explicitly no penalty."               |

Після першого індексування кожне нове питання коштує два виклики, незалежно від кількості контрактів. «Which contracts have a force majeure clause?» — це "force majeure". «Which leases renew automatically?» — це renewal OR renews, і passage містить «renews automatically for 12 months unless notice is given». Пункт про строки повідомлення — terminat? AND notice, де ? означає один символ і підходить під terminate.

Де людина залишається в процесі

Це не перевірка контрактів, і агент не повинен при цьому видавати себе за таку. Індекс знаходить і цитує текст; агент підсумовує те, що він процитував. Дві звички тримають його чесним. Запитуйте цитату разом з кожним твердженням, щоб неправильний підсумок був видимим поруч із реченням, яке було неправильно прочитано. І запитуйте також про майже‑місії: «перелічіть контракти, які згадують слова без пункту», бо саме в цих випадках важливе судження читача.

Чесні обмеження

  • У режимі оцінки індекс містить не більше 100 документів, а пошук повертає не більше 10, і кожна відповідь про це повідомляє. Викликайте get_license_status перед реальним запуском, бо обмежена відповідь виглядає повною.
  • Скановані контракти без текстового шару індексуються лише за їхніми властивостями файлу; OCR не передбачено.
  • Пошук за повним текстом збігає лише слова: агент має використовувати словник контракту або пробувати варіанти.
  • Видалення одного файлу з індексованої папки не підтримується; видаліть папку і додайте назад те, що потрібно.

Часті питання

Чи може AI‑агент шукати у всіх моїх контрактах без їх завантаження?
Так. Індекс створюється і шукається у контейнері на вашому комп’ютері; лише ті пункти, які агент процитує, потрапляють до моделі.

Скільки контрактів він може обробити?
Ліцензовано, стільки, скільки дозволяють ваш диск і пам’ять; індекс будується один раз і оновлюється інкрементально. У режимі оцінки обмеження — 100 документів на індекс.

Чому мій пошук за двома словами нічого не повернув?
Слова без лапок не збігаються як фраза. Оточіть їх лапками, "termination penalty", або з’єднайте їх за допомогою AND; hint сервера пояснює те саме.

Поглибити