Free lesson · GenAI Safety & Evaluation Engineering

డేటాసెట్ కలుషితం (contamination) మరియు లీకేజీని గుర్తించండి

మూల్యాంకన డేటాసెట్‌లు LLM training data లోకి లీక్ కాలేదని నిర్ధారించుకోవడానికి మీరు contamination detection ను నిర్మిస్తారు. ఒక ContaminationDetector class ను సృష్టించండి, ఇది: (1) ప్రతి test case input ను OpenAI GPT-4o మరియు Gemini Pro కు పంపుతుంది, (2) మోడల్ ఆశించిన output ను యథాతథంగా (verbatim) పునరుత్పత్తి చేయగలదో లేదో తనిఖీ చేస్తుంది (contamination సంకేతం), (3) ఒక contamination score ను గణిస్తుంది: మోడల్ output కు ఆశించిన సమాధానంతో >90% ROUGE-L overlap ఉన్న test cases శాతం. కలుషితమైన test cases ను భర్తీ కోసం ఫ్లాగ్ చేయండి. ఒక quarantine workflow ను నిర్మించండి: కలుషితమైన cases contamination సాక్ష్యంతో పాటు ఒక quarantine.jsonl ఫైల్‌లోకి తరలించబడతాయి. ఒక contamination report ను రూపొందించండి: మొత్తం cases, కలుషితమైన వాటి సంఖ్య, ప్రతి మోడల్‌కు మరియు ప్రతి category కు contamination rate.

Course: GenAI Evaluation, Safety & Governance · Chapter 1 · Evaluation Dataset Curation

Free to read — no subscription required.

పరిచయం

మోడల్ ప్రొవైడర్ యొక్క ట్రైనింగ్ డేటాలో కనిపించే ఒక టెస్ట్ కేస్, ప్రొడక్షన్‌లో మాయమయ్యే ఉబ్బిన బెంచ్‌మార్క్ స్కోర్‌లను ఉత్పత్తి చేస్తుంది. ఇదే డేటాసెట్ కలుషితం (dataset contamination) — మరియు మీరు ట్రైనింగ్ కార్పొరాను పరిశీలించలేని హోస్టెడ్ LLMల విషయంలో, దీన్ని సంభావ్యతా పద్ధతిలో (probabilistically) మాత్రమే గుర్తించగలం. ప్రామాణిక పద్ధతి ఏమిటంటే, ప్రతి టెస్ట్ కేస్‌లోని ఒక భాగంతో మోడల్‌ను ప్రోబ్ చేసి, ఆశించిన కొనసాగింపులో ఎంత భాగాన్ని అది యథాతథంగా (verbatim) పునరుత్పత్తి చేస్తుందో కొలవడం. అధిక యథాతథ ఓవర్‌ల్యాప్ (ROUGE-L 0.85 కంటే ఎక్కువ) అంటే మోడల్ ఆ ఉదాహరణను ముందే చూసిందనడానికి బలమైన సాక్ష్యం; డేటాసెట్‌ను న్యాయమైన బెంచ్‌మార్క్‌గా ఉపయోగించే ముందు ఆ కేస్‌ను క్వారంటైన్ చేసి, కొత్తదానితో భర్తీ చేయాలి.

కీలక పదజాలం

  • Contamination (కలుషితం): మోడల్ యొక్క ట్రైనింగ్ డేటాలో ఉన్న టెస్ట్ కేస్, ఇది పక్షపాతంతో కూడిన eval స్కోర్‌లను ఉత్పత్తి చేస్తుంది.
  • ROUGE-L: రెండు స్ట్రింగ్‌ల మధ్య పొడవైన ఉమ్మడి ఉపక్రమం (longest common subsequence) ఓవర్‌ల్యాప్, పొడవైన స్ట్రింగ్‌తో నార్మలైజ్ చేయబడింది. పరిధి 0–1.
  • Probe (ప్రోబ్): temperature=0.0తో మోడల్‌కు పంపిన టెస్ట్ కేస్ యొక్క కత్తిరించిన ప్రిఫిక్స్; మోడల్ కొనసాగింపును ఆశించిన అవుట్‌పుట్‌తో పోల్చుతారు.
  • Quarantine (క్వారంటైన్): కలుషితమైన రికార్డులను భర్తీ కోసం నమోదు చేసే అపెండ్-ఓన్లీ ఫైల్ (quarantine.jsonl).
  • Replacement (భర్తీ): క్వారంటైన్ చేసిన కేస్ స్థానాన్ని భర్తీ చేయడానికి ఉత్పత్తి చేసిన కొత్త టెస్ట్ కేస్, ఇది కేటగిరీ/కష్టస్థాయి సమతుల్యతను కాపాడుతుంది.

భావనలు

నిర్వహణ క్రమశిక్షణ

  1. ఎప్పుడూ temperature 0.0 వద్దే ప్రోబ్ చేయండి. స్టోకాస్టిక్ శాంప్లింగ్ ప్రతి రన్‌లో వేరే కంప్లీషన్‌లను ఇస్తుంది మరియు స్కోర్‌లను అర్థరహితం చేస్తుంది.
  2. క్వారంటైన్ కోసం అపెండ్ మోడ్ (a) ఉపయోగించండి. ఓవర్‌రైట్ చేయడం కలుషిత చరిత్ర యొక్క ఆడిట్ ట్రెయిల్‌ను నాశనం చేస్తుంది.
  3. ప్రతి స్కాన్‌కు కనీసం రెండు ప్రొవైడర్‌లను ప్రోబ్ చేయండి. ఒక్క ప్రొవైడర్ ట్రైనింగ్ డేటా, ఇతరులు చూసినదాన్ని కవర్ చేయకపోవచ్చు; క్రాస్-ప్రొవైడర్ ప్రోబింగ్ మరిన్ని కేసులను పట్టుకుంటుంది.
  4. ప్రతి త్రైమాసికం మళ్లీ స్కాన్ చేయండి. ప్రొవైడర్ ట్రైనింగ్ కటాఫ్‌లు ముందుకు కదులుతాయి; కొత్త మోడల్ వెర్షన్‌లు విడుదలైనప్పుడు కొత్త కలుషితం కనిపిస్తుంది.
  5. ROUGE-L > 0.85ను బలమైన సంకేతంగా చూడండి, కానీ రుజువుగా కాదు. కొన్ని టెస్ట్ కేసులు సహజంగానే తక్కువ-ఎంట్రోపీతో ఉంటాయి (ఉదా., "What is 2+2?") మరియు కలుషితం లేకుండానే అధిక ఓవర్‌ల్యాప్‌ను ఇస్తాయి. క్వారంటైన్ చేయడానికి ముందు స్పాట్-చెక్ చేయండి.

కోడ్ వాక్‌త్రూ

ప్రోబ్ లూప్

Code snippetpython
1import asyncio, json 2from pathlib import Path 3from openai import AsyncOpenAI 4from rouge_score import rouge_scorer 5 6class ContaminationDetector: 7 def __init__(self, providers: dict[str, AsyncOpenAI], threshold: float = 0.85) -> None: 8 self._providers = providers 9 self._threshold = threshold 10 self._scorer = rouge_scorer.RougeScorer(["rougeL"], use_stemmer=True) 11 12 async def probe(self, model: str, prefix: str) -> str: 13 client = self._providers[model] 14 resp = await client.chat.completions.create( 15 model=model, 16 messages=[{"role": "user", "content": prefix}], 17 temperature=0.0, 18 max_tokens=300, 19 ) 20 return resp.choices[0].message.content or "" 21 22 async def score(self, prefix: str, expected: str) -> dict[str, float]: 23 scores: dict[str, float] = {} 24 completions = await asyncio.gather(*[ 25 self.probe(m, prefix) for m in self._providers.keys() 26 ]) 27 for model, completion in zip(self._providers.keys(), completions): 28 r = self._scorer.score(expected, completion)["rougeL"].fmeasure 29 scores[model] = r 30 return scores 31 32 def is_contaminated(self, scores: dict[str, float]) -> bool: 33 return any(s >= self._threshold for s in scores.values())
  • ContaminationDetector కన్‌స్ట్రక్టర్ ప్రొవైడర్ పేరు → SDK క్లయింట్ అనే dictని, అలాగే కలుషిత థ్రెషోల్డ్‌ను (డిఫాల్ట్ 0.85) తీసుకుంటుంది.
  • probe ఒకే మోడల్‌ను ప్రిఫిక్స్‌తో temperature 0.0 వద్ద కాల్ చేస్తుంది — నాన్-డిటర్మినిస్టిక్ డీకోడింగ్ ట్రైనింగ్-డేటా ఓవర్‌ల్యాప్‌ను దాచేస్తుంది కాబట్టి డిటర్మినిస్టిక్ సెట్టింగ్ అత్యవసరం.
  • score అన్ని ప్రొవైడర్‌లను ఏకకాలంలో ప్రోబ్ చేసి, ఆశించిన కొనసాగింపుకు వ్యతిరేకంగా ప్రతి ప్రొవైడర్‌కు ROUGE-L స్కోర్‌ను తిరిగి ఇస్తుంది.
  • ఏదైనా ఒక ప్రొవైడర్ థ్రెషోల్డ్ కంటే ఎక్కువ స్కోర్ చేస్తే is_contaminated టెస్ట్ కేస్‌ను ఫ్లాగ్ చేస్తుంది; క్రాస్-ప్రొవైడర్ బెంచ్‌మార్క్‌లను పక్షపాతం చేయడానికి ఒక ప్రొవైడర్ ఆ కేస్‌ను కంఠస్థం చేసినా సరిపోతుంది.

క్వారంటైన్ ఫ్లో

Loading diagram...

భర్తీ దశ ముఖ్యమైనది: కలుషితమైన కేసులను కేవలం తొలగించడం డేటాసెట్‌ను కుదిస్తుంది మరియు తరచుగా కేటగిరీ/కష్టస్థాయి సమతుల్యతను వక్రీకరిస్తుంది. ఎప్పుడూ అదే (category, difficulty) సెల్‌లో కొత్త కేస్‌ను ఉత్పత్తి చేసి, దాన్ని మళ్లీ ప్రోబ్ చేసి, థ్రెషోల్డ్‌ను దాటిన తర్వాతే కమిట్ చేయండి.

విభాగ అనువర్తనం

చేయవలసినవి మరియు చేయకూడనివి

చేయవలసినవి

  1. ప్రతి probe కాల్‌లో temperature=0.0 సెట్ చేయండి — డిటర్మినిస్టిక్ డీకోడింగ్ అవసరం, ఎందుకంటే సున్నా కాని temperature శాంప్లింగ్ నాయిస్‌ను ప్రవేశపెట్టి యథాతథ ట్రైనింగ్-డేటా ఓవర్‌ల్యాప్‌ను దాచగలదు, తద్వారా తప్పుడు నెగటివ్‌లు వచ్చి కలుషితమైన కేసులు యాక్టివ్ డేటాసెట్‌లో మిగిలిపోతాయి.
  2. ఏదైనా ఒక ప్రొవైడర్ ROUGE-L స్కోర్ 0.85కు చేరినా లేదా దాటినా టెస్ట్ కేస్‌ను కలుషితమైనదిగా ఫ్లాగ్ చేయండి — ఆశించిన కొనసాగింపును కంఠస్థం చేసిన ఒకే ప్రొవైడర్ క్రాస్-ప్రొవైడర్ బెంచ్‌మార్క్‌లను పక్షపాతం చేయడానికి సరిపోతుంది, కాబట్టి is_contaminated తనిఖీ any()ని ఉపయోగించాలి, మెజారిటీ లేదా సగటును కాదు.
  3. అదే (category, difficulty) సెల్‌లో భర్తీని ఉత్పత్తి చేసి, కమిట్ చేసే ముందు దాన్ని మళ్లీ ప్రోబ్ చేయండి — క్వారంటైన్ చేసిన కేసులను కేవలం వదిలేయడం డేటాసెట్‌ను కుదించి కేటగిరీ మరియు కష్టస్థాయి సమతుల్యతను వక్రీకరిస్తుంది; భర్తీ స్వయంగా థ్రెషోల్డ్‌ను దాటిన తర్వాతే యాక్టివ్ డేటాసెట్‌లో రాయాలి.

చేయకూడనివి

  1. కలుషితమైన కేస్‌ను క్వారంటైన్ చేసిన తర్వాత భర్తీ దశను దాటవేయవద్దు — కొత్త టెస్ట్ కేస్‌ను ఉత్పత్తి చేయకుండా quarantine.jsonlకు అపెండ్ చేయడం డేటాసెట్ కవరేజీలో ఖాళీని వదిలేస్తుంది; ఫలితంగా వచ్చే డిస్ట్రిబ్యూషన్ షిఫ్ట్ బెంచ్‌మార్క్ ఫలితాలను మునుపటి రన్‌లతో పోల్చలేనివిగా చేస్తుంది.
  2. ఒకే టెస్ట్ కేస్‌ను స్కోర్ చేసేటప్పుడు ప్రొవైడర్‌లను వరుసగా (sequentially) ప్రోబ్ చేయవద్దు — score మెథడ్ అన్ని ప్రొవైడర్‌లను సమాంతరంగా ప్రోబ్ చేయడానికి asyncio.gatherని ఉపయోగిస్తుంది; ఆ కాల్‌లను వరుసగా చేయడం ప్రొవైడర్‌ల సంఖ్యకు అనులోమానుపాతంలో లేటెన్సీని జోడిస్తుంది మరియు పెద్ద-డేటాసెట్ కలుషిత స్కాన్‌లను ఆచరణ సాధ్యం కానంత నెమ్మదిగా చేస్తుంది.
  3. 0.85 కంటే తక్కువ ROUGE-L స్కోర్‌ను మోడల్ ఆ ఉదాహరణను ఎప్పుడూ చూడలేదనడానికి రుజువుగా భావించవద్దు — ROUGE-L ఒక సంభావ్యతా సంకేతం, ఫోరెన్సిక్ గ్రౌండ్ ట్రూత్ కాదు; అంచు కేసులను పట్టుకోవడానికి థ్రెషోల్డ్‌ను తగ్గించడం తప్పుడు పాజిటివ్‌లను పెంచుతుంది, కానీ దాన్ని 0.85 కంటే పైకి పెంచడం స్కోర్‌లను ఇప్పటికీ ఉబ్బించే పారాఫ్రేజ్-స్థాయి కంఠస్థాన్ని కోల్పోయే ప్రమాదం ఉంది.

3 hands-on labs come with this lesson — real code, in a cloud IDE. Create a free account to run them. No card.

Free account · no card · straight to the labs

Or get the full path — from

Listen to this lesson

Audio overviews of this lesson's labs and its chapter, from GenBodha Bytes.

More free lessons in GenAI Evaluation, Safety & Governance

All free lessons in GenAI Safety & Evaluation Engineering →