چگونه با استفاده از LLM یک مجموعه داده 10K ایجاد کردیم تا LLM دیگری را تنظیم کنیم

معرفی
پس از خراش دادن دادههایی که بهعنوان ورودی برای LLM برای تولید خروجی استفاده میشوند، ما نیاز به ایجاد یک مجموعه داده برای تنظیم دقیق یک LLM برای Tarwiiga AdGen، یک تولیدکننده تبلیغات Google با استفاده از هوش مصنوعی توسعهیافته در Tarwiiga بودیم. این ابزار ورودی می گرفت و یک خروجی JSON تولید می کرد. در حالی که ما به LLMهایی مانند GPT OpenAI، Google’s Gemini، و Anthropic’s Claude برای تولید تبلیغات با اعلانهای خاص و استفاده از تجزیهکنندههای LangChain برای دریافت JSON متکی بودیم، میخواستیم از این رویکرد برای تولید مجموعه داده استفاده کنیم. در اینجا، من رویکرد خود را برای تولید مجموعه داده 10K مورد بحث قرار می دهم.
رویکرد قدیمی
اما قبل از آن، میخواهم اشاره کنم که ابتدا سعی کردم LLM همه چیز را از ورودی تا خروجی تولید کند. من از آن خواستم لیستی از 10 ورودی به من بدهد و سپس از طریق این لیست حلقه زدم تا خروجی JSON تولید و آنها را در یک فایل CSV ذخیره کنم. با این حال، متوجه شدم که هر بار که فهرستی از ورودی ها را درخواست می کردم، موارد تکراری زیادی ایجاد می کند. من فکر می کنم این اتفاق افتاد زیرا API LLM در حال ذخیره پاسخ ها بود. در حالی که میتوان این مشکل را برای کاهش تعداد موارد تکراری حل کرد، من تصمیم گرفتم با دادههای واقعی که انتظار دارم در آینده هنگام استفاده از ابزار دریافت کنم، کار کنم. علاوه بر این، تولید همه ورودیها و سپس ادامه تولید خروجی خیلی طول میکشید.
خراش دادن داده ها
به همین دلیل است که دادهها را برای استفاده بهعنوان ورودی حذف کردم. همانطور که در مقاله ذکر شد، با رویکردی که دنبال کردم، توانستم میلیون ها نقطه داده را حذف کنم. به طور خاص، من دادهها را از 12 دسته جمعآوری کردم که هر دسته شامل 5000 صفحه بود. هر صفحه حدود 20 ورودی داشت که در مجموع 12 * 5000 * 20 = 1200000 ورودی یا تقریباً یک میلیون و دویست هزار ورودی داشت. در واقعیت، برخی از صفحات حاوی بیش از 20 ورودی بودند، بنابراین من با 1239232 نقطه داده به پایان رسیدم. ورودی های تکراری زیادی وجود داشت – به طور دقیق 1،173،847 – من را با 65،385 نقطه داده منحصر به فرد باقی گذاشت. در حالی که این رویکرد ورودی های تکراری را به طور کامل حذف نکرد، دریافت ورودی از منبع دیگری به جای تکیه بر LLM بسیار سریعتر بود. اکنون، LLM می تواند تنها بر تولید خروجی ها تمرکز کند.
بررسی اجمالی سریع
همانطور که من درخواست های API را به API های LLM ارسال می کردم، باید راهی برای مدیریت کارآمد فرآیند تولید پیدا کنم. من با یک دسته شروع کردم و 200 صفحه را مرور کردم که هر صفحه شامل حدود 20 ورودی بود، گاهی اوقات کمی بیشتر یا کمتر. این فرآیند به من اجازه داد تا حدود 3859 نقطه داده را برای دسته اول ایجاد کنم. برای دسته دیگر، حدود 3899 نقطه داده و برای دسته سوم 2171 نقطه داده تولید کردم. در مجموع، این به 3,859 + 3,899 + 2,171 = 9,929 نقطه داده است که تقریباً یک مجموعه داده 10K است.
در طول فرآیند تولید، من توانستم Gemma 2B گوگل را بر روی یک مجموعه داده 1K تنظیم کنم که نتایج بسیار خوبی به همراه داشت. در پست آینده درباره تنظیم دقیق صحبت خواهم کرد، اما در حال حاضر، میخواهم روی نحوه مدیریت فرآیند تولید تمرکز کنم.
فرآیند تولید
فرآیند اولیه است و من در ابتدا هیچ بهینه سازی انجام ندادم. من فقط می خواستم شروع کنم و ببینم اوضاع چطور پیش می رود. برای درک آن، اجازه دهید از پایین به بالا شروع کنیم. ابتدا کد AdGen را داریم که یک ورودی می گیرد و یک خروجی JSON تولید می کند که نشان دهنده عناصر Google Ad است. این با یک فرمان و تجزیه کننده ویژه برای استخراج JSON ساخته شده است.
با حدود 20 ورودی در هر صفحه، آنها را به تکه های اندازه 5 تقسیم کردم. در بالای این، یک حلقه وجود دارد که برای دریافت ورودی از صفحات عبور می کند. من آن را در 10 صفحه حلقه کردم تا 20 ورودی از هر صفحه را دریافت کنم، سپس آن 20 ورودی را به تکه های 5 تایی تقسیم کردم. برای هر ورودی، یک درخواست به LLM ارسال شد و خروجی در یک فایل CSV ذخیره شد. این منجر به یک پوشه دسته بندی با 200 زیرپوشه برای صفحات شد و در داخل هر صفحه، 4 فایل CSV مجموعه داده وجود داشت.
این فرآیند در برخی از LLM ها مانند GPT-4 زمان زیادی طول کشید و در برخی دیگر مانند GPT-3.5 و Gemini Pro 1.5 سریعتر بود. من فکر می کنم GPT-4 کندتر بود زیرا با درخواست های کاربران دیگر مشغول بود، اگرچه مطمئن نیستم. همچنین مشکلاتی در مورد جمینی وجود داشت که چندین بار تلاش می کرد. من یک اسکریپت مشابه را چندین بار اجرا کردم و هر بار محدوده صفحات را تغییر دادم: اسکریپت اول از صفحه 0 به 10، اسکریپت دوم از صفحه 10 تا 20 و غیره.
در حالی که فکر میکنم این رویکرد میتواند بهینهسازی و بهبود یابد، هدف من تولید سریع مجموعه دادهای برای تنظیم دقیق بود. با این رویکرد، من توانستم یک مجموعه داده 10K ایجاد کنم، که برای تنظیم دقیق هر LLM بسیار خوب است، اگرچه حاوی ورودی های تکراری است. ورودی های منحصر به فرد، همانطور که در بالا ذکر شد، حدود 65K بود. ایجاد یک مجموعه داده 65K مستلزم بهینه سازی کد برای سریعتر کردن آن است، اما این در حال حاضر ضروری نیست. بعدا قابل انجام است
نتیجه
امیدوارم این مقاله برای شما مفید بوده باشد. لطفا از پرسیدن هرگونه سوال از من دریغ نکنید و می توانید با من تماس بگیرید توییتر (X) و لینکدین