Free lesson · GenAI Safety & Evaluation Engineering
ડેટાસેટ contamination અને leakage શોધો
તમે contamination detection બનાવશો જેથી ખાતરી થાય કે evaluation datasets LLM training data માં leak થયા નથી. એક ContaminationDetector class બનાવો જે: (1) દરેક test case input ને OpenAI GPT-4o અને Gemini Pro ને મોકલે, (2) તપાસે કે model expected output ને શબ્દશઃ (verbatim) પુનઃઉત્પન્ન કરી શકે છે કે નહીં (contamination signal), (3) contamination score ગણે: એવા test cases ની ટકાવારી જ્યાં model output નો expected answer સાથે >90% ROUGE-L overlap હોય. Contaminated test cases ને બદલવા માટે flag કરો. એક quarantine workflow બનાવો: contaminated cases ને contamination evidence સાથે quarantine.jsonl file માં ખસેડવામાં આવે. એક contamination report generate કરો: કુલ cases, contaminated સંખ્યા, model દીઠ contamination rate, category દીઠ.
Course: GenAI Evaluation, Safety & Governance · Chapter 1 · Evaluation Dataset Curation
Free to read — no subscription required.
પરિચય
મોડેલ પ્રોવાઇડરના ટ્રેનિંગ ડેટામાં દેખાતો ટેસ્ટ કેસ ફુલાવેલા બેન્ચમાર્ક સ્કોર પેદા કરે છે જે પ્રોડક્શનમાં અદૃશ્ય થઈ જાય છે. આ ડેટાસેટ દૂષણ (dataset contamination) છે — અને હોસ્ટેડ LLM માટે, જેમના ટ્રેનિંગ કોર્પસનું તમે નિરીક્ષણ કરી શકતા નથી, તે માત્ર સંભાવનાત્મક રીતે જ શોધી શકાય છે. પ્રમાણભૂત ટેકનિક એ છે કે દરેક ટેસ્ટ કેસના એક ભાગ સાથે મોડેલને પ્રોબ કરવું અને માપવું કે તે અપેક્ષિત કન્ટિન્યુએશનનો કેટલો ભાગ શબ્દશઃ પુનઃઉત્પન્ન કરે છે. ઊંચો શબ્દશઃ ઓવરલેપ (ROUGE-L 0.85થી ઉપર) એ મજબૂત પુરાવો છે કે મોડેલે આ ઉદાહરણ પહેલાં જોયું છે; ડેટાસેટને ન્યાયી બેન્ચમાર્ક તરીકે વાપરી શકાય તે પહેલાં આ કેસને ક્વોરન્ટાઇન કરીને નવા કેસથી બદલવો જરૂરી છે.
મુખ્ય પરિભાષા
- દૂષણ (Contamination): મોડેલના ટ્રેનિંગ ડેટામાં હાજર ટેસ્ટ કેસ, જે પૂર્વગ્રહયુક્ત ઇવૅલ સ્કોર પેદા કરે છે.
- ROUGE-L: બે સ્ટ્રિંગ વચ્ચેનો સૌથી લાંબો સામાન્ય સબસિક્વન્સ ઓવરલેપ, લાંબી સ્ટ્રિંગ દ્વારા નોર્મલાઇઝ કરેલો. રેન્જ 0–1.
- પ્રોબ (Probe): ટેસ્ટ કેસનો કાપેલો પ્રિફિક્સ જે
temperature=0.0સાથે મોડેલને મોકલાય છે; મોડેલના કન્ટિન્યુએશનની અપેક્ષિત આઉટપુટ સાથે તુલના કરવામાં આવે છે. - ક્વોરન્ટાઇન (Quarantine): એક append-only ફાઇલ (
quarantine.jsonl) જેમાં દૂષિત રેકોર્ડ બદલવા માટે નોંધવામાં આવે છે. - રિપ્લેસમેન્ટ (Replacement): ક્વોરન્ટાઇન થયેલા કેસની જગ્યા ભરવા માટે જનરેટ કરેલો નવો ટેસ્ટ કેસ, જે કેટેગરી/ડિફિકલ્ટી સંતુલન જાળવી રાખે છે.
વિભાવનાઓ
સંચાલન શિસ્ત
- હંમેશાં temperature 0.0 પર પ્રોબ કરો. સ્ટોકેસ્ટિક સેમ્પલિંગ દરેક રનમાં અલગ કમ્પ્લીશન પેદા કરે છે અને સ્કોરને અર્થહીન બનાવે છે.
- ક્વોરન્ટાઇન માટે append મોડ (
a) વાપરો. ઓવરરાઇટ કરવાથી દૂષણ ઇતિહાસનો ઑડિટ ટ્રેઇલ નષ્ટ થાય છે. - દરેક સ્કેનમાં ઓછામાં ઓછા બે પ્રોવાઇડર પ્રોબ કરો. એક પ્રોવાઇડરનો ટ્રેનિંગ ડેટા બીજાઓએ જે જોયું છે તે આવરી લેતો ન હોય શકે; ક્રોસ-પ્રોવાઇડર પ્રોબિંગ વધુ કેસ પકડે છે.
- દર ત્રિમાસિકે ફરી સ્કેન કરો. પ્રોવાઇડરના ટ્રેનિંગ કટઑફ આગળ વધે છે; નવા મોડેલ વર્ઝન શિપ થતાં નવું દૂષણ દેખાય છે.
- 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).probetemperature 0.0 પર પ્રિફિક્સ સાથે એક મોડેલને કૉલ કરે છે — ડિટર્મિનિસ્ટિક સેટિંગ આવશ્યક છે કારણ કે નૉન-ડિટર્મિનિસ્ટિક ડિકોડિંગ ટ્રેનિંગ-ડેટા ઓવરલેપને ઢાંકી દે છે.scoreબધા પ્રોવાઇડરને એકસાથે પ્રોબ કરે છે અને અપેક્ષિત કન્ટિન્યુએશન સામે પ્રતિ-પ્રોવાઇડર ROUGE-L સ્કોર પરત કરે છે.is_contaminatedજો કોઈપણ પ્રોવાઇડર થ્રેશોલ્ડથી ઉપર સ્કોર કરે તો ટેસ્ટ કેસને ફ્લેગ કરે છે; એક પ્રોવાઇડરે કેસ યાદ રાખ્યો હોય તે ક્રોસ-પ્રોવાઇડર બેન્ચમાર્કને પૂર્વગ્રહયુક્ત બનાવવા માટે પૂરતું છે.
ક્વોરન્ટાઇન ફ્લો
રિપ્લેસમેન્ટ સ્ટેપ મહત્વનું છે: દૂષિત કેસને ફક્ત દૂર કરવાથી ડેટાસેટ સંકોચાય છે અને ઘણીવાર કેટેગરી/ડિફિકલ્ટી સંતુલન વિકૃત થાય છે. હંમેશાં એ જ (category, difficulty) સેલમાં નવો કેસ જનરેટ કરો, તેને ફરી પ્રોબ કરો, અને થ્રેશોલ્ડ પાસ થાય ત્યારે જ તેને કમિટ કરો.
શિસ્ત ઉપયોગ
શું કરવું અને શું ન કરવું
શું કરવું
- દરેક
probeકૉલમાંtemperature=0.0સેટ કરો — ડિટર્મિનિસ્ટિક ડિકોડિંગ જરૂરી છે કારણ કે શૂન્ય સિવાયનું temperature સેમ્પલિંગ નૉઇઝ દાખલ કરે છે જે શબ્દશઃ ટ્રેનિંગ-ડેટા ઓવરલેપને ઢાંકી શકે છે, ખોટા નેગેટિવ પેદા કરે છે અને દૂષિત કેસને સક્રિય ડેટાસેટમાં ટકી રહેવા દે છે. - જ્યારે કોઈપણ પ્રોવાઇડરનો ROUGE-L સ્કોર 0.85ને પહોંચે અથવા તેથી વધુ હોય ત્યારે ટેસ્ટ કેસને દૂષિત તરીકે ફ્લેગ કરો — અપેક્ષિત કન્ટિન્યુએશન યાદ રાખનાર એક જ પ્રોવાઇડર ક્રોસ-પ્રોવાઇડર બેન્ચમાર્કને પૂર્વગ્રહયુક્ત બનાવવા માટે પૂરતો છે, તેથી
is_contaminatedચેકેany()વાપરવું જોઈએ, બહુમતી કે સરેરાશ નહીં. - એ જ
(category, difficulty)સેલમાં રિપ્લેસમેન્ટ જનરેટ કરો અને કમિટ કરતાં પહેલાં તેને ફરી પ્રોબ કરો — ક્વોરન્ટાઇન થયેલા કેસને ફક્ત કાઢી નાખવાથી ડેટાસેટ સંકોચાય છે અને કેટેગરી અને ડિફિકલ્ટી સંતુલન વિકૃત થાય છે; રિપ્લેસમેન્ટે સક્રિય ડેટાસેટમાં લખાય તે પહેલાં પોતે થ્રેશોલ્ડ પાર કરવો જોઈએ.
શું ન કરવું
- દૂષિત કેસને ક્વોરન્ટાઇન કર્યા પછી રિપ્લેસમેન્ટ સ્ટેપ છોડશો નહીં — નવો ટેસ્ટ કેસ જનરેટ કર્યા વિના
quarantine.jsonlમાં append કરવાથી ડેટાસેટના કવરેજમાં ખાલી જગ્યા રહે છે; પરિણામી ડિસ્ટ્રિબ્યુશન શિફ્ટ બેન્ચમાર્ક પરિણામોને અગાઉના રન સાથે તુલના ન કરી શકાય તેવા બનાવે છે. - એક ટેસ્ટ કેસ સ્કોર કરતી વખતે પ્રોવાઇડરને ક્રમિક રીતે પ્રોબ કરશો નહીં —
scoreમેથડ બધા પ્રોવાઇડરને સમાંતર પ્રોબ કરવા માટેasyncio.gatherવાપરે છે; એ કૉલને ક્રમબદ્ધ કરવાથી પ્રોવાઇડરની સંખ્યાના પ્રમાણમાં લેટન્સી વધે છે અને મોટા ડેટાસેટના દૂષણ સ્કેન અવ્યવહારુ રીતે ધીમા બને છે. - 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.
- Build ContaminationDetector with LLM probingLab5 min
- Implement ROUGE-L overlap scoringLab5 min
- Create quarantine workflow and contamination reportLab5 min
- Evaluation Dataset CurationChapter overview20 min
More free lessons in GenAI Evaluation, Safety & Governance
- Ch 1Build a stratified evaluation dataset
- Ch 1Detect dataset contamination and leakageYou are here
- Ch 3Implement RAGAS metrics for RAG evaluation
- Ch 3Build DeepEval test suites for RAG
- Ch 5Score agent tool selection with DeepEval 3.0 and Vertex AI Agent Evaluation
- Ch 5Build agent benchmarks with task suites
- Ch 7Design A/B experiments for prompt variants