AI کے اشارہ کردہ انجینئرنگ کی تاثیر کا تخمینہ لگانے کے لیے پروڈکٹ کے تجربات کا جوابی طریقہ

تصور کریں کہ آپ کی ٹیم نے دو ہفتے قبل Prompt A کو عالمی سطح پر تقسیم کیا تھا۔ سخت ڈیڈ لائنز اور زیادہ قابل اعتماد ہونے کی وجہ سے، رول آؤٹ A/B ٹیسٹنگ، شیڈو ٹریفک، یا ہولڈ آؤٹ گروپس کے بغیر 100% صارفین تک پہنچ گیا۔

تکمیل کی شرحیں بظاہر مستحکم نظر آتی ہیں، لیکن حقیقی سوالات اس وقت شروع ہوتے ہیں جب کوئی ساتھی رات گئے تیاری کی ترتیب میں ایک نیا اشارہ پیش کرتا ہے۔ کیا متبادل شپنگ ایک بہتر آپشن ہوتا؟

اب آپ لاگ ان ڈیٹا ٹریپ میں پھنس گئے ہیں۔ اس کا جواب دینا ناممکن لگتا ہے، لیکن ایسا نہیں ہے۔ پروڈکٹ ٹیمیں یہ دیکھنے کے لیے ممکنہ تجربات چلاتی ہیں کہ جب وہ خصوصیات جاری کرتی ہیں تو کیا ہوگا۔ متضاد تخمینے سابقہ ​​ورژن کا جواب ہیں۔ دوسرے لفظوں میں، یہ آپ کو بتاتا ہے کہ اگر آپ کوئی مختلف پروڈکٹ بھیجتے تو کیا ہوتا۔

ڈیٹا سائنس اور پروڈکٹ انجینئرنگ لیڈروں کے لیے جو LLM پروڈکٹ لاگز کے ساتھ کام کرتے ہیں، پروڈکشن میں جانے کے بعد پرامپٹس اکثر پیمائش کا واحد راستہ دستیاب ہوتے ہیں۔ آپ کے پاس موجود تمام لاگ ان صارفین کے ہیں جنہوں نے پرامپٹ A دیکھا۔ سوالات خالصتاً سابقہ ​​ہیں۔ آپ واپس نہیں جا سکتے اور ایک مختلف کنفیگریشن کے ساتھ ہفتہ کو دوبارہ نہیں کر سکتے۔ یہ ایک کلاسک جوابی مسئلہ ہے۔

ٹیم فوری طور پر اشارے فراہم کرتی ہے، نوشتہ جات جمع کرتی ہے، اور پھر سابقہ ​​سوالات پوچھتی ہے۔ دوسرے سسٹم پرامپٹس میں منتقلی کیسی نظر آئے گی؟ کن صارفین نے مختلف ردعمل کا اظہار کیا ہو سکتا ہے؟ کیا نئے ماڈل کی ہم آہنگی حقیقی ہے، یا وہ بیک وقت تعینات کی جانے والی تیز رفتار تبدیلیوں سے آتی ہیں؟

اس کا جواب طریقوں کی ایک کلاس میں ہے جسے میٹلیئرنرز کا استعمال کرتے ہوئے جوابی تخمینہ کہا جاتا ہے۔ بنیادی خیال یہ ہے کہ ریکارڈ شدہ ڈیٹا کی موجودہ تبدیلیوں کو ایک ایسا ماڈل بنانے کے لیے استعمال کیا جائے جو یہ پیش گوئی کرے کہ علاج کے تمام اسائنمنٹس میں انفرادی صارف نے کیا تجربہ کیا ہوگا۔ ان تغیرات کا نتیجہ صارفین کو مختلف اشارے، روٹنگ کے فیصلے، یا فیچر ایکسپوژر حاصل کرنے سے ہو سکتا ہے۔

اس گائیڈ میں، ہم اسکِٹ لرن کا استعمال کرتے ہوئے شروع سے ہی ٹی لرنر اور ایکس لرنر کو لاگو کرتے ہیں۔ بوٹسٹریپ اعتماد کے وقفے شامل کریں اور نتیجے میں آنے والے تخمینوں کو ٹھوس پالیسی فیصلوں میں ترجمہ کریں۔ اگر آپ ہر صارف کو اس پرامپٹ پر روٹ کر سکتے ہیں جو آپ کے خیال میں سب سے زیادہ مددگار ثابت ہو گا، تو آپ دیکھ سکتے ہیں کہ ان کی کل لفٹ کیسی دکھتی ہے۔

اس ٹیوٹوریل کے تمام کوڈ بلاکس درج ذیل ساتھی نوٹ بک میں آخر سے آخر تک چلائے جاتے ہیں۔ product-experimentation-causal-inference-genai-llm/tree/main/10_counterfactual_prompts/. لیپ ٹاپ فائل ہے۔ counterfactual_demo.ipynb.

انڈیکس

ریکارڈ شدہ ڈیٹا ایک تجربہ کیوں نہیں ہے۔

ریکارڈ شدہ پروڈکشن ڈیٹا کے ساتھ ایک اہم مسئلہ یہ ہے کہ علاج کی تقسیم شاذ و نادر ہی بے ترتیب ہوتی ہے۔ بے ترتیب A/B ٹیسٹ میں، سکے کا پلٹنا جو صارف کو A یا پرامپٹ B کرنے کے لیے تفویض کرتا ہے باقی تمام چیزوں سے آزاد ہے۔ صارفین کے دو گروپوں میں منگنی کی کلاس، استفسار کی قسم، اور سیشن کی لمبائی کی یکساں تقسیم ہوتی ہے، بشمول وہ تمام غیر مشاہدہ شدہ خصوصیات جن کی ہم نے پیمائش نہیں کی۔

چونکہ گروپوں کے درمیان واحد منظم فرق خود علاج ہے، اس لیے نتائج میں کوئی بھی فرق اس علاج کا ایک کارگر اثر ہونا چاہیے۔

پروڈکشن لاگز کی ساخت مختلف ہوتی ہے۔ صارفین نے مخصوص وجوہات کی بنا پر جھنڈا لگے ہوئے پیغامات کو دیکھا، جیسے کہ وہ جس ورک اسپیس میں تھے، جس فیچر فلیگ بالٹی سے وہ پہنچے، استفسار کا وقت، یا آمد پر تعینات ماڈل کا ورژن۔

ان میں سے کچھ وجوہات آپ کے ڈیٹا میں درج ہیں۔ باقی پوشیدہ ہے۔ پرامپٹ A دیکھنے والے صارفین اور لاگ میں پرامپٹ B دیکھنے والے صارفین کے درمیان نتائج میں سادہ اوسط فرق کا حساب لگانا دونوں گروپوں کے درمیان کسی بھی منظم فرق کے ساتھ پرامپٹ کے کازل سگنل کو جذب کر لے گا۔

یہ وہ جگہ ہے جہاں اسے تکلیف ہوتی ہے۔ اس ٹیوٹوریل کے منظر نامے میں، ریکارڈ شدہ ڈیٹا درحقیقت بے ترتیب پرامپٹ اسائنمنٹس پر مشتمل ہے۔

بس ایک لمحے کے لیے ایسا نہیں ہونے کا بہانہ کریں۔ امیجن پرامپٹ بی کو ان صارفین تک پہنچایا گیا جو پروڈکٹ کے ساتھ زیادہ مشغول تھے، زیادہ پیچیدہ سوالات بھیجتے تھے، اور سبسکرائب کرنا جاری رکھتے تھے۔ ایک سادہ موازنہ Prompt B کے اثر کو نمایاں طور پر بڑھا چڑھا کر پیش کرے گا۔

متضاد تخمینے کے طریقے خاص طور پر غیر بے ترتیب صورت کے لیے بنائے گئے ہیں، اور اس گائیڈ میں عمل درآمد اسی طرح کام کرتا ہے قطع نظر اس سے کہ اصل تفویض صاف تھا یا افراتفری۔

آپ جس فرق میں دلچسپی رکھتے ہیں وہ اس فرق کے درمیان ہے کہ صارف نے اصل میں کیا تجربہ کیا ہے اور اگر اس نے کوئی مختلف علاج حاصل کیا ہوتا تو اسے کیا تجربہ ہوتا۔ متضاد تخمینہ دونوں ریاستوں کے لیے الگ الگ پیشین گوئیاں پیدا کرتا ہے، حالانکہ ہر صارف کو صرف ایک موصول ہوتی ہے۔

جوابی تخمینہ لگانے کا طریقہ کار

شکل 1: ٹی لرنر کی تصوراتی مثال۔ نیلے رنگ کے منحنی (m0) ماڈلز کا ٹاسک پرامپٹ A پر مکمل ہوتا ہے، اور سرخ وکر (m1) اسے پرامپٹ B پر ماڈل کرتا ہے۔ دونوں کے درمیان سبز سایہ دار فاصلہ ہر query_confidence قدر کی CATE ہے۔ نیچے والا پینل دکھاتا ہے کہ کس طرح CATE مختلف قسم کے کوواریٹس پر مختلف ہوتا ہے، زمینی سچائی +4pp اثر کو بیس لائن کے طور پر دکھایا گیا ہے۔

ممکنہ نتائج کا فریم ورک (Rubin, 1974, Holland, 1986 ) اس مسئلے کو فریم کرنے کا سب سے صاف طریقہ فراہم کرتا ہے۔ ہر صارف $i$ کے لیے، نتیجہ حاصل کرنے کے لیے پرامپٹ B لکھیں (Y_i(1))، اور فوری طور پر A لکھیں (Y_i(0)) نتیجہ حاصل کرنے کے لیے۔ دلچسپی کی مقدار انفرادی علاج کا اثر ہے: (tau_i = Y_i(1) – Y_i(0))۔

بنیادی مسئلہ یہ ہے کہ ہم صرف دو نتائج میں سے ایک کا مشاہدہ کرتے ہیں۔ ایک صارف جو پرامپٹ A دیکھتا ہے (Y_i(0)) فراہم کرتا ہے، لیکن (Y_i(1)) غائب رہتا ہے۔ ایک صارف جو پرامپٹ B دیکھتا ہے (Y_i(1)) فراہم کرتا ہے، لیکن (Y_i(0)) غائب رہتا ہے۔

انفرادی علاج کے اثرات کی شناخت صرف ایک مشاہدے سے نہیں کی جا سکتی۔ اس کے بجائے جس چیز کا اندازہ لگایا جاسکتا ہے وہ ہے مشروط اوسط علاج کا اثر (CATE)۔ (tau(x) = E[Y(1) – Y(0) mid X = x])۔

کوویریٹ پروفائل $x$ والے صارف کے لیے یہ متوقع علاج کا اثر ہے۔ کوویریٹس کے فنکشن کے طور پر ہر علاج کے مشروط اوسط نتائج کی ماڈلنگ کرکے، ہم تمام صارفین کے لیے متضاد اوسط کی پیشین گوئی کر سکتے ہیں اور فرق تلاش کر سکتے ہیں۔ پیشن گوئی فرق اس فرد کے لیے تخمینہ شدہ CATE بن جاتا ہے۔

اس نقطہ نظر کے لیے دو بنیادی مفروضوں کی ضرورت ہے: پہلا یہ کہ الجھن میں نہ پڑنا۔ علاج کی تفویض بے ترتیب ہے، مشاہدہ شدہ کوویرائٹس پر مشروط ہے۔ رسمی طور پر، یہ ((Y(0)، Y(1)) perp T mid X) ہے۔

اگر غیر مشاہدہ شدہ متغیرات اس چیز پر اثر انداز ہوتے ہیں جو صارفین کو کسی کام کی تصدیق اور مکمل کرنے پر مجبور کرتی ہے، تو یہ مفروضہ ٹوٹ جاتا ہے اور تعصب پیدا ہوتا ہے۔

دوسرا مفروضہ مثبتیت یا فالتو پن ہے۔ ہر صارف کو دو میں سے ایک علاج حاصل کرنے کا کچھ موقع ہونا چاہیے۔ اگر صارف کے دیئے گئے طبقے نے صرف ایک اشارہ دیکھا، تو حقائق کی خلاف ورزی کی پیش گوئی کی حمایت کرنے کے لیے کوئی اوورلیپ نہیں ہوگا۔

تیسرا مفروضہ، اسٹیبل یونٹ ٹریٹمنٹ ویلیو اسمپشن (SUTVA)، اس بات پر زور دیتا ہے کہ ہر صارف کا ممکنہ نتیجہ صرف اس کے علاج کی مختص پر منحصر ہے۔ دوسرے صارفین کی طرف سے موصول ہونے والے پیغامات نتائج کو متاثر نہیں کریں گے۔

یہ ایک واحد کرایہ دار SaaS پروڈکٹ میں بہت قابل فہم ہے جہاں صارف کے کام کی تکمیل آزاد ہے۔ باہمی تعاون پر مبنی کام کی جگہوں میں چیزیں پیچیدہ ہو جاتی ہیں، جہاں پرامپٹ کے ساتھ ایک صارف کا تعامل ٹیم کے رویے کو بدل سکتا ہے۔

میٹا لرنر تخمینہ لگانے والوں کا ایک خاندان ہے جو CATE کا تخمینہ لگانے کے لیے معیاری زیر نگرانی سیکھنے کے ماڈل کے مطابق ہے۔ آپ اپنے پاس پہلے سے موجود ڈیٹا کے لیے scikit-learn جیسے مانوس ٹولز استعمال کر سکتے ہیں۔ پیشین گوئیوں میں فرق متضاد تخمینوں کی اجازت دیتا ہے۔ یہ اس ٹیوٹوریل کی پوری بنیاد ہے۔

شرائط اور سیٹ اپ

یہاں پر عمل کرنے کے لیے آپ کو ضرورت ہو گی:

  • Python 3.11 یا اس سے زیادہ

  • پانڈوں کے ساتھ راحت محسوس کریں اور سیکھیں۔

  • پیشگی وجہ کا اندازہ لگانے کا تجربہ مددگار ہے، لیکن ٹیوٹوریل اس کے بغیر قابل رسائی ہے۔

اس ٹیوٹوریل کے لیے پیکجز انسٹال کریں۔

pip install numpy pandas scikit-learn

مصنوعی ڈیٹاسیٹ حاصل کرنے کے لیے، ساتھی ریپوزٹری کو کلون کریں۔

git clone https://github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm.git
cd product-experimentation-causal-inference-genai-llm
python data/generate_data.py --seed 42 --n-users 50000 --out data/synthetic_llm_logs.csv

ڈیٹاسیٹ دو فوری تغیرات کا استعمال کرتے ہوئے SaaS پروڈکٹ کی نقل کرتا ہے۔ پرامپٹ اے کنٹرول ہے اور پرامپٹ بی چیلنجر ہے۔ اس میں 50,000 صارفین شامل ہیں، جو دونوں حصوں کے درمیان یکساں طور پر تقسیم ہیں۔ نتیجہ کام کی تکمیل کا ایک بائنری اشارے ہے، اور covariates شرکت کی پرت اور سوال کا اعتماد ہے۔

ڈیٹا جنریٹر مجموعی طور پر +4 فیصد پوائنٹس کے زمینی سچائی کازل اثر کا اطلاق کرتا ہے۔ اس کا مطلب ہے کہ آپ معلوم جوابات کے خلاف اپنے تخمینہ لگانے والے کو چیک کر سکتے ہیں۔ یہ ایک عیش و آرام ہے جو پیداوار میں شاذ و نادر ہی حاصل کی جاتی ہے۔

اپنا ڈیٹا لوڈ کریں اور دیکھیں کہ آپ کس چیز کے ساتھ کام کر رہے ہیں۔

import pandas as pd
import numpy as np

df = pd.read_csv("data/synthetic_llm_logs.csv")

print("Shape:", df.shape)
print("nTreatment arm sizes:")
print(df.prompt_variant.value_counts().to_dict())

print("nTask completion by prompt variant:")
print(df.groupby("prompt_variant").task_completed.agg(["mean", "count"]).round(4))

naive_effect = (
    df[df.prompt_variant == 1].task_completed.mean()
    - df[df.prompt_variant == 0].task_completed.mean()
)
print(f"nNaive difference: {naive_effect:+.4f}")

متوقع پیداوار:

Shape: (50000, 16)

Treatment arm sizes:
{0: 25000, 1: 25000}

Task completion by prompt variant:
              mean  count
prompt_variant
0             0.60  25000
1             0.63  25000

Naive difference: +0.0260

دونوں بازوؤں کے درمیان کام کی تکمیل کے فیصد میں سادہ فرق تقریباً +0.026 ہے۔ اگلا، ہم اپنے مشین لرننگ ماڈل کے لیے فیچر میٹرکس بناتے ہیں۔

X_cols = ["engagement_tier", "query_confidence"]
X = pd.get_dummies(df[X_cols], drop_first=True).astype(float)
X_arr = X.values

treatment = df["prompt_variant"].values
outcome = df["task_completed"].values

print("Feature matrix shape:", X_arr.shape)
print("Feature names:", list(X.columns))
print("Treatment balance:", treatment.mean().round(4))

متوقع پیداوار:

Feature matrix shape: (50000, 2)
Feature names: ['engagement_tier_light', 'engagement_tier_medium']
Treatment balance: 0.5000

کیا ہو رہا ہے: ایک گرم انکوڈنگ engagement_tier (حوالہ کے زمرے کو ہم آہنگی سے بچنے کے لیے گرا دیا گیا)، برقرار رکھا گیا۔ query_confidence مسلسل فلوٹنگ پوائنٹ، sklearn estimator کے لیے numpy array میں تبدیل کریں۔ یہ ڈیٹا سیٹ یقینی بناتا ہے کہ علاج متوازن ہیں (تقریباً 50/50)۔ مشاہدے کے ماحول میں عدم توازن اس بات کی پہلی علامت ہے کہ الجھن موجود ہو سکتی ہے۔

a3c3f8c7-df82-450e-928e-5bfc24c2541d

شکل 2: 50,000 صارف کے مصنوعی ڈیٹاسیٹ کے لیے شرکت کی سطح کے ذریعے ٹی لرنر CATE کی تقسیم۔ بھاری صارفین (سرخ، اوسط CATE ≒ +0.048) ہلکے صارفین (نیلے، اوسط CATE ≒ +0.053) یا درمیانے صارفین (ٹین، اوسط CATE ≒ +0.031) کے مقابلے پرامپٹ B سے زیادہ فائدہ اٹھاتے ہیں۔ نیچے والا پینل مجموعی اوسط (ڈاٹڈ لائن) کے نسبت اوسط CATE فی اسٹریٹم دکھاتا ہے۔ شکل 1 کے برعکس، یہ تخمینے اسکیمیٹکس کے بجائے حقیقی مصنوعی ڈیٹا پر ٹی لرنر چلانے سے آتے ہیں۔

مرحلہ 1: T-Learner for factual prediction

T-Learner (Künzel et al., 2019) سب سے آسان میٹا لرنر ہے۔ دو مکمل طور پر الگ الگ ماڈلز کو فٹ کریں۔ ایک پروسیس شدہ مشاہدات کے لیے موزوں ہے اور دوسرا کنٹرول کے لیے موزوں ہے۔ ہر صارف کے لیے، متضاد پیشین گوئی ایک ماڈل سے آتی ہے جسے علاج کے مخالف بازو پر تربیت دی جاتی ہے۔

from sklearn.linear_model import LogisticRegression

# Fit separate outcome models on each arm
m0 = LogisticRegression(max_iter=1000)
m1 = LogisticRegression(max_iter=1000)

m0.fit(X_arr[treatment == 0], outcome[treatment == 0])
m1.fit(X_arr[treatment == 1], outcome[treatment == 1])

# Predict potential outcomes for every user under both prompts
mu0 = m0.predict_proba(X_arr)[:, 1]   # predicted P(complete | Prompt A)
mu1 = m1.predict_proba(X_arr)[:, 1]   # predicted P(complete | Prompt B)

# CATE: the individual-level difference
cate_t = mu1 - mu0

print(f"T-learner mean CATE:  {cate_t.mean():+.4f}")
print(f"T-learner CATE std:   {cate_t.std():.4f}")
print(f"CATE range:           [{cate_t.min():.4f}, {cate_t.max():.4f}]")

print("nMean CATE by engagement tier:")
df["cate_t"] = cate_t
print(df.groupby("engagement_tier").cate_t.mean().round(4))

متوقع پیداوار:

T-learner mean CATE:  +0.0260
T-learner CATE std:   0.0100

Mean CATE by engagement tier:
engagement_tier
heavy    0.0400
light    0.0300
medium   0.0130
Name: cate_t, dtype: float64

موجودہ صورتحال کچھ یوں ہے: m0 ہم صارف کی خصوصیات اور کام کی تکمیل کے درمیان تعلق صرف ان صارفین کے لیے سیکھتے ہیں جنہوں نے پرامپٹ A دیکھا۔ m1 یہی تعلق صرف Prompt B صارفین کے لیے سیکھا جاتا ہے۔

یہ پوچھتا ہے کہ ہر ماڈل ڈیٹاسیٹ میں ہر صارف کے لیے کیا پیشین گوئی کرے گا، قطع نظر اس کے کہ انھوں نے اصل میں کون سا اشارہ دیکھا ہے۔ یہ ہیں پرامپٹ A سے نتائج اور پرامپٹ B سے نتائج۔ فرق mu1 - mu0 ٹی لرنر کا صارف کے انفرادی علاج کے اثر کا تخمینہ۔

اوسط CATE تقریباً 0.010 کے معیاری انحراف کے ساتھ تقریباً +0.026 ہے۔ اثر یکساں نہیں ہے۔ زیادہ مصروفیت رکھنے والے صارفین کی CATE +0.040 کے لگ بھگ ہوتی ہے، درمیانے درجے کے صارفین کی CATE +0.013 کے لگ بھگ ہوتی ہے، اور ہلکے صارفین کی CATE +0.030 کے قریب ہوتی ہے۔ یہ صارف کے لیے مخصوص تغیرات وہ ہیں جو حقائق کے برعکس تخمینہ لگاتے ہیں اور جو اس طریقہ کار کو ایک اوسط لفٹ گنتی سے زیادہ مفید بناتا ہے۔

ٹی لرنر کی اصل کمزوری اس وقت ظاہر ہوتی ہے جب اس کے بازو ایک طرف جھک جاتے ہیں۔ 25,000 مشاہدات فی بازو ٹھیک ہے۔ تاہم، 200 پروسیس شدہ صارفین اور 4,800 کنٹرولز کے ساتھ (ایک عام تناسب جب کسی خصوصیت کو چھوٹے گروپ کے لیے جاری کیا جاتا ہے) m1 ڈیٹا کی شدید کمی ہے اور جو کچھ سیکھا جاتا ہے اس پر بھروسہ نہیں کیا جا سکتا۔ ایکس لرنر کی اگلی سطح بالکل ان حالات کے لیے بنائی گئی ہے۔

مرحلہ 2: ہتھیاروں کے عدم توازن کے علاج کے لیے ایکس لرنر

Künzel et al کے ذریعہ متعارف کرایا گیا ایکس لرنر۔ (2019)، تین قدمی اپروچ کے ذریعے غیر متوازن ہتھیاروں کو سنبھالیں۔ مرحلہ 1 T-Learner کے اسی نتیجے میں آنے والے ماڈل میں فٹ بیٹھتا ہے۔ مرحلہ 2 میں، لگائے گئے انفرادی اثرات کا حساب لگایا جاتا ہے اور ایک مرحلہ 2 ٹاؤ ماڈل ان پر لگایا جاتا ہے۔ مرحلہ 3 وزن کے طور پر رجحان کے اسکور کا استعمال کرتے ہوئے ان تخمینوں کو یکجا کرتا ہے۔

مرحلہ 2a: مرتب کردہ اثرات

# Stage 2a: imputed effects
# For treated users: observed minus what the control model predicts
D1 = outcome[treatment == 1] - m0.predict_proba(X_arr[treatment == 1])[:, 1]

# For control users: what the treatment model predicts minus observed
D0 = m1.predict_proba(X_arr[treatment == 0])[:, 1] - outcome[treatment == 0]

print(f"Imputed effects D1 (treated): mean={D1.mean():.4f}, std={D1.std():.4f}")
print(f"Imputed effects D0 (control): mean={D0.mean():.4f}, std={D0.std():.4f}")

متوقع پیداوار:

Imputed effects D1 (treated): mean=0.0280, std=0.1520
Imputed effects D0 (control): mean=0.0240, std=0.1490

موجودہ صورتحال کچھ یوں ہے: D1 پروسیس شدہ ہر صارف کے لیے بقایا۔ کوویریٹ یہ ہے کہ صارف کے عمل کا موازنہ اس سے کیا گیا کہ پروفائل کا استعمال کرتے ہوئے اس نے فوری A پر کیا کیا۔

D0 کنٹرول صارف کے لیے منطق کو پلٹتا ہے۔ دوسرے لفظوں میں، آپ پرامپٹ B پر کتنا بہتر کرتے جو آپ نے اصل میں پرامپٹ A پر کیا تھا؟

دونوں نقائص کے اثرات پورے ڈیٹا سیٹ سے لیے گئے علاج کے اثر کے شور مچانے والے انفرادی تخمینے ہیں۔

مرحلہ 2b: تاؤ ماڈل

from sklearn.linear_model import Ridge

# Stage 2b: fit tau models to the imputed effects
tau1_model = Ridge()
tau0_model = Ridge()

tau1_model.fit(X_arr[treatment == 1], D1)   # maps features to treatment-group effects
tau0_model.fit(X_arr[treatment == 0], D0)   # maps features to control-group effects

tau1 = tau1_model.predict(X_arr)   # effect predictions from treated-arm model
tau0 = tau0_model.predict(X_arr)   # effect predictions from control-arm model

موجودہ صورتحال کچھ یوں ہے: tau1_model رج ریگریشن جو ان صارفین سے سیکھتا ہے جنہوں نے علاج حاصل کیا تھا کہ انفرادی علاج کا اثر کوویریٹس کے ساتھ کس طرح مختلف ہوتا ہے۔ tau0_model ہم کنٹرول صارفین سے بھی یہی سیکھتے ہیں۔ ہر ایک ڈیٹاسیٹ کے تمام صارفین کے لیے پیشین گوئیاں تیار کرتا ہے، جس سے حتمی مرحلے میں دو الگ الگ CATE تخمینے ملتے ہیں۔

مرحلہ 3: پروپینسٹی ویٹڈ امتزاج

# Stage 3: combine with propensity score
ps_model = LogisticRegression(max_iter=1000)
ps_model.fit(X_arr, treatment)
e_x = ps_model.predict_proba(X_arr)[:, 1]   # P(T=1 | X)

# Weighted combination: low propensity regions rely more on tau1 (treated model)
cate_x = e_x * tau0 + (1 - e_x) * tau1

print(f"nX-learner mean CATE:  {cate_x.mean():+.4f}")
print(f"X-learner CATE std:   {cate_x.std():.4f}")
print(f"Propensity range:     [{e_x.min():.4f}, {e_x.max():.4f}]")

متوقع پیداوار:

X-learner mean CATE:  +0.0260
X-learner CATE std:   0.0100
Propensity range:     [0.4820, 0.5170]

منسوب اثر اس بات کا اندازہ لگاتا ہے کہ ہر صارف کی کارکردگی کا موازنہ اس سے کیا جاتا ہے کہ ایک عام صارف اپنا پروفائل استعمال کرنے والے متبادل پرامپٹ پر کیا حاصل کرے گا۔ رج ریگریشن سیکھتا ہے کہ انفرادی اثرات کوویریٹس کے ساتھ کیسے مختلف ہوتے ہیں۔

رجحان کے اسکور وزن کو سنبھالتے ہیں۔ اگر رجحان زیادہ ہے (بہت سے ملتے جلتے صارفین پر کارروائی کی جاتی ہے)، تو ایکس لرنر اس پر بھروسہ کرے گا۔ tau0 علاج شدہ مشاہدات کی دولت کی وجہ سے یہ خاص طور پر سچ ہے۔ جہاں رجحان کم ہے، ہم ڈیٹا ڈینس کنٹرول آرم ماڈلز پر انحصار کرتے ہیں۔

اس متوازن ڈیٹاسیٹ میں، ایکس لرنر کی اوسط CATE تقریباً +0.026 ہے، جو تقریباً T-لارنر سے ملتی جلتی ہے۔ یہ متوقع ہے۔ دونوں تخمینوں کو متوازن بے ترتیب ڈیٹا پر اکٹھا ہونا چاہیے۔ یہ اندرونی مستقل مزاجی اس بات کو یقینی بناتی ہے کہ کوئی عددی غلطیاں نہیں ہیں، لیکن درست جواب کی بازیافت کی تصدیق نہیں کرتی ہے۔

جہاں ایکس لرنر کو عدم توازن ڈیٹا کے ساتھ پیچیدگی حاصل ہوتی ہے۔ جب رجحان 0.10 کی طرف جھک جاتا ہے، تو وزن کا مجموعہ T-Learner کو نمایاں طور پر پیچھے چھوڑ دیتا ہے۔ متوازن ڈیٹا سیٹ میں، آپ کو کوئی فرق نظر نہیں آئے گا۔ لیکن عادت بنانے کے لیے بہرحال ایسا کریں۔ کیونکہ اگلا ڈیٹا سیٹ جسے آپ چھوتے ہیں شاید اتنا صاف نہیں ہوگا۔

مرحلہ 3: بوٹسٹریپ اعتماد کا وقفہ

غیر یقینی کی حدود کے بغیر پوائنٹ تخمینہ عملی فیصلوں کے لیے کافی نہیں ہیں۔ بوٹسٹریپ اعتماد کے وقفے متبادل کے ساتھ ڈیٹا کو دوبارہ نمونہ بناتے ہیں اور ہر ایک دوبارہ نمونے کے لیے پوری تخمینہ پائپ لائن کو درست کرتے ہیں۔

500 دوبارہ نمونے بہت زیادہ لگ سکتے ہیں، لیکن یہ ضرورت سے زیادہ نہیں ہے۔ CI کی چوڑائی واقعی چھوٹی تعداد میں مستحکم نہیں ہوتی ہے اور آپ حد سے زیادہ شور پڑھ سکتے ہیں۔ اگر پبلیکیشن لیول CI کو ٹارگٹ کر رہے ہیں، تو 1,000 ریسیمپلز پر دھکیلیں۔

np.random.seed(7)
n = len(df)
n_boot = 500
boot_means_t = []
boot_means_x = []

for i in range(n_boot):
    idx = np.random.choice(n, n, replace=True)
    Xb = X_arr[idx]
    tb = treatment[idx]
    yb = outcome[idx]

    # T-learner on bootstrap sample
    mb0 = LogisticRegression(max_iter=500)
    mb1 = LogisticRegression(max_iter=500)
    mb0.fit(Xb[tb == 0], yb[tb == 0])
    mb1.fit(Xb[tb == 1], yb[tb == 1])

    mu0b = mb0.predict_proba(Xb)[:, 1]
    mu1b = mb1.predict_proba(Xb)[:, 1]
    boot_means_t.append((mu1b - mu0b).mean())

    # X-learner on bootstrap sample
    D1b = yb[tb == 1] - mb0.predict_proba(Xb[tb == 1])[:, 1]
    D0b = mb1.predict_proba(Xb[tb == 0])[:, 1] - yb[tb == 0]

    t1b = Ridge(); t1b.fit(Xb[tb == 1], D1b)
    t0b = Ridge(); t0b.fit(Xb[tb == 0], D0b)

    tau1b = t1b.predict(Xb)
    tau0b = t0b.predict(Xb)

    psb = LogisticRegression(max_iter=500)
    psb.fit(Xb, tb)
    eb = psb.predict_proba(Xb)[:, 1]

    cate_xb = eb * tau0b + (1 - eb) * tau1b
    boot_means_x.append(cate_xb.mean())

boot_means_t = np.array(boot_means_t)
boot_means_x = np.array(boot_means_x)

ci_t = (np.percentile(boot_means_t, 2.5), np.percentile(boot_means_t, 97.5))
ci_x = (np.percentile(boot_means_x, 2.5), np.percentile(boot_means_x, 97.5))

print(f"T-learner mean CATE: {boot_means_t.mean():+.4f}")
print(f"T-learner 95% CI:    [{ci_t[0]:+.4f}, {ci_t[1]:+.4f}]")
print()
print(f"X-learner mean CATE: {boot_means_x.mean():+.4f}")
print(f"X-learner 95% CI:    [{ci_x[0]:+.4f}, {ci_x[1]:+.4f}]")

متوقع پیداوار:

T-learner mean CATE: +0.0260
T-learner 95% CI:    [+0.0120, +0.0400]

X-learner mean CATE: +0.0260
X-learner 95% CI:    [+0.0120, +0.0400]

یہاں کیا ہو رہا ہے: ہر 500 تکرار پر، ہم اصل کے سائز کے بوٹسٹریپ نمونے کو تبدیل کرتے ہیں، تمام ماڈلز کو شروع سے ریفٹ کرتے ہیں (نتیجہ کا ماڈل، اثر انداز، رجحان ماڈل)، ان دوبارہ نمونوں کے لیے اوسط CATE کا حساب لگاتے ہیں، اور نتائج کو محفوظ کرتے ہیں۔

ہر تکرار کے بعد، ہم ذخیرہ شدہ قدروں کے 2.5ویں اور 97.5ویں پرسنٹائلز کو 95% اعتماد کے وقفے کے نچلے اور اوپری حدود کے طور پر استعمال کرتے ہیں۔ دونوں سیکھنے والوں پر بوٹسٹریپ چلانا یقینی بناتا ہے کہ غیر یقینی صورتحال کے تخمینے متفق ہیں، جو ایک اضافی مستقل مزاجی کی جانچ ہے۔

اگر دونوں CI حدود صفر سے اوپر ہیں (جیسا کہ وہ یہاں کرتے ہیں)، آپ کے پاس اعداد و شمار کے لحاظ سے اہم ثبوت ہیں کہ پرامپٹ B پرامپٹ A کو پیچھے چھوڑ دیتا ہے۔ A CI 0 سے اوپر کا مطلب ہے کہ صرف نمونے لینے کی تبدیلی ہی مشاہدہ شدہ فرق کی وضاحت کر سکتی ہے۔ مزید قطعی شواہد کے لیے یا تو ممکنہ تجربات یا ایک واضح عزم کی ضرورت ہوگی کہ غلط کالوں کے اخراجات خطرے کی ضمانت دینے کے لیے کافی کم ہیں۔ جیسا کہ یہاں دیکھا جا سکتا ہے، ایک مکمل طور پر مثبت وقفہ بے ضابطگیوں کی نگرانی کے دوران منتخب رول آؤٹ کے ساتھ آگے بڑھنے کا جواز پیش کرتا ہے۔

نقطہ تخمینوں کے مقابلے میں CIs کافی وسیع ہیں۔ یہ 2.6 فیصد پوائنٹس کے مرکزی تخمینہ کے دونوں طرف تقریباً 3.8 فیصد پوائنٹس ہیں۔ وسعت حقیقی غیر یقینی کی عکاسی کرتی ہے اور ایماندار ہے۔ 500 سے زیادہ بوٹسٹریپ تکرار کو چلانے سے باؤنڈری پر مونٹی کارلو کی خرابی کم ہو جاتی ہے، لیکن بنیادی غیر یقینی صورتحال کی اصل چوڑائی میں کوئی تبدیلی نہیں آتی۔

مرحلہ 4: CATE کو پالیسی ویلیو میں تبدیل کریں۔

اوسط CATE آپ کو پرامپٹ B کے لیے اوسط متوقع لفٹ بتاتا ہے۔ پروڈکٹ کے فیصلوں کے لیے آپ کو درکار پالیسی کی قدریں ہیں۔ اگر آپ ہر صارف کو اس پرامپٹ پر روٹ کرتے ہیں جو آپ کے خیال میں سب سے زیادہ مددگار ثابت ہوگا، تو کچھ بھی نہیں بھیجنے کی بنیادی لائن کے مقابلے متوقع کل لفٹ کتنی ہے؟

پالیسی کے اصول سادہ ہیں۔ ان تمام صارفین کو فوری B بھیجیں جن کے متوقع منافع منتخب کردہ حد سے زیادہ ہیں، اور تمام دیگر صارفین کے لیے فوری A رکھیں۔ پھر ہم اس اثر کا حساب لگاتے ہیں جو پالیسی کچھ نہ کرنے کے مقابلے میں فراہم کرتی ہے۔

# Use the T-learner CATE from Step 1
threshold = 0.020   # ship Prompt B to users where estimated benefit exceeds 2pp

policy_mask = cate_t > threshold
n_policy = policy_mask.sum()
mean_cate_policy = cate_t[policy_mask].mean()
total_lift = cate_t[policy_mask].sum()

print(f"Policy threshold:           CATE > {threshold:.3f}")
print(f"Users who receive Prompt B: {n_policy} / {n} ({n_policy/n*100:.1f}%)")
print(f"Mean CATE in policy group:  {mean_cate_policy:+.4f}")
print(f"Estimated total lift:       {total_lift:.0f} additional completions")

# Compare shipping to everyone vs. selective routing
print(f"nShip to everyone:           {cate_t.mean():+.4f} mean CATE")
print(f"Selective routing (>{threshold}): {mean_cate_policy:+.4f} mean CATE per routed user")
print(f"Share of users routed:      {n_policy/n*100:.1f}%")

# Baseline: ship Prompt A to everyone = 0 lift
# Policy value = E[CATE | CATE > threshold] * fraction_routed
policy_value = mean_cate_policy * (n_policy / n)
print(f"nPolicy value (lift per user in full population): {policy_value:+.4f}")

متوقع پیداوار:

Policy threshold:           CATE > 0.020
Users who receive Prompt B: 35000 / 50000 (70.0%)
Mean CATE in policy group:  +0.0320
Estimated total lift:       1120 additional completions

Ship to everyone:           +0.0260 mean CATE
Selective routing (>0.020): +0.0320 mean CATE per routed user
Share of users routed:      70.0%

Policy value (lift per user in full population): +0.0224

آفاقی طور پر ترسیل کے بجائے CATE تخمینوں کی بنیاد پر روٹنگ کا نتیجہ فی صارف زیادہ اوسط اثر ہوتا ہے کیونکہ ہم جان بوجھ کر ایسے صارفین کو منتخب کرتے ہیں جن سے Prompt B کو کم کارکردگی کا مظاہرہ کرنے یا صرف ایک نہ ہونے کے برابر فائدہ فراہم کرنے کی توقع کی جاتی ہے۔

0.020 کی حد کے ساتھ اس ڈیٹاسیٹ میں، تقریباً 35,000 صارفین (70%) فوری B وصول کرتے ہیں، اور جامع رول آؤٹ کے لیے +0.026 کے مقابلے اس گروپ کے اندر اوسط CATE تقریباً +0.032 ہے۔

حد منتخب کرنے کے لیے یہاں ایک ایماندارانہ تجارت ہے: 0.020 جادو نہیں ہے۔ اونچی حدیں کم صارفین کو روٹ کرتی ہیں اور فی روٹ شدہ صارف کو زیادہ سخت اور زیادہ مضبوط اوسط CATE فراہم کرتی ہیں، لیکن ہر ایک کے لیے ایک ہی لفٹ برقرار رکھتی ہے۔ ایک نچلی حد زیادہ لفٹ حاصل کرتی ہے لیکن کم ثبوت والے صارفین کو اپنی طرف متوجہ کرتی ہے۔

حقیقی تعیناتی کے لیے، ہم مرحلہ 3 کے لیے 95% CI کے ساتھ پالیسی کی اقدار پیش کرنا چاہیں گے۔ CI تقریباً اس کے برابر ہے: [+0.009, +0.047] یہاں، معقول حد کے نچلے سرے پر، اس کا مطلب ہے کہ اگر حد بہت کم ہے، منتخب روٹنگ عالمگیر رول آؤٹ کارکردگی کو کم کر سکتی ہے۔ چوڑائی کے ساتھ ساتھ نقطہ کے تخمینے کو بھی ذہن میں رکھتے ہوئے اپنی حد مقرر کریں۔

جب متضاد تخمینہ ناکام ہوجاتا ہے۔

میٹا سیکھنے والے مفروضوں کے ذریعے نتائج حاصل کرتے ہیں۔ ان مفروضوں میں ناکامی کے الگ الگ طریقے ہیں جن کی شناخت لانچ کے فیصلے کرنے کے لیے متضاد تخمینے استعمال کرنے سے پہلے کی جانی چاہیے۔

ماڈل کی غلط تفصیلات

T-learner اور X-learner دونوں بنیادی زیر نگرانی ماڈل میں موجود تمام تعصبات کے وارث ہیں۔ اگر صارف کی صلاحیتوں اور کام کی تکمیل کے درمیان حقیقی تعلق انتہائی نان لائنر ہے، اور آپ اس ٹیوٹوریل کی طرح لاجسٹک ریگریشن استعمال کرتے ہیں، تو نتیجہ آنے والا ماڈل ناکافی ہوگا اور آپ کے CATE کے تخمینے غلط ہوں گے۔

درحقیقت، آپ اس بات کو محسوس کریں گے جب بیس لرنر کو تبدیل کرنے سے اوسط CATE میں نمایاں تبدیلی آتی ہے۔ لاجسٹک ریگریشن سے گراڈینٹ بوسٹنگ کی طرف بڑھتے ہوئے، تخمینہ +0.026 سے +0.012 تک گرتا ہے، جو ہمیں بتاتا ہے کہ عدم استحکام فنکشنل مفروضوں کے لیے حساس ہے جو تخمینہ کو برقرار نہیں رکھ سکتے۔

ایک حل یہ ہے کہ ایک زیادہ لچکدار بیس لرنر کا استعمال کیا جائے (مثال کے طور پر گریڈینٹ بوسٹنگ یا رینڈم فارسٹ) اور چیک کریں کہ آیا بیس لرنر کی پسند کا CATE تخمینہ پر کوئی معنی خیز اثر پڑتا ہے۔ ماڈلز کے خاندان میں استحکام وہ بہترین اشارہ ہے جو آپ حاصل کر سکتے ہیں کہ اندازے قابل اعتماد ہیں۔

نرم خلاف ورزی

ایک متضاد تخمینہ کا تقاضا ہے کہ آبادی میں سے ہر صارف کو ممکنہ طور پر دو میں سے ایک علاج مل سکتا ہے۔ اگر انتہائی مصروف صارفین کو منظم طریقے سے 95% وقت B پرامپٹ پر روٹ کیا گیا تھا، اور کم مصروف صارفین کو 5% وقت کے لیے روٹ کیا گیا تھا، تو پروپینسیٹی ماڈل ان انتہائی اسکورز کو صحیح طریقے سے سیکھے گا، اور ان صارفین کے لیے بے بنیاد جوابی حقائق کے پاس ان کی مدد کے لیے بہت کم حقیقی ڈیٹا ہوگا۔

میں وزن کا مجموعہ مارجن پر صارفین کے لیے انفرادی سطح کی CATE کی تشریح کرنے سے پہلے ہمیشہ رجحان سکور کی تقسیم کو چیک کریں۔

بے حساب کنفاؤنڈرز

اس کا دفاع کرنا سب سے مشکل ہے کیونکہ یہ ڈیٹا سے پوشیدہ ہے۔ اگر فیچر میٹرکس میں کوئی ایسی چیز غائب ہے جو صارف کو اشارہ کرتی ہے اور کام کی تکمیل کو متاثر کرتی ہے، تو اس ٹیوٹوریل میں CATE کے تمام تخمینے گمشدہ سگنل کو اس طرح جذب کریں گے جیسے یہ پرامپٹ کا اثر ہو۔

میں نے ایسا ہوتا دیکھا ہے جب فوری روٹنگ جزوی طور پر ورک اسپیس کے سائز سے متاثر ہوتی ہے۔ کام کی جگہ جتنی بڑی ہوگی، سوالات اتنے ہی پیچیدہ ہوں گے اور کام کرنے کے لیے انفراسٹرکچر اتنا ہی بہتر ہوگا۔ اگر آپ ورک اسپیس کا سائز شامل نہیں کرتے ہیں۔ X_colsآپ کا تخمینہ اشارہ کے اثر کے ساتھ ورک اسپیس سائز کے اثر کو شامل کرتا ہے۔

مضبوط فیچر انجینئرنگ اور ڈومین کا گہرا علم یہاں آپ کا واحد دفاع ہے۔ کوئی شماریاتی ٹیسٹ نہیں ہے جو اس چیز کو پکڑتا ہے جس کی آپ پیمائش نہیں کرتے ہیں۔

نان اوور لیپنگ کوویریٹس کے لیے سپورٹ

اگر علاج اور کنٹرول گروپس کوویریٹ اسپیس کے مکمل طور پر مختلف علاقوں میں رہتے ہیں (ایک جیسے پروفائلز کے ساتھ کوئی مشترکہ صارف نہیں)، میٹا لرنر صرف ایک گروپ سے دوسرے گروپ کا اندازہ لگا سکتا ہے۔ ایکسٹراپولیشن کا طریقہ مکمل طور پر فرض شدہ فنکشنل فارم کی پیروی کرتا ہے (رجج ریگریشن مثال میں لکیریٹی)، جس میں ڈیٹا میں کوئی اوورلیپنگ ریجنز نہیں ہوتے ہیں۔

عملی طور پر، آپ اسے اس وقت دیکھ سکتے ہیں جب بڑے ذیلی گروپوں کے لیے پرپینسٹی سکور کلسٹرز 0 یا 1 کے قریب ہوتا ہے۔ Covariate عدم توازن کے ساتھ ڈیٹاسیٹس کے لیے CATE کے تخمینے پر بھروسہ کرنے سے پہلے، پروپینسٹی اوورلیپ پلاٹوں کو چلائیں، covariates کے ذریعے تقسیم کا موازنہ کریں، اور تمام شعبوں میں معیاری اوسط فرق۔

SUTVA کی خلاف ورزی

متضاد تخمینے فرض کرتے ہیں کہ ہر صارف کا نتیجہ صرف اس صارف کے علاج کی تفویض پر منحصر ہوتا ہے۔ اشتراکی AI پروڈکٹس (مشترکہ ورک اسپیسز، ٹیم کے خلاصے، کوڈ ریویو اسسٹنٹس) ایک صارف کے پرامپٹ کے آؤٹ پٹ کو ساتھی کی سیاق و سباق کی ونڈو میں ظاہر ہونے دیتے ہیں۔ ایک صارف کا سلوک ان کی ٹیم کے ارکان کے نتائج کو براہ راست متاثر کر سکتا ہے۔

جب SUTVA بند کر دیا جاتا ہے، انفرادی سطح کے CATE تخمینے صارفین کے نیٹ ورکس میں اسپل اوور اثرات کے ساتھ براہ راست علاج کے اثرات کو یکجا کرتے ہیں۔ اگر آپ کے پروڈکٹ میں ٹیم کی سطح کے تعاملات ہیں، تو آپ اسے اس وقت دیکھ سکتے ہیں جب انفرادی سطح کے تخمینے مشتبہ طور پر زیادہ ہوں اور لانچ کے بعد روکے نہ ہوں۔ اس کے بجائے، کلسٹر سطح کے تخمینے کے طریقے لاگو کریں۔ انفرادی میٹا لرنرز صحیح ٹول نہیں ہیں۔

اسٹریٹجک نفاذ

مذکورہ بالا عمل کو جان بوجھ کر کم سے کم رکھا گیا ہے تاکہ مکینیکل اقدامات کو بے نقاب کیا جا سکے۔ پیداواری ماحول کے لیے امیر بیس سیکھنے والوں کی ضرورت ہوتی ہے۔ لاجسٹک ریگریشن کو گریڈینٹ بوسٹڈ کلاسیفائر کے ساتھ تبدیل کرنا (سکیٹ لرن سے) GradientBoostingClassifier) غیر لکیری کوواریٹ تعاملات کیپچر کرتا ہے جو لکیری ماڈلز سے محروم ہیں۔ اوپر دیا گیا T-learner اور X-learner کوڈ کسی بھی sklearn مطابقت پذیر تخمینہ لگانے والے کے ساتھ کام کرتا ہے۔ صرف تبدیلی وہ ماڈل کلاس ہے جسے آپ انسٹیٹیوٹ کرتے ہیں۔

خودکار ماڈل کے انتخاب کے ساتھ پروڈکشن گریڈ CATE تخمینہ کے لیے، ایک دوگنا مضبوط تخمینہ لگانے والا (DR لرنر)، اور بلٹ ان نیسٹڈ تشخیص، استعمال کریں: econml یا causalml پیکج دونوں X-learner، T-learner، DR-learner، اور causal Forest کو ایک متحد API میں مناسب اعتماد کے وقفوں کے ساتھ نافذ کرتے ہیں۔

اس ٹیوٹوریل کے شروع سے شروع ہونے والا ورژن بنانے میں سست اور پڑھنے کے لیے وربوز ہے۔ یہی بات ہے۔ اس سے پہلے کہ آپ جان سکیں کہ پیکیج کہاں غلط ہو سکتا ہے، آپ کو یہ جاننا ہوگا کہ یہ کیا کرتا ہے۔

شیڈو ٹریفک کے ذریعہ پیمانے پر فوری تشخیص کو بہت بہتر بنایا گیا ہے۔ صارف کے ارتکاب سے پہلے B پرامپٹ کرنے کے لیے اپنی پیداواری استفسار کے کچھ حصے کو روٹ کرکے، آپ پہلے سے طے شدہ نتائج کو محفوظ طریقے سے لاگ کر سکتے ہیں۔ اس شیڈو ڈیٹا پر متضاد تجزیہ چلا کر، ہم ریلیز کے خطرے کے بغیر اصل پیداوار کی تقسیم کا مشاہداتی تخمینہ حاصل کر سکتے ہیں۔

اس ٹیوٹوریل کے لیے ساتھی نوٹ بک github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm/tree/main/10_counterfactual_prompts پر ہے۔ ریپوزٹری کو کلون کریں، ایک مصنوعی ڈیٹاسیٹ بنائیں، اور اسے چلائیں۔ counterfactual_demo.ipynb شروع سے ختم تک ہر کوڈ بلاک کو دوبارہ پیش کریں۔

آپ کی ٹیم نے جو لاگز جمع کیے جس ہفتے پرامپٹ A بھیجا گیا تھا ان میں بالکل وہی سگنلز ہوتے ہیں جن کی آپ کو رات گئے حکمت عملی کے سوالات کے جوابات دینے کی ضرورت ہوتی ہے۔ آپ کو ہولڈ آؤٹ گروپ کی ضرورت نہیں ہے جسے آپ بنانا بھول گئے ہیں۔ آپ کو اس بات کا ایک مضبوط ماڈل درکار ہے کہ ہر صارف نے متبادلات کے حوالے سے کیا کیا، اس تخمینے پر سخت اعتماد کی حدوں کے ساتھ، اور ایک حد کا قاعدہ جو صارفین کو صرف اس صورت میں روٹ کرتا ہے جب ثبوت کافی حد تک واضح ہو کارروائی کرنے کے لیے۔

اس ماڈل کو بنائیں، ناکامی کے طریقوں کی شناخت کریں، جان بوجھ کر حد مقرر کریں، اور اپنی گٹ انسٹینٹ کالز سے بہتر کچھ فراہم کریں۔

اوپر تک سکرول کریں۔