Корпоративный ассистент знает все документы компании. В этом его сила и его главный риск. Если бот найдёт приказ о премиях и перескажет его стажёру, это уже не ошибка поиска, а утечка.
Как часто делают
Все документы индексируют в одну базу, а права проверяют в самом конце: модель сформировала ответ, система смотрит, можно ли его показать. Проблем здесь три:
- закрытый документ уже побывал в контексте модели и мог повлиять на ответ. Даже если сам документ не показали, его содержание могло просочиться в формулировку;
- такой фильтр легко обойти, переформулировав вопрос;
- в логах остаются фрагменты закрытых данных.
Как правильно: фильтр до поиска
- При индексации у каждого фрагмента сохраняются права: какие роли, отделы или люди его видят. Те же, что в исходной системе — файловом хранилище, СЭД, вики.
- При запросе система знает, кто спрашивает, и ищет только среди разрешённых ему фрагментов.
- Модель получает только то, что пользователь и так мог бы открыть сам.
- В ответе ссылки ведут на документы, доступные этому пользователю.
Модель не может пересказать то, чего не видела. В этом весь смысл.
Подводные камни
Синхронизация прав. Человека перевели в другой отдел — права в индексе должны обновиться так же быстро, как в исходной системе.
Наследование. Права часто задают на папку, а не на файл. При индексации их нужно правильно развернуть на каждый документ.
Сводные вопросы. «Сколько у нас договоров с поставщиком X?» — ответ собирается из многих документов, и каждый должен пройти фильтр.
Логи. Журнал запросов тоже содержит данные, и доступ к нему ограничивают отдельно.
Как проверить свою систему
Задайте один и тот же вопрос от имени двух пользователей с разными правами. Если ответы одинаковые — фильтра нет или он стоит не там.
Так устроено живое демо на нашем сайте: одна база, несколько компаний и ролей, и ответ меняется в зависимости от того, кто спрашивает.
Строите или уже запустили корпоративного ассистента? Опишите, как устроены права, — проверим архитектуру за 30 минут.