РУКОВОДСТВО · ОБНОВЛЕНО 2026-10-30
Слишком большой ответ инструмента: как передавать данные LLM частями
Контракт функции, который не отправляет всю базу в контекст и не скрывает оставшиеся записи.
Когда инструмент возвращает большой список, не обрезайте его молча перед отправкой модели. Задайте ограничение страницы на сервере, явный признак продолжения и способ запросить следующую часть. Для задачи подсчёта или поиска конкретного объекта лучше выполнить целевую операцию над данными и вернуть проверяемый результат. Пагинация ограничивает один ответ, но уже прочитанные страницы всё равно занимают место в истории. Планируйте, какие сведения агент сохраняет и когда он должен остановить чтение.
1. Опишите форму результата функции
Верните записи, признак наличия продолжения и непрозрачный курсор, если выбран такой контракт. Документируйте порядок сортировки и допустимые фильтры. Не выдавайте длину текущей страницы за общее количество записей. Спецификация MCP описывает структурированные результаты инструментов, но не создаёт автоматически бизнес-пагинацию вашего списка. Поля и семантику страницы определяет реализация функции. Модель должна понимать, какие данные ещё не прочитаны и что означает отсутствие следующего курсора.
2. Ограничьте работу на стороне сервера
Проверяйте предельный page size даже при неожиданном аргументе модели. Применяйте права доступа и фильтры к каждой странице, а курсор связывайте с нужным контекстом запроса. При изменении фильтров начинайте новый обход. Для изменяемого набора определите, допустимы ли повторы и пропуски между страницами, либо используйте согласованный снимок. Не позволяйте подменённому курсору открыть чужой список. Ограничение числа строк дополняйте разумным пределом размера самих полей.
3. Выберите нужную операцию вместо выгрузки
Для ответа о количестве записей используйте серверный подсчёт с теми же фильтрами. Для нахождения конкретного заказа передайте идентификатор в функцию поиска. Если агенту нужен обзор, верните агрегаты и несколько примеров с возможностью открыть детали. Краткое представление должно явно отличаться от полного набора. Не рассчитывайте итоговую сумму по первой странице и не называйте её общей. Важные числа проверяйте программно, сохраняя условия отбора и время снимка данных.
4. Проверьте завершение и накопление истории
Создайте тестовый набор больше одной страницы и убедитесь, что агент получает все нужные части или честно сообщает о частичном просмотре. Проверьте пустой результат, истёкший курсор, смену фильтра и повтор запроса. Ограничьте число шагов и общий объём чтения. Если полный обход не помещается в бюджет, сохраните результат вне диалога и передайте ссылку или идентификатор по вашему контракту. Возобновление должно сохранять права доступа и понятный статус завершённости, а не продолжать бесконечную цепочку вызовов.
Частые вопросы
Можно ли просто оставить первые сто строк?
Только если результат явно обозначен как ограниченная выборка и задача это допускает. Для полного списка нужен механизм продолжения или другой способ обработки.
Гарантирует ли MCP пагинацию результата функции?
Нет. Пагинация списков протокола и бизнес-результат вызванного инструмента имеют разные контракты. Поля страницы вашей функции нужно определить отдельно.
Зачем нужен серверный подсчёт?
Он позволяет получить итог над всем разрешённым набором без загрузки каждой строки в контекст. Фильтры и права должны совпадать с основной выдачей.
Решает ли пагинация переполнение контекста?
Она ограничивает отдельный ответ. Если все страницы накапливаются в истории, контекст продолжает расти; нужен отдельный план сохранения и сокращения данных.