Прибуток:
- Налаштуйте контроль доступу (ACL), який фільтрує отримання на основі прав користувача
- Написання надійного шаблону підказки, який правильно розміщує контекст і запитання користувача
- Практика незалежності від запитань і управління історією в багатораундових бесідах
Ми створили архітектуру; Тепер давайте зробимо це безпечним, послідовним і розмовним. У цьому розділі є три важливі теми: (1) контроль доступу, який фільтрує пошук на основі повноважень користувача, (2) надійний шаблон підказки, який правильно розміщує контекст і питання, (3) незалежність запитань і керування історією розмов у багатораундовому чаті. Без цих трьох помічник або буде витікати дані, даватиме суперечливі відповіді, або розпадеться на додаткових запитаннях.
Контроль доступу: несанкціоновані дані ніколи не повинні надходити
Найбільший ризик підприємства: документ, який користувач не повинен бачити, потрапляє у відповідь. Дуже поширеною помилкою новачків є «сказати моделі «показати приховані документи» під час підказки». Це не безпечно. Модель може забути інструкцію або негайна ін’єкція може ухилитися від неї. Правильним місцем є фаза вилучення: недозволену частину взагалі не слід приносити.
Спосіб зробити це полягає в тому, щоб застосувати метадані повноважень (відділ, роль, рівень конфіденційності), які ви додали до кожної частини як фільтр під час пошуку. Ви безпечно визначаєте, хто є користувачем (ідентифікація та ролі) на прикладному рівні та додаєте до виклику фільтр ACL (список контролю доступу).
# Відфільтровано за отриманням повноважень (концептуальний) користувач = автентифікація (сеанс) # автентифікований із надійного джерела = користувач.ролі + ["кожний"] # напр. ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": allowed}, # дозволені лише частини "privacy": {"lte": user.level}} # нижче рівня)
Застереження: ніколи не запитуйте повноважень у моделі та не покладайтеся на підказку. Ідентифікація та повноваження визначаються на довіреному рівні програми; Фільтр пошуку обов'язковий, підказка - лише додатковий рівень. «Я написав це в підказці» не є безпекою.
Твердий шаблон підказки
Шаблон підказки — це скелет, який об’єднує контекст, запитання користувача та інструкції щодо поведінки з отримання. Частини хорошого шаблону: опис ролі/завдання, правила поведінки (заземлення, дозвіл «Я не знаю», запит ресурсу, тон), контекст, запитання.
Ви корпоративний помічник з персоналу. Ваше завдання — відповідати на запитання співробітників ЛИШЕ на основі наступного КОНТЕКСТУ. Правила: - Якщо відповідь не зрозуміла в контексті, напишіть "Я не міг знайти інформацію про це в документації, зверніться до відділу кадрів". Не гадайте, не вигадуйте.- Якщо джерела в контексті суперечать, візьміть за основу офіційну політику та вкажіть протиріччя.- Додайте джерело, на яке ви покладаєтеся, як [Джерело: файл, розділ] у кінці кожного твердження.- Відповідайте коротко, чітко та професійно. КОНТЕКСТ:{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]... ЗАПИТАННЯ: {питання}# Результат: відповідь, яка відповідає контексту, має джерело та правильно врегулює протиріччя.
Управління розмовами з кількома турами
Реальний користувач не задає жодного питання і залишає його в спокої; говорить. «Скільки днів я маю щорічної відпустки?» → «А як щодо 6-річного працівника?» → «Як подати заявку на це?» Друге і третє питання самі по собі безглузді; залежить від попереднього контексту.
Потрібно вирішити дві задачі. Перший для пошуку: зробити наступне запитання незалежним (переписування запитання). «А як щодо 6-річного працівника?» → «Скільки днів щорічної відпустки має право працівник 6 років?» Ви шукаєте це незалежне запитання. Другий — для виробництва: ви також передаєте історію розмов моделі, щоб вона продовжувалася послідовно.
# Двоетапний: незалежний → пошук → генерувати з історією (концептуальний)dependent = model.uret( "Використовуйте історію розмов, щоб зробити питання зрозумілим самостійно:\nHistory: {history}\nQuestion: {follow_question}") context = retrieval(independent) # пошук з незалежним questionanswer = 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 потрібно повторно застосовувати кожного раунду в цьому сценарії.
контрольний список
- [ ] Я реалізую контроль доступу за допомогою фільтра пошуку, я просто не покладаюся на підказку.
- [ ] Я додаю заземлення, я не знаю дозвіл, джерело та правило конфлікту до свого шаблону запиту.
- [ ] Я даю частини контексту пронумеровані та посилання.
- [ ] Перед пошуком я роблю додаткові запитання незалежними.
- [ ] Я керую вартістю та вікном, узагальнюючи довгу історію розмов.