«Какие из наших контрактов содержат штраф за расторжение?» звучит как задача для ИИ‑агента, и действительно так, но не путём чтения всех контрактов. Агент, который открывает каждый файл, тратит контекст на 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». Модель, читающая только результат поиска, посчитает его; читая отрывок, она отмечает 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."               |

После первого индексирования каждый новый вопрос стоит двух вызовов, независимо от количества контрактов. «Какие контракты содержат пункт форс-мажора?» — "force majeure". «Какие аренды продлеваются автоматически?» — renewal OR renews, а отрывок звучит «renews automatically for 12 months unless notice is given». Пункт о сроках уведомления — terminat? AND notice, где ? обозначает один символ и совпадает с terminate.

Где человек остаётся в цепочке

Это не проверка контрактов, и агент не должен выдавать себя за неё. Индекс находит и цитирует текст; агент суммирует то, что он процитировал. Две привычки сохраняют честность. Запрашивайте цитату к каждому утверждению, чтобы неверное резюме было видно рядом с предложением, которое было неверно прочитано. И запрашивайте также «почти‑попадания», «перечислите контракты, где упомянуты слова без соответствующего пункта», потому что именно там решение человека имеет наибольшее значение.

Честные ограничения

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

FAQ

Может ли ИИ‑агент искать по всем моим контрактам без их загрузки?
Да. Индекс создаётся и ищется в контейнере на вашем компьютере; к модели попадают только те пункты, которые агент цитирует.

Сколько контрактов он может обработать?
По лицензии — столько, сколько позволяют ваш диск и память; индекс создаётся один раз и обновляется инкрементально. В режиме оценки ограничение — 100 документов на индекс.

Почему мой поиск по двум словам ничего не вернул?
Слова без кавычек не совпадают как фраза. Заключите их в кавычки, "termination penalty", или соедините словами AND; hint сервера объясняет то же самое.

Углубиться