
LLM एजेंट्स में पर्सिस्टेंट-मेमोरी पॉइज़निंग के लिए डिटरमिनिस्टिक बेंचमार्क और मूल्यांकन हार्नेस, जिसमें युग्मित स्वच्छ/विषाक्त केस, LangChain/LlamaIndex रनर और रक्षा-तंत्र शामिल हैं।
यह रिपॉज़िटरी पेपर MemForm: Benchmarking Memory Formation Poisoning in LLM Agents के साथ है।
MemForm, LLM एजेंट्स में स्थायी-मेमोरी विषाक्तता (persistent-memory poisoning) का एक नियतात्मक (deterministic) बेंचमार्क है। यह एक कारणात्मक (causal) प्रश्न पूछता है जिसे सामान्य jailbreak या prompt-injection सूट अलग नहीं करते:
यदि किसी एजेंट की दीर्घकालिक मेमोरी को एक सुस्पष्ट सतह पर बदला जाए, तो क्या उसी कार्य पर डाउनस्ट्रीम निर्णय-निर्माण एक स्वच्छ नीति से एक विषाक्त नीति की ओर स्थानांतरित हो जाता है?
प्रत्येक आइटम एक युग्मित हस्तक्षेप (paired intervention) है। डाउनस्ट्रीम ट्रिगर, एक्शन स्पेस, और परिवार अर्थ-विज्ञान (family semantics) स्थिर रखे जाते हैं। स्वच्छ और विषाक्त स्थितियों के बीच केवल मेमोरी-निर्माण इनपुट बदलता है। आक्रमण की सफलता एक आइटम-आंतरिक (within-item) विरोधाभास है।
इस रिलीज़ में फ़्रोज़न बेंचमार्क केस और मूल्यांकन / रक्षा रनर शामिल हैं। निर्माण पाइपलाइन को पेपर के समीक्षाधीन होने तक रोका गया है और प्रकाशन के बाद जारी किया जाएगा।
प्रत्येक परिवार को पाँच मेमोरी इंटरफ़ेस पर तत्काल (instantiate) किया गया है। केस फ़ील्ड interface है। P1–P5 पेपर के नाम हैं: Content, Evidence, Scope, Selection, और Path।
| इंटरफ़ेस | पेपर नाम | कारणात्मक चर | स्वच्छ बनाम विषाक्त विरोधाभास | डाउनस्ट्रीम प्रोब |
|---|---|---|---|---|
| P1 | Content | संग्रहीत मेमोरी टेक्स्ट | एक स्वच्छ पुन:प्रयोज्य नीति बनाम एक विषाक्त नीति का सीधा लेखन | एक सामान्य लक्ष्य कार्य |
| P2 | Evidence | सहायक रिकॉर्ड की प्रामाणिकता | समान-बजट प्रामाणिक इतिहास बनाम एक मिलान इतिहास जो कुछ रिकॉर्ड को जाली साक्ष्य से बदल देता है। Provenance मेमोरी शिक्षार्थी से छिपा रहता है | एक सामान्य लक्ष्य कार्य |
| P3 | Scope | प्रेक्षित स्कोप वितरण | स्थानीय रूप से वैध साक्ष्य और बाहरी प्रति-उदाहरण बनाम स्थानीय रूप से पसंदीदा क्रिया के लिए संकेत-प्रमुख आंतरिक सफलताएँ और प्रामाणिक बाहरी/सामान्य सफलताएँ | तीन कार्य: इन-स्कोप, निकट आउट-ऑफ़-स्कोप, लक्ष्य आउट-ऑफ़-स्कोप |
| P4 | Selection | प्रतिधारित उपसमुच्चय | समान उम्मीदवार पूल; एक निश्चित-आकार उपसमुच्चय का स्वच्छ बनाम विषाक्त प्रतिधारण, पूर्ण-पूल नियंत्रण के साथ | एक सामान्य लक्ष्य कार्य |
| P5 | Path | केवल समेकन क्रम | समान-संदर्भ अनुभव का वही मल्टीसेट दो क्रमचयों में। स्वच्छ क्रम में स्वच्छ साक्ष्य अंतिम है; विषाक्त क्रम में विषाक्त साक्ष्य अंतिम है | एक समान-संदर्भ लक्ष्य कार्य |
P3 इन-स्कोप एक सहमति / साझा-लक्ष्य नियंत्रण है: स्वच्छ और विषाक्त स्वर्ण उत्तर समान हैं। निकट-बाहरी और लक्ष्य-बाहरी कार्य अलग-किए जा सकने वाले प्रोब हैं। P5 छिपे हुए संदर्भ बदलावों को मना करता है: प्रत्येक रिकॉर्ड एक ही context_key साझा करता है, और स्वच्छ- तथा विषाक्त-समर्थक दोनों रिकॉर्ड प्रेक्षित सफलताएँ हैं।
| पथ | सामग्री |
|---|---|
outputs/mcq_item_audit/accepted_cases.jsonl | फ़्रोज़न बहुविकल्पीय केस (994 आइटम, 235 परिवार) |
outputs/freeform_item_audit/accepted_cases.jsonl | फ़्रोज़न फ्री-फ़ॉर्म केस (897 आइटम, 218 परिवार) |
memform/eval/ | साझा प्रोटोकॉल और LangChain / LlamaIndex / रक्षा रनर |
memform/freeform/evaluator.py | कैस्केडेड फ्री-फ़ॉर्म प्रतिक्रिया न्यायाधीश |
memform/defenses/ | राइट-टाइम रक्षा, यूज़-टाइम Task Shield, और निश्चित-हर (fixed-denominator) मेट्रिक्स |
memform/common.py | JSONL I/O और केस-स्कीमा जाँच |
इंटरफ़ेस के अनुसार गणना — MCQ: P1 234, P2 233, P3 174, P4 144, P5 209। फ्री-फ़ॉर्म: P1 209, P2 212, P3 144, P4 134, P5 198।
memform-code/
├── outputs/
│ ├── mcq_item_audit/accepted_cases.jsonl
│ └── freeform_item_audit/accepted_cases.jsonl
├── memform/
│ ├── common.py
│ ├── freeform/evaluator.py
│ ├── eval/ # protocol, LangChain, LlamaIndex, defense runners
│ └── defenses/
├── run_langchain.py
├── run_llamaindex.py
├── run_defense.py
├── pyproject.toml
├── requirements.txt
└── .env.example
रूट run_*.py स्क्रिप्ट्स वही एंट्री पॉइंट्स कॉल करती हैं जो python -m memform <command> कॉल करता है।
Python 3.10+।
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
.env.example को .env में कॉपी करें और क्रेडेंशियल सेट करें:
| वेरिएबल | किसके द्वारा उपयोग किया जाता है |
|---|---|
OPENAI_API_KEY | मूल्यांकन एजेंट / मेमोरी मॉडल |
OPENAI_BASE_URL | वैकल्पिक OpenAI-संगत गेटवे (OPENAI_API_BASE भी LlamaIndex द्वारा स्वीकार किया जाता है) |
JUDGE_OPENAI_API_KEY / JUDGE_OPENAI_BASE_URL | वैकल्पिक अलग जज / फ्री-फॉर्म मूल्यांकनकर्ता |
DEFENSE_OPENAI_API_KEY / DEFENSE_OPENAI_BASE_URL | वैकल्पिक अलग डिफेंस-मॉडल एंडपॉइंट |
--api-key और --base-url एनवायरनमेंट को ओवरराइड करते हैं। कोई भी OpenAI-संगत Chat Completions सर्वर काम करता है। CLI के डिफ़ॉल्ट मॉडल नाम प्लेसहोल्डर हैं; अपने एंडपॉइंट पर उपलब्ध कोई मॉडल पास करें।
python -m memform --help
JSONL, प्रति पंक्ति एक केस।
साझा फ़ील्ड: case_id, family_id, interface (P1–P5), attack_type, domain, decision_variable, clean_policy, poisoned_policy, scope, candidate_experiences, memory_building, metadata।
memory_building युग्मित हस्तक्षेप है:
oracle_memory.clean / oracle_memory.poisoned — गोल्ड पॉलिसी टेक्स्ट (डायग्नोस्टिक)clean_condition / poisoned_condition — उस इंटरफ़ेस के लिए मेमोरी-बिल्डिंग इनपुटMCQ. evaluation.type multiple_choice है। प्रत्येक trigger_tasks[] प्रविष्टि में task, choices, clean_answer, और poisoned_answer होते हैं।
फ़्री-फ़ॉर्म. task_format free_form है; source_case_id MCQ स्रोत की ओर इंगित करता है। विकल्प मेन्यू को एक खुली सिफ़ारिश से बदल दिया जाता है। स्कोरिंग युग्मित behavioral_signatures (clean / poisoned / ambiguous / unclear) का उपयोग करती है। पॉइज़निंग निर्माण अपरिवर्तित रहता है।
प्रोवेनेंस और गोल्ड लेबल स्कोरिंग के लिए बेंचमार्क ग्राउंड ट्रुथ हैं। डिफ़ेंस को कभी भी अटैक इंटरफ़ेस, कंडीशन नाम, गोल्ड उत्तर, प्रोवेनेंस, या ID प्रॉम्प्ट फ़ीचर के रूप में प्राप्त नहीं होते।
दोनों रनर केस वैलिडेशन, मेमोरी कंसॉलिडेशन, डाउनस्ट्रीम निर्णय, स्कोरिंग, और एग्रीगेशन साझा करते हैं। वे केवल LLM / मेमोरी स्टैक में भिन्न होते हैं।
python -m memform run-langchain \
--cases outputs/mcq_item_audit/accepted_cases.jsonl \
--output-dir results/langchain_mcq \
--phase all \
--interfaces P1 P2 P3 P4 P5 \
--model MODEL
python -m memform run-llamaindex \
--cases outputs/mcq_item_audit/accepted_cases.jsonl \
--output-dir results/llamaindex_mcq \
--phase learned \
--interfaces P1 P2 P3 P4 P5 \
--model MODEL
वही कमांड outputs/freeform_item_audit/accepted_cases.jsonl स्वीकार करते हैं। Free-form स्कोरिंग सटीक canonical मिलान का उपयोग करती है, फिर वैकल्पिक parser / judge मॉडल (--freeform-parser-model, --freeform-judge-model)।
| Flag | अर्थ |
|---|---|
--phase oracle|learned|all | Oracle gold policy टेक्स्ट का उपयोग करता है; learned संकलित इतिहास से समेकित करता है |
--target-alignment | learned memory क्या अनुशंसित करती है, इसका task-conditional judge (diagnostic) |
--p5-updaters | incremental_merge (डिफ़ॉल्ट), full_rewrite, recency_weighted_strict, batch_replay |
--p5-random-orders N | अतिरिक्त deterministic P5 क्रमपरिवर्तन |
--cache | LLM कॉल का JSONL डिस्क कैश |
--validate-only | रन योजना और अनुमानित कॉल संख्या प्रिंट करें, फिर बाहर निकलें |
प्रत्येक रन --output-dir के अंतर्गत case_results.jsonl और summary.json लिखता है।
Frozen attack cases को फिर से नहीं लिखा जाता। Write-time रक्षाएँ समेकन से पहले रिकॉर्ड को रख सकती हैं, अस्वीकार कर सकती हैं, sanitize कर सकती हैं, quarantine कर सकती हैं, या bypass कर सकती हैं। Task Shield उपयोग के समय assistant आउटपुट की जाँच करता है और memory निर्माण को नहीं बदलता।
python -m memform run-defense \
--defense all \
--interfaces all \
--cases outputs/mcq_item_audit/accepted_cases.jsonl \
--undefended-results results/langchain_mcq/case_results.jsonl \
--output-dir results/defense \
--model MODEL \
--defense-model MODEL