Unità 6 / 11

Controllo degli accessi, modello di prompt e gestione delle conversazioni

Guadagni:

  • Configurare il controllo degli accessi (ACL) che filtra il recupero in base all'autorità dell'utente
  • Scrivere un modello di prompt solido che inserisca correttamente il contesto e la domanda dell'utente
  • Praticare l'indipendenza dalle domande e la gestione della storia in conversazioni a più round

Abbiamo stabilito l'architettura; Ora rendiamolo sicuro, coerente e conversazionale. Ci sono tre argomenti critici in questa unità: (1) controllo degli accessi che filtra il recupero in base all'autorità dell'utente, (2) un modello di prompt robusto che posiziona correttamente il contesto e la domanda, (3) indipendenza delle domande e gestione della cronologia delle conversazioni nella chat a più round. Senza questi tre, un assistente perderà dati, darà risposte incoerenti o fallirà alle domande di follow-up.

Controllo degli accessi: i dati non autorizzati non dovrebbero mai arrivare

Il rischio più grande per l'azienda: un documento che un utente non dovrebbe vedere si perde nella risposta. Un errore molto comune per i principianti è "dire al modello di 'mostrare documenti nascosti' quando richiesto". Questo non è sicuro. Il modello potrebbe dimenticare un'istruzione o un'iniezione tempestiva potrebbe eluderla. Il luogo corretto è la fase di recupero: il pezzo non autorizzato non deve essere assolutamente introdotto.

Il modo per farlo è applicare i metadati dell'autorità (dipartimento, ruolo, livello di privacy) che hai inserito in ciascuna parte come filtro durante la ricerca. Determina in modo sicuro chi è l'utente (identità e ruoli) a livello di applicazione e aggiungi un filtro ACL (elenco di controllo degli accessi) alla chiamata.

# Filtrato per recupero dell'autorità (concettuale)utente = authenticate(session) # autenticato da fonte attendibile = user.roles + ["everyone"] # es. ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": aware}, # sono consentite solo le parti "privacy": {"lte": user.level}} # sotto il livello)

Attenzione: non chiedere mai autorità al modello né fare affidamento sul suggerimento. L'identità e l'autorità sono determinate al livello attendibile dell'applicazione; Il filtro di recupero è obbligatorio, l'istruzione prompt è solo un livello aggiuntivo. "L'ho scritto nel prompt" non è sicurezza.

Modello di prompt solido

Il modello di prompt è lo scheletro che riunisce il contesto, la domanda dell'utente e le istruzioni di comportamento derivanti dal recupero. Parti di un buon modello: descrizione del ruolo/compito, regole di condotta (radicamento, autorizzazione non so, richiesta di risorse, tono), contesto, domanda.

Sei un assistente delle risorse umane aziendale. Il tuo compito è rispondere alle domande dei dipendenti SOLO in base al seguente CONTESTO. Regole: - Se la risposta non è chiaramente nel contesto, scrivi "Non ho trovato informazioni al riguardo nella documentazione, verifica con il team delle risorse umane". Non indovinare, non inventare.- Se le fonti nel contesto sono in conflitto, prendi come base la politica ufficiale e dichiara la contraddizione.- Aggiungi la fonte su cui fai affidamento come [Fonte: file, sezione] alla fine di ogni affermazione.- Rispondi in un linguaggio breve, chiaro e professionale. CONTESTO:{numbered_parts}DOMANDA: {user_question}

Numerare le parti di contesto ([1], [2], ...) facilita la citazione del modello. Inoltre, scrivi la fonte all'inizio di ogni pezzo in modo che il modello possa citarla correttamente.

Suggerimento: mantieni costante il modello di prompt e posiziona sempre le variabili (contesto, domanda) negli stessi posti. Un modello fisso aumenta la testabilità e riduce i costi grazie alla memorizzazione nella cache tempestiva in alcuni sistemi.

CONTESTO:[1] (Fonte: ik_el_kitabi.pdf, Sezione 5.2) Le ferie annuali retribuite sono di 14 giorni...[2] (Fonte: ik_el_kitabi.pdf, Sezione 5.4) Il congedo è di 20 giorni per le persone con più di 5 anni di servizio...

Prompt debole / Prompt forte

Debole (nessuna base, nessuna fonte, identità mista):

Usa questi documenti e rispondi alla domanda: {parts}Utente: {question}# Problema: il modello esce dal contesto, trucca, non cita le fonti, # si comporta arbitrariamente in contraddizione.

Forte (ruolo + regole + contesto numerato + fonte obbligatoria):

Tu sei... Affidati solo al CONTESTO. Altrimenti dite "non lo so". In conflitto, scegli la politica ufficiale. Aggiungi [Fonte: ...] ad ogni affermazione. CONTESTO: [1]... [2]... DOMANDA: {domanda}# Risultato: risposta fedele al contesto, alla fonte e che gestisce correttamente la contraddizione.

Gestione delle conversazioni multi-tour

Un utente reale non fa una sola domanda e non la lascia stare; parla. "Quanti giorni di ferie annuali ho?" → “E il dipendente da 6 anni?” → “Come posso richiederlo?” La seconda e la terza questione da sole non hanno senso; dipende dal contesto precedente.

Devi risolvere due problemi. Il primo è per il recupero: rendere indipendente la domanda di follow-up (riscrittura della domanda). "E il dipendente da 6 anni?" → "A quanti giorni di ferie annuali ha diritto un dipendente di 6 anni?" Esegui la ricerca con questa domanda indipendente. Il secondo è per la produzione: fornisci anche la cronologia delle conversazioni al modello in modo che continui in modo coerente.

# In due passaggi: indipendentizza → ricerca → genera con la cronologia (concettuale) independent = model.uret( "Usa la cronologia della conversazione per rendere la domanda comprensibile da sola:\nHistory: {history}\nQuestion: {follow_question}") context = retrieval(independent) # cerca con independent questionanswer = model.uret(prompt(context, History, follow_question))

Man mano che la cronologia cresce (conversazione lunga), inviarla tutta in una volta diventa costosa e riempie la finestra di contesto. Soluzione: riepilogare i turni precedenti oppure mantenere gli ultimi N turni e ridurre i precedenti al riassunto. Pertanto, i costi rimangono sotto controllo e la coerenza viene mantenuta.

Stato

problema

Soluzione

La domanda successiva non ha contesto

Le ricerche di recupero non hanno senso

Rendi la domanda indipendente (riscrivi)

lunga chiacchierata

I costi e le finestre si gonfiano

Riepilogo dei tour passati

L'utente ha cambiato argomento

Il vecchio contesto viene infettato

Ridurre l'influenza passata sul nuovo argomento

L'autorità può variare tra i tour

Rischio di perdite

Riapplica il filtro ACL ogni round

Tre mini custodie

Caso 1 – Errore di “sicurezza” con tempestività. Un'azienda ha fornito a un assistente documenti confidenziali sullo stipendio a cui chiunque avrebbe potuto chiedere, ma sulla richiesta ha scritto solo "non fornire informazioni sullo stipendio". Il modello ha fatto trapelare la fascia salariale quando un utente ha posto la domanda in modo indiretto. Quando il filtro ACL è stato aggiunto al recupero (parti salariali solo per il ruolo HR), la falla è stata completamente chiusa; perché la parte non viene mai più portata.

Caso 2 – Stalking senza contesto. In un assistente di supporto, l'utente chiede "periodo di restituzione?" → “e il prodotto rotto?” Il sistema ha portato parti irrilevanti per il "prodotto rotto". Quando è stata aggiunta l'indipendenza della domanda ("Quanto dura il periodo di restituzione di un prodotto rotto?"), il tasso di risposta corretta è aumentato dal 44% al 90%.

Caso 3: passato gonfio. In 30 round di chat con un assistente, ogni chiamata ha inviato l'intera cronologia; Il costo aumentava di 3 volte per round e le risposte rallentavano. Quando siamo passati a una struttura che manteneva gli ultimi 6 round e riassumeva quelli precedenti, il costo dei token è diminuito del 62% e la coerenza è stata mantenuta.

Errori comuni

  • Lasciare l'autorità al prompt: il modello dimentica/ignora; Il filtro ACL è obbligatorio durante il recupero.
  • Non enumerare il contesto: il modello non può citare la fonte corretta.
  • Non rendere indipendente la domanda successiva: il recupero cerca inutilmente.
  • Inviare tutta la cronologia alla cieca: esplode in termini di costi e ritardi; riassumere.
  • Non scrivere la regola di contraddizione: il modello può presentare la fonte inaffidabile come ufficiale.

In sintesi

  • Il controllo degli accessi è implementato con un filtro di metadati durante la fase di recupero; Non dovrebbero mai essere portate parti non autorizzate.
  • L'identità e l'autorità sono determinate a livello dell'applicazione attendibile; Le istruzioni tempestive sono solo un ulteriore livello di difesa.
  • Un modello di prompt robusto include ruolo, regole di condotta (radicamento, autorizzazione non conosciuta, fonte, conflitto), contesto numerato e domanda.
  • Nella conversazione a più round, le domande di follow-up sono disaccoppiate e il modello produce risposte coerenti con la cronologia.
  • Riassumendo la lunga storia, la finestra dei costi e del contesto viene tenuta sotto controllo; L'ACL viene riapplicato ad ogni round.

Compito dell'applicazione

(1) Definisci almeno tre gruppi di autorizzazione per il tuo assistente (ad esempio tutti, dipartimento, manager) e scrivi in una tabella quale tipo di documento è aperto a quale gruppo. (2) Adattare e scrivere il modello di suggerimento di cui sopra in base al proprio ruolo e tono; Rendi il contesto numerato e di provenienza. (3) Scrivere uno scenario di conversazione realistico in tre fasi (domanda → follow-up → follow-up) e generare manualmente versioni indipendenti di ciascuna domanda di follow-up. (4) Spiegare in una frase perché il filtro ACL dovrebbe essere riapplicato ogni round in questo scenario.

lista di controllo

  • [] Implemento il controllo degli accessi con un filtro di recupero, semplicemente non mi affido al prompt.
  • [ ] Aggiungo la messa a terra, non conosco l'autorizzazione, l'origine e la regola di conflitto al mio modello di prompt.
  • [ ] Fornisco le parti del contesto numerate e referenziate.
  • [ ] Rendo le domande di follow-up indipendenti prima del recupero.
  • [ ] Gestisco i costi e la finestra riassumendo la lunga cronologia delle conversazioni.