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?
Bu MVP'de uc seyi bir araya getirdik:
- React tabanli bir demo arayuzu
- FastAPI backend ile risk/evidence endpointleri
- 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.
Kodlamak için AI Agent olarak: GPT 5.5 Codex
- 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- Python
- FastAPI
- Pydantic
- uv
Ana dosya:
backend/main.pyEndpointler:
GET /health
GET /info
GET /evidence
POST /simulate
POST /predKullandigimiz ana dataset:
KuaiRand-PureKullandigimiz sinyaller:
user_idvideo_idtime_msis_clickis_likelong_viewplay_time_msis_randvideo_features_basic.tag- video distribution/statistics features
- 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.pyAna artifactler:
artifacts/features/user_tag_risk_features.json
artifacts/risk/evidence_bundles.json
artifacts/gcn/training_summary.json
artifacts/gcn/gcn_model.ptLoglar 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 timelineBu kritik, cunku projenin iddiasi zamanla ilgilidir: engagement oncesinde ne gosterildi?
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
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.GCN, frontenddeki demo kartlarini tahmin etmez. GCN'in calistigi seviye:
user_id <-> tag_idYani 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.
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 categoryTransparentAd 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
.ptmodelini FastAPI icinde canli torch inference olarak calistirmaz. - Production database, auth, login veya gercek kullanici sistemi icermez.
- Reinforcement learning veya buyuk transformer modeli kullanmaz.
Hackathon suresi nedeniyle bilincli feragatler yaptik.
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.
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.
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."
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.
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."
- Kullanici basta fitness-like kategoriye dusuk ilgili.
- Feed, bridge/high-distribution icerikleri gostermeye basliyor.
- Ilk engagement gelmeden once exposure memory birikiyor.
- Sonraki turlarda kategori payi artiyor.
- TransparentAd risk paneli sunu soyluyor:
Bu ilgi sinyali, onceki platform maruziyetinden bagimsiz gorunmuyor..
├── 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.shTek komut:
./demo.shManuel:
UV_CACHE_DIR=.uv-cache uv run uvicorn backend.main:app --host 127.0.0.1 --port 8000
npm run devBuild:
npm run buildBackend smoke test:
UV_CACHE_DIR=.uv-cache uv run python -c "from backend.main import PredictionRequest, prediction_response; print(prediction_response(PredictionRequest()))"- product_story.md
- demo_flow.md
- technical_architecture.md
- data_and_model.md
- risk_methodology.md
- api_contract.md
- marketing_strategy.md
- faq_and_jury_defense.md
- diagrams.md
- implementation_notes.md
- pitch_script.md
- roadmap.md
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.