3 مهر 1402
تهران، خیابان آزادی، تقاطع قریب
هوش مصنوعی

هوش مصنوعی برای برنامه نویسان نرم افزار

هوش مصنوعی برای توسعه دهندگان نرم افزار

نکات کلیدی

توسعه دهندگان هوش مصنوعی به جای به چالش کشیدن انسان‌ها، ممکن است سعی کنند برای تقویت کار برنامه نویسان و افزایش بهره وری آن‌ها، از الگوریتم‌ها استفاده کنند. در زمینه توسعه نرم افزار، به وضوح می‌بینیم که هوش مصنوعی، هم وظایف انسانی را انجام می‌دهد و هم کارِ برنامه نویسان را تقویت می‌کند.

بر اساس تحقیقات ما، برنامه نویسان 35 درصد از زمان خود را صرف درک کد، 5 درصد را صرف نوشتن کد، 10 درصد را برای سایر فعالیت‌های مربوط به کدنویسی و 50 درصد دیگر را نیز صرف فعالیت‌هایی به جز کدنویسی می‌کنند. حتی با وجود کامپیوترهای پیشرفته. پس ما انتظار نداریم که ابزارهای هوش مصنوعی در آینده نزدیک حرفه یک برنامه نویس را از نو تعریف کنند.

کمک به برنامه نویسان برای انجام وظایف کوچکتر با بازده بیشتر، حوزه وسیعی است که هوش مصنوعی در آن کار می‌کند. هوش مصنوعی می‌تواند به تکمیل کد، آموزش استفاده از ویژگی‌های جدید، جستجو در کد و بسیاری از چیزهای فراتر از آن، به کاربر کمک کند.

نکات کلیدی توسعه هوش مصنوعی

موانع بر سر راه بی عیب و نقص شدنِ هوش مصنوعی، شامل در دسترس نبودن داده‌های آموزشی، منابع مورد نیاز و رابط بین هوش مصنوعی و کاربر است.

شرکت‌هایی که روی ابزارهای توسعه نرم افزار کار می‌کنند، به سرعت توانایی تولید راه حل‌های مبتنی بر هوش مصنوعی را برای کارهای کوچک توسعه می‌دهند. بنابراین انتظار داریم در آینده نزدیک، راه حل‌های بیشتری از این دست ظاهر شوند.

مردم در زندگی روزمره و کاری خود هر روز بیشتر و بیشتر در معرض هوش مصنوعی قرار می‌گیرند. JetBrains ابزارهایی را به این منظور برای برنامه نویسیان ایجاد می‌کند. و احساس می‌شود که صنعت توسعه نرم افزار نیز از این روند مستثنی نیست.

موارد استفاده و محدودیت

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

  • هوش مصنوعی را جایگزین انسان‌ها کنید و برخی از مشاغل آن‌ها را کاملاً اتوماتیک کنید.
  • انسان‌ها را تقویت کنید و آن‌ها را به عنوان کاراکتر اصلی این فرآیند حفظ کنید.

کدها الان هم توسط الگوریتم‌ها نوشته می‌شوند، اما توسعه دهندگان انسانی نیازی به ترس از تعویض فوری ندارند.

با کمال تعجب، این به این دلیل نیست که آموزش مهارت‌های لازم برای برنامه نویسی به کامپیوترها غیر ممکن است، بلکه به این دلیل است که این کار غیر عملی است.

سه عامل بزرگ وجود دارد که پیشرفت هوش مصنوعی را محدود می‌کند:

  • دسترسی محدود به داده‌های آموزشی
  • منابع محاسباتی محدود
  • پیچیدگی رابط بین الگوریتم‌ها و افراد

در آرگومان کار برنامه نویسان انسانی، بسیاری از کارهای پیش پا افتاده مانند تکمیل کد، جستجوی کد و تشخیص اشکال اکنون توسط یادگیری ماشین انجام می‌شود.

راه‌های اعمال هوش مصنوعی و مشکلات موجود در هر مسیر
شکل 1 : راه‌های اعمال هوش مصنوعی و مشکلات موجود در هر مسیر

مردم هوش مصنوعی را چگونه تصور می‌کنند؟

وقتی مردم اصطلاح «AI»  به معنای هوش مصنوعی را می‌شنوند، اغلب تصور می‌کنند کامپیوتر قرار است جایگزین انسان شود. کامپیوتر همان کار انسان را انجام می‌دهد، اما به نوعی بهتر، سریع‌تر، ارزان‌تر و با کیفیت بالاتر. نمونه‌هایی از این کارها شامل بازی شطرنج یا Go ، سرودن شعر و رانندگی ماشین است.

برخی از مردم این امکان را می‌پذیرند که کامپیوترها آنان را از انجام دادن کارهای پیش و پا افتاده، خلاص می‌کنند. در حالی که برخی دیگر شک دارند. دسته دوم ممکن است ادعا کنند که ماشین ‌ها با آ‌ن‌چه که انسان می‌تواند انجام دهد فاصله زیادی دارند.

سؤالات متداول در زمینه هوش مصنوعی

سؤالاتی مانند «چگونه به کامپیوتر این کار را آموزش می‌دهید؟» اغلب این مفهوم را دارند که شما نمی‌توانید. در این‌جا چند نمونه از این نوع سؤالات را که در گذشته مطرح شده‌اند، می‌بینید.

  • تعداد حرکات منطقی در Go از منابع محاسباتی موجود بیشتر است. چگونه هوش مصنوعی را جایگزین شهود انسان خواهید کرد؟ کارشناسان این مقاله در سال 1997 تخمین زدند که این کار صد سال طول می‌کشد.
  • چگونه می‌توان به یک ماشین خود-ران یاد داد که قسمت خیس جاده را ببیند و سرعتش را کم کند؟

کامپیوترها اکنون هم Go بازی می‌کنند و هم رانندگی می‌کنند. بنابراین این سؤالات منسوخ هستند. این به ما دلیلی می‌دهد که باور کنیم سؤالاتی از این نوع که هنوز باقی هستند نیز، در نهایت پاسخ داده خواهند شد. در هر زمینه شغلی که فکرش را بکنیم، کامپیوترها بیش از آن که ما انتظارش را داریم منطبق با مهارت‌های انسانی هستند.

با این حال، جایگزین کردن آن‌ها با یک انسان همیشه به صلاح نیست. توسعه دهندگان فناوری‌های مبتنی بر هوش مصنوعی باید به جای رقابت با انسان‌ها، استراتژی محصول متفاوتی را انتخاب کنند. و سعی کنند از الگوریتم‌ها برای تقویت کار برنامه نویسان و افزایش بازده کار آن‌ها استفاده کنند.

در زمینه توسعه نرم افزار، به وضوح می‌بینیم که هوش مصنوعی هم وظایف انسانی را انجام می‌دهد و هم کار برنامه نویسان را تقویت می‌کند.

جایگزینی هوش مصنوعی با برنامه نویس انسانی

انتشار GitHub Capilot  که توسط OpenAI  طراحی شده است، جان تازه‌ای به بحث‌ها درباره این‌که چه زمانی کامپیوترها جایگزین برنامه نویس‌های انسانی خواهند شد، داد. کسانی که فکر می‌کردند جایگزینی ماشین با انسان غیر ممکن است همیشه می‌پرسیدند:

  • چگونه به دستگاه توضیح می‌دهید که برنامه شما باید چه کاری انجام دهد؟

پاسخ بسیار ساده است. شما آن‌چه را که می‌خواهید، با یک زبان طبیعی تعریف می‌کنید. یک نام برای تابع انتخاب می‌کند، و به صورت اختیاری چند خط برای شروع آن می‌نویسید. سپس Copilot بقیه‌اش را پر می‌کند. دقیقاً مانند یک برنامه نویس واقعی.

برخی از مردم از هوش بالای Copilot خوشحال هستند. دیگران به درستی به اشکالات کار آن توجه می‌کنند و این موضوع را به اندازه کافی مهم می‌دانند که برنامه نویسان انسانی، هنوز هم برای آینده‌ای که پیش‌بینی می‌کنیم، لازم خواهند بود. سپس گروه دیگری از بررسی‌کنندگان وجود دارند که متوجه همان اشکالات می‌شوند، اما به این نتیجه می‌رسند که Copilot یک ابزار وحشتناک و خطرناک است که باید از آن فرار کرد.

 اشکال اصلی که به آن اشاره شد چیست؟

برنامه‌های ایجاد شده توسط Copilot ، اغلب بیش از حد طولانی هستند و به سختی خوانده می‌شوند.

وضوح بسیار مهم است، زیرا خواندن کد برای یک توسعه دهنده، مهم‌تر از نوشتن آن است. در بیشتر موارد، برنامه نویسان توابعی را بر روی کدهای تاپی که توسط افراد دیگری نوشته شده  است، اضافه می‌کنند. از این نظر، نوشتن کد مانند افزودن یک اتاق جدید به یک خانه قدیمی است. شما باید تعیین کنید که آیا چیزی که اضافه می‌کنید، تعادل را به هم می‌زند و کل ساختمان را خراب می‌کند یا خیر. اگر همه چیز ایمن است، مسئله دیگری هم وجود دارد. هنوز هم باید ساختار موجود را درک و اصلاح کنید تا بتوانید روی آن چیز جدیدی بسازید. برنامه نویسان بیشتر زمان کاری خود را صرف افزودن «اتاق‌های جدید» به «خانه‌های از پیش ساخته شده» می‌کنند.

همانطور که ر.مینلی، آ.موچی و م.لانزا دریافتند، برنامه نویسان حدود 70 درصد از زمان کدنویسی خود را صرف درک کد می‌کنند. در حالی که تلاش برای نوشتن فقط حدود 5 درصد از کل زمانشان را شامل می‌شود. بر اساس این درصدبندی و سایر مطالعات، توزیع زمان توسعه دهنده در محل کار را همان‌طور که در شکل زیر نشان داده شده است، مشاهده می‌کنیم.

زمان صرف شده توسط برنامه نویسان در محل کار و تفکیک فعالیت‌ها
شکل 2 : زمان صرف شده توسط برنامه نویسان در محل کار و تفکیک فعالیت‌ها

برنامه‌های پرگویانه و نامشخص تولید شده توسط ماشین، می‌تواند بخش «درک» را سخت و حتی دشوارتر از قبل کند.

غیرممکن ممکن است؟

بار شناختی روی بخش انسانی همچنان ادامه دارد: برنامه نویس هنوز باید متوجه این شود که الگوریتم چه چیزی می‌نویسد. انسان‌ها تا چه مدت می‌توانند سرعت تنظیم شده توسط کامپیوتر را حفظ کنند؟ داشتن Write Code هوش مصنوعی ممکن است به کارهای کوچک سرعت ببخشد، اما لزوماً درباره پروژه‌های بزرگ این طور نیست.

این فرآیند را با کنترل تجدید نظر ( revision control ) که در دهه 1970 معرفی شد مقایسه کنید. توانایی ردیابی و بازگرداندن تغییرات به حالت اولیه، مشکل محدودیت‌های درک افراد را تا حد زیادی حل کرد. این اتفاق، امکان همکاری گروه‌های بزرگی از برنامه نویسان و در نتیجه امکان ایجاد سیستم‌های پیچیده‌تر را فراهم کرد. این تحولی برای کل صنعت بود.

Copilot یک نتیجه تحقیقاتی عالی است که پتانسیل هوش مصنوعی را نشان می‌دهد. کاری را انجام می‌دهد که بسیاری از مردم تصور می‌کردند غیر ممکن است. و با این حال، ما انتظار نداریم که چنین ابزارهایی، به این زودی‌ها حرفه یک برنامه‌نویس را دوباره تعریف کنند.

کمک به برنامه نویسان انسانی

Copilot، گرچه یک پیشرفت در هوش مصنوعی مرتبط با برنامه نویسی است، اما هنوز نه یک انقلاب در صنعت است و نه یک جایگزین برای کار انسانی. با در نظر گرفتن این‌که چنین انقلابی ممکن است زمانی اتفاق بیفتد، ما همچنان باید به بهبود فرآیندهای موجود در توسعه نرم افزار ادامه دهیم. کمک به برنامه نویسان برای انجام وظایف کوچکتر با بازده بیشتر، حوزه وسیعی از کار هوش مصنوعی است.

ابزارها برای توسعه دهندگان نرم افزار، معمولاً با قوانین سخت‌گیرانه «فرآیندهای کاوشی» (heuristics ) و بدون هوش مصنوعی آغاز می‌شوند.  قوانین پیچیده‌تر می‌شوند زیرا قابلیت‌های جدیدی در هر ابزار تعبیه شده است. در نهایت، برای انسان تقریباً غیر ممکن می‌شود که همه چیز را درک کند. و بفهمد که چگونه ابزارها را تغییر دهد. این‌جاست که هوش مصنوعی می‌تواند کمک کند.

تکمیل کد

وقتی عبارتی را در گوگل سرچ می‌کنید، گوگل کاراکترهایی را که وارد می‌کنید دریافت می‌کند، و فهرست گزینه‌های پیشنهادی را در اختیار شما قرار می‌دهد. ویرایشگرهای سورس کد عملکرد بسیار مشابهی را در اختیار برنامه نویسان قرار می‌دهند.

اولین نسخه‌های تکمیل کد مدت‌ها پیش، در قرن بیستم ایجاد شدند. که فرکانس کلمات را در پروژه محاسبه می‌کردند. آن‌ها پرتکرارترین کلماتی را که با کاراکترهای تایپ شده توسط کاربر شروع می‌شد، نمایش می‌دادند. این رویکرد مبتنی بر فرکانس به اندازه کافی خوب بود که بهره وری را افزایش دهد. در طول سال‌ها، مردم الگوریتم را با روش‌هایی که بر پایه ایده فرکانس ساخته شده بودند، ارتقا دادند. اما تمایل به ارائه همان کلمه مورد نظر کاربر به شکل دقیق، ما را به استفاده از یادگیری ماشین برای مرتب کردن پیشنهادات سوق داد.

اطلاعاتی که می‌توانیم برای تعیین بهترین پیشنهاد استفاده کنیم، آن‌قدر فراوان است که ایجاد یک الگوریتم قطعی با درنظر گرفتن همه آن‌ها غیر ممکن است. ما مجبوریم که به موارد استثنائی پرتعداد رسیدگی کنیم.

قوانین کلی

به عنوان مثال، چند قانون کلی وجود دارد. هر چه توکن به مکانی که برنامه نویس در حال حاضر ویرایش می‌کند نزدیک‌تر باشد، احتمال آن بیشتر می‌شود. همچنین کتابخانه‌های زبان استاندارد را می‌توان بر اساس محبوبیت مرتب کرد. و نشانه‌های کتابخانه‌هایی با محبوبیت کمتر را می‌توان از اولویت‌بندی خارج کرد. پیرو تمام آن‌چه که گفته شد، تصور کنید که در جاوا یک ویرایشگر سورس کد ایجاد می‌کنید. (این همان کاری است که در JetBrains  انجام می‌شود.) و شروع به تایپ کردن « Co » کنید. کدام یک از دو پیشنهاد زیر را ترجیح می‌دهید؟

از یک طرف، ما در ادیتور از ساختار red-black trees استفاده می‌کنیم. در طرف دیگر، پکیج java.awt قرار دارد که به ندرت در این صنعت مورد استفاده قرار می‌گیرد. اما با این حال، به احتمال زیاد، منظور ما از « Color » در پروژه‌مان java.awt.Color است.

عوامل مؤثر بر ترتیب پیشنهادات

بیش از صد عامل وجود دارد که بر ترتیب‌بندی پیشنهادات تأثیر می‌گذارد. آیا پیشنهاد نمادی ( symbol )  است که در پروژه کاربر، در یک کتابخانه زبان استاندارد یا در یک کتابخانه وارد شده توسط شخص ثالث تعریف شده است؟ محل درج پیشنهاد در ابتدای یک لاین است یا در وسط آن؟ آیا نقطه‌ای در لاین قبلی این لوکیشن وجود دارد؟ کاربر به طور متوسط چقدر در روز کار می‌کند؟ آیا آن‌ها تعریف پیشنهاد را در تب ادیتور دیگری باز کرده‌اند؟

یادگیری ماشینی به ما این امکان را می‌دهد که الگوها را به روشی نیمه خودکار استخراج کنیم و همه این‌ها و بسیاری از عوامل دیگر را در مواردی که spell کردنِ صریح همه وابستگی‌ها امکان‌پذیر نیست، در نظر بگیریم.

با در نظر گرفتن این موضوع، استفاده از هوش مصنوعی برای تولید قطعات کوچک کد نیز امکان پذیر است. اگر ادیتور به جای تنها یک کلمه، لاین فعلی را کامل کند، بین سرعت توسعه و بار شناختی تعادل خوبی وجود دارد:

نمونه‌ای از تکمیل کد که بیش از یک کلمه را پیشنهاد می‌دهد
شکل 3 : نمونه‌ای از تکمیل کد که بیش از یک کلمه را پیشنهاد می‌دهد

برخی از شرکت‌ها این ویژگی را هسته اصلی تجارت خود می‌دانند. برای مثال، TabNine و Kite نرم افزار خود را به عنوان افزونه‌های ادیتور توزیع می‌کنند. که به برنامه نویسان کمک می‌کند تا لاین‌ها را به روش هوش مصنوعی تکمیل کنند.

آموزش استفاده از ویژگی‌های جدید به کاربر

ادیتورِ سورس کد یک نرم افزار پیچیده است. صدعا عملیات افزایش بهره وری وجود دارد که می‌توان آن‌ها را فراخوانی کرد. متأسفانه شناخت همه آن‌ها برای برنامه نویسان غیر ممکن است.

ما می‌توانیم با نشان دادن نکاتی در مورد راه‌اندازی، عملکرد خاصی را ارتقا دهیم. اما یادآوری این نکات در زمان استفاده از آن‌ها ممکن است دشوار باشد. برنامه نویسان معمولاً مجموعه‌ای از حدود پنجاه دستور ( command ) مورد علاقه دارند. با راهنمایی‌های هوشمندانه، باید دو یا سه عمل را به کاربر ارائه دهیم که بر اساس پترن‌های و عادات کاری برای او مفید باشد.

برای ایجاد این توصیه‌های شخصی‌، می‌توان از هوش مصنوعی استفاده کرد. به عنوان مثال، ممکن است بخواهیم به کاربر در مورد عملیات جابجایی کد بگوییم. اگر و تنها در صورتی که بیشتر عملیات کات / پیست را در همان صفحه انجام دهد.

نکته ادیتور عملیات « Code Move »
شکل 4 : نکته ادیتور عملیات « Code Move »

Collaborative Filtering

ساده ترین راه برای تحقق این امر، تحت عنوان «پالایش گروهی» ( collaborative filtering ) شناخته می‌شود. سیستم‌های مدرن برای توصیه موسیقی، ویدئو، کتاب و کالا همگی از آن استفاده می‌کنند. در ان فرآیند دو مرحله اساسی وجود دارد:

  • کاربران «مشابه» را پیدا کنید.
  • با بررسی الگوی رفتاری این کاربران، کارهایی مشخصی که یکی از این کاربران انجام داده و دیگری انجام نداده را، تحت عنوان پیشنهاد به آن کاربر دیگر توصیه کنید.

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

برای ویژگی‌های سورس ادیتور، این کار کمی دشوارتر است. هیچ ویژگی خاصی از یک ژانر یا یک بازیگر وجود ندارد. بنابراین باید الگوهای رفتاری کوچک‌تری را تحلیل کنیم. کاربر چقدر زمان صرف رفع اشکال می‌کند؟ هر چند وقت یک‌بار کدهای موجود را ویرایش می‌کند؟ با چه سرعتی می‌تواند تایپ کند؟ آیا قبل از نوشتن کد تست‌ها را می‌نویسند یا بعد از نوشتن آن؟ در نظر گرفتن چنین عواملی، شباهت بین کاربران را تعیین می‌کند و ابزارهایی را توصیه می‌کند که با توجه به الگوهای رفتاری شناخته شده، مفید خواهند بود.

جستجو در کد و فراتر از آن

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

ما می‌خواهیم یک تابع جستجوی واحد را در ادیتور سورس کد ارائه کنیم که می‌تواند برای یافتن هر یک از دامنه‌های بالا، با درنظر گرفتن مترادف‌ها و اشتباهات تایپی استفاده شود. از آن‌جایی که افراد زیادی بر روی الگوریتم‌های جستجو کار می‌کنند، می‌توان انتظار داشت که یک راه حل استاندارد، با قابلیت استفاده مجدد وجود داشته باشد. اما افسوس که هر دامنه دارای جزئیات خاصی است که این جزئیات، به طور جداگانه نیاز به توسعه عملکرد جستجو دارند.

پیچیدگی‌ها زمانی آغاز می‌شوند که انواع آیتم‌های مختلف با نام‌های مشابه در پروژه موجود باشد. اگر کاربر در حالی که فایلی به نام Formatter.java در پروژه‌اش وجود دارد، « format » را در کادر جستجو تایپ کند، آیا به دنبال آن فایل برای توابع کتابخانه‌ای قالب‌بندی استاندارد می‌گردد؟ یا به دنبال کارآمدی IDE به منظور قالب‌بندی مجدد کد پروژه خود است؟

یادگیری ماشین به عنوان ابزاری برای ترکیب نتایج جستجو از منابع مختلف و مقایسه آن‌ها با یکدیگر عمل می‌کند. عوامل مؤثر بر تصمیم عبارت‌اند از: تطابق متن، سابقه جستجوی کاربر، ترجیحات قبلی آن‌ها، (به عنوان مثال، آیا بر روی نتایج جستجوی فایل کلیک می‌کنند؟) محتوای پروژه کاربر و آخرین چیزی که کاربر پیش از انتشار ادیت می‌کرد. نوشتن یک الگوریتم قطعی با در نظر گرفتن همه این موارد، عملی نیست. در حالی که روش‌های یادگیری ماشین الگوها را به طور خودکار استخراج می‌کنند.

داد و ستد عرضه هوش مصنوعی

مجموعه تمام پیشرفت‌های کوچک مبتنی بر هوش مصنوعی، می‌تواند منجر به افزایش چشمگیر بازده کاربری شود. اما هزینه‌ای هم دارد.

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

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

موانع رسیدن به هوش مصنوعی بی عیب و نقص

در دسترس نبودن داده‌های آموزشی

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

وظایف تولید کد، چه تکمیل شده در IDE و چه تولید یک تابع کامل در Copilot ، برای آموزش نیاز به سورس کد دارند. و استفاده از Repository های اپن سورس موجود در GitHub طبیعی به نظر می‌رسد. با این حال، این Repository ها مملو از لایسنس‌هایی هستند که ممکن است الزامات اضافی را بر کارهای مشتق تحمیل کنند.

دو پرسش کلیدی در الگوریتم‌های هوش مصنوعی

این امر ما را با دو سؤال بزرگ روبرو می‌کند. آیا الگوریتم‌های هوش مصنوعی ما، کار مشتقِ کدی است که برای آموزش از آن استفاده کرده‌ایم؟ و آیا متنی که این الگوریتم می‌نویسد، یک کار مشتق است؟

از یک طرف، نویسندگان هوش مصنوعی چیزی را در الگوریتم کپی نمی‌کنند. از سوی دیگر، شبکه nueral توانایی تفکر مستقل ندارد. تمام کدهایی که این شبکه تولید می‌کند ترکیبی از قطعاتی است که در مرحله یادگیری دیده است. حتی ممکن است قطعه کدهایی ایجاد کند که شبیه به کپی‌های دقیق از مجموعه داده آموزشی باشند. نکته این‌جاست که حتی قطعاتی که مستقل به نظر می‌رسند هم مستقل از کپی‌ها نیستند.

این یک مشکل جدید است و ما هنوز هیچ تصمیم قطعی‌ برای حل آن مشاهده نکرده‌ایم. این عدم اطمینان، پیشرفت توسعه دهندگان محصول را کُند می‌کند. چرا که مردم نمی‌خواهند در کاری سرمایه‌گذاری کنند که ممکن است فردا غیرقانونی شود.

مشکلات فنی

ما هنگام ایجاد سیستم تکمیل کدمان با همین مشکل روبرو شدیم. علاوه بر محدودیت‌های قانونی احتمالی، مشکلات فنی نیز وجود داشت. کدی که می‌توانیم در یک Repository اپن سورس پیدا کنیم، به نوعی «کامل» است. معمولاً کامپایل می‌شود، آزمایش‌های ساده را پشت سر می‌گذارد، قالب‌بندی واضحی دارد و حاوی بلوک‌های تکراری یا سکشن‌های باگ‌زدایی موقت نیست. با این حال، کدی که در ادیتور باید با آن کار کنیم، اغلب اوقات «کامل» نیست. بنابراین، داده‌های آموزشی که می‌توانیم از Repository های منبع باز به دست بیاوریم، با شرایط بهره برداری مطابقت ندارند.

ما به کمک آمار استفاده از محصولاتمان، این محدودیت‌ها را برطرف کردیم. ساختن این داده‌ها به صورت ناشناس، تلاش زیادی را می‌طلبید. اما در نهایت همه چیز به خوبی انجام شد.

این‌ها تنها چند نمونه از مسائلی هستند که افراد هنگام تلاش برای جمع‌آوری داده‌های آموزشی از الگوریتم‌های مبتنی بر هوش مصنوعی، با آن‌ها مواجه می‌شوند.

منابع مورد نیاز

الگوریتم‌های هوش مصنوعی تشنه‌ منابع هستند. این عطش پیامدهای متفاوتی در مراحل یادگیری و بهره برداری دارد. محدودیت منابع هزینه‌های اضافی زیادی را بر مرحله یادگیری تحمیل می‌کند. جایی که توسعه دهندگان الگوریتم ممکن است تصمیم بگیرند که آیا بر روی سخت افزار سرمایه گذاری کنند یا خیر. اما در مرحله بهره برداری، نه منابع توسعه‌دهندگان الگوریتم ، بلکه منابع کاربران آن‌هاست که تبدیل به عامل محدودکننده می‌شود.

یکی از راه حل‌های استاندارد برای حل مشکل تقاضای منابع در طول بهره برداری، انتقال محاسبات فشرده منابع به یک خوشه از راه دور (remote cluster ) است. مشتریان ما معمولاً می‌خواهند سورس کد خود را در شبکه محافظت‌شده خودشان نگهداری کنند. بنابراین استفاده از سرور از راه دور (remote server ) اغلب غیرممکن است. این بدان معناست که الگوریتم‌های ما باید سورس ادیتوری در لپ‌تاپ کاربر کار کنند. ادیتور دارای ویژگی‌های زیادی است و مقدار قابل توجهی از منابع موجود را مصرف می‌کند. بنابراین هر بایت اختصاصی جدید، محاسبه می‌شود.

تفاوت دیدگاه یک توسعه دهنده عادی و یک یادگیرنده ماشین

درباره منابع، بین دیدگاه یک توسعه دهنده نرم افزار معمولی و یک یادگیرنده ماشین، شکاف قابل توجهی وجود دارد. داستان زیر می‌تواند تصریح کند که این شکاف چقدر عمیق و بزرگ است.

هنگامی که برای اولین بار تکمیل کد قانومند را با یادگیری ماشین جایگزین کردیم، تیم مسئول این کار، نیاز به حافظه اضافی را به 1.5 مگابایت کاهش داد. تیم فکر می‌کرد که چنین کاهشی غیرممکن نیست و همه به این موضوع افتخار می‌کردند. خنده‌دار است که افراد مختلف، وقتی این موضوع را شنیدند، چگونه به آن واکنش نشان دادند.

محققان دانشگاهی هوش مصنوعی که با آن‌ها همکاری داشتیم گفتند: «1.5 مگابایت؟ شوخی می‌کنی؟ ما با حدود 1 گیگابایت شروع می‌کردیم!»

در سمت دیگر، توسعه دهندگان ابزار سنتی که این تغییر را بررسی کردند، گفتند: «1.5 مگابایت؟  این همه رو می‌خوای چیکار؟!»

محققان اغلب فکر می‌کنند که منابع بی‌نهایت هستند. در حالی که تولید باید با سخت افزار موجود اجرا شود. این یکی از دلایلی است که باعث می‌شود نتایج تحقیقات در زمینه پیشرفت هوش مصنوعی، به سختی تولید می‌شوند.

رابط بین هوش مصنوعی و کاربر

اما حتی زمانی که اجرای عملیات از راه دور ممکن است، اجرای هوش مصنوعی بر روی یک remote server به جای دستگاه مشتری، ممکن است یک مشکل کاربردی و مهم ایجاد کند.

هرگونه تأخیر می‌تواند برای کاربران غیر قابل تحمل باشد. به خصوص اگر برای چیزی بسیار کوچک باشد. بنابراین رفت و برگشت به سرور به منظور تکمیل کد، توصیه‌های مبتنی بر ویژگی‌ها و سایر پیشرفت‌های مبتنی بر هوش مصنوعی ممنوع است.

حتی با سرعت کافی، ویژگی‌های مبتنی بر هوش مصنوعی باید به شیوه‌ای تقریباً یکپارچه با گردش کار کاربران ترکیب شوند. و حواس پرتی ایجاد نکنند.

به عنوان مثال، ما می‌توانیم برخی از اشکالات را در کد کاربر پیدا کنیم. در نگاه اول، به نظر می‌رسد این نوع از عملکرد، احتمالاً مورد علاقه کاربران باشد. با این حال، یافتن زمان مناسب برای گزارش یک اشکال، هنوز هم چالش برانگیز است. هشدار به کاربر در زمانی که تا زانو در کدنویسی خود است، فقط حواس او را پرت می‌کند. و احتمالاً باعث می‌شود که این ویژگی را غیرفعال کند. ما باید در لحظه‌ای این کار را انجام دهیم که برنامه نویس بخشی از کار را تکمیل کرده است. و در مرحله‌ای قرار دارد که می‌خواهد قبل از ادامه کار، آن را برای عیب‌یابی بررسی کند.

شاید در این‌جا بتوانیم با یک الگوریتم هوش مصنوعی تصمیم‌گیرنده، نتایج حاصل از یک الگوریتم هوش مصنوعی دیگر را ارائه کنیم. درست نیست؟

مشتاقانه منتظریم!

هوش مصنوعی برای توسعه نرم افزار در راه است. درست همان طور که قرار است در حوزه‌های دیگر استفاده شود. و تلاش می‌کند با تقلید از انسان‌ها کار آن‌ها را تقویت کند.

کامپیوترها اکنون می‌توانند کد بنویسند، اما این یک تحول صنعتی نیست. توانایی کدنویسی برای جایگزینی با یک برنامه‌نویس انسانی کافی نیست. به نظر می‌رسد که توانایی در نظر گرفتن تعاملات پیچیده اجزای نرم افزار بسیار مهم است و هوش مصنوعی هنوز این قابلیت را ندارد.

در این بین، فرصت‌های متعددی برای استفاده از یادگیری ماشین برای ارائه پیشرفت‌های جزئی وجود دارد. و مجموع این پیشرفت‌ها، می‌تواند بازده کار توسعه دهندگان نرم افزار را افزایش دهد. شرکت‌هایی که روی ابزارهای توسعه نرم افزار کار می‌کنند، به سرعت توانایی تولید راه حل‌های مبتنی بر هوش مصنوعی را برای کارهای کوچک توسعه می‌دهند. بنابراین، انتظار می‌رود که در آینده نزدیک، راه حل‌های بیشتری از این دست ایجاد شوند.

منبع: infoq    نویسنده: نیکیتا پوواروف ( متخصص آمار داده، یادگیری ماشین و هوش مصنوعی در JetBrains )

Leave feedback about this

  • کیفیت
  • قیمت
  • خدمات

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video
X