Сценарии Guardrails для RAG и Memory
Где проверять документы, факты и поисковую выдачу, как сохранять маскированный текст и проверять интеграцию.
На какие требования опираемся
Для RAG это ING-6 — проверка персональных данных и классификация до индексации,
а также RET-8 — проверка извлечённого контекста. Для Memory — SEC-2:
маскирование персональных данных до долговременного сохранения, включая проверку
извлечённых фактов. Ниже описан предлагаемый адаптер к существующему API проверки текста,
а не уже включённая интеграция в сервисах соседних команд.
Описания команд в Team Docs содержат различия между целевым API и поставкой.
Руководство RAG отмечает отсутствие
/v1/retrieve_and_pack и переиндексации через API.
Руководство Memory отдельно отмечает, что Guardrails,
JWT/SpiceDB-интеграция и некоторые операции памяти/контрольных точек ещё не
включены. Поэтому первым этапом здесь используются приём документа и /v1/query
для RAG, добавление/поиск/список памяти для Memory. Доступность конкретной версии
их сервисов должна подтвердить соответствующая команда.
Общие правила преобразования
Извлеките только проверяемые текстовые поля в сообщения. Рядом сохраните таблицу
позиций, например 0 → document.content.title, 1 → sections[0].text.
После mask заменяйте поля по этой таблице. Не пытайтесь восстановить привязку
по совпадению строк: одинаковый текст может встречаться в разных полях.
Сервис продолжает владеть doc_id, memory_id, agent_id, run_id, ACL,
фильтрами доступа и ссылками на источник. Эти данные не являются параметрами
Guardrails. Не передавайте их как дополнительные поля HTTP-тела.
Поля title, подписи таблиц, строковые значения метаданных и URL могут сами
содержать персональные данные: явно включите нужные поля в карту проверки либо
исключите их из сохраняемых/выдаваемых данных. Проверка только content не
покрывает остальные поля автоматически.
Один вызов оценивает набор сообщений целиком. HTTP-ответ не сообщает, какой именно документ вызвал запрет. Для независимого решения по каждому документу вызывайте Guardrails отдельно, с ограниченной конкурентностью. Стоп-лист и регулярные выражения не склеивают границы разных сообщений. Разрезанная между частями запрещённая фраза может не обнаружиться; LLM-проверка также не даёт гарантии обходоустойчивости.
Документ больше лимита нельзя молча обрезать. Согласуйте единицу проверки, размер частей, перекрытие и проверку собранного контекста. Если документ должен попасть в индекс целиком, сначала соберите результаты всех частей и только затем публикуйте новую версию. Ошибка последней части не должна оставлять первые части уже доступными пользователям.
RAG: приём документа
Точка входа по API RAG — POST /v1/documents:submit.
Предлагаемый порядок для upsert:
- Проверить права и форму документа обычным механизмом RAG. Выбрать политику по доверенной конфигурации коллекции/сервиса.
- Для
contentизвлечь текст из заголовка, секций и таблиц по явному списку полей. Дляcontent_refсначала получить и распарсить содержимое в RAG: Guardrails сам не скачивает S3/HTTP-объекты и не проверяет их по URI. - Отправить текст в
/request. Для каждого поля использовать сообщение{"role":"user","content":"..."}. Конкретная роль здесь — соглашение адаптера, а не повышение доверия к документу. - При
passпродолжить с проверенными строками. Приmaskсформировать новый канонический документ из возвращённых строк, сохранив идентификаторы и ACL. - Из проверенной версии строить части, эмбеддинги, индекс и поисковые выдержки.
Если в системе есть хэш исходника для дедупликации, сохранить его назначение;
отдельно хранить отпечаток обработанного представления. Не подменять смысл
content_hashсуществующего API без решения команды RAG. - При запрете завершить документ отказом; при технической ошибке не публиковать
его в индексе. Отображение этих случаев в
FAILED/error_codeзадания согласует команда RAG. Новых HTTP-кодов её API это руководство не вводит.
202 Accepted у приёма документа означает принятие задания, а не прохождение
Guardrails. Признак завершения должен появляться только после проверки и
публикации разрешённой версии. Повторы должны использовать исходный ключ
идемпотентности задания и согласованную ревизию политики.
Если сырые документы сохраняются в S3 или очереди до проверки, формулировка «персональные данные нигде не сохраняются» неверна. Для требования «до индекса» допустимость закрытого временного хранилища, его срок жизни и доступ определяет команда. Для более строгого требования проверку нужно ставить до такой записи. Удаление документа не должно блокироваться проверкой его удаляемого текста.
RAG: поисковая выдача
В первой интеграции используйте реализованный POST /v1/query.
- Авторизовать поиск, применить ACL и фильтры средствами RAG.
- Проверить текст поискового запроса до отправки во внешний сервис эмбеддингов, переписывания или ранжирования, если политика ограничивает такую передачу.
- Получить разрешённые результаты и составить карту
позиция → items[i].contentи других выдаваемых текстовых полей. - Проверить выдачу через
/response, используяchoices[].message. Приmaskобновить соответствующие строки.doc_id,chunk_idи оценки релевантности остаются под управлением RAG. - Из проверенных строк собрать контекст для модели, пересчитать бюджет токенов. Если классификатор оценивает контекст целиком, проверить и итоговую сборку. Не добавлять после проверки непроверенные заголовки или исходные выдержки.
Предлагаемый вариант отказа для первого этапа — остановить выдачу целиком при
deny/ошибке. Выборочно удалить опасный фрагмент можно только с отдельной
проверкой каждого фрагмента и явно согласованным поведением частичной выдачи.
При этом нужно пересчитать количество результатов и бюджет токенов, сохранить
корректность цитат и не раскрыть удалённый текст в пояснениях.
Маскированная цитата уже не дословна: в отображении и ссылках на источник это должно учитываться. Ссылка на исходный документ не должна обходить его ACL или раскрывать данные, ради которых применили маскирование.
Memory: запись диалога и извлечение фактов
Точка входа — POST /v1/memories, поля messages, agent_id/run_id, infer.
Порядок внедрения:
- Выполнить проверки прав и области памяти. Guardrails не решает, чью память можно изменять, и не заменяет фильтры Memory.
- Проверить
messagesперед очередью, если нельзя сохранять исходные ПД в её сообщениях. Для разрешённого промежуточного хранения явно определить срок и доступ. Поля сообщений Memory преобразовать в поддержанныеrole/content. - При
infer: trueотправить разрешённые сообщения в извлечение фактов. Если требуется скрыть ПД от модели извлечения, отправлять только результат локального маскирования. Проверка одного вызова модели не гарантирует безопасность произвольного нового факта после последующей обработки. - Проверить полученные факты перед записью. Для этой границы рекомендуем
отдельную политику
memory-write, секциюrequest, по одному сообщению на факт. В ней можно совместить локальные маски и классификацию допустимого факта. Имя политики — предложение конфигурации; готовой политики с таким именем нет. - При
infer: falseпройти ту же проверку перед записью. Этот путь не должен обходить Guardrails только потому, что LLM не вызывается. - Сохранять разрешённый/маскированный факт. История изменений, эмбеддинги, полнотекстовый индекс и производные поля должны создаваться из него. Повторная сборка объекта не должна вернуть исходный текст.
- Завершить событие успешным только после сохранения разрешённого результата.
При запрете/ошибке не выдавать
SUCCEEDEDс непроверенным фактом. Сопоставление сPENDING/SUCCEEDED/FAILEDи кодами ошибок принадлежит команде Memory.
Правила для диалога и долговременного факта могут различаться: вопрос пользователя не всегда является фактом, который стоит запоминать. Не используйте Telecom- классификатор по умолчанию для всех доменов памяти.
custom_instructions/prompt из запроса Memory не должны становиться инструкцией
самого Guardrails-классификатора. Его инструкция хранится в версии политики.
Если пользовательские инструкции передаются модели извлечения, их нужно
отдельно включить в анализ угроз и проверяемый вход Memory.
Memory: чтение и поиск
Для POST /v1/memories/search и GET /v1/memories:
- Применить права, фильтры, срок действия фактов.
- Получить факты и проверить выдаваемые строки
results[i].memoryчерез/response. Вести таблицу позиций до исходныхid. - Подставить маскированный текст и пересчитать производные данные выдачи,
включая
tokens_returned, если они есть. Не менять идентификатор или область памяти. - При отказе не возвращать исходный текст. Поведение частичной выдачи согласовать отдельно; по умолчанию в первой интеграции останавливать весь результат.
Проверка выдачи полезна и после проверки записи: политика могла измениться, а старые записи — существовать до внедрения. Она не очищает хранилище задним числом. Для этого потребуется отдельная миграция/повторная проверка данных. История факта может содержать старый исходный текст — доступ и проверку её выдачи также нужно включить в охват, если история доступна пользователю.
Операции контрольных точек с произвольным объектом или base64 не покрываются текстовым API. Нельзя сериализовать непрозрачный снимок в строку и утверждать, что все его данные проверены. Для такого пути сначала нужен контракт извлечения и восстановления текстовых полей. Операции удаления и право на забвение не должны зависеть от разрешения Guardrails на содержимое удаляемой записи.
Ошибки, очереди и идемпотентность
При PolicyDenied повтор того же текста не является исправлением. При
CheckUnavailable остановите запись/выдачу, а задание отложите либо завершите
ошибкой в пределах согласованной политики повторов. Ограничьте число попыток,
суммарное время и конкурентность; используйте задержку с разбросом, чтобы
восстановление Guardrails не вызвало одновременный поток повторов.
Guardrails не знает job_id/event_id и не фиксирует успешную запись в вашей БД.
Сохраните выбранную ревизию и контрольную сумму набора рядом с заданием. Правило повторной проверки
после изменения политики должно быть явным: «то же задание с прежней ревизией»
либо контролируемая перепроверка новой ревизией. Не переключайтесь незаметно на
текущую политику в середине обработки документа.
Для диагностической записи достаточно: идентификатор задания, точка проверки,
идентификатор и ревизия политики, контрольная сумма набора, результат, код технической ошибки, длительность
и traceId ошибки Guardrails. Содержимое документа, токены, найденные ПД и полный
ответ классификатора не должны попадать в журнал. Ответ об успешной проверке не возвращает
собственный traceId; сохраняйте корреляцию своей операции.
Что проверить перед совместной приёмкой
| Сценарий | Ожидаемый результат |
|---|---|
| Разрешённый документ/факт | Сохраняется без изменения проверенных полей |
| Синтетический email | В БД, очереди после границы проверки, индексе, истории и выдаче находится выбранная маска; исходник не возвращается через другую копию |
BLOCK-CONTENT в учебной политике | Guardrails отвечает HTTP 200 с запретом; запись/выдача не выполняется |
infer: false | Прямой импорт проходит те же обязательные проверки перед записью |
| Недоступный Guardrails / неверный токен / неверная контрольная сумма | Непроверенные данные не сохраняются и не выдаются |
Ошибка, неизвестный или обрезанный action | Клиент завершает проверку технической ошибкой |
| Большой документ, много фактов | Нет молчаливого усечения и неограниченной конкурентности; ошибка последней части не публикует частичный документ |
| Запрещённая фраза на границе частей | Поведение разбиения проверено отдельно; ограничения обнаружения зафиксированы |
| Повтор задания после сбоя | Нет дублирования записи и незаметного изменения ревизии политики |
| Новая версия политики | Новые задания используют её после согласованного переключения, старые обработаны по выбранному правилу |
| Старая запись / история / кэш | Нельзя обойти текущую проверку через альтернативный путь чтения |
| Чужая коллекция или область памяти | Отказ средствами RAG/Memory независимо от pass Guardrails |
| LLM-классификатор | Свой корпус допустимых/недопустимых текстов, неопределённый ответ, таймаут и недоступность; отдельно оценены ложные запреты |
Локальные примеры проверяют HTTP и применение результата к тексту. Они не заменяют эти сквозные испытания с настоящими RAG/Memory и их хранилищами.