RAG को सुरक्षित बनाना: रिट्रीव किए गए डॉक्यूमेंट्स के लिए परमिशन्स
रिट्रीवल तय करता है कि मॉडल क्या देखेगा। अगर रिट्रीवल इस बात पर ध्यान नहीं देता कि यूज़र कौन है, तो मॉडल खुशी-खुशी उन डॉक्यूमेंट्स से जवाब दे देगा जिन्हें यूज़र को कभी नहीं पढ़ना चाहिए।
60 सेकंड में
RAG को सुरक्षित बनाना: रिट्रीव किए गए डॉक्यूमेंट्स के लिए परमिशन्स
रिट्रीवल तय करता है कि मॉडल क्या देखेगा। अगर रिट्रीवल इस बात पर ध्यान नहीं देता कि यूज़र कौन है, तो मॉडल खुशी-खुशी उन डॉक्यूमेंट्स से जवाब दे देगा जिन्हें यूज़र को कभी नहीं पढ़ना…
मूल नियम: क्वेरी के समय ही फिल्टर करें
- 1
यूज़र साइन इन करता है
आपके ऐप को सेशन से पता चल जाता है कि वे कौन हैं: user id, tenant, groups। - 2
कोड में फिल्टर बनाएं
टेनेंट और एक्सेस ग्रुप्स सेशन से आते हैं, मॉडल या चैट से कभी नहीं। - 3
फिल्टर के साथ सर्च करें
वेक्टर या कीवर्ड सर्च केवल उन्हीं चंक्स पर ध्यान देती है जिन्हें यह यूज़र पढ़ सकता है। - 4
रैंक करें और भेजें
मॉडल तक केवल वही चंक्स पहुंचते हैं जिनकी अनुमति है, साथ ही साइटेशन के लिए उनकी सोर्स आईडी भी होती है। - 5
सोर्स का रिकॉर्ड रखें
रिकॉर्ड रखें कि हर जवाब के लिए कौन सी डॉक्यूमेंट आईडी का इस्तेमाल किया गया था।
def retrieve(query_vector, session, k=5):
user = session.user # from login
return vector_db.search(
vector=query_vector,
top_k=k,
# Filter syntax differs between databases. The idea does not:
# tenant is always required, and groups come from the session.
filter={
"tenant_id": user.tenant_id,
"allowed_groups": {"any_of": user.groups},
},
)- मॉडल से यह कहना कि "सिर्फ उन्हीं डॉक्यूमेंट्स का इस्तेमाल करो जिन्हें यह यूज़र देख सकता है"
- सभी कस्टमर्स के लिए एक ही शेयर्ड इंडेक्स, जिसे "ज़रूरत पड़ने पर" फिल्टर किया जाता है
- इंडेक्सिंग के समय परमिशन्स कॉपी करना और उन्हें कभी अपडेट न करना
- एक ऐसा आंसर कैश (answer cache) जिसकी 'key' केवल सवाल के टेक्स्ट पर आधारित हो
- सर्च क्वेरी में ही फिल्टर लगाना, जिसे कोड द्वारा लागू किया गया हो
- हर क्वेरी पर टेनेंट फिल्टर, या हर टेनेंट के लिए एक अलग इंडेक्स
- परमिशन में बदलावों और हटाए गए एक्सेस को तुरंत सिंक करना
- ऐसी कैश कीज़ (cache keys) जिनमें यूज़र का परमिशन स्कोप शामिल हो, या कोई शेयर्ड कैश न हो
मल्टी-टेनेंट अलगाव (Multi-tenant separation)
| तरीका | खूबी | लागत |
|---|---|---|
| हर टेनेंट के लिए अलग इंडेक्स या डेटाबेस | सबसे मज़बूत अलगाव; फिल्टर की कोई गड़बड़ी (bug) टेनेंट्स का डेटा आपस में नहीं मिला सकती | चलाने और पैसे चुकाने के हिसाब से ज़्यादा महंगा |
| हर टेनेंट के लिए अलग नेमस्पेस (namespace) या कलेक्शन | अच्छा अलगाव, बशर्ते एक्सेस कीज़ (access keys) भी अलग हों | प्रोडक्ट के फीचर्स पर निर्भर करता है |
| एक ज़रूरी (mandatory) टेनेंट फिल्टर के साथ शेयर्ड इंडेक्स | चलाने में सबसे सस्ता और सबसे आसान | एक भी फिल्टर छूटा तो सब कुछ लीक हो जाएगा; मज़बूत टेस्ट्स की ज़रूरत होती है |
ज़हरीले (Poisoned) डॉक्यूमेंट्स
- हर उस सोर्स को जानें जिसे आप इंडेक्स करते हैं, और यह भी कि उसमें कौन लिख सकता है।
- अविश्वसनीय पब्लिक कंटेंट (रिव्यूज़, अपलोड्स) को भरोसेमंद पॉलिसी डॉक्यूमेंट्स से अलग रखें, और हर चंक के ट्रस्ट लेवल पर लेबल लगाएं।
- रिट्रीव किए गए टेक्स्ट को पढ़ने के बाद मॉडल क्या कर सकता है, उसे सीमित करें: कम टूल्स दें, जोखिम भरे कामों के लिए मंज़ूरी (approvals) तय करें।
- ज़्यादा भरोसेमंद सोर्स में होने वाले बदलावों की समीक्षा करें, और अपलोड में छिपे हुए टेक्स्ट पर नज़र रखें, जैसे सफ़ेद बैकग्राउंड पर सफ़ेद टेक्स्ट या बहुत छोटा फॉन्ट।
साइटेशन (Citations) और नयापन
और देखें और पढ़ें
लैब
कामकाजी परमिशन फिल्टर और पास होने वाले टेस्ट्स के साथ एक टॉय (toy) रिट्रीवल फंक्शन।
समस्या
अपने कंप्यूटर पर स्टार्टर कोड चलाएं। यह आसान शब्द मिलान (word matching) के साथ पांच नकली डॉक्यूमेंट्स पर एक टॉय "सर्च" है। अभी यह किसी को भी डॉक्यूमेंट्स लौटा देता है।
retrieveको बदलें ताकि यह केवल यूज़र केtenantऔर कम से कम एक मैचिंग ग्रुप वाले डॉक्यूमेंट्स पर ही विचार करे।- इसे fail closed बनाएं: अगर यूज़र का कोई टेनेंट नहीं है, तो एरर (error) दें।
- टेस्ट्स को तब तक चलाएं जब तक वे सभी पास न हो जाएं।
- अपना खुद का एक टेस्ट जोड़ें: सही टेनेंट लेकिन गलत ग्रुप वाला यूज़र।
प्रैक्टिस लैब
कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।
कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।
आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1आपका फिल्टर चैट पाथ में काम करता है। RAG प्रोडक्ट में दो ऐसे अन्य कोड पाथ्स के नाम बताएं जहां इसी फिल्टर को अक्सर भुला दिया जाता है।दिखाएं
आम उदाहरण: बैकग्राउंड जॉब्स जो डॉक्यूमेंट्स की समरी बनाते हैं या उन्हें टैग करते हैं, "संबंधित डॉक्यूमेंट्स" या ऑटो-कम्प्लीट फीचर्स, आंसर कैश, लोकप्रिय सवाल और जवाब दिखाने वाले एनालिटिक्स डैशबोर्ड, एडमिन या डिबग सर्च टूल्स, और इवैल्यूएशन स्क्रिप्ट्स जो प्रोडक्शन डेटा की कॉपी बनाती हैं। इंडेक्स को पढ़ने वाले हर पाथ को उसी फिल्टर की ज़रूरत होती है, बेहतर होगा कि यह एक शेयर्ड फंक्शन के ज़रिए हो।
Q2हर टेनेंट के लिए एक अलग इंडेक्स रखना कभी-कभी अतिरिक्त लागत के लायक क्यों होता है?दिखाएं
क्योंकि यह एक लॉजिक नियम को एक फिजिकल बाउंड्री में बदल देता है। एक शेयर्ड इंडेक्स के साथ, किसी भी कोड पाथ में एक भी छूटा हुआ या गलत फिल्टर टेनेंट्स का डेटा आपस में मिला सकता है। अलग इंडेक्स और अलग क्रेडेंशियल्स के साथ, वह बग दूसरे क्लाइंट के डेटा तक नहीं पहुंच सकता। कड़े कॉन्ट्रैक्ट या संवेदनशील डेटा वाले क्लाइंट्स के लिए, यह सुरक्षा लागत से कहीं ज़्यादा मायने रख सकती है।
अक्सर पूछे जाने वाले सवाल
क्या हम रिट्रीवल के बाद रिज़ल्ट्स को फिल्टर नहीं कर सकते?
आप कर सकते हैं, बशर्ते हटाए गए चंक्स को कोई और न देखे। लेकिन पोस्ट-फिल्टरिंग से अक्सर बहुत कम रिज़ल्ट मिलते हैं और इसे किसी एक कोड पाथ (code path) में भूल जाना आसान होता है, जैसे कि कोई समरी जॉब या कैश में। क्वेरी के अंदर ही फिल्टर करना ज़्यादा सुरक्षित है और इससे बेहतर जवाब मिलते हैं।
क्या अपने डॉक्यूमेंट्स पर मॉडल को fine-tune करने से यह समस्या हल हो जाती है?
नहीं, यह स्थिति को और बिगाड़ देता है। मॉडल वेट्स (model weights) में समाए ज्ञान को प्रति-यूज़र के हिसाब से फिल्टर नहीं किया जा सकता। जो कोई भी मॉडल का इस्तेमाल कर सकता है, वह इसे निकाल पाने में सक्षम हो सकता है। परमिशन वाले डेटा को रिट्रीवल में ही रखें, जहां आप उसे फिल्टर कर सकते हैं।
क्या हो अगर खाली टेनेंट फिल्टर हर चीज़ से मेल खा जाए?
यह एक वास्तविक और आम बग है। कोड को fail closed बनाएं: अगर टेनेंट या ग्रुप्स गायब हैं, तो सर्च करने से मना कर दें। ठीक इसी मामले के लिए एक टेस्ट लिखें।
परमिशन में बदलाव कितनी तेज़ी से इंडेक्स तक पहुंचने चाहिए?
उतनी ही तेज़ी से जितना कि जोखिम के हिसाब से ज़रूरी हो। जब कोई व्यक्ति किसी प्रोजेक्ट को छोड़ता है, तो उसके डॉक्यूमेंट्स तक उसका एक्सेस तुरंत खत्म हो जाना चाहिए। कई टीमें एक तय शेड्यूल पर और किसी ग्रुप से हटाए जाने जैसे ज़रूरी मौकों पर भी परमिशन्स को सिंक करती हैं।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।