Skip to content

yusuf-said/TransparentAd

Repository files navigation

TransparentAd

TransparentAd, sosyal medya feed'lerinde bir kullanicinin bir kategoriye olan ilgisinin organik mi yoksa tekrar eden algoritmik maruziyetle mi buyudugunu gorunur yapan bir hackathon MVP'sidir.

Tek cumle:

Like atti diye seviyor sanmiyoruz; once neye maruz kaldigina da bakiyoruz.

TransparentAd bir sosyal medya klonu degil. Bir "amplification risk" demo ve analiz katmanidir. Temel sorusu sudur:

Kullanici bu kategoriye gercekten basta mi ilgiliydi, yoksa once platform bu kategoriye tekrar tekrar maruz mu birakti?

Ne Yaptik?

Bu MVP'de uc seyi bir araya getirdik:

  1. React tabanli bir demo arayuzu
  2. FastAPI backend ile risk/evidence endpointleri
  3. KuaiRand-Pure uzerinden cikarilan user-tag exposure featurelari ve GCN model raporu

Frontend, kullaniciya anlasilir bir policy-loop simülasyonu gosterir. Backend, risk skoru ve evidence bilgilerini sunar. Model tarafinda ise gercek KuaiRand-Pure loglarindan user-tag seviyesinde exposure-before-engagement sinyali cikarilir.

Ne Kullandik?

Kodlamak için AI Agent olarak: GPT 5.5 Codex

Frontend

  • React
  • Vite
  • TypeScript
  • Tailwind CSS
  • Recharts

Ana dosyalar:

src/App.tsx
src/lib/simulation.ts
src/lib/scoring.ts
src/lib/api.ts
src/data/posts_demo.json

Backend

  • Python
  • FastAPI
  • Pydantic
  • uv

Ana dosya:

backend/main.py

Endpointler:

GET  /health
GET  /info
GET  /evidence
POST /simulate
POST /pred

Dataset

Kullandigimiz ana dataset:

KuaiRand-Pure

Kullandigimiz sinyaller:

  • user_id
  • video_id
  • time_ms
  • is_click
  • is_like
  • long_view
  • play_time_ms
  • is_rand
  • video_features_basic.tag
  • video distribution/statistics features

Model / Analiz

  • user-tag feature extraction
  • temporal ordering by time_ms
  • risk evidence bundle generation
  • simple user-tag GCN
  • temporal train/val/test split
  • train-only graph construction
  • validation threshold selection
  • ablation metrics
  • counterfactual exposure metrics

Ana scriptler:

scripts/extract_graph_features.py
scripts/train_gcn.py
scripts/generate_evidence_bundle.py

Ana artifactler:

artifacts/features/user_tag_risk_features.json
artifacts/risk/evidence_bundles.json
artifacts/gcn/training_summary.json
artifacts/gcn/gcn_model.pt

Nasil Calisiyor?

1. KuaiRand loglari okunur

Loglar kullanici bazinda gruplanir ve her kullanicinin eventleri time_ms ile siralanir.

all logs
  -> group by user_id
  -> sort by time_ms
  -> join video_id to tag
  -> build user-tag timeline

Bu kritik, cunku projenin iddiasi zamanla ilgilidir: engagement oncesinde ne gosterildi?

2. User-tag featurelari cikarilir

Her user_id + tag icin su tip featurelar uretilir:

  • exposure count
  • engagement count
  • first engagement step
  • exposure before first engagement
  • category share in first 20 impressions
  • category share in last 20 impressions
  • feed drift
  • standard-vs-random exposure gap
  • high-distribution proxy count
  • repeat streak

3. Evidence bundle uretilir

Bu featurelardan juriye ve UI'a anlatilabilir evidence bundle olusturulur.

Ornek evidence:

Tag 12 had 8 exposures before first engagement.
The tag reached 15% of the user's last 20 impressions.
Standard-feed exposure share was higher than random-feed share.
Consensus risk is 0.73.

4. GCN graph sinyali eklenir

GCN, frontenddeki demo kartlarini tahmin etmez. GCN'in calistigi seviye:

user_id <-> tag_id

Yani model sunu ogrenmeye calisir:

Bu kullanici ile bu tag arasindaki exposure gecmisi engagement sinyali tasiyor mu?

Bu, risk anlatimina teknik destek verir. GCN'i "fitness modeli" diye satmiyoruz. Dogru ifade:

GCN, KuaiRand tag seviyesinde exposure-engagement iliskisinin anlamli sinyal tasidigini gosterir.

5. Frontend bunu gorsellestirir

Frontenddeki post metinleri human-readable demo havuzudur. KuaiRand-Pure dogrudan "fitness", "gaming", "whey" gibi temiz metinler vermez. Bu yuzden UI, gercek user-tag dinamigini daha anlasilir bir senaryoyla gosterir.

Dogru okuma:

KuaiRand tag cluster
  -> user-tag exposure evidence
  -> demo label: fitness-like category

Ne Yapmiyoruz?

TransparentAd su an sunlari yapmaz:

  • Gercek sosyal medya feed'i calistirmaz.
  • Gercek reklam satin alma veya sponsor tespiti yapmaz.
  • Kullanici psikolojisini veya fikir degisimini kesin kanitlamaz.
  • KuaiRand tag'lerini dogrudan gercek semantik kategori olarak iddia etmez.
  • Ekrandaki demo postlarini KuaiRand'dan birebir alinmis gibi sunmaz.
  • GCN .pt modelini FastAPI icinde canli torch inference olarak calistirmaz.
  • Production database, auth, login veya gercek kullanici sistemi icermez.
  • Reinforcement learning veya buyuk transformer modeli kullanmaz.

Nelerden Feragat Ettik?

Hackathon suresi nedeniyle bilincli feragatler yaptik.

1. Semantik kategori dogrulugu

KuaiRand-Pure tagleri numeric. "Fitness" gibi isimler dogrudan gelmiyor. Bu yuzden frontenddeki fitness label'i bir demo alias.

Feragat:

Daha anlasilir demo icin tag cluster'i insan diline cevirdik.

Risk:

Juri bunu gercek dataset etiketi sanabilir.

Mitigation:

Docs ve UI dilinde bunun demo label oldugunu acik tutuyoruz.

2. Live GCN inference

GCN egitildi ve artifact raporu uretiliyor, fakat backend su an .pt modelinden her request icin canli inference yapmiyor.

Feragat:

Modeli teknik evidence olarak kullandik, online inference'i sonraki adima biraktik.

Neden:

Hackathon demosunda stabilite ve anlatilabilirlik daha onemliydi.

3. Causal claim

Random exposure sinyali olmasina ragmen tam nedensel iddia kurmuyoruz.

Feragat:

"Bu kullanicinin fikri degisti" demiyoruz.

Guvenli claim:

"Bu engagement sinyali onceki exposure'dan bagimsiz gorunmuyor."

4. Full recommender engine

Frontenddeki simulator gercek production recommender degil.

Feragat:

Sadece exposure amplification loop'unu gorsellestiren hafif bir policy simulator kullandik.

Neden:

MVP'nin amaci feed motoru yapmak degil, maruziyet-risk mantigini gostermekti.

Guvenli Iddia Seti

Sunlari soyleyebiliriz:

  • TransparentAd exposure-before-engagement sinyalini gorunur kilar.
  • KuaiRand-Pure uzerinden user-tag seviyesinde risk featurelari cikariyoruz.
  • GCN graph modeli user-tag exposure yapisinda anlamli sinyal buldu.
  • Risk skoru kesin manipülasyon kaniti degil, inceleme onceligi sinyalidir.
  • High-distribution proxy sponsorlu reklam kaniti degil, dagitim baskisi sinyalidir.

Sunlari soylememeliyiz:

  • "Algoritma kullanicinin fikrini kesin degistirdi."
  • "Bu icerik kesin reklam."
  • "Fitness KuaiRand'in orijinal kategorisidir."
  • "GCN ekrandaki Red Bull kartini tahmin ediyor."
  • "Bu production-ready recommender audit sistemi."

Demo Nasil Anlatilir?

  1. Kullanici basta fitness-like kategoriye dusuk ilgili.
  2. Feed, bridge/high-distribution icerikleri gostermeye basliyor.
  3. Ilk engagement gelmeden once exposure memory birikiyor.
  4. Sonraki turlarda kategori payi artiyor.
  5. TransparentAd risk paneli sunu soyluyor:
Bu ilgi sinyali, onceki platform maruziyetinden bagimsiz gorunmuyor.

Proje Yapisi

.
├── backend/
│   └── main.py
├── src/
│   ├── App.tsx
│   ├── components/
│   ├── data/
│   └── lib/
├── scripts/
│   ├── extract_graph_features.py
│   ├── train_gcn.py
│   └── generate_evidence_bundle.py
├── artifacts/
│   ├── features/
│   ├── gcn/
│   └── risk/
├── KuaiRand-Pure/
├── sample_data/
├── docs/
└── demo.sh

Calistirma

Tek komut:

./demo.sh

Manuel:

UV_CACHE_DIR=.uv-cache uv run uvicorn backend.main:app --host 127.0.0.1 --port 8000
npm run dev

Build:

npm run build

Backend smoke test:

UV_CACHE_DIR=.uv-cache uv run python -c "from backend.main import PredictionRequest, prediction_response; print(prediction_response(PredictionRequest()))"

Diger Dokumanlar

En Kisa Ozet

TransparentAd, bir kullanicinin sonradan verdigi engagement sinyalini tek basina tercih kabul etmez. Once, o kullanicinin bu kategoriye ne kadar maruz kaldigina bakar. Eğer exposure baskisi, feed drift ve graph sinyali birlikte yuksekse bunu "algoritmik amplifikasyon riski" olarak isaretler.

About

Ad optimization for users and companies

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors