AI Ethics और Responsible AI
Responsible AI क्या है?
AI systems अब तय करने में मदद करते हैं कि loan किसे मिले, कौन सा CV shortlist हो, हम कौन सी ख़बरें देखें और किन students को अतिरिक्त मदद चाहिए। Responsible AI का मतलब है इन systems को ऐसे बनाना और इस्तेमाल करना कि वे निष्पक्ष, सुरक्षित, निजी, पारदर्शी और जवाबदेह हों। यह सिर्फ़ दार्शनिकों का विषय नहीं – ज़्यादातर समस्याएँ data और testing के साधारण technical फ़ैसलों से शुरू होती हैं।
| सिद्धांत | पूछने का सवाल |
|---|---|
| Fairness | क्या system अलग-अलग groups (gender, क्षेत्र, भाषा) के लिए बराबर अच्छा चलता है? |
| Privacy | क्या हम सिर्फ़ ज़रूरी data, सहमति से लेते और सुरक्षित रखते हैं? |
| Transparency | क्या हम समझा सकते हैं कि system ने फ़ैसला क्यों लिया? |
| Safety और reliability | ग़लत होने पर क्या होगा? क्या ज़रूरी फ़ैसलों को इंसान जाँच रहा है? |
| Accountability | ज़िम्मेदार कौन है और लोग शिकायत या अपील कैसे करें? |
Bias: model अन्याय कैसे सीखता है
Model पुराने data से patterns सीखता है। अगर पुराने फ़ैसले अन्यायपूर्ण थे, या कोई group कम दर्शाया गया है, तो model उसी अन्याय को बड़े पैमाने पर दोहराता है। नीचे एक synthetic scholarship dataset (पढ़ाने के लिए बनाया गया) है जिसमें पुरानी committees ने समान marks पर भी शहर के applicants को प्राथमिकता दी।
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
rng = np.random.default_rng(0)
n = 2000
area = rng.choice(["city", "village"], size=n, p=[0.6, 0.4])
marks = rng.normal(75, 10, n).clip(35, 100)
income = rng.normal(4, 1.5, n).clip(0.5, 12) # lakh per year
# historical (biased) decisions: same marks, but villages approved less often
logit = 0.25 * (marks - 75) - 0.4 * (income - 4) + np.where(area == "city", 0.8, -0.8)
approved = rng.random(n) < 1 / (1 + np.exp(-logit))
df = pd.DataFrame({"area": area, "marks": marks.round(), "income": income.round(1), "approved": approved})
X = pd.get_dummies(df[["marks", "income", "area"]], drop_first=True) # area_village column
model = LogisticRegression(max_iter=1000).fit(X, df["approved"])
df["predicted"] = model.predict(X)
rates = df.groupby("area")[["approved", "predicted"]].mean().round(2)
print(rates)
print("weight on area_village:", round(model.coef_[0][list(X.columns).index("area_village")], 2))Model ने “village” के लिए बड़ा negative weight सीख लिया और गाँव के बहुत कम applicants approve करता है – उसने पुरानी committees का bias copy कर लिया।
Fairness नापना
सिर्फ़ area column हटाने से अक्सर bias ठीक नहीं होता, क्योंकि दूसरे columns (school का नाम, PIN code, भाषा) छिपे proxies बन सकते हैं। पहले बराबर योग्य लोगों के बीच groups के नतीजों का अंतर नापें।
import numpy as np
import pandas as pd
rng = np.random.default_rng(0)
n = 2000
area = rng.choice(["city", "village"], size=n, p=[0.6, 0.4])
marks = rng.normal(75, 10, n).clip(35, 100)
def report(name, predicted):
df = pd.DataFrame({"area": area, "top": marks >= 85, "pred": predicted})
sel = df.groupby("area")["pred"].mean()
tpr = df[df["top"]].groupby("area")["pred"].mean() # among strong students
print(f"{name}")
print(f" selection rate city {sel['city']:.2f} | village {sel['village']:.2f} | gap {sel['city'] - sel['village']:.2f}")
print(f" top students OK city {tpr['city']:.2f} | village {tpr['village']:.2f} | gap {tpr['city'] - tpr['village']:.2f}")
biased = (marks + np.where(area == "city", 8, -8)) >= 80 # a rule that adds points for city
fair = marks >= 80 # the same cut-off for everyone
report("biased rule", biased)
report("same cut-off for all", fair)| Metric | अर्थ |
|---|---|
| Selection-rate gap (demographic parity) | हर group के चुने गए हिस्से का अंतर |
| True-positive-rate gap (equal opportunity) | जो “हाँ” के हक़दार हैं, उनमें हर group को कितनी बार मिला |
| Per-group accuracy | क्या model हर group के लिए बराबर सही है? |
अलग fairness metrics आपस में टकरा सकते हैं, और सही चुनाव स्थिति और कानून पर निर्भर है। Metrics समस्या दिखाते हैं; domain जानकार और प्रभावित समुदाय को उपाय तय करना चाहिए।
Privacy: कम लें, ज़्यादा बचाएँ
भारत का Digital Personal Data Protection Act, 2023 personal data के लिए वैध उद्देश्य और सहमति माँगता है, और लोगों को अपने data पर अधिकार देता है। अच्छी engineering आदतें: सिर्फ़ ज़रूरी data लें, analysis या AI services को text भेजने से पहले पहचान वाली जानकारी mask या हटाएँ, और ज़रूरत न रहने पर data delete करें।
import hashlib
import re
note = ("Parent Ramesh Kumar (9829012345, ramesh.k@gmail.com) says Aadhaar 2345 6789 0123 "
"was submitted. Address: 14 Johari Bazaar, Jaipur 302003.")
PATTERNS = {
"PHONE": r"\b[6-9]\d{9}\b",
"EMAIL": r"\b[\w.+-]+@[\w-]+\.[\w.]+\b",
"AADHAAR": r"\b\d{4}\s?\d{4}\s?\d{4}\b",
"PIN": r"\b[1-9]\d{5}\b",
}
def mask(text):
for label, pattern in PATTERNS.items():
text = re.sub(pattern, f"[{label}]", text)
return text
def pseudonym(name, salt="school-2026"):
return "P-" + hashlib.sha256((salt + name).encode()).hexdigest()[:8]
print(mask(note))
print("Ramesh Kumar →", pseudonym("Ramesh Kumar"))Regex masking आम formats पकड़ता है पर सब कुछ नहीं (नाम, मकान नंबर)। संवेदनशील projects में इसे access control और इंसानी जाँच के साथ जोड़ें – और test files में असली Aadhaar numbers कभी न रखें।
Transparency: फ़ैसले समझाएँ
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split
data = load_breast_cancer(as_frame=True)
X_tr, X_te, y_tr, y_te = train_test_split(data.data, data.target, random_state=0, stratify=data.target)
model = RandomForestClassifier(n_estimators=200, random_state=0).fit(X_tr, y_tr)
imp = permutation_importance(model, X_te, y_te, n_repeats=10, random_state=0)
top = pd.Series(imp.importances_mean, index=X_te.columns).sort_values(ascending=False).head(5)
print("test accuracy:", round(model.score(X_te, y_te), 3))
print("features the model relies on most:")
print(top.round(4).to_string())Permutation importance एक बार में एक column shuffle करके नापता है कि accuracy कितनी गिरी। अगर model ज़्यादातर किसी अप्रासंगिक चीज़ (ID number, hospital का नाम) पर टिका हो, तो यह चेतावनी है। SHAP जैसे tools हर व्यक्ति के लिए explanation देते हैं।
Generative AI के ख़तरे
| ख़तरा | उदाहरण | आप क्या कर सकते हैं |
|---|---|---|
| Deepfakes | किसी नेता का नकली video या पैसे माँगती नकली आवाज़ वाली call | दूसरे माध्यम से जाँचें; cybercrime.gov.in पर या 1930 पर शिकायत |
| ग़लत जानकारी | आत्मविश्वास भरे पर ग़लत जवाब या नकली citations | Share करने से पहले आधिकारिक स्रोत जाँचें |
| Copyright | किसी के काम से मिलता-जुलता बना text/image | Original content; स्रोतों को credit; licences मानें |
| शैक्षणिक ईमानदारी | AI से लिखा homework अपना बताकर जमा करना | School के नियम मानें; AI सीखने के लिए, copy के लिए नहीं |
| ज़्यादा निर्भरता | Professional के बिना AI की medical या legal सलाह मानना | समझने के लिए AI, फ़ैसलों के लिए professionals |
आपके project के लिए responsible-AI checklist
- उद्देश्य: यह कौन सा फ़ैसला सहारा देता है, और ग़लत होने पर किसे नुकसान हो सकता है?
- Data: कहाँ से आया, क्या सहमति है, कौन से groups ग़ायब या छोटे हैं?
- Testing: हर group की accuracy, fairness gaps, edge cases, उलझाने वाले inputs।
- Privacy: न्यूनतम data, masking, सुरक्षित storage, delete करने की योजना।
- इंसानी निगरानी: ज़रूरी या अनिश्चित मामलों को कौन जाँचेगा?
- Transparency: users को बताएँ कि AI शामिल है और अपील कैसे करें।
- Monitoring: launch के बाद performance दोबारा जाँचें, क्योंकि data बदलता है।
अभ्यास
learned_bias.pyमें area column हटाकर दोबारा train करें। क्या gap ख़त्म होता है? क्यों या क्यों नहीं?- Masking function में PAN numbers (
ABCDE1234F) का pattern जोड़ें। - जिस AI app का आप इस्तेमाल करते हैं उसके लिए 7-point checklist भरें।
- इस course के किसी model के लिए एक page का “model card” लिखें: उद्देश्य, data, accuracy, सीमाएँ।
सारांश
- Models पुराने data से patterns copy करते हैं – अन्यायपूर्ण भी।
- हर group के लिए fairness नापें; एक column हटाना शायद ही काफ़ी हो।
- कम personal data लें, पहचान mask करें और DPDP Act मानें।
- Models समझाएँ (permutation importance, SHAP) और ज़रूरी फ़ैसले इंसानों के हाथ में रखें।
- AI output जाँचें, AI content पर label लगाएँ और deepfake fraud की शिकायत करें।
