Unité 6 / 11

Contrôle d'accès, modèle d'invite et gestion des conversations

Gains :

  • Configurer le contrôle d'accès (ACL) qui filtre la récupération en fonction de l'autorité de l'utilisateur
  • Rédaction d'un modèle d'invite solide qui place correctement le contexte et la question de l'utilisateur
  • Pratiquer l'indépendance des questions et la gestion de l'historique dans des conversations à plusieurs tours

Nous avons établi l'architecture; Rendons-le maintenant sûr, cohérent et conversationnel. Il y a trois sujets critiques dans cette unité : (1) le contrôle d'accès qui filtre la récupération en fonction de l'autorité de l'utilisateur, (2) un modèle d'invite robuste qui place correctement le contexte et la question, (3) l'indépendance des questions et la gestion de l'historique des conversations dans une discussion à plusieurs tours. Sans ces trois éléments, un assistant divulguera des données, donnera des réponses incohérentes ou s'effondrera sur les questions de suivi.

Contrôle d'accès : les données non autorisées ne devraient jamais arriver

Le plus grand risque de l'entreprise : un document qu'un utilisateur ne devrait pas voir fuit dans la réponse. Une erreur très courante du débutant consiste à « dire au modèle d'« afficher les documents cachés » à l'invite ». Ce n'est pas sûr. Le modèle peut oublier une instruction ou une injection rapide peut y échapper. Le bon endroit est la phase de récupération : la pièce non autorisée ne doit pas du tout être introduite.

La façon de procéder consiste à appliquer les métadonnées d'autorité (département, rôle, niveau de confidentialité) que vous avez définies sur chaque partie comme filtre lors de la recherche. Vous déterminez en toute sécurité qui est l'utilisateur (identité et rôles) au niveau de la couche application et ajoutez un filtre ACL (Access Control List) à l'appel.

# Filtré par récupération d'autorité (conceptuel) utilisateur = authentifier (session) # authentifié à partir d'une source fiable = user.roles + ["tout le monde"] # par ex. ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": autorisé}, # uniquement les parties autorisées "privacy": {"lte": user.level}} # en dessous du niveau)

Attention : ne demandez jamais l'autorité du modèle et ne vous fiez jamais à l'invite. L'identité et l'autorité sont déterminées au niveau de la couche de confiance de l'application ; Le filtre de récupération est obligatoire, l'instruction d'invite n'est qu'une couche supplémentaire. "Je l'ai écrit dans l'invite" n'est pas une sécurité.

Modèle d'invite solide

Le modèle d'invite est le squelette qui rassemble le contexte, la question de l'utilisateur et les instructions de comportement issues de la récupération. Éléments d'un bon modèle : description du rôle/tâche, règles de conduite (mise à la terre, je ne sais pas, autorisation, demande de ressources, ton), contexte, question.

Vous êtes assistant RH en entreprise. Votre travail consiste à répondre UNIQUEMENT aux questions des employés en fonction du CONTEXTE suivant. Règles : - Si la réponse n'est pas clairement contextuelle, écrivez "Je n'ai pas trouvé d'informations à ce sujet dans la documentation, vérifiez auprès de l'équipe RH". Ne devinez pas, n'inventez pas.- Si les sources dans le contexte sont en conflit, prenez comme base la politique officielle et exposez la contradiction.- Ajoutez la source sur laquelle vous vous appuyez comme [Source : fichier, section] à la fin de chaque affirmation.- Répondez dans un langage court, clair et professionnel. CONTEXTE : {numbered_parts}QUESTION : {user_question}

La numérotation des parties de contexte ([1], [2], ...) facilite la citation du modèle. Écrivez également la source au début de chaque pièce afin que le modèle puisse la citer correctement.

Astuce : Gardez le modèle d'invite constant et placez toujours les variables (contexte, question) aux mêmes endroits. Un modèle fixe augmente à la fois la testabilité et réduit les coûts grâce à une mise en cache rapide dans certains systèmes.

CONTEXTE :[1] (Source : ik_el_kitabi.pdf, section 5.2) Le congé annuel payé est de 14 jours...[2] (Source : ik_el_kitabi.pdf, section 5.4) Le congé est de 20 jours pour les personnes ayant plus de 5 ans d'ancienneté...

Invite faible/Invite forte

Faible (pas de fondement, pas de source, identité mixte) :

Utilisez ces documents et répondez à la question : {parts}Utilisateur : {question}# Problème : le modèle sort de son contexte, invente, ne cite pas les sources, # se comporte arbitrairement en contradiction.

Fort (rôle + règles + contexte numéroté + source obligatoire) :

Vous êtes... Comptez simplement sur le CONTEXTE. Sinon, dites « Je ne sais pas ». En cas de conflit, choisissez la politique officielle. Ajoutez [Source : ...] à chaque réclamation.CONTEXT : [1]... [2]... QUESTION : {question}# Résultat : réponse fidèle au contexte, sourcée et qui gère correctement la contradiction.

Gestion des conversations multi-tours

Un véritable utilisateur ne pose pas une seule question et ne la laisse pas tranquille ; parle. « De combien de jours de congé annuel ai-je ? » → « Qu'en est-il du salarié de 6 ans ? → « Comment puis-je en faire la demande ? » Les deuxième et troisième questions à elles seules n’ont aucun sens ; dépend du contexte précédent.

Vous devez résoudre deux problèmes. La première est destinée à la récupération : rendre la question de suivi indépendante (réécriture de la question). « Qu'en est-il de l'employé de 6 ans ? → « À combien de jours de congés annuels un salarié de 6 ans a-t-il droit ? Vous recherchez avec cette question indépendante. La seconde est destinée à la production : vous donnez également l’historique des conversations au modèle afin qu’il continue de manière cohérente.

# En deux étapes : indépendantiser → rechercher → générer avec historique (conceptuel) indépendant = model.uret( "Utiliser l'historique de la conversation pour rendre la question compréhensible par elle-même :\nHistorique : {historique}\nQuestion : {follow_question}") context = retrieval(independent) # rechercher avec questionanswer indépendante = model.uret(prompt(context, history, follow_question))

À mesure que l’historique s’allonge (longue conversation), l’envoi de tout cela en une seule fois devient coûteux et remplit la fenêtre contextuelle. Solution : résumer les tours précédents ou conserver les N derniers tours et réduire les précédents au résumé. Ainsi, les coûts restent maîtrisés et la cohérence est maintenue.

Statut

problème

Solution

La question complémentaire n'a pas de contexte

Les recherches de récupération n'ont aucun sens

Rendre la question indépendante (réécrire)

longue conversation

Coût et gonflement des fenêtres

Résumé des tournées passées

L'utilisateur a changé de sujet

L'ancien contexte est infecté

Réduire l’influence passée sur un nouveau sujet

L'autorité peut varier d'une visite à l'autre

Risque de fuite

Réappliquer le filtre ACL à chaque tour

Trois mini-étuis

Cas 1 — Erreur de « sécurité » avec invite. Une entreprise a mis sur un assistant des documents de salaire confidentiels que n'importe qui pouvait demander, mais a seulement écrit « ne donnez pas d'informations sur le salaire » à l'invite. Le modèle a divulgué l’échelle salariale lorsqu’un utilisateur a posé la question de manière détournée. Lorsque le filtre ACL a été ajouté à la récupération (parties salariales uniquement pour le rôle RH), la fuite a été complètement colmatée ; car la pièce n'est plus jamais apportée.

Cas 2 – Harcèlement sans contexte. Dans un assistant d'assistance, l'utilisateur demande « délai de retour ? » → « Et le produit cassé ? » Le système a apporté des pièces non pertinentes pour le « produit cassé ». Lorsque l'indépendance des questions a été ajoutée (« Quelle est la durée du délai de retour pour un produit cassé ? »), le taux de réponses correctes est passé de 44 % à 90 %.

Cas 3 – Passé gonflé. En 30 séries de discussions avec un assistant, chaque appel envoyait l'intégralité de l'historique ; Le coût augmentait 3 fois par tour et les réponses ralentissaient. Lorsque nous sommes passés à une structure conservant les 6 derniers tours et résumant les précédents, le coût du token a chuté de 62 % et la cohérence a été maintenue.

Erreurs courantes

  • Laisser l'autorité à l'invite : le modèle oublie/contourne ; Le filtre ACL est obligatoire lors de la récupération.
  • Ne pas énumérer le contexte : le modèle ne peut pas citer la bonne source.
  • Ne pas indépendantiser la question complémentaire : la récupération effectue des recherches inutiles.
  • Envoi aveugle de tout l’historique : explose en termes de coûts et de délais ; résumer.
  • Ne pas écrire la règle de contradiction : le modèle peut présenter la source peu fiable comme officielle.

En résumé

  • Le contrôle d'accès est mis en œuvre avec un filtre de métadonnées pendant la phase de récupération ; Ne jamais apporter de pièces non autorisées.
  • L'identité et l'autorité sont déterminées au niveau de la couche application de confiance ; L’instruction rapide n’est qu’une couche de défense supplémentaire.
  • Un modèle d'invite robuste comprend le rôle, les règles de conduite (mise à la terre, autorisation ne sait pas, source, conflit), le contexte numéroté et la question.
  • Dans une conversation à plusieurs tours, les questions de suivi sont découplées et le modèle produit des réponses cohérentes avec l'historique.
  • En résumant le long historique, la fenêtre de coût et de contexte reste sous contrôle ; L'ACL est réappliquée à chaque tour.

Tâche de candidature

(1) Définissez au moins trois groupes d'autorisation pour votre propre assistant (par exemple tout le monde, service, responsable) et écrivez dans un tableau quel type de document est ouvert à quel groupe. (2) Adaptez et rédigez le modèle d'invite ci-dessus en fonction de votre propre rôle et de votre ton ; Rendre le contexte numéroté et sourcé. (3) Rédigez un scénario de conversation réaliste en trois tours (question → suivi → suivi) et générez manuellement des versions indépendantes de chaque question de suivi. (4) Expliquez en une phrase pourquoi le filtre ACL doit être réappliqué à chaque tour dans ce scénario.

liste de contrôle

  • [ ] J'implémente le contrôle d'accès avec un filtre de récupération, je ne me fie tout simplement pas à l'invite.
  • [ ] J'ajoute une mise à la terre, je ne connais pas l'autorisation, la source et la règle de conflit à mon modèle d'invite.
  • [ ] Je donne les parties de contexte numérotées et référencées.
  • [ ] Je rends les questions de suivi indépendantes avant la récupération.
  • [ ] Je gère le coût et la fenêtre en résumant le long historique des conversations.