Прибыль:
- Настройте контроль доступа (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 следует применять повторно каждый раунд.
контрольный список
- [ ] Я реализую контроль доступа с помощью поискового фильтра, я просто не полагаюсь на подсказку.
- [ ] Я добавляю заземление: «Я не знаю разрешения, источника и правила конфликта» в свой шаблон приглашения.
- [ ] Части контекста пронумерованы и снабжены ссылками.
- [ ] Я делаю дополнительные вопросы независимыми перед поиском.
- [ ] Я управляю стоимостью и окном, суммируя длинную историю разговоров.