OpenAI چطور صدای هوش مصنوعی رو برای ۹۰۰ میلیون کاربر کمتأخیر نگه میداره
خلاصهٔ کاملتر
voice AI یا مثل یه گفتگو به نظر میرسه، یا مثل یه walkie-talkie. خط بین این دو تجربه میلیثانیهست. اگه مکثی بین صحبت کاربر و جواب مدل باشه، توهم گفتگو میشکنه. علاوه بر این، audio باید بهصورت یه جریان پیوسته به مدل برسه - نه بعد از اینکه کاربر تمام کرد. این stream یهطرفهست که مدل میتونه در حین صحبت کاربر شروع به transcribe و استدلال کنه.
WebRTC پروتکل استانداردی که صنعت برای این کار ساخته، یه bundle از چند پروتکله: ICE برای پیدا کردن مسیر بین دو endpoint از پشت firewall، DTLS برای رمزنگاری، SRTP برای packet های audio، و RTCP برای feedback کیفیت. Justin Uberti که یکی از معماران اصلی WebRTC هست، الان در OpenAI کار میکنه.
مشکل اینه که WebRTC فرض میکنه server یه IP و port ثابت داره. ولی Kubernetes pod هارو هرجایی که ظرفیت وجود داشته باشه schedule میکنه و آدرسشون موقتیه. یه session WebRTC که به یه pod وصله باید تا آخر همون pod بمونه - ولی Kubernetes این رو تضمین نمیکنه.
مشکل دیگه port exhaustion هست. deployment سنتی WebRTC از یه UDP port برای هر session استفاده میکنه. در مقیاس OpenAI این بهمعنی دهها هزار port عمومی per service هست که load balancer های cloud برای اون طراحی نشدن.
راهحل OpenAI split کردن stack به دو بخشه. یه stateless relay در لبه جغرافیایی شبکه packet هارو route میکنه بدون اینکه session state داشته باشه. یه stateful transceiver همه state سنگین WebRTC رو نگه میداره و میتونه جای دلخواهی در cluster اجرا بشه. کلید اتصال این دو، ICE ufrag هست - یه فیلد که اصلاً در پروتکل WebRTC وجود داشت و در اولین packet session فرستاده میشه. relay میتونه این فیلد رو بخونه و بفهمه session رو به کجا route کنه، بدون اینکه هیچ state نگه داشته باشه.
روی این بنا، OpenAI یه relay جهانی ساخته، WebRTC رو در userspace Go پیادهسازی کرده، از Redis cache برای سرعت استفاده میکنه، و socket رو در سطح kernel بهینه کرده.
نکات کلیدی:
- WebRTC و Kubernetes با هم سازگار نیستن - از نظر port management و state persistence
- راهحل: split به stateless relay در لبه و stateful transceiver در cluster
- ICE ufrag بهعنوان routing key - فیلدی که از قبل در پروتکل وجود داشت
- Go userspace implementation و Redis cache بخشی از معماری نهاییه




