Часто — нет. Для папки с контрактами, отчетами или электронной почтой AI‑агент с инструментом полнотекстового поиска находит нужные файлы, читает только совпадающие отрывки и цитирует их, а индекс работает локально без модели встраивания и без векторного хранилища. GroupDocs.Search.Mcp предоставляет Claude Desktop, Claude Code, Cursor или Copilot этот инструмент в одной Docker‑команде:

Индексировать папку с контрактами, затем сказать мне, какие контракты упоминают штраф за расторжение, и процитировать пункт.

Пошаговая версия с конфигурацией и устранением неполадок находится в документации: Как искать документы с помощью AI‑агентов, используя MCP.

Почему все сначала тянутся к встраиваниям?

Потому что «генерация с поддержкой поиска» пришла как рецепт: разбить документы на фрагменты, встроить каждый фрагмент, сохранить векторы, встроить вопрос, взять ближайшие фрагменты и вставить их в подсказку. Это работает, и для вопросов, сформулированных совсем не как документы, это правильный инструмент. Но это конвейер с вызовом модели встраивания, хранилищем, настройкой фрагментации и задачей повторного встраивания каждый раз, когда документы меняются. Для «какие из моих 300 контрактов упоминают штраф за расторжение» эта система отвечает так же, как поисковый индекс — напрямую.

Доказательства догнали интуицию. Исследование, опубликованное на arXiv в конце 2025 года (Keyword search is all you need), дало агенту лишь поиск по ключевым словам и регулярным выражениям по папке и сравнило его со стандартным конвейером RAG: более 90 % от оценок RAG, без векторной базы данных, и лучше подходит для часто меняющихся коллекций. Агентам‑программистам уже был продемонстрирован такой подход на практике: они ищут с помощью grep, уточняют и ищут снова.

Что делает агент вместо этого?

Три вызова. GroupDocs.Search.Mcp предоставляет восемь инструментов; в цикле нужны три из них:

user              agent                         Search MCP server
 |  "Which contracts mention a termination penalty?"           |
 |---------------->|                                           |
 |                 |-- add_to_index ------------------------->|  reads the
 |                 |   {"documentsPath":"contracts",           |  files once,
 |                 |    "indexName":"contracts"}               |  stores text
 |                 |<- "5 document(s) added, 5 in the index" --|
 |                 |-- search ------------------------------->|
 |                 |   {"query":"termination AND penalty"}     |
 |                 |<- {"documentsFound":3, "documents":[ ... |  which files
 |                 |-- get_text_fragments ------------------->|
 |                 |   {"query":"\"termination penalty\""}     |
 |                 |<- === contracts/acme-...-agreement.pdf ===|  the passages
 |<- "Two contracts carry one: Acme (3 monthly fees, 12.3),    |
 |    Globex (50% of the remaining fees). Initech excludes it."|

add_to_index читает файлы один раз и сохраняет текст в именованном индексе на диске. search возвращает совпадающие файлы в виде JSON с количеством вхождений. get_text_fragments возвращает каждое совпадение с несколькими словами контекста, поэтому агент цитирует пункт вместо загрузки всего контракта.

Вот что сервер действительно вернул в нашем тесте, против пяти синтетических контрактов:

-> 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 (1 occurrence(s)) ===
     …a termination penalty of three monthly fees applies, payable
     within 30…
   === contracts/globex-consulting-agreement.docx (1 occurrence(s)) ===
     …Early termination penalty: the Client pays 50 percent of the fees…

Обратите внимание на третий контракт. NDA Initech совпал с termination AND penalty, потому что в нём говорится «нет платы и штрафа, связанных с расторжением». Отрывок — это то, что отличает совпадение от упоминания, и агент, читающий отрывки, указывает на это. Это обоснование: каждое утверждение в ответе указывает на файл и предложение, которое можно открыть.

Где каждый подход выигрывает?

Конвейер встраивания                     Агентный полнотекстовый поиск
-------------------------------------    -------------------------------------
разбить, встроить, сохранить в векторном   add_to_index: локальный полнотекстовый индекс
хранилище                                 
встроить вопрос, взять топ‑k фрагментов   агент ищет, уточняет, ищет снова
вставить фрагменты в подсказку            get_text_fragments: цитируемые отрывки
повторно встраивать при изменении          update_index перечитывает изменённые
документов                              
нужна модель встраивания и хранилище      без вызовов модели, без сети во время выполнения
соответствует смыслу; ранжирование        соответствие словам; каждый результат объясним
непрозрачно                              

Полнотекстовый поиск проигрывает, когда вопрос и документ не имеют общих слов: «какие контракты рискованны для нас?» не содержит ключевых слов. Он выигрывает, когда словарь общий, что описывает большинство вопросов, которые люди задают о своих документах: название пункта, продукт, клиент, номер счета, диапазон дат. Когда запрос не находит, агент пробует renewal OR renews или нечеткое совпадение, как человек. Сервер помогает: некотированный запрос из двух слов ничего не находит в GroupDocs.Search, а пустой результат содержит hint, который подсказывает агенту заключить фразу в кавычки.

Какой инструмент для какого вопроса?

Запрос пользователя Вызовы агента
“Индексировать эту папку” add_to_index
“Какие файлы упоминают X?” search
“Что говорится о X?” get_text_fragments
“Файлы изменились, обновить” update_index
“Забыть папку drafts” remove_from_index
“Что находится в индексе?” get_index_info
“Создать отдельный индекс” create_index
“Почему только 10 результатов?” get_license_status

Индекс понимает 82 формата, включая PDF, Office, OpenDocument, HTML и архивы электронной почты (PST, OST, MSG, EML) с их вложениями.

Как запустить?

claude mcp add groupdocs-search -- docker run --rm -i \
  -v /path/to/documents:/data ghcr.io/groupdocs-search/search-net-mcp:latest

Cursor, Claude Desktop, VS Code с GitHub Copilot и другие клиенты используют тот же контейнер в своем конфигурационном файле: Регистрация в AI‑клиентах. На Linux добавьте --user "$(id -u):$(id -g)", чтобы контейнер мог записывать индекс в вашу папку. Сервер работает на движке GroupDocs.Search 26.10, чей новый формат индекса делает индексы меньше и примерно вдвое сокращает их потребление памяти (release notes).

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

  • В режиме оценки индекс содержит не более 100 документов, а поиск возвращает не более 10; каждый ответ указывает на это. Сначала вызовите get_license_status.
  • Это полнотекстовый поиск, а не семантический: он сопоставляет слова, а не смысл.
  • Нет OCR: отсканированные PDF без текстового слоя индексируются только по свойствам файла.
  • Поставляется только как Docker‑образ (упакованный инструмент превышает ограничение размера в NuGet).

Часто задаваемые вопросы

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

Это RAG?
Это поиск с поддержкой генерации, но агентный: модель решает, что искать и когда у неё достаточно, используя полнотекстовый индекс вместо встраиваний.

Что происходит, когда мои документы меняются?
Попросите агента обновить. update_index перечитывает только изменённые, добавленные и удалённые файлы.

Углубиться