Единица 6 / 11

Контроль доступа, шаблон подсказок и управление разговорами

Прибыль:

  • Настройте контроль доступа (ACL), который фильтрует получение данных на основе полномочий пользователя.
  • Написание надежного шаблона подсказки, в котором правильно размещается контекст и вопрос пользователя.
  • Практика независимости вопросов и управления историей в многораундовых беседах

Мы создали архитектуру; Теперь давайте сделаем это безопасным, последовательным и диалоговым. В этом модуле рассматриваются три важные темы: (1) контроль доступа, который фильтрует поиск на основе полномочий пользователя, (2) надежный шаблон подсказок, который правильно размещает контекст и вопрос, (3) независимость вопросов и управление историей разговоров в многораундовом чате. Без этих трех помощник либо утечет данные, даст противоречивые ответы, либо развалится на дополнительных вопросах.

Контроль доступа: несанкционированные данные никогда не должны поступать

Самый большой риск для предприятия: документ, который пользователь не должен видеть, попадает в ответ. Очень распространенная ошибка новичков — «приказать модели «показать скрытые документы» в командной строке». Это небезопасно. Модель может забыть инструкцию или немедленная инъекция может обойти ее. Правильное место — этап извлечения: несанкционированный предмет вообще не следует приносить.

Способ сделать это — применить метаданные полномочий (отдел, роль, уровень конфиденциальности), которые вы помещаете в каждую часть в качестве фильтра во время поиска. Вы безопасно определяете, кто является пользователем (личность и роли) на уровне приложения, и добавляете к вызову фильтр ACL (список управления доступом).

# Фильтруется по получению полномочий (концептуальный)user = аутентификация(сессия) # аутентифицировано из доверенного источника = user.roles + ["everyone"] # например. ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": разрешено}, # разрешены только части "privacy": {"lte": user.level}} # ниже уровня)

Внимание: никогда не спрашивайте у модели полномочий и не полагайтесь на подсказки. Идентичность и полномочия определяются на доверенном уровне приложения; Фильтр поиска обязателен, инструкция подсказки — это всего лишь дополнительный слой. «Я написал это в подсказке» — это не безопасность.

Сплошной шаблон подсказки

Шаблон подсказки — это скелет, объединяющий контекст, вопрос пользователя и инструкции по поведению из полученного запроса. Части хорошего шаблона: описание роли/задачи, правила поведения (обоснование, разрешение «не знаю», запрос ресурса, тон), контекст, вопрос.

Вы корпоративный HR-ассистент. Ваша задача — отвечать на вопросы сотрудников ТОЛЬКО на основе следующего КОНТЕКСТА. Правила: - Если ответ не совсем понятен по контексту, напишите «Я не смог найти информацию по этому поводу в документации, обратитесь в отдел кадров». Не гадайте, не выдумывайте.- Если источники в контексте противоречат друг другу, возьмите за основу официальную политику и укажите противоречие.- Добавьте источник, на который вы полагаетесь, как [Источник: файл, раздел] в конце каждой претензии.- Отвечайте коротким, ясным и профессиональным языком. КОНТЕКСТ:{numbered_parts}ВОПРОС: {user_question}

Нумерация частей контекста ([1], [2], ...) облегчает цитирование модели. Кроме того, напишите источник в начале каждого фрагмента, чтобы модель могла правильно его процитировать.

Совет: Сохраняйте шаблон подсказки неизменным и всегда размещайте переменные (контекст, вопрос) в одних и тех же местах. Фиксированный шаблон повышает удобство тестирования и снижает затраты благодаря быстрому кэшированию в некоторых системах.

КОНТЕКСТ:[1] (Источник: ik_el_kitabi.pdf, раздел 5.2) Ежегодный оплачиваемый отпуск составляет 14 дней...[2] (Источник: ik_el_kitabi.pdf, раздел 5.4) Отпуск составляет 20 дней для лиц со стажем работы более 5 лет...

Слабая подсказка/Сильная подсказка

Слабый (нет заземления, нет источника, смешанная идентичность):

Используйте эти документы и ответьте на вопрос: {parts}Пользователь: {question}# Проблема: модель вырывается из контекста, компенсируется, не цитирует источники, # ведет себя произвольно в противоречии.

Сильная (роль + правила + нумерованный контекст + обязательный источник):

Вы... Просто положитесь на КОНТЕКСТ. В противном случае скажите: «Я не знаю». В конфликте выбирайте официальную политику. Добавьте [Источник: ...] к каждому утверждению. КОНТЕКСТ: [1]... [2]... ВОПРОС: {question}# Результат: ответ, который соответствует контексту, источнику и правильно разрешает противоречие.

Управление многоходовым диалогом

Настоящий пользователь не задаст ни одного вопроса и не оставит его в покое; говорит. «Сколько дней ежегодного отпуска у меня есть?» → «А как насчет шестилетнего сотрудника?» → «Как мне подать заявку на это?» Сами по себе второй и третий вопросы бессмысленны; зависит от предыдущего контекста.

Вам нужно решить две проблемы. Первый предназначен для извлечения информации: сделайте дополнительный вопрос независимым (переписывание вопроса). «А как насчет шестилетнего сотрудника?» → «На сколько дней ежегодного отпуска имеет право работник от 6 лет?» Вы ищете этот самостоятельный вопрос. Второй — для производства: вы также передаете модели историю разговоров, чтобы она продолжалась последовательно.

# Двухэтапный: независимость → поиск → создание с историей (концептуальный)dependent = model.uret( "Используйте историю разговора, чтобы сделать вопрос понятным самостоятельно:\nHistory: {history}\nQuestion: {follow_question}") context = retrival(independent) # поиск с независимым вопросомответ = model.uret(prompt(context, History, Follow_question))

По мере того, как история разрастается (длинный разговор), отправка всей ее за раз становится дорогостоящей и заполняет окно контекста. Решение: суммировать предыдущие раунды или сохранить последние N раундов и свести предыдущие к итогу. Таким образом, затраты остаются под контролем и сохраняется последовательность.

Статус

проблема

Решение

Последующий вопрос не имеет контекста

Поисковые запросы бессмысленны

Сделайте вопрос независимым (перепишите)

долгий чат

Стоимость и размеры окон

Краткое описание прошлых туров

Пользователь изменил тему

Старый контекст заражается

Уменьшите влияние прошлого на новую тему

Полномочия могут различаться в зависимости от тура.

Риск утечки

Повторно применяйте фильтр ACL каждый раунд.

Три мини-кейса

Случай 1 — ошибка «Безопасность» с подсказкой. Компания выложила помощнику конфиденциальные документы о зарплате, которые любой мог спросить, но в приглашении написала только «не сообщать информацию о зарплате». Модель раскрыла диапазон зарплат, когда пользователь задал вопрос иносказательно. Когда к получению был добавлен фильтр ACL (части зарплаты только для роли HR), утечка была полностью закрыта; потому что деталь больше никогда не привозят.

Случай 2 — Бесконтекстное преследование. В ассистенте поддержки пользователь спрашивает "период возврата?" → «А как насчет сломанного продукта?» Система принесла ненужные детали для «испорченного продукта». Когда была добавлена ​​независимость вопросов («Каков срок возврата сломанного товара?»), процент правильных ответов увеличился с 44% до 90%.

Случай 3 — Раздутое прошлое. За 30 раундов чатов с ассистентом при каждом звонке отправлялась вся история; Стоимость увеличивалась в 3 раза за раунд, а ответы замедлялись. Когда мы перешли на структуру, которая сохраняла последние 6 раундов и суммировала предыдущие, стоимость токена снизилась на 62% и сохранилась согласованность.

Распространенные ошибки

  • Оставление полномочий подсказке: модель забывает/обходит; Фильтр ACL обязателен при получении.
  • Не перечисление контекста: модель не может указать правильный источник.
  • Отсутствие независимого ответа на дополнительный вопрос: поиск бессмысленен.
  • Отправка всей истории вслепую: резко увеличивает стоимость и задержки; подвести итог.
  • Не писать правило противоречия: модель может представить ненадежный источник как официальный.

В заключение

  • Контроль доступа реализуется с помощью фильтра метаданных на этапе поиска; Никогда не следует привозить несанкционированные детали.
  • Идентичность и полномочия определяются на уровне доверенных приложений; Быстрая инструкция — это всего лишь дополнительный уровень защиты.
  • Надежный шаблон подсказки включает роль, правила поведения (заземление, разрешение «не знаю», источник, конфликт), нумерованный контекст и вопрос.
  • При многораундовом разговоре дополнительные вопросы отделяются, и модель дает ответы, соответствующие истории.
  • Суммируя долгую историю, окно затрат и контекста остается под контролем; ACL применяется повторно каждый раунд.

Задача приложения

(1) Определите как минимум три группы полномочий для своего помощника (например, все, отдел, руководитель) и запишите в таблице, какой тип документа открыт для какой группы. (2) Адаптируйте и напишите приведенный выше шаблон подсказки в соответствии со своей ролью и тоном; Сделайте контекст пронумерованным и источником. (3) Напишите реалистичный сценарий беседы из трех раундов (вопрос → продолжение → продолжение) и вручную создайте независимые версии каждого дополнительного вопроса. (4) Объясните в одном предложении, почему в этом сценарии фильтр ACL следует применять повторно каждый раунд.

контрольный список

  • [ ] Я реализую контроль доступа с помощью поискового фильтра, я просто не полагаюсь на подсказку.
  • [ ] Я добавляю заземление: «Я не знаю разрешения, источника и правила конфликта» в свой шаблон приглашения.
  • [ ] Части контекста пронумерованы и снабжены ссылками.
  • [ ] Я делаю дополнительные вопросы независимыми перед поиском.
  • [ ] Я управляю стоимостью и окном, суммируя длинную историю разговоров.