رجعت کے وقفے کے ساتھ پروڈکٹ کا تجربہ: LLM اعتماد کی حدیں Python میں قدرتی تجربات کیسے تخلیق کرتی ہیں

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

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

آپ کا باس ایسا جواب چاہتا ہے جو دلیل کو ختم کرے۔ کیا پریمیم ماڈل تلاش کے استفسار کے قابل ہے؟

چونکہ روٹنگ تعییناتی ہے، آپ کلین A/B ٹیسٹ نہیں چلا سکتے۔ 0.84 کے اعتماد کے ساتھ ایک سوال ہمیشہ پریمیم حاصل کرے گا، 0.86 کے اعتماد کے ساتھ ایک سوال ہمیشہ سستا ہوگا، اور مختص کو بے ترتیب نہیں کیا جا سکتا۔

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

حد بذات خود ایک مفت تجربہ ہے۔ 0.85 پر اسائنمنٹس بدل جاتے ہیں، لیکن اس باؤنڈری کے دونوں طرف کے سوالات بنیادی طور پر ایک جیسے ہوتے ہیں۔ 0.849 کی اعتماد کی سطح کے ساتھ ایک سوال 0.851 کے اعتماد کی سطح کے ساتھ ایک سوال سے نمایاں طور پر مختلف نہیں ہے۔ دونوں گروہوں کے درمیان نتائج میں تنگ فرق روٹنگ کے فیصلوں سے خالصتاً آتا ہے۔ یہ وہی ہے جو ریگریشن ڈسکوٹینیوٹی ڈیزائن (RDD) پڑھتا ہے۔

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

LLM ٹیلی میٹری ایک 50,000 صارف کا مصنوعی ڈیٹاسیٹ ہے جس میں حقیقی پریمیم روٹنگ اثرات +6 فیصد پوائنٹس میں بیک کیے گئے ہیں، لہذا ہم دیکھ سکتے ہیں کہ آیا RDD اسے بحال کرتا ہے۔

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

انڈیکس

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

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

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

طریقہ کار تمام صورتوں میں یکساں ہے: مسلسل اسکور، حد، اور مقررہ روٹنگ کے اصول۔

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

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

وہ مقامی بے ترتیبی وہ تجربہ ہے جسے RDD پڑھتا ہے۔ کسی بے ترتیب کنٹرول گروپ کی ضرورت نہیں ہے، اور نہ ہی رجحان کے اسکور کی ضرورت ہے۔ اور آپ کو صرف ایک آلے کی ضرورت نہیں ہے، آپ کو ایک تیز دہلیز کی ضرورت ہے جسے کوئی بھی کھیل نہیں سکتا۔

رجعت کے وقفے دراصل کیا کرتے ہیں۔

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

گرافک طور پر، y-axis کام کی تکمیل کی نمائندگی کرتا ہے اور x-axis استفسار کے اعتماد کی نمائندگی کرتا ہے۔ تکمیل عام طور پر ایک پراعتماد رجحان ہے (آسان سوالات زیادہ کثرت سے مکمل کیے جاتے ہیں)۔ تاہم، بالکل 0.85 پر، کٹ آف سے نیچے کے صارفین کو پریمیم روٹنگ ملے گی اور اس سے اوپر کے صارفین کو سستے طریقے سے روٹ کیا جائے گا۔

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

شکل 1. تصوراتی اسکیمیٹک۔ پریمیم روٹنگ سوالات (0.85 سے کم اعتماد) اور سستے روٹنگ سوالات (0.85 سے زیادہ اعتماد) کے نتیجے میں آنے والے دو راستے دہلیز کو پورا کرتے ہیں لیکن آپس میں نہیں ملتے ہیں۔ 0.85 کے اختتامی پوائنٹس کے درمیان عمودی فرق پریمیم روٹنگ کا مقامی وجہ اثر ہے۔

ان فرقوں کی شناخت دو نامی مفروضوں کی بنیاد پر کی گئی ہے۔

  1. پھانسی کے متغیرات میں کوئی ہیرا پھیری نہیں ہے۔ صارف (یا سسٹم) کٹ آف میں کسی استفسار کے اعتماد کے اسکور کو قطعی طور پر ایڈجسٹ نہیں کر سکتا۔ اگر کوئی اپنا سکور 0.85 سے بالکل نیچے حاصل کر سکتا ہے اور پریمیم روٹنگ حاصل کر سکتا ہے، تو کٹ آف اب تصادفی طور پر نہیں بنتا اور RDD ٹوٹ جاتا ہے۔

  2. کٹ آف پر ممکنہ نتائج کا تسلسل: دیگر تمام عوامل جو کام کی تکمیل کو متاثر کرتے ہیں (استفسار کی قسم، صارف کی مہارت، کام کی جگہ، وقت) 0.85 پر آسانی سے مختلف ہوتے ہیں۔ صرف روٹنگ اسائنمنٹ بالکل دہلیز پر متواتر تبدیل ہوتی ہے۔ اگر پروڈکٹ کا دوسرا اصول 0.85 پر چلتا ہے (مختلف لاگنگ لیول، علیحدہ UI پروسیسنگ، دوبارہ کوشش کرنے کی پالیسی)، RDD اس اصول کے اثر کو روٹنگ کے فیصلے سے منسوب کرے گا۔

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

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

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

یہ دیکھنے کے لیے کہ آیا آپ کا جواب درست ہے، کئی بینڈوتھس پر لکیری اور چوکور تصریحات کو آزمائیں۔

ہم پورے مضمون میں تیز RDDs استعمال کرتے ہیں کیونکہ مختص اعتماد کا ایک فیصلہ کن فعل ہے (0.85 سے نیچے ہمیشہ پریمیم ہوتا ہے، اور 0.85 سے اوپر ہمیشہ سستا ہوتا ہے)۔ جب حدیں اسٹاکسٹک ہوتی ہیں اور تعمیل جزوی ہوتی ہے، تو ڈیزائن ایک مبہم RDD ہے اور اس کے لیے ایک انسٹرومینٹل متغیر فریم ورک کی ضرورت ہوتی ہے جسے اس کا استعمال کرتے ہوئے لاگو کیا جا سکتا ہے۔ rdrobust ازگر پیکج۔

شرطیں

آپ کو Python 3.11 یا اس سے زیادہ، پانڈوں اور شماریاتی ماڈلز کے ساتھ سکون، اور لکیری رجعت اور تعامل کی شرائط کے بارے میں قطعی علم کی ضرورت ہوگی۔

اس ٹیوٹوریل میں استعمال ہونے والے پیکجز کو انسٹال کریں۔

pip install numpy pandas statsmodels matplotlib scipy

موجودہ صورتحال کچھ یوں ہے: تشخیصی تصور کے لیے چار معیاری سائنسی Python لائبریریاں اور matplotlib۔ اس کے بارے میں غیر ملکی کوئی چیز نہیں ہے۔

ساتھی ریپوزٹری کو کلون کریں اور ایک مصنوعی ڈیٹاسیٹ بنائیں۔

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

موجودہ صورتحال کچھ یوں ہے: ڈیٹا جنریٹر ہے۔ query_confidence بیٹا (5,2) کی تقسیم کا سکور روٹنگ کا اصول ہے (routed_to_premium = query_confidence < 0.85)، +6% پوائنٹ پریمیم روٹنگ اثر task_completed. ہر بار ایک ہی بیج، ایک ہی ڈیٹا سیٹ۔

ورکنگ مثال سیٹ اپ

ڈیٹا سیٹ ایک SaaS پروڈکٹ کی نقل کرتا ہے جو اعتماد کے اسکور کی بنیاد پر پریمیم ماڈل اور ایک سستے ماڈل کے درمیان سوالات کو روٹ کرتا ہے۔ حد 0.85 ہے اور پریمیم روٹنگ کا اصل کارآمد اثر کام کی تکمیل پر +6 فیصد پوائنٹس ہے۔ اب جب کہ آپ کو حقیقت معلوم ہو گئی ہے، آپ اس بات کو یقینی بنا سکتے ہیں کہ آپ کا RDD اسے بحال کر لے۔

اپنا ڈیٹا لوڈ کریں اور روٹنگ کے تجزیات کو دریافت کریں۔

import numpy as np
import pandas as pd
import statsmodels.formula.api as smf

df = pd.read_csv("data/synthetic_llm_logs.csv")
print(f"Loaded {len(df):,} rows, {df.shape[1]} columns")

print("nRouting breakdown:")
counts = df.routed_to_premium.value_counts().to_dict()
print(f"  Premium-routed (confidence < 0.85):  {counts.get(1, 0):,}")
print(f"  Cheap-routed   (confidence >= 0.85): {counts.get(0, 0):,}")

print("nQuery confidence distribution:")
print(df.query_confidence.describe().round(3))

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

Loaded 50,000 rows, 16 columns

Routing breakdown:
  Premium-routed (confidence < 0.85):  38,874
  Cheap-routed   (confidence >= 0.85): 11,126

Query confidence distribution:
count    50000.000
mean         0.715
std          0.159
min          0.078
25%          0.611
50%          0.736
75%          0.838
max          0.998

موجودہ صورتحال کچھ یوں ہے: تقریباً 78% سوالات 0.85 کٹ آف سے نیچے آتے ہیں اور پریمیم روٹنگ حاصل کرتے ہیں۔ بیٹا (5,2) کی تقسیم 0.736 کے میڈین کے ساتھ اوپری سرے کی طرف متوجہ ہے، زیادہ تر ماسز اب بھی 0.85 سے نیچے ہیں۔ باقی 22% سوالات ہیں جن کے بارے میں ماڈل پہلے ہی پراعتماد ہے اور سستے ماڈل پر جاتے ہیں۔

رجعت کا تجزیہ کرنے سے پہلے، یہاں ان سادہ موازنوں پر ایک نظر ہے جو ہر پروڈکٹ ٹیم چلانا چاہے گی:

naive = (
    df[df.routed_to_premium == 1].task_completed.mean()
    - df[df.routed_to_premium == 0].task_completed.mean()
)
print(f"Naive premium-vs-cheap effect: {naive:+.4f}  (ground truth = +0.06)")

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

Naive premium-vs-cheap effect: +0.0632  (ground truth = +0.06)

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

پیداوار میں، آپ کو شاذ و نادر ہی اس قسم کی قسمت ملتی ہے۔ صارف کی مہارت، تیز رفتار اظہار، وقت، اور 12 غیر مشاہدہ شدہ سوال کی خصوصیات سب کا تعلق اعتماد اور تکمیل سے ہے۔

حقیقی نظاموں کے سادہ موازنہ دونوں سمتوں میں 50% سے زیادہ مختلف ہو سکتے ہیں۔ RDD شناخت فراہم کرتا ہے جو مخفی الجھنے والے عوامل کی عدم موجودگی پر منحصر نہیں ہے۔

مرحلہ 1: مقامی لکیری رجعت کا استعمال کرتے ہوئے تیز آر ڈی ڈی

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

کٹ آف = 0.85 bw = 0.10 قربت = df[(df.query_confidence > cutoff - bw)
          & (df.query_confidence < cutoff + bw)].copy() کے قریب["below_cutoff"] = قریب (near.query_confidence < cutoff).astype(int)["rc"] = Near.query_confidence - cutoff rdd_model = smf.ols( "task_completed ~ below_cutoff + rc + below_cutoff:rc", data=near, .fit(cov_type="HC3") اثر = rdd_model.params["below_cutoff"]
پرنٹ کریں['below_cutoff']:.4f}") پرنٹ(f"p-values: {rdd_model.pvalues['below_cutoff']:.4f}") پرنٹ (f"N صارفین [0.75, 0.95):     {len(near):,}")

Expected output:

RDD effect at cutoff (LATE): +0.0548
Std error (HC3):             0.0131
p-value:                     0.0000
N users in [0.75, 0.95):     21,689

Here's what's happening: the model fits separate intercepts and slopes on each side of 0.85 (below_cutoff is the side indicator, rc is confidence centered at the cutoff). The coefficient on below_cutoff reads off the vertical jump at the threshold, which is the local average treatment effect (LATE) for queries with confidence near 0.85. You get +0.0548, within sampling noise of the +0.06 ground truth.

Three notes on the specification. First, task_completed is binary, so this is a linear probability model. For RDD with a binary outcome at the cutoff, the linear probability model is standard practice because local linearity is the identifying assumption either way. Logit at the cutoff is an alternative if you need bounded predictions globally.

Second, the standard errors are used cov_type="HC3" to relax the homoskedasticity assumption, which is almost always wrong for binary outcomes.

Third, the dataset has one query per user with no within-user clustering, so cluster-robust standard errors aren't needed here. In a setting with multiple queries per user, you'd cluster on user_id.

The next diagnostic to look at is the confidence distribution near the cutoff. Figure 2 shows what 50,000 queries look like in the bandwidth window:

9ecb8a4c-6eac-4732-95ae-2a5981917f54

Figure 2. Real distribution from the 50,000-user synthetic dataset. Unlike the schematic in Figure 1, this shows the actual query density by confidence score, with the routing threshold annotated. The bottom panel counts how many queries land in each 2-percentage-point bin near the cutoff (2,461 / 2,481 / 2,335 / 2,229 / 2,048 across the 0.80–0.90 range). The roughly uniform spread is the visual signal that no manipulation is concentrating users on one side of the threshold.

Step 2: Try Different Bandwidths

Bandwidth choice matters. Too narrow and you have too few observations, so the confidence interval blows up. Too wide and you're extrapolating into regions where the linear specification is no longer a reasonable local approximation.

The honest move is to try multiple bandwidths and report whether the estimate holds.

results = []
BW کے لیے [0.05, 0.10, 0.15, 0.20]:sub=df[(df.query_confidence > cutoff - bw)
             & (df.query_confidence < cutoff + bw)].copy() ذیلی["below_cutoff"] = (sub.query_confidence 

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

 bandwidth      n  effect     se       p
      0.05  11554  0.0635  0.0183  0.0005
      0.10  21689  0.0548  0.0131  0.0000
      0.15  29137  0.0618  0.0112  0.0000
      0.20  34074  0.0614  0.0107  0.0000

موجودہ صورتحال کچھ یوں ہے: یہ کٹ آف کے ارد گرد ±0.05 سے ±0.20 تک کی چار بینڈوتھس پیش کرتا ہے، ہر ایک دوبارہ اسی RDD وضاحتوں سے مشروط ہے۔ تخمینوں کی حد +0.0548 سے +0.0635 تک ہے، یہ سب کچھ +0.06 زمینی سچائی کی طرح ہے، جس میں معیاری غلطیاں کم ہوتی جاتی ہیں جیسے جیسے بینڈوتھ کم ہوتی جاتی ہے وسیع تر ہوتی جاتی ہے۔ تمام p-values ​​0.05 سے نیچے ہیں۔ آیا تخمینہ "مستحکم" ہے اس کا انحصار تخمینہ کے ارد گرد اعتماد کے وقفے پر ہوتا ہے، جو مرحلہ 5 میں بوٹسٹریپنگ کے ذریعے تیار کیا جاتا ہے۔

مرحلہ 3: دہلیز پر ہیرا پھیری کی تصدیق کریں۔

RDDs صرف اس وقت درست ہیں جب صارف کٹ آف کے ارد گرد ایگزیکیوشن متغیرات کو درست طریقے سے جوڑ نہیں سکتا۔ اگر صارف (یا سسٹم) پریمیم روٹنگ پر مجبور کرنے کے لیے اعتماد کے اسکور کو 0.85 سے بالکل نیچے ایڈجسٹ کر سکتا ہے، تو یہ کٹ آف پر کثافت میں اضافے کا سبب بنے گا اور RDD تخمینوں کو آلودہ کر دے گا۔

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

پرنٹ ("2% پوائنٹ رینج میں صارفین کی تعداد تقریباً 0.85 ہے:") کے لیے [0.80, 0.82, 0.84, 0.86, 0.88]: hi = lo + 0.02 cnt = ((df.query_confidence >= lo) & (df.query_confidence < hi)).sum() print(f"  [{lo:.2f}, {hi:.2f}):  n = {cnt:,}")

Expected output:

User counts in 2-percentage-point bins around 0.85:
  [0.80, 0.82):  n = 2,461
  [0.82, 0.84):  n = 2,481
  [0.84, 0.86):  n = 2,335
  [0.86, 0.88):  n = 2,229
  [0.88, 0.90):  n = 2,048

Here's what's happening: counts trend gently downward across the bandwidth because Beta(5,2) places more mass at higher confidence levels, and the density tapers as it approaches 1.0. There's no spike or dip at the 0.84–0.86 bin that straddles the cutoff. The 433-user spread across all five bins is consistent with smooth tapering of the underlying density.

That's the pattern you want when manipulation is absent. For a more rigorous test, the rddensity Python package implements the formal McCrary procedure with bias-corrected standard errors.

What manipulation looks like when it's real: a spike in users at confidences just barely below 0.85 (they're being nudged into premium routing) and a dip just above. If you see that pattern, the RDD estimate overstates the causal effect because the users right below 0.85 differ in motivation from those right above. They cared enough to manipulate the score, and they'd have shown different outcomes even under random routing.

Step 4: Quadratic Specification as a Robustness Check

If the true relationship between confidence and task completion isn't exactly linear, a local linear RDD can mistake the curvature for a jump. The standard robustness check allows quadratic terms on both sides of the cutoff and tests whether the estimate holds.

near = df[(df.query_confidence > cutoff - 0.10)
         & (df.query_confidence < cutoff + 0.10)].copy() کے قریب["below_cutoff"] = قریب (near.query_confidence < cutoff).astype(int)["rc"] = Near.query_confidence - کٹ آف کے قریب["rc2"] = Near.rc ** 2 rdd_quad = smf.ols( "task_completed ~ below_cutoff + rc + below_cutoff:rc" " + rc2 + below_cutoff:rc2", data=near, .fit(cov_type="HC3") print(f"Linear RDD (bw=0. 0.1 اثر): <0=0.1 0.0001") پرنٹ (f"کواڈراٹک RDD (bw=0.10): اثر = " f"{rdd_quad.params['below_cutoff']:+.4f}، "f"p = {rdd_quad.pvalues['below_cutoff']:.4f}")

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

Linear RDD    (bw=0.10):  effect = +0.0548, p < 0.0001
Quadratic RDD (bw=0.10):  effect = +0.0569, p = 0.0036

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

دونوں اندازوں میں 0.0022 کا فرق ہے، دونوں زمینی سچائی کے قریب +0.06 ہیں، اور دونوں p <0.01 پر اہم ہیں۔ ماڈل کو موڑنے سے جواب نہیں بدلتا۔

اگر لکیری اور چوکور تصریحات بظاہر مماثل نہیں ہیں، تو آپ کے پاس ایک حقیقی سگنل ہے۔ چھوٹے نمونوں کے لیے (ہزاروں تنگ بینڈوڈتھ پر)، دوسرے آرڈر والے ورژن کی طاقت ختم ہو سکتی ہے کیونکہ چار اضافی پیرامیٹرز کی شناخت کے لیے ڈیٹا کی ضرورت ہوتی ہے۔

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

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

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

def bootstrap_ci(df, cutoff, bw, quadratic=False, n_reps=500, seed=7):
    rng = np.random.default_rng(seed)
    near = df[(df.query_confidence > cutoff - bw)
              & (df.query_confidence < cutoff + bw)].copy()
    near["below_cutoff"] = (near.query_confidence < cutoff).astype(int)
    near["rc"] = near.query_confidence - cutoff
    if quadratic:
        near["rc2"] = near.rc ** 2
        formula = ("task_completed ~ below_cutoff + rc + below_cutoff:rc"
                   " + rc2 + below_cutoff:rc2")
    else:
        formula = "task_completed ~ below_cutoff + rc + below_cutoff:rc"

    n = len(near)
    estimates = np.empty(n_reps)
    for i in range(n_reps):
        sample = near.iloc[rng.integers(0, n, size=n)]
        m = smf.ols(formula, data=sample).fit()
        estimates[i] = m.params["below_cutoff"]
    return (np.percentile(estimates, 2.5), np.percentile(estimates, 97.5))


print("Linear RDD (bw=0.10):")
lo, hi = bootstrap_ci(df, cutoff, bw=0.10)
print(f"  effect = +0.0548   95% CI: [{lo:+.4f}, {hi:+.4f}]")

print("nBandwidth sensitivity:")
for bw, eff in [(0.05, 0.0635), (0.10, 0.0548), (0.15, 0.0618), (0.20, 0.0614)]:
    lo, hi = bootstrap_ci(df, cutoff, bw=bw)
    print(f"  bw = {bw:.2f}   effect = {eff:+.4f}   "
          f"95% CI: [{lo:+.4f}, {hi:+.4f}]")

print("nQuadratic RDD (bw=0.10):")
lo, hi = bootstrap_ci(df, cutoff, bw=0.10, quadratic=True)
print(f"  effect = +0.0569   95% CI: [{lo:+.4f}, {hi:+.4f}]")

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

Linear RDD (bw=0.10):
  effect = +0.0548   95% CI: [+0.0278, +0.0817]

Bandwidth sensitivity:
  bw = 0.05   effect = +0.0635   95% CI: [+0.0244, +0.0986]
  bw = 0.10   effect = +0.0548   95% CI: [+0.0278, +0.0817]
  bw = 0.15   effect = +0.0618   95% CI: [+0.0381, +0.0823]
  bw = 0.20   effect = +0.0614   95% CI: [+0.0420, +0.0808]

Quadratic RDD (bw=0.10):
  effect = +0.0569   95% CI: [+0.0205, +0.0959]

موجودہ صورتحال کچھ یوں ہے: بوٹسٹریپ بینڈوڈتھ کے محدود ڈیٹا کو 500 بار متبادل کے ساتھ دوبارہ نمونہ بناتا ہے، ہر تکرار پر RDD کو ریفٹ کرتا ہے، اور below_cutoff گتانک ان 500 تخمینوں کا 2.5 واں اور 97.5 واں پرسنٹائل 95 فیصد وقفہ بناتے ہیں۔ تمام وقفوں میں +0.06 زمینی سچائی شامل ہے، تمام وقفے 0 کو چھوڑ دیتے ہیں، اور بینڈوتھ سویپ اوورلیپنگ وقفے پیدا کرتے ہیں۔

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

ایک چیز جو وقفہ اس ڈیٹا سیٹ میں نہیں کرتا ہے وہ ہے بولی +0.0632 تخمینہ کو خارج کرنا۔ اس کی وجہ یہ ہے کہ ڈیٹا جنریٹر استفسار کے اعتبار سے الجھن میں نہیں ہے۔ توقعات کے لحاظ سے، پریمیم اور کم لاگت والے گروپوں کے درمیان فرق صرف +6pp روٹنگ اثر ہے، لہذا ایک سادہ موازنہ حقیقت کے قریب تر ہے۔

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

جب رجعت کا تسلسل ناکام ہوجاتا ہے۔

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

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

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

دوسری پالیسیاں بھی اسی بنیاد پر لاگو ہوتی ہیں۔ (مفروضہ 2 کی خلاف ورزی)۔ اگر آپ کے پروڈکٹ میں 0.85 میں اضافی قواعد فعال ہیں (علیحدہ UI ہینڈلنگ، مختلف لاگنگ لیولز، مختلف دوبارہ کوشش کی پالیسیاں)، RDD دیگر پالیسی اثرات سے روٹنگ اثرات کو الگ نہیں کر سکے گا۔ ان تمام اندراجات کے لیے پوری رول بک کا آڈٹ کریں جو حد کا اشتراک کرتی ہیں۔

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

جب پریمیم ماڈلز کے لیے مختص کرنا ایک متعین خصوصیت نہیں ہے۔ query_confidenceایسے مبہم RDDs ہیں جن کے لیے ایک انسٹرومینٹل متغیر فریم ورک کی ضرورت ہوتی ہے۔ کہ rdrobust پیکیجنگ میں تیز اور مبہم ڈیزائن دونوں شامل ہیں۔

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

مرحلہ 4 میں ایک ثانوی مضبوطی ٹیسٹ معیاری تشخیص ہے۔ اگر لکیری اور چوکور مماثل نہیں ہیں، تو بینڈوتھ کو چوڑا کریں اور دونوں کو دوبارہ چلائیں۔

extrapolation تعصب (تسلسل کے مسائل، تشکیل نو) RDD کے تخمینے سختی سے کٹ آف تک محدود ہیں۔ 0.85 پر +0.06 کا اثر ہمیں اس بارے میں کچھ نہیں بتاتا کہ پریمیم روٹنگ 0.30 یا 0.99 کے اعتماد کے ساتھ سوالات کے لیے کیا کرتی ہے۔

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

آگے کیا کرنا ہے۔

RDD ایک موزوں ٹول ہے جب AI خصوصیات کو مسلسل سکور اور تیز حد کے ذریعے کنٹرول کیا جاتا ہے۔

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

پیداوار RDD تجزیہ کے لیے، استعمال کریں: rdrobust ازگر پیکج۔ بینڈوڈتھ کا بہترین انتخاب فراہم کرتا ہے (Calonico, Cattaneo, and Titiunik 2014)، تعصب سے درست شدہ معیاری خامیاں، اور بلٹ ان پلاٹنگ یوٹیلیٹیز۔ ساتھی rddensity پیکج میککری کثافت ٹیسٹ کو نافذ کرتا ہے جسے غیر رسمی طور پر مرحلہ 3 میں دیکھا گیا ہے۔

اس ٹیوٹوریل کا ابتدائی ورژن طریقہ کار کو ظاہر کرتا ہے۔ rd-packages اسٹیک جائزہ لینے والوں کو فراہم کیا جاتا ہے۔

ایک چیز جو لیٹ نہیں کرتی ہے وہ آپ کو ان صارفین کے لیے اثر بتاتی ہے جو کٹ آف سے دور ہیں۔ اگر آپ کی پائپ لائن میں پریمیم روٹنگ کو برقرار رکھنے کے لیے 0.85 سے +0.06 لیٹ کافی ہے، تو آپ کا کام ہو گیا ہے۔ اگر آپ کو یہ جاننے کی ضرورت ہے کہ پریمیم ان آسان سوالات کے لیے کیا کرتا ہے جو آپ فی الحال سستے میں بھیجتے ہیں (یا نیچے کے قریب سب سے مشکل سوالات)، اگلا مرحلہ اس علاقے میں ایک چھوٹا بے ترتیب رول آؤٹ ہے، جو RDD تخمینہ کے خلاف کیلیبریشن چیک کے ساتھ اسکور کیا جاتا ہے۔ بغیر ثبوت کے دیر کو عام نہ کریں۔

اس ٹیوٹوریل کے لیے ساتھی نوٹ بک یہاں GitHub پر ہے۔ ریپوزٹری کو کلون کریں، ایک مصنوعی ڈیٹاسیٹ بنائیں، اور اسے چلائیں۔ rdd_demo.ipynb اس ٹیوٹوریل سے تمام کوڈ بلاکس کو دوبارہ تیار کریں۔

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

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