Зачем эта статья существует
Каждый месяц я вижу одно и то же: компания внедряет RAG-систему для внутренних документов, загружает туда тысячи PDF с резюме, договорами, перепиской. Через неделю сотрудник спрашивает LLM: "Найди все номера телефонов клиентов из Москвы". И система радостно вываливает приватную информацию. Штраф по GDPR - до 20 миллионов евро или 4% годового оборота. В России - до 6 миллионов рублей по 152-ФЗ.
Проблема в том, что большинство решений для обнаружения PII либо слишком простые (регулярные выражения), либо требуют кастомных моделей, которые нужно обучать годами. Amazon Bedrock Data Automation с Guardrails - это попытка AWS сделать универсальный детектор и редактор персональных данных. Работает ли он в 2026 году? Давайте разбираться.
Важно: Bedrock постоянно обновляется. На 20 января 2026 года актуальная версия Data Automation - 2.4 с поддержкой 47 типов PII-сущностей, включая новые категории вроде крипто-кошельков и биометрических шаблонов.
Что Bedrock умеет находить (и почему это важно)
Guardrails в Bedrock - это не просто фильтр слов. Это многоуровневая система, которая понимает контекст. Разница между "Москва" как городом и "Москва" как номером кредитной карты (да, есть такая серия).
| Тип PII | Примеры | Особенность Bedrock |
|---|---|---|
| Имена и ФИО | Иван Иванов, Dr. Smith | Определяет полные имена vs обычные слова |
| Финансовые данные | Credit card 4111-1111-1111-1111 | Проверяет валидность через Luhn algorithm |
| Медицинские записи | ICD-10 codes, диагнозы | Распознает даже в свободном тексте |
| Изображения с PII | Фото паспорта, сканы договоров | OCR + анализ текста на картинке |
Самое интересное - работа с изображениями. Вы загружаете сканы договоров, Bedrock использует встроенный OCR (на базе Amazon Textract), находит текст на изображении, затем применяет те же Guardrails. Обнаруживает номер паспорта в углу скана? Может замазать его или полностью удалить из вывода.
Архитектура: как это работает под капотом
Типичная ошибка - думать, что можно просто вызвать API и получить чистые данные. На практике нужна pipeline-архитектура, особенно если у вас потоковая обработка документов.
1Шаг 1: Подготовка Bedrock
Сначала активируем Data Automation в консоли AWS. На 2026 год появилась упрощенная настройка - один клик для стандартных конфигураций PII. Но я не рекомендую это делать. Почему? Потому что стандартные настройки включают обнаружение ВСЕХ типов PII, что замедляет обработку в 3-4 раза.
Лучше создать кастомный Guardrail с только нужными entity types:
# Создаем кастомный guardrail через AWS CLI (версия 2.15.40+)
aws bedrock create-guardrail \
--name "pii-detector-production" \
--blocked-input-messaging "PII detected" \
--pii-entities \
"Name=EMAIL,Action=BLOCK" \
"Name=PHONE,Action=ANONYMIZE" \
"Name=CREDIT_DEBIT_CARD_NUMBER,Action=BLOCK" \
"Name=PASSPORT_NUMBER,Action=ANONYMIZE" \
--sensitive-information-policy "{\"piiEntitiesConfig\":{\"piiEntityTypes\":[\"EMAIL\",\"PHONE\"]}}"
Обратите внимание на Action: BLOCK полностью блокирует запрос, ANONYMIZE заменяет PII на [REDACTED]. Для production я советую BLOCK для финансовых данных и ANONYMIZE для остального. Почему? Потому что если номер карты просочился, его уже не исправить заменой на звездочки.
2Шаг 2: Обработка текстовых документов
Допустим, у вас есть папка с документами в S3. Старое решение - скачивать, парсить локально, загружать обратно. Новый способ - использовать Bedrock Data Automation Jobs:
import boto3
from datetime import datetime
bedrock = boto3.client('bedrock', region_name='us-east-1')
# Создаем задание для обработки документов в S3
response = bedrock.create_data_automation_job(
jobName=f'pii-cleanup-{datetime.now().strftime("%Y%m%d-%H%M%S")}',
inputDataConfig={
's3Uri': 's3://your-bucket/raw-documents/',
'contentType': 'TEXT' # или 'PDF', 'DOCX', 'HTML'
},
outputDataConfig={
's3Uri': 's3://your-bucket/cleaned-documents/'
},
automationConfig={
'piiRedactionConfig': {
'guardrailIdentifier': 'your-guardrail-id',
'piiEntityTypes': ['EMAIL', 'PHONE', 'PASSPORT_NUMBER'],
'redactionType': 'ANONYMIZE' # или 'REMOVE', 'MASK'
}
}
)
print(f"Job ID: {response['jobId']}")
Ключевой момент здесь - redactionType. ANONYMIZE заменяет на общие метки ([EMAIL], [PHONE]). REMOVE удаляет фрагмент полностью. MASK оставляет структуру (***@***.***). Для юридических документов, где важна длина текста, используйте MASK. Для аналитики - ANONYMIZE.
Осторожно с кодировками! Bedrock на 2026 год поддерживает UTF-8, но если у вас старые документы в Windows-1251, нужно конвертировать до загрузки в S3. Иначе кириллические имена не найдутся.
3Шаг 3: Работа с изображениями
Вот где начинается магия. Bedrock Data Automation 2.4 умеет обрабатывать изображения через связку Textract + Guardrails:
def process_image_with_pii_detection(s3_image_path):
"""
Обрабатывает изображение, находит и скрывает PII
"""
bedrock = boto3.client('bedrock', region_name='us-east-1')
# Шаг 1: Извлекаем текст с изображения
textract = boto3.client('textract')
text_response = textract.detect_document_text(
Document={'S3Object': {'Bucket': 'your-bucket', 'Name': s3_image_path}}
)
# Собираем весь текст из блоков
full_text = ' '.join([
block['Text'] for block in text_response['Blocks']
if block['BlockType'] == 'LINE'
])
# Шаг 2: Проверяем текст через Guardrails
guardrail_response = bedrock.invoke_guardrail(
guardrailIdentifier='your-guardrail-id',
text=full_text,
action='ANONYMIZE'
)
# Шаг 3: Если нужно, создаем новое изображение с замазанными областями
if guardrail_response['piiEntities']:
# Получаем координаты PII на изображении
for entity in guardrail_response['piiEntities']:
# Textract возвращает координаты bounding boxes
# Можно использовать Amazon Rekognition для размытия областей
print(f"Found {entity['Type']} at coordinates: {entity.get('Geometry', {})}")
# Альтернатива: просто возвращаем очищенный текст
return guardrail_response['sanitizedText']
return full_text
Проблема в том, что Textract не всегда точно определяет координаты текста на сложных изображениях (скан паспорта с водяными знаками). На практике я советую использовать этот подход для простых сканов, а для сложных - сначала конвертировать в PDF с текстовым слоем.
Интеграция с существующими системами
У вас уже есть RAG-система? Отлично. Вместо того чтобы чистить все документы заранее (что занимает дни), можно интегрировать Bedrock Guardrails прямо в pipeline индексирования.
Возьмем пример из статьи про локальный RAG для 4 миллионов PDF. Там документы парсятся через PyPDF2 и отправляются в векторную БД. Добавляем промежуточный шаг:
from langchain.text_splitter import RecursiveCharacterTextSplitter
import boto3
class BedrockPIICleaner:
def __init__(self, guardrail_id):
self.bedrock = boto3.client('bedrock')
self.guardrail_id = guardrail_id
def clean_chunk(self, text_chunk):
"""Очищает один чанк текста от PII"""
try:
response = self.bedrock.invoke_guardrail(
guardrailIdentifier=self.guardrail_id,
text=text_chunk,
action='ANONYMIZE',
contentClassifiers=['PII'] # Новый параметр в версии 2.4
)
if response['piiDetected']:
print(f"Cleaned PII in chunk: {response['piiEntities']}")
return response['sanitizedText']
return text_chunk
except Exception as e:
# Если Bedrock недоступен, лучше пропустить чанк, чем рисковать PII
print(f"Bedrock error: {e}. Skipping chunk with potential PII.")
return "[CONTENT REMOVED DUE TO PII SCAN FAILURE]"
# Использование в RAG pipeline
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000)
cleaner = BedrockPIICleaner(guardrail_id="your-id")
for document in documents:
chunks = text_splitter.split_text(document.text)
clean_chunks = [cleaner.clean_chunk(chunk) for chunk in chunks]
# Теперь clean_chunks можно отправлять в векторную БД
Этот подход дороже (каждый чанк - отдельный вызов API), но безопаснее. Особенно если вы работаете с медицинскими или финансовыми документами, где один пропущенный номер счета может стоить миллионов.
Что делать, когда Bedrock ошибается
False positives - проклятие любой PII-системы. Bedrock иногда определяет "ИИ" как инициалы (Иван И.). Или принимает номер договора за номер кредитной карты. Есть три стратегии борьбы:
- Whitelist patterns - добавляем regex-исключения прямо в Guardrail. Например, если все ваши номера договоров начинаются с "ДОГ-", можно исключить эту паттерн.
- Контекстные правила - в Bedrock 2.4 появились contextual rules. Можно сказать: "Если перед последовательностью цифр есть слово 'договор', не считать это PII".
- Человеческая проверка - для сомнительных случаев отправляем фрагмент на модерацию. AWS предлагает интеграцию с Mechanical Turk, но я бы использовал внутреннюю команду.
Вот как добавлять whitelist:
# Добавляем исключение для номеров договоров
whitelist_rule = {
"name": "contract-numbers",
"description": "Исключить номера договоров из проверки PII",
"match": {
"type": "REGEX",
"pattern": r"ДОГ-\\d{5}" # ДОГ-12345
},
"sensitivityLevel": "LOW"
}
response = bedrock.update_guardrail(
guardrailIdentifier=guardrail_id,
whitelistRules=[whitelist_rule]
)
Сколько это стоит и когда оно того не стоит
На 20 января 2026 года цены на Bedrock Data Automation:
- Обработка текста: $0.75 за 1M токенов
- Обработка изображений: $1.50 за 1000 изображений
- Guardrails вызовы: $0.25 за 1000 запросов
Обработка 10 000 документов по 10 страниц каждый? Около $300-500. Дешевле, чем один штраф. Но если у вас open-source проект или внутренний инструмент без доступа к sensitive data, возможно, лучше использовать локальные решения вроде SentinLLM.
Bedrock нужен, когда:
- Вы обрабатываете данные клиентов (GDPR, CCPA)
- Работаете с медицинскими записями (HIPAA)
- Строите коммерческий продукт с RAG
- Нужна сертификация compliance (Bedrock имеет SOC 2, ISO 27001)
Не нужен, когда:
- Обрабатываете только публичные данные
- Имеете статический набор документов (проще очистить один раз)
- Бюджет ограничен, а риски минимальны
Типичные ошибки (чтобы вы их не повторили)
Ошибка 1: Доверять Bedrock на 100%. Всегда делайте выборочную проверку. Я видел случай, когда система пропустила номер паспорта в кривом скане. Регулярно запускайте тестовый набор с заведомо известными PII.
Ошибка 2: Хранить логи с неочищенными данными. Bedrock возвращает очищенный текст, но в CloudWatch могут попасть оригинальные запросы. Настройте очистку логов или используйте промежуточный слой для маскирования.
Ошибка 3: Игнорировать производительность. Обработка 1000 документов через Guardrails занимает 10-15 минут. Для реального времени это слишком много. Кэшируйте результаты или используйте batch processing.
Что будет дальше с PII-защитой
К 2027 году, по моим прогнозам, появятся два тренда:
- Federated PII detection - модели будут работать на edge-устройствах без отправки данных в облако. Особенно важно для медицинских учреждений.
- Context-aware redaction - система будет понимать, можно ли показывать email в данном контексте. Внутри компании между отделами - можно. Внешнему консультанту - нельзя.
Amazon уже тестирует Bedrock Local Zones для обработки данных без выхода из региона. Это ответ на ужесточение законодательства вроде российского закона о локализации данных.
Мой совет: начните с пилота. Возьмите 100 самых грязных документов (сканы паспортов, договоры, резюме), пропустите через Bedrock. Посчитайте precision/recall. Если система находит 95% PII с false positive rate меньше 5% - внедряйте. Если нет, посмотрите в сторону кастомных моделей или гибридных подходов.
И помните: ни одна автоматическая система не заменит human-in-the-loop для критически важных данных. Особенно когда на кону не только штрафы, но и репутация.