Как найти и скрыть PII в тексте и изображениях через Amazon Bedrock | AiManual
AiManual Logo Ai / Manual.
20 Янв 2026 Гайд

Автоматическая чистка персональных данных: от текстов до картинок с Amazon Bedrock

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

Зачем эта статья существует

Каждый месяц я вижу одно и то же: компания внедряет 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. Обнаруживает номер паспорта в углу скана? Может замазать его или полностью удалить из вывода.

💡
Если вы работаете с локальными решениями вроде SLM и Artifex, знайте их ограничения: они не умеют в контекстный анализ. "Москва" всегда будет "Москвой", даже если это номер карты. Bedrock дороже, но умнее.

Архитектура: как это работает под капотом

Типичная ошибка - думать, что можно просто вызвать 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 иногда определяет "ИИ" как инициалы (Иван И.). Или принимает номер договора за номер кредитной карты. Есть три стратегии борьбы:

  1. Whitelist patterns - добавляем regex-исключения прямо в Guardrail. Например, если все ваши номера договоров начинаются с "ДОГ-", можно исключить эту паттерн.
  2. Контекстные правила - в Bedrock 2.4 появились contextual rules. Можно сказать: "Если перед последовательностью цифр есть слово 'договор', не считать это PII".
  3. Человеческая проверка - для сомнительных случаев отправляем фрагмент на модерацию. 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 году, по моим прогнозам, появятся два тренда:

  1. Federated PII detection - модели будут работать на edge-устройствах без отправки данных в облако. Особенно важно для медицинских учреждений.
  2. Context-aware redaction - система будет понимать, можно ли показывать email в данном контексте. Внутри компании между отделами - можно. Внешнему консультанту - нельзя.

Amazon уже тестирует Bedrock Local Zones для обработки данных без выхода из региона. Это ответ на ужесточение законодательства вроде российского закона о локализации данных.

Мой совет: начните с пилота. Возьмите 100 самых грязных документов (сканы паспортов, договоры, резюме), пропустите через Bedrock. Посчитайте precision/recall. Если система находит 95% PII с false positive rate меньше 5% - внедряйте. Если нет, посмотрите в сторону кастомных моделей или гибридных подходов.

И помните: ни одна автоматическая система не заменит human-in-the-loop для критически важных данных. Особенно когда на кону не только штрафы, но и репутация.