Vinster:
- Ställ in åtkomstkontroll (ACL) som filtrerar hämtning baserat på användarbehörighet
- Att skriva en solid snabbmall som placerar sammanhanget och användarfrågan korrekt
- Öva frågeoberoende och historiehantering i flerrundssamtal
Vi etablerade arkitekturen; Låt oss nu göra det säkert, konsekvent och konversationsrikt. Det finns tre kritiska ämnen i den här enheten: (1) åtkomstkontroll som filtrerar hämtning baserat på användarens auktoritet, (2) en robust promptmall som placerar sammanhanget och frågan korrekt, (3) frågans oberoende och hantering av konversationshistorik i flerrunda chatt. Utan dessa tre kommer en assistent antingen att läcka data, ge inkonsekventa svar eller falla isär på följdfrågor.
Åtkomstkontroll: Obehörig data bör aldrig komma fram
Företagens största risk: Ett dokument som en användare inte ska se läcker in i svaret. Ett mycket vanligt nybörjarmisstag är att "säga till modellen att 'visa dolda dokument' vid uppmaningen." Detta är inte säkert. Modellen kan glömma en instruktion eller en snabb injektion kan undvika den. Den korrekta platsen är hämtningsfasen: den obehöriga biten ska inte tas in alls.
Sättet att göra detta är att tillämpa auktoritetsmetadata (avdelning, roll, integritetsnivå) du lägger på varje del som ett filter under sökningen. Du bestämmer säkert vem användaren är (identitet och roller) i applikationslagret och lägger till ett ACL-filter (Access Control List) till samtalet.
# Filtrerat efter auktoritetshämtning (konceptuell) användare = autentisera(session) # autentiserat från betrodd källa = användare.roller + ["alla"] # t.ex. ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": allow}, # endast tillåtna delar "privacy": {"lte": user.level}} # under nivån)
Varning: Fråga aldrig modellen om auktoritet eller lita på uppmaningen. Identitet och auktoritet bestäms på det betrodda lagret av applikationen; Hämtningsfiltret är obligatoriskt, den snabba instruktionen är bara ett extra lager. "Jag skrev det i prompten" är ingen säkerhet.
Solid promptmall
Uppmaningsmallen är skelettet som sammanför sammanhanget, användarfrågan och beteendeinstruktionerna från hämtningen. Delar av en bra mall: roll-/uppgiftsbeskrivning, uppföranderegler (förankring, jag vet inte behörighet, resursbegäran, ton), sammanhang, fråga.
Du är en företags HR-assistent. Ditt jobb är att besvara anställdas frågor ENDAST baserat på följande KONTEXT. Regler:- Om svaret inte är tydligt i sammanhanget skriv "Jag kunde inte hitta information om detta i dokumentationen, kolla med HR-teamet". Gissar inte, gör inte upp.- Om källorna i sammanhanget står i konflikt, ta den officiella policyn som grund och ange motsägelsen.- Lägg till källan du förlitar dig på som [Källa: fil, avsnitt] i slutet av varje påstående.- Svara på ett kort, tydligt och professionellt språk. KONTEXT:{numbered_parts}FRÅGA: {user_question}
Genom att numrera kontextdelarna ([1], [2], ...) blir det lättare att citera modellen. Skriv också källan i början av varje del så att modellen kan citera den korrekt.
Tips: Håll promptmallen konstant och placera alltid variabler (sammanhang, fråga) på samma ställen. En fast mall både ökar testbarheten och minskar kostnaderna tack vare snabb cachning i vissa system.
KONTEXT:[1] (Källa: ik_el_kitabi.pdf, avsnitt 5.2) Årlig betald ledighet är 14 dagar...[2] (Källa: ik_el_kitabi.pdf, avsnitt 5.4) Ledigheten är 20 dagar för personer med mer än 5 års tjänstgöring...
Svag prompt / Stark prompt
Svag (ingen jordning, ingen källa, blandad identitet):
Använd dessa dokument och svara på frågan: {parts}Användare: {question}# Problem: modellen går ur sitt sammanhang, gör upp, citerar inte källor, # beter sig godtyckligt i motsägelse.
Stark (roll + regler + numrerad kontext + källa obligatorisk):
Du är... Lita bara på KONTEXT. Annars säg "jag vet inte". I konflikt, välj officiell policy. Lägg till [Källa: ...] till varje påstående. KONTEXT: [1]... [2]... FRÅGA: {question}# Resultat: svar som är troget i sammanhanget, hämtat och hanterar motsägelsen korrekt.
Konversationshantering på flera turer
En riktig användare ställer inte en enda fråga och låter den vara ifred; talar. "Hur många dagars årlig semester har jag?" → "Vad sägs om den 6-åriga anställde?" → "Hur ansöker jag om det?" Enbart den andra och tredje frågan är meningslösa; beror på det tidigare sammanhanget.
Du måste lösa två problem. Den första är för hämtning: gör följdfrågan oberoende (fråga omskrivning). "Vad sägs om den 6-åriga anställde?" → "Hur många dagars årlig semester har en anställd på 6 år rätt till?" Du söker med denna oberoende fråga. Den andra är för produktion: du ger också konversationshistoriken till modellen så att den fortsätter konsekvent.
# Tvåsteg: oberoende → sök → generera med historik (konceptuell) independent = model.uret( "Använd konversationshistoriken för att göra frågan förståelig på egen hand:\nHistoria: {historia}\nFråga: {follow_question}") context = retrieval(oberoende) # sök med oberoende frågesvar = model.uret(prompt) follow_
När historien växer (långt samtal) blir det dyrt att skicka allt åt gången och fyller sammanhangsfönstret. Lösning: summera de föregående omgångarna eller behåll de N sista omgångarna och reducera de föregående till sammanfattningen. Därmed förblir kostnaderna under kontroll och konsistensen bibehålls.
Status
problem
Lösning
Följdfråga har inget sammanhang
Hämta sökningar meningslösa
Gör frågan oberoende (skriv om)
lång chatt
Kostnad och fönster sväller
Sammanfattning av tidigare turer
Användaren ändrade ämne
Gamla sammanhang blir infekterade
Minska tidigare inflytande på nytt ämne
Auktoriteten kan variera mellan turerna
Risk för läckage
Applicera ACL-filter igen varje omgång
Tre minifodral
Fall 1 - "Säkerhets"-fel med prompt. Ett företag lade konfidentiella lönedokument på en assistent som vem som helst kunde fråga, men skrev bara "ge inte löneinformation" på prompten. Modellen läckte löneintervallet när en användare ställde frågan i rundgång. När ACL-filtret lades till hämtningen (lönedelar endast till HR-rollen) var läckan helt stängd; eftersom delen aldrig tas med längre.
Fall 2 — Kontextlös stalking. I en supportassistent frågar användaren "returperiod?" → "hur är det med den trasiga produkten?" Systemet förde med sig irrelevanta delar för den "trasiga produkten". När frågans oberoende lades till ("Hur lång är returperioden för en trasig produkt?") ökade den korrekta svarsfrekvensen från 44 % till 90 %.
Fall 3 — Svullen förbi. I 30 omgångar av chattar med en assistent skickade varje samtal hela historiken; Kostnaden ökade tre gånger per omgång, och svaren saktade ner. När vi bytte till en struktur som behöll de senaste 6 omgångarna och sammanfattade de tidigare, sjönk tokenkostnaden med 62 % och konsistensen bibehölls.
Vanliga misstag
- Lämnar auktoritet till prompten: Modellen glömmer/förbigår; ACL-filter är obligatoriskt vid hämtning.
- Räknar inte upp sammanhanget: Modellen kan inte citera rätt källa.
- Inte oberoende av följdfrågan: Hämtning söker meningslöst.
- Skickar all historik blind: Exploderar i kostnad och fördröjning; sammanfatta.
- Skriver inte motsägelseregeln: Modellen kan presentera den opålitliga källan som officiell.
Sammanfattningsvis
- Åtkomstkontroll implementeras med ett metadatafilter under hämtningsfasen; Otillåtna delar får aldrig tas med.
- Identitet och auktoritet bestäms i det betrodda applikationslagret; Den snabba instruktionen är bara ett extra lager av försvar.
- Robust promptmall inkluderar roll, uppföranderegler (jordning, vet inte tillstånd, källa, konflikt), numrerad kontext och fråga.
- I flerrundssamtal frikopplas följdfrågor och modellen ger konsekventa svar med historik.
- Genom att sammanfatta den långa historien hålls kostnads- och sammanhangsfönstret under kontroll; ACL appliceras på nytt varje runda.
Applikationsuppgift
(1) Definiera minst tre behörighetsgrupper för din egen assistent (t.ex. alla, avdelning, chef) och skriv i en tabell vilken dokumenttyp som är öppen för vilken grupp. (2) Anpassa och skriv ovanstående promptmall efter din egen roll och ton; Gör sammanhanget numrerat och källa. (3) Skriv ett realistiskt konversationsscenario i tre omgångar (fråga → uppföljning → uppföljning) och generera manuellt oberoende versioner av varje uppföljningsfråga. (4) Förklara i en mening varför ACL-filtret ska användas igen varje omgång i detta scenario.
checklista
- [ ] Jag implementerar åtkomstkontroll med ett hämtningsfilter, jag litar bara inte på uppmaningen.
- [ ] Jag lägger till jordning, jag vet inte tillstånd, källa och konfliktregel i min promptmall.
- [ ] Jag ger kontextdelarna numrerade och refererade.
- [ ] Jag gör följdfrågor oberoende innan hämtning.
- [ ] Jag hanterar kostnaden och fönstret genom att sammanfatta den långa konversationshistoriken.