پست

الگوریتم X دقیقاً دنبال چیه؟ یه نگاه از داخل سورس‌کد

الگوریتم X دقیقاً دنبال چیه؟ یه نگاه از داخل سورس‌کد

چند وقتیه که X سورس‌کد بخشی از الگوریتم پیشنهاد محتواش رو منتشر کرده و همین باعث شده خیلی از فرضیات و شایعاتی که سال‌ها دورمون می‌چرخید، یا تأیید بشن یا کاملاً رد بشن. بیایید با هم قدم‌به‌قدم بریم ببینیم این الگوریتم واقعاً چطور فکر می‌کنه.

x-algorithm

سؤال اصلی الگوریتم اصلاً چیه؟

فرض غلط رایج اینه که یه الگوریتم مثل X یه لیست از «بهترین پست‌های دنیا» داره و همون رو به همه نشون می‌ده. واقعیت این نیست. سؤالی که سیستم واقعاً از خودش می‌پرسه اینه:

همین کاربر، همین لحظه، احتمالاً با این پست خاص چیکار می‌کنه؟

یه پست از یه استارتاپ کوچیک درباره‌ی بهینه‌سازی کوئری SQL ممکنه برای یه بک‌اند دولوپر فوق‌العاده باشه ولی برای یه طراح UI هیچ معنایی نداشته باشه. به‌جای امتیاز ثابت، سیستم سعی می‌کنه رفتار احتمالی همون کاربر مشخص رو حدس بزنه:

  • چقدر احتمال داره Like بزنه؟
  • چقدر احتمال داره Reply بده؟
  • ممکنه Repost کنه؟
  • می‌خواد برای یکی بفرسته؟
  • روی لینک کلیک می‌کنه؟
  • نویسنده رو Follow می‌کنه؟
  • یا برعکس، Report یا Block می‌کنه؟

تحلیل من: این یعنی نوشتن برای «همه» عملاً یه استراتژی بازنده‌ست. هرچی محتوا برای یه گروه مشخص (مثلاً دولوپرهای Vue یا کسایی که با Cloudflare کار می‌کنن) دقیق‌تر و تخصصی‌تر باشه، احتمال پیش‌بینی درست رفتار مثبت اون گروه بالاتر می‌ره — حتی اگه مخاطب کلیش کوچیک‌تر به‌نظر بیاد.

نقشه راه یه پست تا رسیدن به فید شما

مسیر یه پست از لحظه انتشار تا نمایش توی For You یه پروسه چند مرحله‌ایه:

کاربر → بررسی رفتار و علایق قبلی → پیدا کردن انبوهی از پست کاندید → حذف پست‌های نامناسب → پیش‌بینی واکنش کاربر → امتیازدهی → اعمال تنوع و محدودیت → فیلتر Visibility → نمایش نهایی

مرحله‌ی جمع‌آوری اولیه رو Candidate Generation می‌گن. اینجا الگوریتم از دو منبع پست جمع می‌کنه: حساب‌هایی که Follow کردید، و حساب‌هایی که اصلاً نمی‌شناسیدشون.

Thunder: تأمین محتوا از داخل شبکه‌ی خودتون

Thunder اسم اون بخشی از سیستمه که مسئول پیدا کردن محتوای حساب‌هاییه که شما Follow کردید. مثلاً اگه ۳۰۰ نفر رو Follow کرده باشید، Thunder کمک می‌کنه از بین پست‌های اون‌ها، محتوای مرتبط‌تر وارد مرحله رتبه‌بندی بشه. خلاصه‌ش می‌شه: Thunder یعنی موتور جمع‌آوری از شبکه‌ی مستقیم شما.

اما جایی که ماجرا واقعاً جذاب می‌شه، وقتیه که X باید پستی از یه حساب کاملاً غریبه پیدا کنه که هرگز اسمش رو نشنیدید. اونجا نوبت مدل‌های دیگه می‌رسه.

Phoenix: موتوری که سلیقه شما رو حدس می‌زنه

Phoenix رو می‌شه قلب سیستم پیشنهاد محتوای X دونست؛ هم توی پیدا کردن پست‌های کاندید نقش داره هم توی رتبه‌بندی نهایی. کارش اینه که بفهمه با توجه به رفتار قبلی شما، چه محتوایی احتمالاً موردعلاقه‌تونه. برای این کار به این‌ها نگاه می‌کنه:

  • چه موضوعاتی رو Like کردید
  • زیر پست چه کسایی Reply گذاشتید
  • روی چه پست‌هایی بیشتر مکث کردید
  • چی رو به اشتراک گذاشتید
  • چه حساب‌هایی رو تازه Follow کردید

از این داده‌ها یه بازنمایی عددی از سلیقه شما ساخته می‌شه که بهش Embedding می‌گن؛ یعنی تبدیل یه کاربر یا یه محتوا به مجموعه‌ای از اعداد که ماشین بتونه شباهت‌هاشون رو محاسبه کنه. Phoenix بعد Embedding شما رو با Embedding هر پست مقایسه می‌کنه.

تحلیل من: این بخش توضیح می‌ده چرا گاهی یه پست قدیمی شما دوباره سر و کله‌ش پیدا می‌شه — چون Embedding شما یا اون پست تغییر کرده و حالا فاصله‌شون کمتر شده، نه اینکه پست دوباره منتشر شده باشه.

Two-Tower: مقایسه دو دنیا با یه معیار مشترک

توی بخش Retrieval سیستم Phoenix، از معماری Two-Tower استفاده می‌شه. یه برج کاربر رو به بردار عددی تبدیل می‌کنه، برج دیگه محتوا رو. بعد فاصله این دو بردار سنجیده می‌شه؛ هرچی نزدیک‌تر باشن، احتمال تطابق بیشتره. دقیقاً همین سازوکاره که باعث می‌شه یه حساب ناشناس بتونه بدون هیچ Followeri مشترک، توی فید شما ظاهر بشه.

SimClusters: پیدا کردن قبیله دیجیتال شما

ایده SimClusters ساده‌ست: آدم‌هایی که با محتوای مشابه تعامل دارن، احتمالاً علایق مشترک دارن. فرض کنید تعداد زیادی کاربر مدام با موضوعاتی مثل TypeScript، Cloudflare Workers، معماری Serverless و PWA تعامل دارن. سیستم می‌تونه از رفتار این کاربرها یه Cluster بسازه. اگه رفتار شما هم شبیه این کاربرها باشه، محتوای محبوب اون خوشه احتمال بیشتری داره توی For You شما ظاهر بشه.

تحلیل من: این همون دلیلیه که خیلی از مشاوران محتوا می‌گن «توی یه نیچ بمونید». اگه یه حساب هم درباره آشپزی بنویسه هم درباره DevOps، سیستم نمی‌تونه Embedding واضحی ازش بسازه و در نتیجه سخت‌تر می‌تونه مخاطب مناسبش رو پیدا کنه. ثبات موضوعی صرفاً یه توصیه بازاریابی نیست؛ یه محدودیت فنی مدله.

جایی که رتبه‌بندی واقعی اتفاق می‌افته

بعد از جمع شدن چند صد یا چند هزار پست کاندید، Phoenix Ranking وارد کار می‌شه و برای هر پست چند تا احتمال جدا محاسبه می‌کنه:

  • P(Like)
  • P(Reply)
  • P(Repost)
  • P(Share)
  • P(Follow)
  • P(Block)
  • P(Report)

مثلاً اگه P(Reply) برابر ۰.۱۸ باشه، یعنی مدل حدس می‌زنه ۱۸ درصد احتمال داره کاربر Reply بزنه. هر رفتار یه وزن مشخص داره و از جمع وزن‌دار همین احتمال‌ها، یه امتیاز نهایی ساخته می‌شه:

Score = P(Like) × وزن Like + P(Reply) × وزن Reply + P(Share) × وزن Share − P(Report) × وزن Report + …

چرا یه Reply ارزشش خیلی بیشتر از یه Like ـه؟

از پارامترهای منتشرشده معلوم شده که X برای رفتارهای مختلف ارزش خیلی متفاوتی قائله:

رفتار مثبتوزن
Like+0.5
Reply+5
Repost+1
Share+2
ارسال در DM+5
Copy Link+20
Quote+5
Follow نویسنده+4
Click+0.4
Open Link+0.2
رفتار منفیوزن
Not Interested−43.2
Block−31.2
Mute−58.8
Report−234

نکته مهم اینه که این وزن‌ها در تعداد واقعی Like یا Reply ضرب نمی‌شن؛ بلکه روی احتمال پیش‌بینی‌شده‌ی همون رفتار برای یه کاربر خاص اعمال می‌شن. پس نتیجه‌گیری «یه Reply دقیقاً معادل ۱۰ Like ـه» غلطه؛ محاسبه واقعی چیزی شبیه اینه:

احتمال Reply × 5 + احتمال Follow × 4 − احتمال Report × 234

تحلیل من: نکته‌ای که خیلی زیر سایه می‌مونه اینه که وزن Report منفی ۲۳۴ ـه، یعنی تقریباً ۵۰۰ برابر وزن یه Like. این یعنی حتی اگه یه پست هزاران Like بگیره ولی چند نفر محدود Reportش کنن، امتیاز نهایی می‌تونه به‌شدت افت کنه. برای یه حساب فنی، این یعنی دقت در درست بودن اطلاعات (مثلاً کد بدون باگ یا ادعای فنی درست) از نظر الگوریتمی هم اهمیت داره، نه فقط از نظر اعتبار.

از منظر محصول، این عدد کاملاً منطقیه. Like یه لمس ساده‌ست و تقریباً هیچ هزینه‌ای نداره. اما وقتی کسی لینک یه پست رو کپی می‌کنه، یعنی احتمالاً:

  • می‌خواد اون رو جای دیگه‌ای (مثلاً یه گروه تلگرام یا اسلک تیمش) بفرسته
  • می‌خواد بعداً برگرده و دوباره بخونتش
  • محتوا اونقدر ارزشمند بوده که می‌خواد خارج از X هم پخشش کنه

تحلیل من: برای من به‌عنوان یه دولوپر، این یعنی محتوایی مثل یه Snippet کد آماده، یه راه‌حل برای یه باگ رایج، یا یه چک‌لیست دیپلوی روی Cloudflare، به‌مراتب بیشتر از یه جمله انگیزشی Copy Link می‌گیره — چون کاربرد عملی داره و آدم‌ها می‌خوان نگهش دارن.

Reply؛ نشونه گفتگو، نه فقط توافق

Reply هم سیگنال خیلی قوی‌ایه. تفاوت رو با این مثال ببینید:

  • «Rust زبان سریعیه.» → این جمله معمولاً هیچ بحثی راه نمی‌ندازه چون کسی مخالف نداره.
  • «برای پروژه بعدی بک‌اندتون، بین Hono روی Cloudflare Workers یا یه API معمولی با ASP.NET Core کدوم رو انتخاب می‌کنید و چرا؟» → این سؤال احتمال Reply بالایی داره چون طرفدار هر دو گزینه نظر خودشون رو می‌نویسن.

البته این به معنی رفتن سراغ بحث ساختگی یا Clickbait نیست، چون الگوریتم سمت منفی ماجرا رو هم می‌بینه.

چرا محتوای عصبانی‌کننده معمولاً شکست می‌خوره

بعضی‌ها از تاکتیک Rage Bait استفاده می‌کنن: یه ادعای عمداً بحث‌برانگیز مطرح می‌کنن تا مردم برای مخالفت زیرش کامنت بذارن. مشکل اینه که همزمان با بالا رفتن Reply و Quote، این رفتارها هم بالا می‌رن: Mute، Block، Not Interested و Report. و همون‌طور که دیدیم، این سیگنال‌های منفی وزن به‌مراتب سنگین‌تری دارن. تحلیل من: این یعنی از نظر ریاضی محض، یه پست جنجالی که ۵۰ Reply عصبانی و ۱۰ Report بگیره، احتمالاً امتیاز پایین‌تری از یه پست آموزشی ساده با ۵ Reply مثبت و صفر Report داره.

نشونه‌ای که ارزش واقعی محتوا رو لو می‌ده: Follow بعد از دیدن پست

یکی از رفتارهایی که Phoenix پیش‌بینی می‌کنه اینه: آیا این کاربر بعد از دیدن این پست خاص، می‌ره سراغ نویسنده و Follow می‌کنه؟ این سیگنال از نظر محصول خیلی منطقیه؛ اگه یه پست کاربر رو قانع کنه که «ارزش دنبال کردن این آدم رو داره»، یعنی اون محتوا واقعاً مفید بوده، نه صرفاً سرگرم‌کننده لحظه‌ای. تحلیل من: برای یه حساب تخصصی این یعنی هدف باید فراتر از Like رفتن باشه؛ محتوا باید کاربر رو به این نتیجه برسونه که «باید محتوای بیشتری از این آدم ببینم».

توقف روی پست، حتی بدون Like

اصطلاح‌هایی مثل Dwell Time و Active Seconds هم توی سیستم هست. اگه یه کاربر پستی رو در کسری از ثانیه رد کنه ولی روی پست دیگه‌ای ۲۰ ثانیه بمونه و بخونتش، این توقف طولانی حتی بدون هیچ Likeای، اطلاعات مفیدی برای مدل داره. تحلیل من: این یعنی Threadهای بلندتر با توضیح گام‌به‌گام (مثلاً یه راهنمای دیپلوی کامل) که کاربر رو مدتی نگه می‌داره، می‌تونن سیگنال قوی‌تری از یه جمله کوتاه بسازن، حتی اگه ظاهراً تعامل کمتری بگیرن.

چرا زمان انتشار مهم‌تر از چیزیه که فکر می‌کنید

توی pipeline سیستم یه فیلتر به اسم AgeFilter هست که سن پست رو چک می‌کنه. توی یکی از مسیرهای For You، پست‌های قدیمی‌تر از حدود ۴۸ ساعت از لیست کاندیدها خارج می‌شن. این به این معنی نیست که پست بعد از دو روز محو می‌شه، فقط دیگه توی بعضی مسیرهای خاص کاندید محسوب نمی‌شه. تحلیل من: یعنی اگه یه پست توی چند ساعت اول واکنش خوبی نگیره، شانسش برای رسیدن به مخاطب گسترده‌تر به‌شدت افت می‌کنه؛ زمان انتشار (مثلاً وقتی مخاطب هدفتون آنلاینه) به همون اندازه محتوای خود پست اهمیت داره.

چرا فید شما پر از پست یه نفر نمی‌شه

فرض کنید چند تا از پست‌های شما برای یه کاربر خاص خیلی جذابن. بدون محدودیت، ممکنه فیدش پشت‌سرهم پر از پست‌های شما بشه که تجربه بدی می‌سازه. برای همین سیستم امتیاز پست‌های متوالی از یه نویسنده رو کم می‌کنه؛ توی کد با پارامتری به اسم AuthorDiversityDecay. نتیجه‌ش اینه که حتی یه حساب خیلی خوب هم نمی‌تونه کل فید یه نفر رو قبضه کنه.

چطور یه حساب کوچیک می‌تونه Viral بشه

اصطلاح OON مخفف Out Of Network ـه؛ یعنی محتوایی که از حساب‌های Follow‌نشده میاد. بخش قابل‌توجهی از For You اصلاً برای پیدا کردن همین محتوای خارج از شبکه طراحی شده. تحلیل من: این دقیقاً همون دلیلیه که یه حساب با ۲۰۰ Follower می‌تونه یهو یه پست با ۵۰ هزار بازدید داشته باشه؛ کافیه سیستم تشخیص بده اون پست برای یه Cluster خاص (مثلاً دولوپرهای Vue) جذابه، حتی اگه هیچ‌کدوم از اون کاربرها نویسنده رو نمی‌شناسن.

چرا کیفیت Followerها از تعدادشون مهم‌تره

سیستمی به اسم user-cred-v2 به اعتبار شبکه‌ای حساب‌ها مربوطه و از ساختارهایی شبیه PageRank (همون الگوریتم قدیمی گوگل برای سنجش اهمیت صفحات وب) استفاده می‌کنه. ایده‌ش اینه که همه ارتباطات ارزش یکسان ندارن؛ مهم اینه چه حساب‌های معتبری با شما تعامل دارن. تحلیل من: این یعنی ۲۰۰۰ Follower واقعی که فعالانه با پست‌هاتون تعامل دارن، از ۲۰ هزار Follower خریداری‌شده یا غیرفعال، از نظر الگوریتم اعتبار بیشتری به حسابتون می‌ده.

دو مفهومی که باید از هم جدا کنید: رتبه‌بندی و اجازه نمایش

Ranking تصمیم می‌گیره پست کجای فید بیفته؛ Visibility Filtering تصمیم می‌گیره اصلاً اون پست حق نمایش داره یا نه. خروجی‌های این مرحله معمولاً سه حالته:

  • ALLOW: نمایش عادی و بدون محدودیت
  • INTERSTITIAL: پشت یه هشدار یا مرحله واسط (مثلاً هشدار محتوای حساس)
  • DROP: حذف کامل از سطح نمایش

پس یه پست ممکنه از نظر Ranking امتیاز بالایی بگیره ولی Visibility جلوی توزیع گسترده‌ش رو بگیره.

آیا Shadowban واقعاً وجود داره؟

خیلی‌ها احساس می‌کنن بدون هیچ اخطاری، محتواشون کمتر دیده می‌شه. سورس منتشرشده نشون می‌ده X واقعاً چند مرحله جدا برای محدود کردن Visibility داره، پس این احساس بی‌پایه نیست. قابلیتی به اسم Under the Hood هم وجود داره که به کاربر اجازه می‌ده ببینه آیا Label خاصی روی حسابش اعمال شده یا نه. Label یه برچسب سیستمیه (مثل Spam، Sensitive Media یا Abusive Behavior) که لزوماً یعنی حذف محتوا نیست؛ می‌تونه فقط نمایشش رو محدود کنه یا از بعضی پیشنهادها خارجش کنه.

چیزی که از این همه جزئیات یاد گرفتم

اگه بخوام همه این‌ها رو به چند قانون عملی برای تولید محتوا تبدیل کنم:

  • Like مهمه ولی ارزانه؛ الگوریتم دنبال سیگنال‌های گران‌تره.
  • محتوایی که کاربر رو وادار به Reply، Quote، Share یا Copy Link کنه، ارزش خیلی بیشتری از یه Like سریع داره.
  • محتوا باید کاربر رو به Follow کردن ترغیب کنه، نه فقط واکنش لحظه‌ای.
  • سیگنال‌های منفی (Report، Mute، Block) وزن سنگینی دارن؛ پس جنجال ارزون‌قیمت معمولاً ضرر می‌کنه، نه سود.
  • ثبات موضوعی به سیستم کمک می‌کنه شما رو دقیق‌تر دسته‌بندی و به مخاطب درست برسونه.