Добавьте ограниченные запросы ИИ в приложение

AWSBeginner
Практиковаться сейчас

Введение

Команде сводки документа нужны предсказуемые границы для зависимости от ИИ. Вы добавите ограниченный клиент Bedrock в приложение, отклоните слишком длинный ввод до обращения к модели и обработаете сбой или медленный ответ без раскрытия исходных исключений.

Нужны основы Python и проверка структурированного вывода из предыдущей работы. Интерфейс и парсер предоставлены, чтобы вы сосредоточились на границах запросов. У новой VM собственный документ, настроенная идентификация и доступный лимит.

Связь с сертификацией

Сертификация Задача экзамена Практика
AI Practitioner (AIF-C01) Задачи 3.1, 3.2 Ограничить вывод модели и обработать ответы внутри приложения.

Концептуальная схема draw.io: приложение проверяет размер до ограниченного запроса Converse и возвращает сводку для проверки или безопасную диагностику.

Подключите ограниченный клиент Bedrock

На этом шаге вы реализуете клиент предоставленной команды и получите реальную структурированную сводку.

Начните в рабочем каталоге:

cd /home/labex/project

Прочитайте исходный документ и параметры команды:

cat incident.txt
/opt/labex/aws/venv/bin/python application.py --help

Инцидент — INC-204. application.py читает документ и печатает JSON. Он вызывает client.request_summary; предоставленный response_parser.py проверяет завершение и три изученных строковых поля. Начальный client.py сообщает о незавершённой реализации и не отправляет запрос.

Ограничение входа защищает приложение до расходования лимита. Пример принимает непустой текст длиной 1–1000 символов, ограничивает вывод 768 токенами и явно задаёт тайм-ауты соединения и чтения. total_max_attempts: 1 означает один первоначальный запрос без автоматического повтора. Тайм-аут чтения ограничивает ожидание в соединении, а не обещает завершение любой операции ровно в этот момент.

Замените начальный клиент реализацией ниже. ClientError означает ответ об ошибке сервиса, ReadTimeoutError — истёкшее ожидание чтения. Оба превращаются в небольшие JSON-диагностики. Полные исключения, заголовки и учётные данные никогда не включаются в результат:

cat > client.py <<'EOF'
import boto3
from botocore.config import Config
from botocore.exceptions import BotoCoreError, ClientError, ReadTimeoutError
from response_parser import summarize_response


def request_summary(document, endpoint_url, read_timeout):
    if not document.strip() or len(document) > 1000:
        return {'status': 'rejected', 'reason': 'input_limit'}
    client = boto3.client('bedrock-runtime', endpoint_url=endpoint_url,
        config=Config(proxies={}, connect_timeout=3, read_timeout=read_timeout,
                      retries={'total_max_attempts': 1}))
    try:
        response = client.converse(
            modelId='labex.text-v1:0',
            system=[{'text': 'Summarize only facts supplied in the incident document. Return exactly one JSON object with string fields incident_id, impact and next_action. No Markdown fences, extra keys or surrounding prose. Do not turn planned work into completed work.'}],
            messages=[{'role': 'user', 'content': [{'text': document}]}],
            inferenceConfig={'maxTokens': 768, 'temperature': 0})
    except ReadTimeoutError:
        return {'status': 'unavailable', 'reason': 'read_timeout'}
    except ClientError as error:
        code = error.response.get('Error', {}).get('Code')
        reason = 'busy' if code == 'ThrottlingException' else 'service_unavailable'
        return {'status': 'unavailable', 'reason': reason}
    except BotoCoreError:
        return {'status': 'unavailable', 'reason': 'connection_failed'}
    return summarize_response(response)
EOF

Запустите приложение с обычным настроенным endpoint Bedrock. > accepted.json сохраняет напечатанную выдачу:

/opt/labex/aws/venv/bin/python application.py > accepted.json

Прочитайте её:

cat accepted.json

Ожидайте status: ok и три поля. Сравните смысл с документом. Разверните реальный завершённый запрос в AWS View и сравните текст. Ограничение вывода сдерживает токены; предел входных символов — отдельная политика. Кешированный ответ может использовать реальный результат без нового расхода credits.

Реальная AWS View: завершённый запрос сообщает токены, причину завершения и сводку. Значения и формулировки могут отличаться.

Отклоните длинный ввод до обращения к модели

На этом шаге вы подтвердите отказ для документа, превышающего входной бюджет.

Предоставленный oversized.txt содержит больше 1000 символов. wc -m считает символы:

wc -m oversized.txt

Обработайте файл тем же приложением:

/opt/labex/aws/venv/bin/python application.py --document oversized.txt > too-long.json

Это намеренное отклонение даёт код 2. echo $? печатает код предыдущей команды:

echo $?

Прочитайте безопасный результат:

cat too-long.json

Ожидайте status: rejected и reason: input_limit. Проверка происходит до построения запроса, поэтому в AWS View остаётся только прежний завершённый запрос. Отказ предотвращает новый расход; удаление результата не отменяет прежнюю оплату.

Обработайте сбой сервиса и тайм-аут чтения

На этом шаге вы проверите границы ошибок двумя явно локальными тестовыми транспортными сервисами.

Эти endpoints специально возвращают ошибку или задерживают ответ. Они не обращаются к модели и не расходуют credits. Это тестовые зависимости, не альтернативные поставщики успешного вывода.

Используйте тест недоступного сервиса на порту 5001:

/opt/labex/aws/venv/bin/python application.py --endpoint-url http://127.0.0.1:5001 > unavailable.json

Ожидаемый сбой даёт код 3. Изучите диагностику:

cat unavailable.json

Ожидайте status: unavailable и reason: service_unavailable без трассировки, полного текста ошибки SDK или учётных данных.

Сервис порта 5002 ждёт три секунды. Для теста задайте одну секунду ожидания чтения:

/opt/labex/aws/venv/bin/python application.py --endpoint-url http://127.0.0.1:5002 --read-timeout 1 > timed-out.json

Прочитайте результат:

cat timed-out.json

Ожидайте status: unavailable и reason: read_timeout. SDK делает одну попытку. Тайм-аут не доказывает отмену или бесплатность запроса к модели: реальный upstream может закончить после прекращения ожидания клиентом. Проверьте ожидающие/неудачные запросы и лимит перед повтором; не добавляйте безусловный цикл повторов.

В AWS View должен оставаться только реальный запрос шага 1. Обычные 150 секунд чтения — конечное значение для упражнения; реальное приложение выбирает тайм-ауты, повторы и обратную связь по бюджету задержки. Официальная справка Config объясняет отдельные пределы соединения, чтения и числа попыток.

Удалите тестовые результаты и сохраните приложение

На этом шаге вы удалите четыре локальных результата, сохранив рабочий клиент и приложение.

Функциональные и ошибочные пути нужно проверить до очистки. Удалите только названные результаты:

rm accepted.json too-long.json unavailable.json timed-out.json

Выведите оставшиеся файлы:

ls

Сохраните application.py, client.py, response_parser.py, документ и примеры. Converse не создал постоянную облачную нагрузку; удаление результатов не возвращает credits. Исходный код доступен для практики до завершения VM.

Заключение

Вы подключили реальный запрос Bedrock, ограничили вход и вывод, отключили автоматические повторы и задали конечное ожидание. Вы проверили сбой и тайм-аут без подмены успешного вывода, вернули безопасную диагностику и удалили только локальные результаты.