من یک ربات پرسش و پاسخ کد با RAG ساختم: چه چیزهایی جواب داد و چه چیزهایی شکست خورد
توسعهدهندگان ما روزها را صرف جستجو در Slack و اسناد قدیمی میکردند تا میکروسرویسهایمان را درک کنند. تصمیم گرفتم یک چتبات بسازم تا با استفاده از RAG به این سوالات پاسخ دهد.
من در این مسیر اشتباهات زیادی مرتکب شدم. در اینجا آنچه یاد گرفتم را آوردهام.
شکستها
- سعی کردم تمام اسناد را در یک پرامپت قرار دهم. این کار باعث رسیدن به محدودیت توکن، ایجاد توهم (hallucination) و هزینههای بسیار بالا شد.
- از یک ایندکس ساده TF-IDF استفاده کردم. وقتی کاربران از مترادفها یا اصطلاحات متفاوت استفاده میکردند، این روش شکست میخورد.
- از تکهبندیهای (chunks) ساده ۵۰۰ کاراکتری استفاده کردم. نتایج تصادفی بودند زیرا تکهها اغلب در میان یک جمله قطع میشدند.
راه حل
من دیگر با LLM مانند یک موتور جستجو برخورد نکردم. آن را به یک موتور خواندن برای یک ایندکس جستجوی اختصاصی تبدیل کردم.
این همان فرآیندی (pipeline) است که جواب داد:
- اسناد را به قطعات ۳۰۰ توکنی با ۵۰ توکن همپوشانی (overlap) تقسیم کنید.
- هر قطعه را به یک بردار (vector) تبدیل کنید (embed).
- بردارها را در یک ایندکس جستجوی شباهت ذخیره کنید.
- در زمان پرسش، ۵ قطعه بسیار مشابه را پیدا کنید.
- فقط همان قطعات را برای تولید پاسخ به LLM بدهید.
این تغییر، توهمات را تا ۸۰٪ کاهش داد و هزینهها را به کمتر از ۰.۰۱ دلار برای هر پرسش رساند.
نکات کلیدی
- اندازه تکهها (chunk size) حیاتی است. ۱۵۰ توکن بافت (context) بسیار کمی است. ۱۰۰۰ توکن نویز بسیار زیادی دارد. ۳۰۰ توکن نقطه بهینه است.
- همپوشانی (overlap) الزامی است. این کار از از دست رفتن بافت بین تکهها جلوگیری میکند.
- برای سرعت بیشتر از مدلهای کوچک استفاده کنید. یک مدل embedding کوچک برای نیازهای داخلی ما به خوبی عمل کرد.
- بازیابی (retrieval) خود را تست کنید. به بررسیهای دستی تکیه نکنید. یک مجموعه تست برای اندازهگیری دقت بسازید.
RAG جادو نیست؛ یک معمای مهندسی است. اگر تکههای شما بد باشند، بازیابی شما بد خواهد بود. اگر بازیابی شما بد باشد، پاسخهای شما بد خواهد بود.
ما اکنون به ۸۰٪ از سوالات مربوط به فرآیند آشنایی با سیستم (onboarding) به درستی پاسخ میدهیم. این بسیار سریعتر از انتظار برای پاسخ یک انسان در Slack است.
شما چگونه دستیارهای هوش مصنوعی برای مستندات خود میسازید؟
Optional learning community: https://t.me/GyaanSetuAi