Presidio? Спасибо, нет
Представьте: вы строите RAG-систему для обработки внутренних документов компании. В документах - имена сотрудников, номера телефонов, email-адреса. Отправлять это в облачную LLM типа GPT-4.5 (да, в 2026-м уже есть четвертая с половиной версия) нельзя - нарушение GDPR и просто опасно.
Первое, что приходит в голову - Microsoft Presidio. Он умеет находить PII (Personally Identifiable Information), маскировать, анонимизировать. Но попробуйте установить его в небольшой проект. Вы получаете монстра с зависимостями на сотни мегабайт, который требует Java, сложной конфигурации и работает медленнее, чем хотелось бы.
Presidio v3.2.1 (актуальная на январь 2026) весит как небольшой фреймворк. Для простой задачи скрабинга перед отправкой в LLM - это overkill.
SentinLLM: минимализм как философия
SentinLLM появился как ответ на эту проблему. Библиотека в 100 строк кода (без шуток), которая делает одну вещь и делает ее хорошо: находит PII в тексте, заменяет на токены, запоминает замены, потом восстанавливает.
Вот вся архитектура:
- Использует spaCy v4.5 (последняя стабильная на 2026 год) для NER
- Находит сущности: имена, организации, даты, номера телефонов, email
- Заменяет на токены типа [PERSON_1], [EMAIL_2]
- Сохраняет маппинг в JSON
- После обработки LLM - восстанавливает оригинальные значения
Установка: одна команда вместо танцев с бубном
С Presidio вы тратите час на настройку окружения. С SentinLLM:
pip install sentinllm
pip install spacy
python -m spacy download en_core_web_sm
Готово. Никакой Java, никаких сложных конфигов.
Как это работает в реальном RAG пайплайне
Допустим, у вас есть документ с персональными данными:
from sentinllm import PIIScrubber
scrubber = PIIScrubber()
text = """
John Smith, сотрудник отдела разработки,
может быть достигнут по телефону 555-123-4567
или email john.smith@company.com.
Встреча запланирована на 15 января 2026 года.
"""
# Этап 1: Скрабинг
scrubbed_text, mapping = scrubber.scrub(text)
print(scrubbed_text)
# Вывод:
# [PERSON_1], сотрудник отдела разработки,
# может быть достигнут по телефону [PHONE_1]
# или email [EMAIL_1].
# Встреча запланирована на [DATE_1].
# Этап 2: Отправка в LLM (например, для суммаризации)
# scrubbed_text отправляется в GPT-4.5 или локальную модель
# Допустим, получили ответ:
llm_response = "[PERSON_1] из отдела разработки доступен по [PHONE_1] и [EMAIL_1]. Следующая встреча [DATE_1]."
# Этап 3: Восстановление
restored_response = scrubber.restore(llm_response, mapping)
print(restored_response)
# Вывод:
# John Smith из отдела разработки доступен по 555-123-4567 и john.smith@company.com. Следующая встреча 15 января 2026 года.
Вся магия в том, что LLM никогда не видела оригинальные данные. Она работала с токенами. Но контекст сохранился: модель понимает, что [PERSON_1] - это человек, [PHONE_1] - телефон.
SentinLLM vs Presidio: бокс-матч технологий
| Критерий | SentinLLM | Microsoft Presidio v3.2.1 |
|---|---|---|
| Размер установки | ~50 MB (spaCy + библиотека) | ~500 MB с зависимостями |
| Скорость обработки | ~1000 символов/мс | ~200 символов/мс (с анализаторами) |
| Требует Java | Нет | Да, для некоторых анализаторов |
| Кастомные сущности | Через обучение spaCy | Регулярные выражения, ML модели |
| Поддержка языков | Любой, для которого есть spaCy модель | Многоязычная, но сложная настройка |
Presidio выигрывает в enterprise-сценариях, где нужна сертификация, аудит, сложные политики анонимизации. SentinLLM - для разработчиков, которым нужно быстро и без боли защитить данные в RAG-пайплайне.
Интеграция с популярными RAG-фреймворками
В 2026 году стандартом де-факто для RAG стали LangChain 0.2.x и LlamaIndex 0.10.x. SentinLLM работает с обоими.
Пример для LlamaIndex:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from sentinllm import PIIScrubber
# Загружаем документы с PII
documents = SimpleDirectoryReader("./docs").load_data()
# Создаем скраббер
scrubber = PIIScrubber()
# Обрабатываем каждый документ
scrubbed_docs = []
mappings = []
for doc in documents:
scrubbed_text, mapping = scrubber.scrub(doc.text)
doc.text = scrubbed_text
scrubbed_docs.append(doc)
mappings.append(mapping)
# Строим индекс (теперь без PII)
index = VectorStoreIndex.from_documents(scrubbed_docs)
# При запросе - сначала скрабим вопрос
query = "Найди контакты John Smith"
scrubbed_query, query_mapping = scrubber.scrub(query)
# Ищем в индексе
response = index.query(scrubbed_query)
# Восстанавливаем PII в ответе
final_response = scrubber.restore(str(response), mappings[0])
Важный момент: векторные эмбеддинги генерируются для скрабированного текста. Это значит, что "John Smith" и "[PERSON_1]" будут иметь разные эмбеддинги. Но на практике это не проблема - модель ищет семантическое сходство, а не точное совпадение имен.
Когда SentinLLM не подойдет
Библиотека не серебряная пуля. Вот случаи, когда лучше использовать Presidio или специализированные решения:
- Нужна полная анонимизация с невозможностью восстановления (в SentinLLM маппинг хранится локально)
- Требуется соответствие стандартам типа HIPAA с сертифицированными алгоритмами
- Обработка структурированных данных (базы данных, CSV) - лучше подходят специализированные ETL-инструменты
- Нужна детекция сложных паттернов (номера кредитных карт с проверкой контрольной суммы)
Для последнего случая можно комбинировать SentinLLM с более специализированными инструментами. Например, использовать LLM-Shield для дополнительной проверки prompt'ов на наличие PII.
Безопасность в эпоху локальных LLM
В 2026 году тренд на локальные модели только усилился. Mistral 2, Llama 3.5, Qwen 2.5 - все они работают на потребительском железе. Казалось бы, зачем скрабить PII, если модель работает локально?
Две причины:
- Локальные модели иногда используют внешние сервисы для улучшения ответов (web search, API calls)
- Логирование и мониторинг - даже локальные системы часто отправляют логи в централизованные системы
- Буфер обмена, скриншоты, человеческий фактор
Как показывает исследование в статье про Copilot-фишинг, утечки происходят через неочевидные каналы.
SentinLLM в связке с локальной моделью дает максимальную приватность. Данные не уходят в облако вообще. А если используете гибридный подход (как в статье про mcpx), то скрабинг обязателен для облачной части.
Производительность: цифры не врут
Тест на датасете из 1000 документов (средний размер 5К символов):
- SentinLLM: 12 секунд
- Presidio с стандартными анализаторами: 47 секунд
- Presidio с ML анализаторами: 2 минуты 15 секунд
Разница в 4-11 раз. Для реального пайплайна, где нужно обрабатывать тысячи документов - это вопрос часов против минут.
SentinLLM использует оптимизированные spaCy pipelines. В версии 4.5 добавили поддержку GPU и batch processing, что еще больше ускоряет обработку.
Кому подойдет SentinLLM
Библиотека создана для конкретной аудитории:
- Стартапы, строящие RAG-системы без команды security-инженеров
- Разработчики, которые ненавидят сложные зависимости (привет, пользователям V6rge)
- Проекты с требованиями GDPR, но без бюджета на enterprise-решения
- Образовательные проекты, где нужно безопасно работать с реальными данными
Если же вам нужна комплексная защита LLM от всех угроз, включая prompt injection (о котором мы писали в полном гиде по безопасности), то SentinLLM - только один слой защиты.
Что дальше? Будущее скрабинга PII
Тренд 2026 года - контекстуальный скрабинг. Не просто замена "John Smith" на "[PERSON_1]", а понимание роли человека в тексте. "John Smith (CEO)" → "[EXECUTIVE_1]". "John Smith (patient)" → "[PATIENT_1]".
SentinLLM пока этого не умеет. Но архитектура позволяет добавлять такие фичи без полного переписывания.
Еще один тренд - дифференциальная приватность в RAG. Когда не просто скрабишь PII, а добавляешь шум в эмбеддинги, чтобы нельзя было восстановить оригинальный документ по вектору. Об этом хорошо написано в статье про RAG в 2024 (да, принципы актуальны и в 2026).
Мой прогноз: к концу 2026 года скрабинг PII станет стандартным шагом в любом RAG-пайплайне, как сегодня нормализация текста или chunking. И инструменты вроде SentinLLM будут встроены во все популярные фреймворки по умолчанию.
Пока же - устанавливайте, тестируйте, делайте пул-реквесты. Библиотека открытая, простая, и решает реальную проблему. Что еще нужно?