टैक्टिकल RAG: राइटअप्स से एक्शन तक
पिछले साल, एक आंतरिक इन्फ्रास्ट्रक्चर के खिलाफ़ एक एंगेजमेंट के दौरान, मैंने एक बहुत ही ख़ास डिटेल ढूंढने में चालीस मिनट गंवा दिए: किसी ने JMX एक्सपोज़ करने वाली एक मिसकॉन्फ़िगर्ड Java सर्विस के एक विशेष वर्शन के विरुद्ध प्रिविलेज एस्केलेशन कैसे किया था। मुझे पता था कि मैंने इसे पढ़ा था। किसी राइटअप में, किसी Twitter थ्रेड में, किसी Discord में। मुझे याद नहीं था कहाँ। Google मुझे SEO कचरा थमा रहा था, ब्राउज़र बुकमार्क्स एक क़ब्रिस्तान थे, और मेरे ~/notes फ़ोल्डर में 1,300 बिना-इंडेक्स किए हुए markdown पड़े थे।
चालीस मिनट। एक टाइम-बॉक्स्ड पेंटेस्ट में, यह एक Domain Admin है जो आपको नहीं मिलता।
वहीं से Beorn का आइडिया आया: एक RAG जो डॉक्युमेंट्स नहीं ढूंढता, बल्कि एक ऑपरेट कर रहे एजेंट को एक्शनेबल कॉन्टेक्स्ट डिलीवर करता है। आज इसमें 9115 वेक्टर इंडेक्स्ड हैं, 28 थीमैटिक कलेक्शन्स हैं, और यह 50 ms से कम में जवाब देता है। लेकिन वहाँ तक पहुंचना उतना साफ़-सुथरा नहीं था जितना सुनने में लगता है।
जेनरिक RAG आक्रामक काम के लिए नहीं चलता
पहला प्रोटोटाइप किताबी था: langchain, OpenAI एम्बेडिंग्स, लोकल ChromaDB, हर 512 टोकन पर रिकर्सिव चंकिंग। यह "Kerberoasting क्या है?" जैसे सवालों के लिए काम करता था। यह "मेरे पास IIS 10 ऐप्लिकेशन पूल में चल रहे Windows Server 2019 पर एक SeImpersonatePrivilege है, मुझे रास्ता दो" के लिए बुरी तरह विफल था।
समस्या मॉडल में नहीं थी। समस्या यह थी कि अधिकांश RAG साहित्य मानता है कि आपका कॉर्पस कॉर्पोरेट FAQ, प्रोडक्ट डॉक्युमेंटेशन, या PDF पॉलिसी है। आक्रामक राइटअप्स एक अलग चीज़ हैं: वे कथन ("मैंने देखा कि banner ने Apache 2.4.49 लौटाया"), शब्दशः payloads, टूल आउटपुट, और अंतर्निहित निष्कर्ष मिलाते हैं जिन्हें आप तभी समझते हैं जब आप पहले से ही TTP जानते हों। अगर आप उसे फ़िक्स्ड लंबाई से काटते हैं, तो आप payloads तोड़ देते हैं, CVE को उसकी व्याख्या से अलग कर देते हैं, और रैंकिंग पासे फेंकने जैसी हो जाती है।
PentestAgent टीम ने अपने NeurIPS 2024 पेपर में एक पैटर्न दस्तावेज़ किया है (Shen et al., 2024)[1]: आक्रामक ज्ञान प्रक्रियात्मक है, घोषणात्मक नहीं। आप कोई तथ्य नहीं ढूंढ रहे होते। आप अपने कॉन्टेक्स्ट पर शर्तित एक रेसिपी ढूंढ रहे होते हैं। और यह पूरे रिट्रीवर डिज़ाइन को बदल देता है।
9115 राइटअप्स इंडेक्स करते हुए हमने जो सीखा
टोकन्स के बजाय सिमेंटिक यूनिट से चंकिंग
हम रिकर्सिव चंकिंग से एक स्ट्रक्चर-अवेयर चंकिंग पर गए। हर HTB राइटअप में कमोबेश पहचाने जा सकने वाले फ़ेज़ होते हैं: रेकॉनिसन्स, इनिशियल फ़ुटहोल्ड, लैटरल मूवमेंट, प्रिविलेज एस्केलेशन, परसिस्टेंस। हम उन्हें एक प्रीप्रोसेसर से पार्स करते हैं जो markdown हेडर्स, कोड ब्लॉक्स, और स्पष्ट सेपरेटर्स देखता है। हर चंक में मेटाडेटा होता है:
{
"box": "Sauna",
"os": "Windows",
"phase": "privesc",
"ttp": "asreproast",
"tools": ["impacket", "hashcat"],
"cve": [],
"difficulty": "easy",
"lang": "en"
}औसत चंक 380 टोकन पर ठहरा, लेकिन उच्च प्रसरण के साथ: कुछ 90 के हैं (एक कमांड अपने आउटपुट के साथ), अन्य 700 के (Kerberos delegation की पूरी व्याख्या)। NVIDIA की टीम ने इस साल एक एम्पिरिकल विश्लेषण प्रकाशित किया (Wang et al., 2024)[2] जिसमें दिखाया गया कि इष्टतम आकार डोमेन पर निर्भर करता है और एकरूपता थोपने से प्रेसिज़न 8% से 15% तक गिरता है। यह वही था जो हम देख रहे थे।
मल्टीलिंगुअल एम्बेडिंग्स, क्योंकि राइटअप्स केवल अंग्रेज़ी में नहीं होते
हमारे कॉर्पस का लगभग एक-तिहाई स्पैनिश, फ्रेंच या रशियन है। हमने OpenAI का text-embedding-3-small, e5-multilingual-large आज़माया और अंततः bge-m3 (Chen et al., 2024)[3] पर ठहरे, जो 100+ भाषाओं में, 8192-टोकन कॉन्टेक्स्ट के साथ, एक साथ dense, sparse और multi-vector रिट्रीवल सपोर्ट करता है। एक ही कलेक्शन में भाषाओं को मिक्स करने के लिए, बिना recall खोए, यह हमारे लिए सबसे अच्छा रहा।
एक गैर-तुच्छ डिटेल: एजेंट की क्वेरीज़ आम तौर पर टेक्निकल अंग्रेज़ी में आती हैं ("CVE-2021-26855 SSRF chain") लेकिन वे स्पैनिश में लिखी व्याख्याओं की ओर इशारा करती हैं। गुणवत्तापूर्ण मल्टीलिंगुअल एम्बेडिंग्स के बिना, वह cross-lingual recall ढह जाता है। bge-m3 के साथ हमने 200 क्वेरीज़ के एक हाथ से मूल्यांकित सेट पर nDCG@10 0.81 मापा; OpenAI के मॉडल के साथ हम 0.69 पर अटके थे।
Reranking, क्योंकि dense top-k झूठ बोलता है
कोसाइन सिमिलैरिटी से टॉप 10 वेक्टर लौटाना ट्यूटोरियल्स आपको यही सिखाते हैं। यही प्रोडक्शन में टूटता भी है। पहला पास संभाव्य कैंडिडेट्स लाता है लेकिन क्रम शोर भरा होता है। हमने टॉप 50 कैंडिडेट्स पर एक bge-reranker-v2-m3 reranker जोड़ा और टॉप 5 रखे। लागत: +18 ms। Precision@5 में सुधार: 0.64 से 0.87 तक।
# Simplified pipeline
candidates = vector_store.search(query_emb, k=50)
reranked = reranker.score(query, [c.text for c in candidates])
top_k = sorted(zip(candidates, reranked), key=lambda x: -x[1])[:5]एक्सप्लॉइट कर रहे एजेंट को कॉन्टेक्स्ट देना
Beorn कोई चैटबॉट नहीं है। यह Gandalf Gateway के पीछे एक सर्विस के रूप में रहता है, और क्वेरीज़ एजेंट बिना मानवीय हस्तक्षेप के करता है। यह कॉन्ट्रैक्ट बदल देता है: रिस्पॉन्स को मिलीसेकंड्स में किसी और LLM द्वारा पचाने योग्य होना चाहिए, किसी मानव द्वारा पढ़े जाने के लिए नहीं।
पिछले एंगेजमेंट से एक असली क्वेरी:
beorn query \
--filter "os=linux,phase=privesc" \
--context "kernel 5.4.0, sudo 1.8.31, capabilities cap_dac_read_search+ep" \
"binary with capabilities exploitation"रिस्पॉन्स:
{
"latency_ms": 41,
"results": [
{
"chunk_id": "htb-academy-linux-privesc-cap-dac",
"score": 0.94,
"ttp": "T1548.001",
"summary": "cap_dac_read_search permite leer cualquier fichero...",
"command": "getcap -r / 2>/dev/null | grep dac_read",
"next_steps": ["read /etc/shadow", "extract hashes",
"john --wordlist"]
}
]
}एजेंट को यह मिलता है, गद्य का कोई पैराग्राफ़ नहीं। Gandalf को "यहाँ एक टेक्स्ट है, समझो क्या करना है" देने और "यहाँ MITRE TTP है, शुरुआती कमांड है, और अगले तीन कदम हैं" देने में जो फ़र्क़ है, वही फ़र्क़ इम्प्रोवाइज़ करते एजेंट और एक्ज़ेक्यूट करते एजेंट के बीच है।
असली मेट्रिक्स
हम चार महीने से Beorn को इंटरनल प्रोडक्शन में चला रहे हैं। जो संख्याएँ हम मॉनिटर करते हैं:
- Latency p50: 41 ms। P99: 78 ms। बिना कैश।
- 312 असली क्वेरीज़ के एनोटेटेड सेट पर Precision@5: 0.87।
- Recall@20: 0.93।
- कॉर्पस कवरेज: 9115 चंक्स, 28 कलेक्शन्स।
- भाषाएँ: EN 64%, ES 22%, FR 8%, RU 4%, अन्य 2%।
एक ठोस केस जो तालिका से अधिक मूल्यवान है: हाल ही के एक Active Directory असेसमेंट में, एजेंट ने पहले फ़ुटहोल्ड से 6 मिनट में एक ESC8 अटैक पाथ (ADCS HTTP enrollment) की पहचान की। Beorn के बिना, तुलनीय पिछले अभ्यासों में, समतुल्य चरण में हमें एक्सप्लॉइटेशन डिटेल्स की मैनुअल खोज में 40 से 90 मिनट लगते थे। यह जादू नहीं है। यह यह याद करने में समय न गंवाना है कि डिटेल कहाँ था।
जो हम दोबारा नहीं करेंगे
पहला: हमने सब कुछ एक विशाल कलेक्शन में डालकर मेटाडेटा को फ़िल्टर बनाकर शुरुआत की। बुरा विचार। जब आप कुछ हज़ार वेक्टर्स पर पहुँचते हैं, तो post-retrieval फ़िल्टर महंगे हो जाते हैं और recall गिरता है क्योंकि अलग-अलग डोमेन के एम्बेडिंग्स एक ही स्पेस में प्रतिस्पर्धा करते हैं। मौजूदा 28 कलेक्शन्स स्रोत प्रकार और OS द्वारा विभाजित हैं। गेटवे उन्हें ऑर्केस्ट्रेट करता है।
दूसरा: हमने डीडुप्लिकेशन को कम आँका। तीन अलग-अलग राइटअप्स एक ही तकनीक को लगभग एक जैसे शब्दों में समझाते हैं। सिमेंटिक dedup के बिना, top-5 आपको एक ही पैराग्राफ़ के पाँच संस्करण लौटाता है। हमने एक MMR (Maximal Marginal Relevance) कदम जोड़ा और top-k की व्यक्तिपरक उपयोगिता ध्यान देने योग्य रूप से बढ़ गई, हालाँकि क्लासिकल मेट्रिक्स से इसे मापना मुश्किल है।
तीसरा, और यह तकलीफ़देह था: पहले रिलीज़ में कोई कंटीन्यूअस इवैल्यूएशन नहीं था। हम नई एम्बेडिंग्स अपलोड करते, reranker बदलते, और भावना से चलते। तब तक जब तक एक मॉडल बदलाव ने हमारी precision@5 को आठ अंक नीचे न गिरा दिया और एक हफ़्ते तक किसी ने ध्यान नहीं दिया। अब हमारे पास सत्यापित उत्तरों के साथ 300+ क्वेरीज़ का एक गोल्डन सेट है, और किसी भी बदलाव को प्रमोट करने से पहले मूल्यांकित किया जाता है। यह सबक Gao et al. (2024)[4] के सर्वे में भी प्रलेखित है: एक इवैल्यूएशन लूप के बिना, एक RAG सिस्टम बुरी तरह बूढ़ा होता है।
RAG जादू नहीं है, और न ही यह सर्च इंजन है। यह वह ऑपरेशनल मेमोरी है जो आपके एजेंट के पास हमेशा होनी चाहिए थी। इसे ऐसा मानने से डिज़ाइन चंक से लेकर आउटपुट कॉन्ट्रैक्ट तक बदल जाता है।
अगर आपकी टीम कुछ ऐसा बना रही है, तो सबसे उपयोगी सलाह जो मैं दे सकता हूँ वो यह है: कॉन्ट्रैक्ट से शुरू करें। मॉडल से नहीं। कंज़्यूमर — मानव हो या एजेंट — को कार्य करने के लिए क्या प्राप्त करना है? यह चंकिंग, मेटाडेटा, और रिस्पॉन्स फ़ॉर्मेट तय करता है। बाक़ी सब इंजीनियरिंग है।
References
- Shen, X., et al. (2024). PentestAgent: Incorporating LLM Agents to Automated Penetration Testing. arXiv:2411.05185.
- Wang, Y., et al. (2024). Finding the Best Chunking Strategy for Accurate AI Responses. NVIDIA Technical Blog.
- Chen, J., et al. (2024). BGE M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings. BAAI / Hugging Face.
- Gao, A., et al. (2024). Retrieval Augmented Generation for Robust Cyber Defense. PNNL-36792.