Доступ к ресурсам: Эффективная передача контекста для Claude
В мире больших языковых моделей (LLM), таких как Claude, предоставление точного и актуального контекста является ключом к получению высококачественных ответов. Часто моделям требуется доступ к внешней информации — отчетов, документов, баз знаний или конфигурационных файлов. Традиционно это достигается с помощью "инструментов" (tools), которые позволяют модели вызывать внешние функции для получения данных. Однако существует более эффективный способ для определенных типов информации: ресурсы.
В рамках платформы MCP (Model Control Plane), ресурсы позволяют вашему серверу предоставлять данные, которые могут быть непосредственно включены в промпты, без необходимости вызова инструментов для доступа к информации. Это создает значительно более эффективный способ предоставления контекста моделям AI, таким как Claude, особенно когда речь идет о статическом или полустатическом контенте.
Что такое ресурсы и зачем они нужны?
Представьте, что Claude постоянно нуждается в доступе к одним и тем же корпоративным политикам, спецификациям продуктов или часто задаваемым вопросам. Если каждый раз для получения этой информации использовать инструмент, это приведет к дополнительным вызовам API, увеличению задержки и усложнению логики. Ресурсы решают эту проблему, позволяя вам "предзагружать" или "представлять" эти данные непосредственно в контекст промпта.
Ресурсы — это механизм, который позволяет вашему приложению или сервису предоставлять структурированные или неструктурированные данные, которые могут быть легко идентифицированы и вставлены в промпт для Claude. Вместо того чтобы Claude "решал", какой инструмент вызвать для получения информации, данные из ресурса уже доступны и готовы к использованию, как только пользователь или система запрашивает их.
Основные преимущества использования ресурсов:
- Эффективность: Claude получает содержимое документа немедленно, без необходимости совершать дополнительные вызовы инструментов для доступа к информации.
- Снижение задержки: Уменьшается время ожидания ответа, так как нет необходимости в промежуточных шагах.
- Уменьшение количества вызовов API: Сокращаются затраты и сложность, связанные с управлением вызовами внешних API.
- Улучшенное управление контекстом: Гарантирует, что критически важная информация всегда присутствует в промпте.
Как происходит доступ к ресурсам: Общий поток
Когда пользователь или ваше приложение хочет получить доступ к содержимому ресурса, поток данных работает следующим образом:
- Запрос пользователя: Пользователь запрашивает информацию о ресурсе, например, введя специальный синтаксис, такой как
@report.pdf, в интерфейсе чата. - Идентификация запроса: Вашему коду необходимо распознать этот запрос и, возможно, предложить список доступных ресурсов для автозавершения.
- Запрос к MCP Server: MCP Client вашего приложения отправляет запрос на чтение ресурса (
ReadResourceRequest) на MCP Server, указывая URI (Uniform Resource Identifier) запрашиваемого ресурса. - Получение данных: Сервер отвечает результатом чтения ресурса (
ReadResourceResult), который содержит запрошенные данные ресурса. - Включение в промпт: Ваш код затем может напрямую вставить эти данные в промпт, который будет отправлен Claude.
Таким образом, Claude получает всю необходимую информацию как часть исходного промпта, что позволяет ему обрабатывать запрос более целостно и эффективно.
Реализация чтения ресурсов
Для чтения ресурсов из вашего MCP клиента вам потребуется реализовать соответствующую логику в вашем коде. Основная функция будет выполнять запрос к вашей сессии MCP и обрабатывать полученный ответ.
Концептуально, это выглядит так:
Ваша функция принимает URI ресурса (например, "report.pdf"). Она использует метод session().read_resource() для асинхронного запроса данных. После получения ответа, функция извлекает содержимое ресурса из поля contents результата.
Пример псевдокода для понимания:
async def read_resource(self, uri: str) -> Any:
# Выполняем асинхронный запрос на чтение ресурса
result = await self.session().read_resource(AnyUrl(uri))
# Извлекаем содержимое ресурса из ответа
resource = result.contents[0]
# ... дальнейшая обработка содержимого ...
Обработка различных типов ресурсов
Ресурсы могут возвращать различные типы контента, поэтому вам необходимо проверять MIME type и соответствующим образом парсить данные. Это гарантирует, что вы правильно интерпретируете полученную информацию.
Например, если ресурс содержит текстовые данные, вы можете проверить его MIME type:
if isinstance(resource, types.TextResourceContents):
if resource.mimeType == "application/json":
# Если это JSON, парсим его
return json.loads(resource.text)
# В противном случае возвращаем как обычный текст
return resource.text
Этот подход позволяет обрабатывать два основных сценария:
- JSON-ресурсы: Требуют парсинга для преобразования строки JSON в структурированный объект (например, словарь или список в Python).
- Обычные текстовые ресурсы: Могут быть возвращены "как есть", поскольку их содержимое уже является читаемым текстом.
Таким образом, ваш код становится гибким и может работать с различными форматами данных, предоставляемыми через ресурсы.
Ресурсы против инструментов: Когда что использовать?
Понимание различий между ресурсами и инструментами (tools) критически важно для проектирования эффективных систем на базе AI. Хотя оба механизма предоставляют Claude доступ к внешней информации, они предназначены для разных сценариев.
Когда использовать ресурсы:
Ресурсы особенно полезны, когда:
- У вас есть статический или полустатический контент, который часто упоминается (например, руководства пользователя, регламенты, фиксированные наборы данных).
- Вы хотите уменьшить количество вызовов API и связанные с ними задержки.
- Содержимое должно быть немедленно доступно в контексте промпта, без необходимости для AI принимать решение о его поиске.
- Данные не требуют сложной логики или вычислений для извлечения.
Примеры: PDF-отчеты, текстовые документы, JSON-файлы с конфигурацией, статьи из базы знаний, которые не меняются часто.
Когда использовать инструменты (Tools):
Инструменты, напротив, лучше подходят для:
- Динамических операций или когда вам нужно, чтобы AI выполнял действия (например, поиск актуальных новостей, получение текущей погоды, выполнение запроса к базе данных в реальном времени).
- Когда AI должен решить, следует ли получать доступ к определенной информации на основе контекста разговора.
- Операций, которые могут иметь побочные эффекты (например, отправка электронного письма, бронирование встречи, изменение состояния системы).
- Сложных вычислений или агрегации данных, которые нецелесообразно включать напрямую в промпт.
Примеры: API для поиска товаров, API для бронирования билетов, функции для выполнения математических расчетов, доступ к CRM-системе.
Ключевое различие заключается в том, что ресурсы предоставляют предварительно загруженный контекст, тогда как инструменты предоставляют функциональность по требованию, позволяя AI взаимодействовать с внешним миром.
Преимущества использования ресурсов
Использование ресурсов в вашей архитектуре с Claude через Google Vertex AI приносит значительные выгоды:
- Оптимизация производительности: Прямое включение данных в промпт устраняет необходимость в дополнительных раундах взаимодействия между Claude и вашим приложением, что сокращает время ответа.
- Снижение сложности: Упрощается логика обработки запросов, так как нет необходимости управлять вызовами инструментов и их ответами для статического контента.
- Улучшенное понимание контекста: Claude получает более полный и непосредственный контекст, что может привести к более точным и релевантным ответам.
- Экономия ресурсов: Меньшее количество вызовов API может привести к снижению операционных расходов.
В целом, ресурсы представляют собой мощный механизм для эффективного предоставления статической и полустатической информации Claude, дополняя возможности инструментов и позволяя создавать более производительные и интеллектуальные приложения.