Ответ о ваших документах хорош только настолько, насколько хорош текст, из которого он построен, и когда вы вставляете целые файлы в чат, вы не можете понять, какая часть действительно использовалась моделью. GroupDocs.Search.Mcp, работающий локально в Docker, предоставляет Claude Desktop, Cursor или Copilot другую примитивную операцию: get_text_fragments возвращает только отрывки, соответствующие запросу, с несколькими словами контекста и именем файла, из которого они взяты, поэтому агент отвечает, ссылаясь на цитаты:
Что мои контракты говорят о штрафах? Цитируйте отрывки, предоставив достаточно контекста, чтобы понять каждый из них.
Пошаговая версия с настройками и устранением неполадок находится в документации: Как получить соответствующие отрывки вместо чтения целых файлов.
Почему ответы отклоняются от документов?
Потому что окно контекста — это бюджет, а целые документы тратят его неэффективно. Вопрос о штрафах может требовать лишь три предложения из пятидесяти страниц. Вставьте пятьдесят страниц, и модели придётся самостоятельно находить эти три предложения среди всего остального, а затем удерживать их, пока она пишет. Длинные контексты суммируются, ранний материал теряет вес, и ответ начинает опираться на общее представление модели о том, что обычно пишут в контрактах, а не на то, что написано в ваших. В отрасли это называют контекстным инженерингом; самая простая его форма — не загружать текст, который вам не нужен.
Как выглядит фрагмент?
Индекс уже хранит текст каждого документа, поэтому сервер может вырезать отрывок вокруг каждого совпадения. Это реальные ответы из нашего теста, проведённого на пяти синтетических контрактах. По умолчанию, восемь слов с каждой стороны, выдаётся фраза:
-> get_text_fragments {"query":"penalty","indexName":"contracts"}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
[content] …before the end of the Term, a termination penalty of
three monthly fees applies, payable within 30…
Двадцать слов с каждой стороны дают целое положение:
-> get_text_fragments {"query":"penalty","indexName":"contracts",
"termsBefore":20,"termsAfter":20,"maxFragmentsPerDocument":1}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
…convenience on 90 days written notice.
12.3 If the Client terminates before the end of the Term, a termination
penalty of three monthly fees applies, payable within 30 days of the
termination date.
14.2 Force majeure: neither party is…
termsBefore и termsAfter — это регулятор: небольшие значения для «какие файлы и примерно где», большие — для «цитировать пункт». maxFragmentsPerDocument и maxDocuments ограничивают размер ответа, так что слово, встречающееся двести раз, не заполняет контекст.
Бюджет, бок о бок
Reading the files Searching the index
------------------------------------- -------------------------------------
agent opens every document search: which files match (JSON)
context grows with the corpus get_text_fragments: the passages
long files crowd out the question (~8 words either side, per file)
repeated for every question answer cites file + passage
the index is reused next time
Разница растёт с размером корпуса. Для трёх коротких файлов это почти не заметно. Для папки с длинными контрактами, отчётами и письмами фрагменты для одного вопроса составляют несколько сотен слов, против полного текста каждого потенциального документа.
Когда слова различаются
Полнотекстовый поиск сопоставляет слова, что является преимуществом для обоснования (каждое совпадение объяснимо) и ограничением для полноты (синоним считается пропуском). Задача агента — пробовать варианты, и он может увидеть, что именно каждый вариант сопоставил:
-> search {"query":"renewal OR renews","indexName":"contracts"}
<- umbrella-office-lease.pdf, terms ["renewal", "renews"]
-> search {"query":"renewl","indexName":"contracts","fuzzy":true}
<- umbrella-office-lease.pdf, terms ["renewal", "renews", "rent"]
Нечеткое сопоставление спасло опечатку и также подтянуло rent. Поскольку ответ перечисляет найденные термины, агент или вы можете увидеть избыточное совпадение вместо того, чтобы просто доверять ему. Такая прозрачность и есть то, что должно означать «обоснованный»: не только «ответ ссылается на источник», но и «вы можете увидеть, как источник был найден».
Как выглядит обоснованный ответ
Попросите цитаты, и ответ придёт в виде, который можно сразу проверить:
Два контракта содержат штраф за расторжение. Acme MSA, пункт 12.3: «a termination penalty of three monthly fees applies, payable within 30 days of the termination date.» Соглашение Globex consulting, раздел 9: «the Client pays 50 percent of the fees remaining for the current phase.» NDA Initech упоминает расторжение и штраф, но заявляет, что штрафа нет.
Если резюме неверно интерпретирует цитату, ошибка будет расположена сразу рядом с цитатой.
Честные ограничения
- В режиме оценки индекс содержит не более 100 документов, а поиск возвращает не более 10. Режим оценки также добавляет строку «Evaluation only…» в индексированный текст некоторых форматов, которая может появиться во фрагментах; лицензируйте сервер и перестройте индекс, чтобы убрать её. Сначала вызовите
get_license_status. - Контекст фрагмента считается в словах, а не в предложениях, поэтому отрывок может начинаться с середины предложения; увеличьте
termsBefore, когда это важно. - Нет OCR: сканы без текстового слоя не имеют отрывков для возврата.
- Только Docker; в Linux добавьте
--user "$(id -u):$(id -g)".
FAQ
Как заставить Claude ссылаться на источники из моих документов?
Дайте ему инструмент, который возвращает исходный текст вместе с именем файла. get_text_fragments делает именно это, а инструкция вроде «quote the passage and its file» делает это привычкой.
Сокращает ли это использование токенов?
Это избавляет от загрузки целых документов для ответа на вопрос: агент читает только совпадающие отрывки. Насколько это экономит, зависит от размера ваших файлов.
Может ли агент всё равно прочитать весь файл, если это необходимо?
Да, с помощью собственных файловых инструментов. Фрагменты предназначены для поиска и цитирования; читайте весь файл, когда отрывка недостаточно.
Углубиться
- Документация, канонический how-to: Как получить соответствующие отрывки вместо чтения целых файлов
- Центр документации: GroupDocs.Search MCP Server
- Начните здесь: Do you need a vector database to ask questions about a folder of documents?
- Связанные статьи: Why an AI agent should not read 300 contracts to answer one question
- Связанные статьи: 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