واحد 6 / 11

کنترل دسترسی، الگوی سریع و مدیریت مکالمه

سود:

  • کنترل دسترسی (ACL) را تنظیم کنید که بازیابی را بر اساس اختیارات کاربر فیلتر می کند
  • نوشتن یک الگوی سریع که متن و سوال کاربر را به درستی قرار می دهد
  • تمرین استقلال سوال و مدیریت تاریخ در مکالمات چند دور

ما معماری را تأسیس کردیم. حالا بیایید آن را ایمن، سازگار و مکالمه کنیم. سه موضوع مهم در این واحد وجود دارد: (1) کنترل دسترسی که بازیابی را بر اساس اختیارات کاربر فیلتر می کند، (2) یک الگوی سریع قوی که متن و سؤال را به درستی قرار می دهد، (3) استقلال سؤال و مدیریت تاریخچه مکالمه در چت چند دور. بدون این سه، یک دستیار یا داده‌ها را افشا می‌کند، پاسخ‌های متناقض می‌دهد یا در سؤالات بعدی از هم می‌پاشد.

کنترل دسترسی: داده های غیرمجاز هرگز نباید وارد شوند

بزرگترین خطر سازمانی: سندی که کاربر نباید نشت در پاسخ را ببیند. یک اشتباه بسیار رایج مبتدیان این است که "به مدل می گوییم اسناد مخفی را در همان لحظه نشان دهد." این امن نیست. مدل ممکن است یک دستورالعمل را فراموش کند یا یک تزریق سریع ممکن است از آن فرار کند. مکان صحیح مرحله بازیابی است: قطعه غیرمجاز به هیچ وجه نباید وارد شود.

روش انجام این کار این است که متادیتای مرجع (بخش، نقش، سطح حریم خصوصی) را که در طول جستجو بر روی هر قسمت به عنوان فیلتر قرار می دهید، اعمال کنید. شما با خیال راحت تعیین می کنید که کاربر (هویت و نقش) در لایه برنامه چه کسی باشد و یک فیلتر ACL (فهرست کنترل دسترسی) به تماس اضافه کنید.

# فیلتر شده توسط بازیابی مرجع (مفهومی) کاربر = احراز هویت (جلسه) # احراز هویت از منبع قابل اعتماد = user.roles + ["همه"] # به عنوان مثال. ["HR", "admin"]result = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": مجاز}، # فقط قسمت های مجاز "privacy": {"lte": user.level}} # زیر سطح)

احتیاط: هرگز از مدل درخواست صلاحیت نکنید یا به درخواست اعتماد نکنید. هویت و اختیار در لایه قابل اعتماد برنامه تعیین می شود. فیلتر بازیابی اجباری است، دستورالعمل فوری فقط یک لایه اضافی است. "من آن را در اعلان نوشتم" امنیتی نیست.

الگوی جامد Prompt

الگوی سریع اسکلتی است که متن، سؤال کاربر و دستورالعمل‌های رفتار را از بازیابی گرد هم می‌آورد. بخش‌هایی از یک الگوی خوب: شرح نقش/وظیفه، قوانین رفتاری (زمینه، اجازه نمی‌دانم، درخواست منبع، لحن)، زمینه، سؤال.

شما یک دستیار منابع انسانی سازمانی هستید. وظیفه شما این است که به سوالات کارکنان فقط بر اساس زمینه زیر پاسخ دهید. قوانین: - اگر پاسخ به وضوح در متن نیست، بنویسید "من نتوانستم اطلاعاتی در این مورد در اسناد پیدا کنم، با تیم منابع انسانی بررسی کنید". حدس نزنید، جعل نکنید.- اگر منابع موجود در متن متناقض هستند، خط مشی رسمی را مبنا قرار دهید و تناقض را بیان کنید.- منبعی را که به آن تکیه می کنید به عنوان [منبع: فایل، بخش] در پایان هر ادعا اضافه کنید.- به زبانی کوتاه، واضح و حرفه ای پاسخ دهید. CONTEXT:{numbered_parts}سوال: {user_question}

شماره گذاری قسمت های زمینه ([1]، [2]، ...) استناد به مدل را آسان تر می کند. همچنین در ابتدای هر قطعه منبع را بنویسید تا مدل به درستی آن را ذکر کند.

نکته: الگوی درخواست را ثابت نگه دارید و همیشه متغیرها (زمینه، سؤال) را در همان مکان ها قرار دهید. یک الگوی ثابت به لطف ذخیره سریع در برخی از سیستم ها، هم تست پذیری را افزایش می دهد و هم هزینه ها را کاهش می دهد.

زمینه:[1] (منبع: ik_el_kitabi.pdf، بخش 5.2) مرخصی استحقاقی سالانه 14 روز است...[2] (منبع: ik_el_kitabi.pdf، بخش 5.4) مرخصی برای افرادی که بیش از 5 سال سابقه خدمت دارند 20 روز است...

اعلان ضعیف / اعلان قوی

ضعیف (بدون پایه، بدون منبع، هویت مختلط):

از این اسناد استفاده کنید و به سوال پاسخ دهید: {parts}کاربر: {question}# مشکل: مدل از متن خارج می‌شود، می‌سازد، منابع را ذکر نمی‌کند، # خودسرانه در تناقض رفتار می‌کند.

قوی (نقش + قوانین + زمینه شماره گذاری + منبع اجباری):

شما هستید... فقط به CONTEXT تکیه کنید. در غیر این صورت بگویید "نمی دانم". در تضاد، خط مشی رسمی را انتخاب کنید. [منبع: ...] را به هر ادعا اضافه کنید.CONTEXT: [1]... [2]... QUESTION: {question}# نتیجه: پاسخی که به متن وفادار باشد، منبع آن باشد و تناقض را به درستی مدیریت کند.

مدیریت مکالمه چند توری

یک کاربر واقعی یک سوال نمی پرسد و آن را به حال خود رها می کند. صحبت می کند. "چند روز مرخصی سالانه دارم؟" → "در مورد کارمند 6 ساله چطور؟" → "چگونه برای آن درخواست کنم؟" سوال دوم و سوم به تنهایی بی معنی است. بستگی به زمینه قبلی دارد

شما باید دو مشکل را حل کنید. اولین مورد برای بازیابی است: سؤال بعدی را مستقل کنید (بازنویسی سؤال). "در مورد کارمند 6 ساله چطور؟" ← «کارمند 6 ساله چند روز مرخصی سالانه تعلق می گیرد؟ شما با این سوال مستقل جستجو کنید. مورد دوم برای تولید است: شما همچنین تاریخچه مکالمه را به مدل می دهید تا به طور مداوم ادامه یابد.

# دو مرحله ای: مستقل کردن → جستجو → تولید با تاریخ (مفهومی) مستقل = model.uret( "از سابقه مکالمه استفاده کنید تا سوال به تنهایی قابل درک باشد:\nتاریخچه: {history}\nسوال: {follow_question}") context = retrieval(مستقل) # جستجو با پرسش مستقل = model.uretquet(prompt history)

با رشد تاریخ (مکالمه طولانی)، ارسال همه آن در یک زمان گران می شود و پنجره زمینه را پر می کند. راه حل: دورهای قبلی را خلاصه کنید یا N دور آخر را نگه دارید و دورهای قبلی را به خلاصه کاهش دهید. بنابراین، هزینه ها تحت کنترل باقی می ماند و ثبات حفظ می شود.

وضعیت

مشکل

راه حل

سوال بعدی زمینه ندارد

جستجوهای بازیابی بی معنی است

سوال را مستقل کنید (بازنویسی کنید)

چت طولانی

هزینه و پنجره متورم می شود

خلاصه تورهای گذشته

کاربر موضوع را تغییر داد

بافت قدیمی آلوده می شود

تاثیر گذشته بر موضوع جدید را کاهش دهید

اعتبار ممکن است بین تورها متفاوت باشد

خطر نشت

فیلتر ACL را هر دور دوباره اعمال کنید

سه کیف کوچک

مورد 1 - اشتباه "امنیتی" با اعلان. یک شرکت اسناد حقوق و دستمزد محرمانه‌ای را روی دستیار قرار داد که هر کسی می‌توانست از آن بپرسد، اما فقط نوشت: «اطلاعات حقوق و دستمزد را ندهید» روی درخواست. این مدل زمانی که یک کاربر این سوال را به صورت دوربرگردان پرسید، محدوده دستمزد را لو داد. هنگامی که فیلتر ACL به بازیابی اضافه شد (بخش های حقوق فقط به نقش HR)، نشت کاملاً بسته شد. چون قطعه دیگر هرگز آورده نمی شود.

مورد 2 - تعقیب بدون زمینه. در یک دستیار پشتیبانی، کاربر می پرسد "دوره بازگشت؟" → "در مورد محصول شکسته چطور؟" این سیستم برای «محصول شکسته» قطعات بی ربط آورده است. هنگامی که استقلال سؤال اضافه شد ("دوره بازگشت برای یک محصول شکسته چقدر است؟")، میزان پاسخ صحیح از 44٪ به 90٪ افزایش یافت.

مورد 3 - گذشته متورم. در 30 دور چت با یک دستیار، هر تماس کل تاریخچه را ارسال کرد. هزینه در هر دور 3 برابر افزایش می‌یابد و سرعت پاسخ‌ها کاهش می‌یابد. هنگامی که ما به ساختاری رفتیم که 6 راند آخر را حفظ کرد و دوره های قبلی را خلاصه کرد، هزینه توکن تا 62 درصد کاهش یافت و ثبات حفظ شد.

اشتباهات رایج

  • سپردن اختیار به دستور: مدل فراموش می کند/ دور می زند. فیلتر ACL در بازیابی اجباری است.
  • عدم برشمردن زمینه: مدل نمی تواند منبع صحیح را ذکر کند.
  • مستقل نکردن سوال بعدی: بازیابی بیهوده جستجو می کند.
  • ارسال تمام تاریخچه کور: در هزینه و تاخیر منفجر می شود. خلاصه کردن
  • عدم نوشتن قانون تضاد: مدل ممکن است منبع نامعتبر را به عنوان رسمی معرفی کند.

به طور خلاصه

  • کنترل دسترسی با یک فیلتر فراداده در مرحله بازیابی اجرا می شود. قطعات غیر مجاز هرگز نباید آورده شوند.
  • هویت و اختیار در لایه برنامه قابل اعتماد تعیین می شود. دستورالعمل سریع فقط یک لایه دفاعی اضافی است.
  • الگوی سریع قوی شامل نقش، قوانین رفتاری (زمینه، عدم اطلاع از مجوز، منبع، تضاد)، زمینه شماره گذاری شده و سؤال است.
  • در مکالمه چند دور، سؤالات بعدی از هم جدا می شوند و مدل پاسخ های سازگار با تاریخ را تولید می کند.
  • با خلاصه کردن تاریخچه طولانی، پنجره هزینه و زمینه تحت کنترل نگه داشته می شود. ACL مجدداً در هر دور اعمال می شود.

وظیفه کاربردی

(1) حداقل سه گروه مجوز برای دستیار خود (به عنوان مثال همه، بخش، مدیر) تعریف کنید و در جدول بنویسید که کدام نوع سند برای کدام گروه باز است. (2) الگوی اعلان فوق را با توجه به نقش و لحن خود تطبیق داده و بنویسید. متن را شماره گذاری و منبع کنید. (3) یک سناریوی مکالمه واقع گرایانه سه دوری بنویسید (سوال → پیگیری → پیگیری) و به صورت دستی نسخه های مستقلی از هر سؤال بعدی ایجاد کنید. (4) در یک جمله توضیح دهید که چرا فیلتر ACL باید در هر دور در این سناریو دوباره اعمال شود.

چک لیست

  • [ ] من کنترل دسترسی را با یک فیلتر بازیابی پیاده‌سازی می‌کنم، فقط به درخواست تکیه نمی‌کنم.
  • [ ] من پایه، مجوز، منبع و قانون تضاد را به الگوی درخواستی خود اضافه می کنم.
  • [ ] قسمت های زمینه را شماره گذاری و ارجاع می دهم.
  • [ ] من سوالات بعدی را قبل از بازیابی مستقل می سازم.
  • [ ] من هزینه و پنجره را با خلاصه کردن تاریخچه طولانی مکالمه مدیریت می کنم.