«Какие из наших контрактов содержат штраф за расторжение?» звучит как задача для ИИ‑агента, и действительно так, но не путём чтения всех контрактов. Агент, который открывает каждый файл, тратит контекст на 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 сервера объясняет то же самое.
Углубиться
- Документация, канонический how‑to: How to ask questions across a folder of contracts with an AI agent
- Центр документации: GroupDocs.Search MCP Server
- Начните здесь: Do you need a vector database to ask questions about a folder of documents?
- Связано: Grounded answers from your files: quote the passage, not the model’s memory
- Связано: grep can’t read PDF: give your coding agent a document index
- Связано: Search your email archive with an AI agent: PST, MSG, EML and the attachments inside
- Связано: Project memory for AI agents: one index per project, kept current
- On‑premise и модель безопасности: 3 architectures for AI document processing, and the one that keeps files inside your network
- Вопросы: GroupDocs Search forum
- Исходный код: GroupDocs.Search.Mcp on GitHub