چطور نتفلیکس با هوش مصنوعی چندوجهی جستجوی ویدیو را متحول کرد
خلاصهٔ کاملتر
یک فصل از یک سریال نتفلیکس میتونه بیش از ۲۰۰۰ ساعت فوتیج خام داشته باشه؛ یعنی چیزی حدود ۲۱۶ میلیون فریم. وقتی یک تدوینگر دنبال لحظهای خاص میگرده، با یکی از سختترین مسائل جستجو در مهندسی نرمافزار روبروئه. نتفلیکس برای حل این مشکل یک پایپلاین سهمرحلهای ساخته که از نظر ظاهری فقط یک نوار جستجوئه، ولی زیرش یک معماری پیچیده از چند مدل هوش مصنوعی، لایه ادغام داده، و موتور جستجوی ترکیبی قرار داره.
چرا چند مدل؟ مدلهای تخصصی در کار خودشون از یک مدل همهکاره بهتر عمل میکنن. به همین دلیل نتفلیکس یک مجموعه (ensemble) از مدلهای متخصص اجرا میکنه: یکی تشخیص چهره، یکی دستهبندی صحنه، یکی رونویسی دیالوگ، و یکی شناسایی اشیاء. اما هر مدل خروجی متفاوتی تولید میکنه؛ یکی برچسب متنی مثل «جوئی»، یکی یک بردار ۵۱۲ بُعدی (عددی که «معنای» صحنه رو به شکل ریاضی نمایش میده)، و یکی متن با تایماستمپ. علاوه بر این، هر مدل ویدیو رو با بازههای زمانی متفاوت و همپوشانی برش میزنه. مثلاً مدل شخصیت «جوئی» رو از ثانیه ۲ تا ۸ تشخیص میده، ولی مدل صحنه «آشپزخانه» رو از ثانیه ۴ تا ۹ — هیچ تایملاین مشترکی وجود نداره.
مرحله اول: ذخیرهسازی تراکنشی. خروجی خام همه مدلها بدون هیچ تغییری در Apache Cassandra ذخیره میشه. این مرحله فقط یک هدف داره: سرعت نوشتن بالا و حفظ یکپارچگی داده. اگر پردازش و ادغام داده در همین مرحله انجام میشد، محاسبات سنگین، سرعت دریافت داده رو کند میکرد.
مرحله دوم: ادغام آفلاین. بعد از ذخیرهسازی، یک رویداد یک پردازش ناهمزمان رو فعال میکنه. تکنیک اصلی اینجا temporal bucketing (سطلبندی زمانی) یه — یعنی همه خروجیهای مدلها به بازههای یکثانیهای تبدیل میشن. اگر «جوئی» از ثانیه ۲ تا ۸ شناسایی شده، این بازه به هفت سطل یکثانیهای جداگانه تبدیل میشه. وقتی چند مدل برای همان ثانیه annotation تولید کردن، سیستم اونها رو در یک رکورد ترکیبی ادغام میکنه — مثلاً «جوئی در آشپزخانه در ثانیه چهارم». این رکوردها با عملیات upsert (بهروزرسانی در صورت وجود، درج در صورت نبود) با کلید ترکیبی شناسه فایل + سطل زمانی ذخیره میشن تا یک منبع واحد از حقیقت برای هر ثانیه از فوتیج وجود داشته باشه.
مرحله سوم: ایندکسگذاری برای جستجوی آنی. سطلهای زمانی غنیشده وارد Elasticsearch میشن. هر سطل به صورت یک سند تودرتو ذخیره میشه: سطح والد اطلاعات کلی دارایی (مثل شناسه فیلم و بازه زمانی) رو نگه میداره، و اسناد فرزند annotation های چندوجهی خاص مثل داده شخصیت، بردارهای صحنه و متن دیالوگ رو. این ساختار سلسلهمراتبی جستجوی cross-annotation رو در یک کوئری ممکن میکنه.
جستجوی ترکیبی. یک جستجو مثل «جوئی در آشپزخانه» دو نوع تطابق متفاوت نیاز داره. «جوئی» یک اسم خاصه و باید با کلیدواژه دقیق پیدا بشه، ولی «آشپزخانه» یک مفهوم معناییه که با جستجوی برداری (مقایسه فاصله ریاضی بین embedding های ذخیرهشده) بهتر پیدا میشه. ترکیب این دو رویکرد — که hybrid search نامیده میشه — از هر کدام به تنهایی بهتر عمل میکنه. کاربران میتونن بین جستجوی k-NN دقیق (که گرانتر ولی دقیقتره) و الگوریتمهای Approximate Nearest Neighbor (که سریعتر ولی کمی کمتر دقیقه) انتخاب کنن، و حتی آستانه اطمینان (confidence threshold) تنظیم کنن تا نتایج کماهمیت فیلتر بشن.
نکات کلیدی:
- یک فصل نتفلیکس میتونه ۲۱۶ میلیون فریم داشته باشه و خروجی مدلهای AI این رقم رو به میلیاردها نقطه داده تبدیل میکنه
- معماری سهمرحلهای (Cassandra → ادغام آفلاین → Elasticsearch) هر نگرانی رو جداگانه مدیریت میکنه
- temporal bucketing خروجیهای ناهمسو از مدلهای مختلف رو به سطلهای یکثانیهای تبدیل و ادغام میکنه
- جستجوی ترکیبی (keyword + vector) از هر رویکرد به تنهایی بهتر عمل میکنه
- نتفلیکس همزمان روی یک مدل پایه یکپارچه به نام MediaFM هم کار میکنه که نشون میده سوال ensemble در مقابل مدل واحد هنوز بیجواب مونده




