Часто — нет. Для папки с контрактами, отчетами или электронной почтой 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 перечитывает только изменённые, добавленные и удалённые файлы.
Углубиться
- Документация, каноническое руководство: Как искать документы с помощью AI‑агентов, используя MCP
- Центр документации: GroupDocs.Search MCP Server
- Для агент‑программистов: grep не может читать PDF: дайте вашему агенту‑программисту индекс документов
- Связано: Почему AI‑агент не должен читать 300 контрактов, чтобы ответить на один вопрос
- Связано: Обоснованные ответы из ваших файлов: цитируйте отрывок, а не память модели
- Связано: Поиск в архиве электронной почты с AI‑агентом: PST, MSG, EML и вложения внутри
- Связано: Память проекта для AI‑агентов: один индекс на проект, поддерживаемый в актуальном состоянии
- На месте и модель безопасности: 3 архитектуры обработки AI‑документов, и та, которая хранит файлы внутри вашей сети
- Выпуск движка: Выпуск движка: GroupDocs.Search for .NET 26.10 – основные моменты релиза октября 2026
- Вопросы: GroupDocs Search forum
- Исходный код: GroupDocs.Search.Mcp on GitHub