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): ક્વોરન્ટાઇન થયેલા કેસની જગ્યા ભરવા માટે જનરેટ કરેલો નવો ટેસ્ટ કેસ, જે કેટેગરી/ડિફિકલ્ટી સંતુલન જાળવી રાખે છે.

વિભાવનાઓ

સંચાલન શિસ્ત

  1. હંમેશાં temperature 0.0 પર પ્રોબ કરો. સ્ટોકેસ્ટિક સેમ્પલિંગ દરેક રનમાં અલગ કમ્પ્લીશન પેદા કરે છે અને સ્કોરને અર્થહીન બનાવે છે.
  2. ક્વોરન્ટાઇન માટે append મોડ (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માં append કરવાથી ડેટાસેટના કવરેજમાં ખાલી જગ્યા રહે છે; પરિણામી ડિસ્ટ્રિબ્યુશન શિફ્ટ બેન્ચમાર્ક પરિણામોને અગાઉના રન સાથે તુલના ન કરી શકાય તેવા બનાવે છે.
  2. એક ટેસ્ટ કેસ સ્કોર કરતી વખતે પ્રોવાઇડરને ક્રમિક રીતે પ્રોબ કરશો નહીં — 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 →