فهرست مطالب
Toggleیکی از داغترین موضوعات حال حاضر در هوش مصنوعی RAG یا بازیابی افزایش تولید است. یک روش بازیابی است که توسط برخی ابزارهای هوش مصنوعی برای بهبود کیفیت و ارتباط خروجیهایشان استفاده میشود.
سازمانها، ابزارهای هوش مصنوعی را میخواهند که از RAG استفاده کنند، زیرا بدون تلاش و هزینه آموزش مدل سفارشی، RAG میتواند ابزارها را از دادههای اختصاصی آگاه کند. همچنین مدل ها را به روز نگه می دارد .هنگام ایجاد پاسخ بدون RAG، مدلها فقط میتوانند از دادههایی استفاده کنند که در زمان آموزش وجود داشتهاند. اما، با RAG، مدلها میتوانند از پایگاه داده خصوصی اطلاعات جدیدتر، برای پاسخهای آگاهانهتر استفاده کنند.
این مقاله تاثیر عمیق RAG ، معماری، مزایا، چالشها و رویکردهای متنوعی که به آن قدرت میدهد را بررسی می کند.
چرا همه در مورد RAG صحبت می کنند؟
یکی از دلایلی که همیشه مجبور هستید خروجی های یک ابزار هوش مصنوعی را برای تأیید بررسی کنید به این خاطر است که داده های آموزشی آن، دانش به روز ندارند. مدلها خروجیهایی را تولید می کنند که بر اساس درخواست طراحی شدهاند، اما آنها فقط میتوانند به اطلاعاتی که در زمان آموزش وجود داشته اند رجوع کنند. اما با RAG، یک ابزار هوش مصنوعی می تواند از منابع داده فراتر از داده های آموزشی مدل خود برای تولید خروجی استفاده کند.
چگونه RAG درک متنی مدل هوش مصنوعی را افزایش می دهد؟
با RAG، یک LLM می تواند فراتر از داده های آموزشی رفته و اطلاعات را از انواع منابع داده، از جمله منابع اختصاصی بازیابی کند.
پیشرفت های سریع در مدل های زبان بزرگ (LLM) چشم انداز هوش مصنوعی (AI) را تغییر داده است و قابلیت های بی نظیری در درک و تولید زبان نزدیک به زبان طبیعی انسان ارائه می دهد. مدلهای زبان بزرگ (LLM) ، قطعات مهندسی و علمی شگفتانگیزی هستند، با توانایی استدلال و ایجاد یا تولید چیزهای جدید. با این حال، برای مفید ساختن یک LLM برای برنامه یا پروژه مبتنی بر هوش مصنوعی، باید مطمئن شوید که از دادههای مرتبط به آن استفاده میکنید. این مدلها که بر روی دادههای آنلاین گسترده طراحی شدهاند،که وسعت تعامل ما با سیستمهای مجهز به هوش مصنوعی را گستردهتر کردهاند. با این حال، مانند هر تکنولوژیکی جدید، آنها با مجموعه ای از محدودیت ها همراه هستند. یکی از مسائل آشکار تمایل گاه به گاه آنها برای ارائه اطلاعات نادرست یا قدیمی است. علاوه بر این، LLM ها منابع واکنش ها و پاسخگویی های خود را ارائه نمی دهند، که بررسی قابل اطمینان بودن خروجی آنها را به چالش میکشد. این محدودیت بهویژه در زمینههایی که دقت و قابلیت ردیابی پراهمیت است، بسیار مهم میشود.
(Retrieval-Augmented Generation) RAG در هوش مصنوعی یک مثال تحول آفرین است که نوید انقلابی در قابلیت های هوش مصنوعی را می دهد.
RAG این شکاف ها(محدودیت هایی مانند ظرفیت اطلاعات و نادرستی های LLM) را با ادغام یکپارچه اجزای مبتنی بر بازیابی و تولید پر می کند و به LLM ها کمک می کند تا از منابع دانش خارجی بهره ببرند. با انجام این کار، ما از پتانسیل RAG برای اصلاح مدل های زبان بزرگ و هموار کردن راه برای ارتباطات دقیق تر، آگاه تر از زمینه و قابل اعتمادتر هوش مصنوعی پرده برداری می کنیم.
درک (Retrieval-Augmented Generation) RAG
Retrieval-Augmented Generation یا RAG یک رویکرد پیشرفته در زمینه هوش مصنوعی (AI) و پردازش زبان طبیعی (NLP) است. RAG در اصل چارچوبی نوآورانه است که نقاط قوت مدلهای مبتنی بر بازیابی و تولید را ترکیب میکند و نحوه درک و تولید متنهای انسانمانند توسط سیستمهای هوش مصنوعی را متحول میکند.
نیاز به RAG چیست؟
توسعه RAG پاسخی مستقیم به محدودیتهای مدلهای زبان بزرگ (LLM) مانند GPT است. در حالی که LLMها قابلیتهای تولید متن قابل توجهی را نشان دادهاند، اغلب برای ارائه پاسخهای مرتبط با زمینه به مشکل بر می خورندد که مانع از استفاده آنها در کاربردهای عملی میشوند. هدف RAG این است که با ارائه راهحلی که در درک هدف کاربر و ارائه پاسخهای معنیدار و آگاه از متن عالی است، این شکاف را پر کند.
برای مثال، یک چت ربات هواپیمایی که به یک مسافر مکرر که در مورد ارتقای یک پرواز خاص بر اساس مایلهای انباشته شده میپرسد، پاسخ میدهد، اگر پاسخ دهد «لطفاً با پشتیبانی پروازهای مکرر تماس بگیرید» خیلی مفید نخواهد بود.
اما هنگامی که RAG LLM خطوط هوایی را با مجموعه داده های هر کاربر خاص افزایش می دهد، پاسخ متنی بسیار بیشتری می تواند ایجاد شود، مانند: «فرانسیس، شما 929100 مایل در اختیار دارید. برای پرواز EG17 از نیویورک به مادرید، که در ساعت 7 بعد از ظهر 5 نوامبر 2024 حرکت می کند، می توانید برای 30000 مایل به کلاس تجاری یا 90000 مایل به کلاس اول ارتقا دهید. چگونه می خواهید ادامه دهید؟”
تفاوت را می بینید؟
RAG توسط پاتریک لوئیس، محقق در متا و دانشگاه کالج لندن و نویسنده اصلی مقاله 2020 ابداع شده. RAG با استفاده از یک مدل، اسنادی را که احتمالاً مرتبط با یک سؤال است (به عنوان مثال، یک صفحه ویکیپدیا) با استفاده از آنچه اصولا جستجوی کلمه کلیدی است بازیابی میکند و سپس از مدل میخواهد تا با توجه به این داده های اضافی، پاسخهایی را تولید کند.
وقتی با یک مدل هوش مصنوعی دارای قدرت تولید مانند ChatGPT یا Llama تعامل دارید و سوالی میپرسید، پیشفرض این است که مدل از روی حافظه پارامتریک خود (یعنی از دانش ذخیره شده در مولفه های آن) پاسخ دهد . در نتیجه دیوید وادن، دانشمند محقق در AI2، بخش تحقیقاتی متمرکز بر هوش مصنوعی مؤسسه غیرانتفاعی آلن، توضیح داد: آموزش بر روی داده های عظیم از وب. اما، همانطور که اگر مرجعی [مثل یک کتاب یا یک فایل] در جلوی خود داشته باشید، احتمالاً پاسخهای دقیقتری میدهید، در برخی موارد برای مدلها نیز همین امر صادق است.»
مفید بودن RAG غیرقابل انکار است.به یک مدل اجازه میدهد چیزهای تولید شده را به اسناد بازیابی شده نسبت دهد تا واقعیت و علمی بودن آنها را تأیید کند (و به عنوان یک مزیت اضافه، از نقض copyright خودداری می شود). RAG همچنین به شرکتهایی که نمیخواهند از اسنادشان برای آموزش مدلی استفاده شود ،مثلاً شرکتهایی که در صنایع بسیار پراهمیت مانند مراقبتهای بهداشتی و قانون هستند ،این امکان را میدهد تا به مدلها اجازه دهند از این اسناد به روشی امنتر و موقت استفاده کنند.
تلاشهای مداوم زیادی برای آموزش مدلها برای استفاده بهتر از اسناد بازیابی شده توسط RAG در حال اجرا است.
برخی از این تلاشها شامل مدلهایی است که میتوانند «تصمیم بگیرند» چه زمانی از اسناد استفاده کنند، یا مدلهایی که میتوانند در وهله اول بازیابی را در صورت غیرضروری بودن انجام ندهند. برخی دیگر بر روی راههایی برای فهرستبندی کارامدی تر بودن مجموعه دادههای عظیم اسناد و بهبود جستجو از طریق نمایش بهتر اسناد تمرکز میکنند (نمایشهایی که فراتر از کلمات کلیدی است).
مزایای RAG چیست؟
RAG با ادغام مدلهای بازیابی و هوش مصنوعی مولد (AI)، پاسخهایی را ارائه میکند که دقیقتر، مرتبطتر و اصلیتر هستند که حتی به نظر میرسند از انسانها آمدهاند. به این دلیل است که مدلهای RAG میتوانند زمینه پرسوجوها را درک کنند و با ترکیب بهترینهای هر دو مدل، پاسخهای تازه و منحصربهفردی تولید کنند. با انجام این کار، مدل های RAG:
- دقیق تر هستند: ابتدا با استفاده از یک مدل بازیابی برای شناسایی اطلاعات مرتبط از منابع دانش موجود، پاسخهای اولیه مشابه به پاسخ های انسانی که تولید میشوند بر اساس اطلاعات مرتبطتر و بهروزتر از یک مدل تولیدی بدون RAG هستند.
- در ترکیب کردن اطلاعات بهتر هستند: با ترکیب مدلهای بازیابی و مدل های تولیدی، RAG میتواند اطلاعات را از منابع متعدد ترکیب کند و پاسخهای تازه را به روشی شبیه تر به انسان ایجاد کند.که به ویژه برای پرس و جوهای پیچیده تر که نیاز به یکپارچه سازی اطلاعات از منابع متعدد دارند مفید است.
- مهارت در قرار دادن اطلاعات در متن دارند: برخلاف مدلهای بازیابی ساده، RAG میتواند پاسخهایی ایجاد کند که از زمینه یک مکالمه آگاه هستند که در نتیجه مرتبطتر می شوند.
- آموزش آن ها آسان تر است: آموزش یک مدل زبان بزرگ مبتنی بر NLP (LLM) برای ساخت یک مدل هوش مصنوعی مولد، نیاز به حجم عظیمی از داده ها دارد. در حالیکه، مدلهای RAG از منابع دانش از قبل موجود و بازیابی شده استفاده میکنند و نیاز به یافتن و دریافت مقادیر عظیمی از دادههای آموزشی را کاهش میدهند.
- کارآمدتر هستند: مدلهای RAG میتوانند کارآمدتر از مدلهای تولیدی در مقیاس بزرگ باشند، زیرا در مرحله بازیابی اولیه، زمینه داده ها و در نتیجه حجم دادههایی را که باید در مرحله تولید پردازش شوند، را محدود میکند.
امروزه چگونه از RAG استفاده می شود؟
چند نمونه و نحوه استفاده از مدل های RAG در دنیای واقعی امروزه را بررسی می کنیم:
- بهبود پشتیبانی مشتری: از RAG می توان برای ساخت چت بات های پیشرفته یا دستیاران مجازی استفاده کرد تا پاسخ های شخصی شده تر و دقیق تری را به سؤالات مشتری ارائه دهند. که میتواند منجر به پاسخهای سریعتر، افزایش کارایی عملیاتی و در نهایت، رضایت بیشتر مشتری از پشتیبانی شود.
- تولید محتوا: RAG میتواند به کسبوکارها در تولید پستهای وبلاگ، مقالات، کاتالوگهای محصول یا سایر محتواها با ترکیب قابلیتهای تولیدی خود با بازیابی اطلاعات از منابع معتبر خارجی و داخلی کمک کند.
- انجام تحقیقات در بازار: با جمعآوری اطلاعات از حجم وسیعی از دادههای موجود در اینترنت (مانند اخبار مهم، گزارشهای تحقیقاتی صنعت، حتی پستهای رسانههای اجتماعی) RAG میتواند کسبوکارها را در روندهای بازار بهروز نگه دارد و یا حتی فعالیتهای رقبا را تجزیه و تحلیل کند و به تصمیم گیری بهتر کمک کند.
- پشتیبانی فروش: RAG می تواند به عنوان یک دستیار فروش مجازی، پاسخگوی سوالات مشتریان در مورد موجودی اقلام، مشخصات محصول، توضیح دستورالعمل های عملیاتی، و به طور کلی، کمک به چرخه خرید باشد. RAG با تلفیق تواناییهای تولیدی خود با کاتالوگهای محصول، اطلاعات قیمتگذاری و سایر دادهها (حتی بررسی نظرات مشتریان در رسانههای اجتماعی) میتواند توصیههای شخصیسازی شده ارائه دهد، به نگرانیهای مشتریان رسیدگی کند و تجربه خرید را بهبود بخشد.
- بهبود تجربه کارکنان: RAG می تواند به کارمندان برای ایجاد و اشتراک گذاری یک مخزن متمرکز از دانش متخصص و ویژه کمک کند. RAG با ادغام پایگاهها و اسناد اطلاعاتی داخلی میتواند به کارکنان پاسخهای دقیقی به سؤالات مربوط به عملیات شرکت، مزایا، فرآیندها، فرهنگ، ساختار سازمانی و غیره بدهد.
چالش های RAG
RAG داده های تازه و قابل اطمینان بازیابی شده از منابع داخلی یک شرکت (اسناد ذخیره شده در پایگاه داده اسناد و داده های ذخیره شده در سیستم های سازمانی ) را مستقیماً در فرآیند تولید ادغام می کند.
بنابراین، به جای صرفاً تکیه بر پایه دانش عمومی، ایستا و تاریخدار خود، مدل زبان بزرگ (LLM) به طور فعال دادههای مرتبط را از منابع خود شرکت برای تولید خروجیهای آگاهانهتر و مرتبط دریافت میکند. مدل RAG اساساً LLM را با جدیدترین اطلاعات و داده های سازمان، که منجر به پاسخ های دقیق، قابل اعتماد و مرتبط تر می شود،متصل می کند.
با این حال، RAG نیز چالش های خود را دارد:
- RAG به بازیابی اطلاعات در سطح سازمانی متکی است. نه تنها باید اطلاعات و داده های به روز و دقیق را حفظ کنید، بلکه باید ابرداده های دقیقی نیز در اختیار داشته باشید که داده های شما را برای چارچوب RAG توضیح دهد.
- اطلاعات و دادههای ذخیره شده در پایگاههای دانش داخلی و سیستمهای سازمانی باید RAG-ready باشد. قابل دسترس، قابل جستجو و با کیفیت بالا. به عنوان مثال، اگر 100 میلیون سوابق مشتری دارید ، آیا می توانید در کمتر از یک ثانیه به تمام جزئیات دیوید اسمیت دسترسی داشته باشید و آنها را ادغام کنید؟
- برای تولید اعلانهای متنی هوشمند، به قابلیتهای مهندسی سریع پیچیده، از جمله اعلان تحریک زنجیرهای از فکر، برای منتقل کردن دادههای مربوطه به LLM به روشی که دقیقترین پاسخها را ایجاد کند، نیاز دارید.
- برای اطمینان از اینکه دادههای شما محرمانه و ایمن باقی میمانند، باید دسترسی LLM خود را فقط به دادههای مجاز محدود کنید.طبق مثال بالا، این بدان معنی است که فقط دادههای دیوید اسمیت و نه کس دیگری.
علیرغم این چالشها، RAG همچنان یک جهش بزرگ در هوش مصنوعی تولیدی(مولد) است. توانایی آن در استفاده از دادههای داخلی بهروز، محدودیتهای مدلهای تولیدی سنتی را با بهبود تجربه کاربر با مبادلات شخصیشدهتر و مطمئنتر از اطلاعات برطرف میکند.
RAG همچنین از نظر سخت افزار مورد نیاز برای اعمال گران است.
به این دلیل که اسناد بازیابی شده، چه از وب، یا از یک پایگاه داده داخلی یا جای دیگر، باید در حافظه ذخیره شوند (حداقل به طور موقت ) تا مدل بتواند به آنها مراجعه کند. مخارج دیگر برای زمینه داده افزایش یافته است که یک مدل باید قبل از ایجاد پاسخ آن را پردازش کند. برای فناوریی که قبلاً هم به دلیل میزان محاسبات و الکتریسیته مورد نیاز آن حتی برای عملیات اولیه بدنام است، یک مسئله جدی است.
استفاده از RAG
همانطور که از نام آن پیداست، RAG بازیابی داده را در فرآیند تولید پاسخ قرار می دهد تا ارتباط و قابلیت اطمینان پاسخ ها را افزایش دهد. مدل بازیابی، مرتبط ترین اطلاعات و داده ها از منابع مناسب قابل دسترسی، انتخاب و اولویت بندی می کند. پرس و جو کاربر، آن را به یک اعلان غنی متنی تبدیل می کند و LLM را از طریق API خود فراخوانی می کند. LLM با یک پاسخ دقیق و منسجم به کاربر پاسخ می دهد.
این نمودار چارچوب بازیابی افزایش تولید را نشان می دهد:
- کاربر اعلانی را وارد میکند که مدل بازیابی دادهها را برای دسترسی به منابع داخلی شرکت، در صورت لزوم، راهاندازی میکند.
- مدل بازیابی منابع داخلی شرکت را برای داده های ساختاریافته از سیستم های سازمانی و برای داده های بدون ساختار مانند اسناد از پایگاه های دانش جستجو می کند.
- مدلهای بازیابی یک اعلان غنی شده ایجاد میکنند، که درخواست اصلی کاربر را با اطلاعات متنی اضافی تقویت میکند.و آن را به عنوان ورودی به مدل تولید (LLM API) منتقل میکند.
LLM از اعلان تقویتشده برای ایجاد پاسخ دقیقتر و مرتبطتر استفاده میکند که سپس به کاربر ارائه می دهد.
آینده RAG
RAG به سرعت در حال تغییر آینده هوش مصنوعی سازمانی است و نویدبخش پیشرفت هایی در دقت و سرعت بیشتر و همچنین کاربردها و مدیریت کردن های پیچیده تر است. با پیشرفت مدلهای یادگیری ماشین، انتظار میرود RAG به بازیابی اطلاعات دقیقتری دست یابد و کاربرد مدل زبان بزرگ (LLM) را در کارهای مختلف تجاری افزایش دهد.
نقش استراتژیک RAGدر هوش مصنوعی سازمانی بسیار مهم است. و مزایایی که در استفاده از داده ها و بینش های عملی ارائه می دهد بسیار قابل توجه است.LLM های مجهز به RAG برای کسبوکارهایی که تحول دیجیتال را دنبال میکنند، حیاتی هستند و منجر به تصمیم گیری های هوشمندانهتر، راهحلهای نوآورانه و تجربیات بهتر مشتری میشوند. این فناوری تغییر قابل توجهی در نحوه عملکرد و رقابت کسبوکارها در دنیای داده محور، با همواره در حال تکامل بودن خود، هدایت در نوآوری و کارایی در سطح صنعت نشان میدهد.
همکاری بین RAG و هوش مصنوعی چندوجهی، که متن را با انواع دادههای دیگر مانند تصاویر و ویدیوها ترکیب میکند، نویدبخش است. مدلهای RAG در آینده به طور یکپارچه دادههای چندوجهی را برای ارائه پاسخهای غنیتر و آگاهانهتر ترکیب میکنند. این ترکیب درها را به روی برنامه های نوآورانه مانند تولید محتوا، سیستم های توصیه ای یا مشاوره ای و دستیارهای مجازی باز می کند.
برنامه هوش مصنوعی با RAG در 50 خط کد!
همانطور که خواندید، RAG مخفف Retrieval-augmented Generation است، که تکنیکی است که سودمندی LLM را با قادر ساختن به ایجاد پاسخ بر اساس مجموعه گسترده ای از اطلاعاتی که شما ارائه می دهید، افزایش می دهد. این “مجموعه گسترده اطلاعات” ممکن است اساساً به شکل هر نوع داده ساختار یافته (پایگاه داده معمولی یا صفحه گسترده)، یا داده های بدون ساختار (اسناد متنی یا حتی فایل های رسانه ای) ، که باید بیشتر پردازش و به روشی خاص ذخیره شوند، باشد. به طوری، مدل به راحتی بتواند الگوهای درون آن را پیدا کند تا اطلاعات مناسب را بازیابی کند. اگر چنین اطلاعاتی یافت نشد، به جای ارائه با اطمینان پاسخ ، میتوان به LLM دستور داد که به سادگی بگوید: “هی، سوال خوبی است! من نمی دانم” یا پاسخ دیگری را که برای مورد استفاده خود مناسب می دانید.
اهمیت RAG در توانایی آن در بهبود دقت و قابلیت اطمینان LLM است. LLM ها به خودی خود کاملاً به دانش به دست آمده در مرحله آموزش خود برای تولید خروجی متکی هستند که گاهی اوقات می تواند منجر به پاسخ های نادرست یا قدیمی شود. RAG این مشکل را با گنجاندن منابع خارجی اطلاعات در خط تولید پاسخ با مزیت اضافی عدم نیاز به، به روز رسانی یا “تنظیم دقیق” مدل اصلی، فرآیندی که ممکن است به مقادیر زیادی توان محاسباتی نیاز داشته باشد، برطرف می کند و آن را ساده تر می کند. با رویکردی کارآمدتر.
برنامه با RAG
ما یک برنامه ساده خواهیم ساخت که از یک LLM استفاده می کند تا از مخزن اسناد عمومی Scaleway استفاده کند و سعی کند پاسخ یک سؤال ورودی ارائه شده توسط کاربر را بیابد. مثال پایه دارای 50 خط کد است و خواهیم دید که چگونه می توانیم عملکرد آن را با اضافه کردن چند خط دیگر در اینجا و آنجا بهبود دهیم.
ما از LlamaIndex (یک چارچوب داده ساده و انعطاف پذیر، برای اتصال منابع داده سفارشی به LLM)، به عنوان ابزار اصلی برای رسیدن به هدف خود استفاده خواهیم کرد. ما همچنین از یک «مدل جاسازی» استفاده خواهیم کرد که اسناد یا دادهها را بر اساس ویژگیهایشان به یک نمایش عددی تبدیل میکند (بردارها میتواند عبارت مناسب تری باشد). و در نهایت، یک “پایگاه داده برداری” که نمایش های عددی اسناد ما را برای مصرف آسان تر،ذخیره می کند.
بررسی معماری RAG
سیستم چیزی شبیه به شکل زیر است:
فایلها در یک «پایگاه داده برداری» بارگذاری میشوند، این پایگاه داده با درخواست کاربر مورد پرسش قرار میگیرد و اسناد متنی که مطابقت دارند به LLM بازگردانده میشوند، که سپس پاسخی برای ارسال به کاربر را تولید می کند.
ساخت کد RAG
تمام دستورات و کدها قرار است در داخل نمونه GPU شما اجرا شوند. شما می توانید از ویرایشگر متن دلخواه خود استفاده کنید، در این مورد از Visual Studio Code و ویژگی توسعه از راه دور (Remote Development) آن استفاده شده که به ما اجازه می دهد با ورود از طریق SSH به نمونه خود متصل شویم. به طور خودکار سروری را نصب می کند که امکان می دهد کدی را که در نمونه راه دور است ، همانند کد محلی خود، ویرایش و اجرا کند.
نصب نرم افزار های مورد نیاز
یک محیط مجازی برای پروژه خود راه اندازی کنید، به طور پیش فرض virtualenv را انتخاب میکنیم:
console.log( 'Code is Poetry' );mkdir rag-example
cd rag-example
apt update
apt install python3.10-venv -y
python3 -m venv .venv
source .venv/bin/activate
امروزه بسیاری از “پایگاه های داده برداری” برای انتخاب وجود دارد. Qdrant یک منبع باز است که در Rust نوشته شده است، دارای بسیاری از کتابخانه های رسمی است و می تواند به راحتی از طریق docker اجرا شود:
docker run -d -p 6333:6333 --name qdrant qdrant/qdrant
ما باید بسته LlamaIndex و بسته های دیگر را نصب کنیم:
pip install llama-index
pip install llama-index-llms-ollama llama-index-embeddings-huggingface llama-index-vector-stores-qdrant qdrant-client
lama-index-llms-ollama بسته بندی LlamaIndex است که به ما امکان می دهد از مدلی استفاده کنیم که توسط Olama ارائه شده است.
lama-index-embeddings-huggingface در LlamaIndex برای مدلهای HuggingFace است.
lama-index-vector-stores-qdrant ادغام ‘Vector Store’ LlamaIndex برای Qdrant است.
qdrant-client کتابخانه رسمی Python Qdrant است.
همانطور که ذکر شد، از Scaleway Documentation به عنوان منبع داده استفاده می شود،که به عنوان یک مخزن منبع باز در GitHub در دسترس است. برای این مثال، ما فقط شاخه اصلی با عمق 1 را بازسازی می کنیم:
git clone https://github.com/scaleway/docs-content.git --depth 1
محتوایی که به دنبال آن هستیم در داخل فایل ها با پسوند mdx قرار دارد. این فایلهای MDX از Markdown syntax استفاده میکنند و دارای یک هدر Frontmatter شامل ابردادههای مرتبط (عنوان، توضیحات، دستهها، برچسبها، تاریخ انتشار و غیره) هستند.
lama-index-llms-ollama بسته بندی LlamaIndex است که به ما امکان می دهد از مدلی استفاده کنیم که توسط Olama ارائه شده است.
lama-index-embeddings-huggingface در LlamaIndex برای مدلهای HuggingFace است.
lama-index-vector-stores-qdrant ادغام ‘Vector Store’ LlamaIndex برای Qdrant است.
qdrant-client کتابخانه رسمی Python Qdrant است.
همانطور که ذکر شد، از Scaleway Documentation به عنوان منبع داده استفاده می شود،که به عنوان یک مخزن منبع باز در GitHub در دسترس است. برای این مثال، ما فقط شاخه اصلی با عمق 1 را بازسازی می کنیم:
git clone https://github.com/scaleway/docs-content.git --depth 1
تنظیمات Imports و constants
ما به سادگی بسته هایی را که قبلاً نصب کرده بودیم به همراه چند بسته دیگر در کتابخانه استاندارد، فراخوانی می کنیم.همچنین 3 ثابت تنظیم می کنیم: فهرست محلی که می خواهیم شناسه ها و hashهای(شناسه اختصاصی) مرتبط با پایگاه داده برداری، ذخیره کنیم، مکان اسناد (Scaleway) و نام مجموعه ای که می خواهیم برای این برنامه در پایگاه داده برداری خود استفاده کنیم.(به نام پایگاه داده فکر کنید).
import sys
from pathlib import Path
from llama_index.core import Settings, StorageContext, VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.ollama import Ollama
from llama_index.vector_stores.qdrant import QdrantVectorStore
import qdrant_client
STORAGE_DIR= "./storage"
DOCS_DIR = "./docs-content"
COLLECTION_NAME = "scw_docs"
llm = Ollama(model = "llama2:70b") # Using a local LLM served by Ollama
embed_model = HuggingFaceEmbedding(model_name = "sentence-transformers/multi-qa-distilbert-dot-v1", embed_batch_size = 768, device = "cuda") # Assigning an embedding model from HuggingFace
Settings.llm = llm
Settings.embed_model = embed_model
یک «مدل تعبیهکننده»( embedding model) قادر است دادههای ورودی مانند متن، یک سند یا یک تصویر را دریافت کند و آنها را در یک بردار (آرایهای از اعداد) که معرف معنا یا ویژگیهای شی(موجودیت یک چیزی)است، نمایش دهد. هنگامی که به یک نمایش عددی (بردار) تبدیل می شود، سیستم می تواند با محاسبه موقعیت ها و مجاورت آنها در فضای برداری، روابط بین شی ها را برقرار کند. روشی که یک شی در یک فضای برداری نشان داده می شود به مدل تعبیه مورد استفاده بستگی دارد. مدلهای تعبیهشدهای وجود دارند که به طور خاص برای یافتن متن، پاسخ به سؤالات و جستجوی تصاویر بر اساس ورودی متن آموزش داده شدهاند (و بالعکس). یک مکان خوب برای شروع یادگیری بیشتر، مستندات چارچوب Transformers است.
در اینجا از multi-qa-distilbert-dot-v1 استفاده شده،زیرا در پرسش و پاسخ از منابع مختلف آموزش دیده است و در مقایسه با سایر نتایج خوبی را نشان می دهد.
سپس “فروشگاه برداری”( vector store) را داریم.که یک سیستم ذخیره سازی برای بردارهای جاسازی گره ها (تکه های سند) و خود گره ها(Nodes) است.این فروشگاهها در یادگیری ماشین و برنامههای هوش مصنوعی برای ذخیره و بازیابی موثر بردارهای با ابعاد بالا استفاده میشوند که اغلب برای نمایش دادههای پیچیده مانند متن، تصاویر و موارد دیگر استفاده میشوند.
client = qdrant_client.QdrantClient()
vector_store = QdrantVectorStore(client = client, collection_name = COLLECTION_NAME)
بارگیری اسناد
بارگیری فایل ها و تبدیل آنها به اسناد. صبر کنید، فایل ها سند نیستند؟
نه، یک سند یک محفظه عمومی در اطراف هر منبع داده ای است. به طور پیش فرض، یک سند متن را همراه با برخی ویژگی های دیگر ذخیره می کند. ویژگیهای اصلی عبارتاند از دیکشنریهای ابرداده و روابط، که حاوی اطلاعات اضافی برای یک سند (بهطور پیشفرض مسیر فایل، نام، اندازه، تاریخ ایجاد و آخرین تاریخ اصلاح) و ارتباط آنها با سایر اسناد و گرهها هستند. گره(Node) تکه ای از یک سند است.
تابع get_documents یک رشته مسیر (در اینجا مسیر دایرکتوری Scaleway ) دریافت میکند و فهرستی از دایرکتوریهایی را که میدانیم میخواهیم از فرآیند بارگیری سند خود حذف کنیم، تعریف میکند، مانند پوشه git. زیرا مرتبط نیست. و index.mdx زیرا محتویات آن در واقع هیچ اطلاعات مفیدی را اضافه نمی کند.
کلاس SimpleDirectoryReader ، لیستی از پسوندهایی که می خواهیم به دنبال آن بگردیم (به یاد داشته باشید که . را قبل از برنامه افزودنی اضافه کنید.)و دایرکتوری های فرعی و لیست چیزهایی که می خواهیم حذف کنیم را به صورت بازگشتی به دنبال. متد load_data برمی گرداند که شامل متن یافت شده در هر فایل به همراه برخی فراداده می شود.
console.log( 'Code is Poetry' );def get_documents(dir_path):
ignore_these = ['.git/**', '.github/**', '.husky/**', 'assets/**', 'bin/**', 'blocks/**', 'changelog/**', 'components/**', 'docs/**', 'menu/**', 'styles/**', 'contribute.mdx', 'index.mdx']
return SimpleDirectoryReader(
input_dir = dir_path,
required_exts = [".mdx"],
recursive = True,
exclude = ignore_these
).load_data()
در کد زیر، دستور if بررسی می کند که آیا این اولین باری است که این اسکریپت اجرا می شود، با بررسی اینکه آیا dir ذخیره سازی در فایل سیستم وجود دارد یا خیر. اگر این اولین باری است که اجرا می شود، (این شاخه else است)، سپس تابع get_documents فراخوانی می شود و یک زمینه ذخیره سازی ایجاد می شود.
LlamaIndex از StorageContext برای ذخیره کردن استفاده می کند. در اینجا به vector_store، که پایگاه داده برداری Qdrant ما است.
vector_index یک فهرست ذخیره برداری جدید از اسنادی که قبلاً تولید شده اند ایجاد می کند، و آنها را به قطعات تقسیم و در پایگاه داده برداری بارگذاری می کند.
در نهایت، در شاخه else، همچنان به ذخیره شناسههای سند و hashهایی که به عناصر پایگاه داده برداری اشاره میکنند، ادامه میدهیم، و این چیزی است که در آخرین خط زمانی که vector_index.storage_context.persist فراخوانی میشود، اتفاق میافتد.
در شاخه if، از سیستم فایل StorageContext را با گذراندن مسیر در آرگومان persist_dir بارگذاری می کنیم، سپس یک نمایه برداری به همان روشی که قبلا ذکر شد ایجاد می کنیم، به جز اینکه به جای ایجاد from_documents، از from_vector_store ایجاد می شود زیرا داده ها از قبل در پایگاه داده برداری ،وجود دارند.
if Path(STORAGE_DIR).exists():
storage_context = StorageContext.from_defaults(persist_dir = STORAGE_DIR)
vector_index = VectorStoreIndex.from_vector_store(
vector_store = vector_store, storage_context = storage_context, show_progress = True
)
else:
docs = get_documents(DOCS_DIR)
storage_context = StorageContext.from_defaults(vector_store = vector_store)
vector_index = VectorStoreIndex.from_documents(
documents= docs, storage_context = storage_context, show_progress = True
)
vector_index.storage_context.persist(STORAGE_DIR)
ایجاد یک موتور پرس و جو
در این مرحله، ارجاع LLM به LlamaIndex ایجاد شد، جاسازیهای سند در پایگاه داده برداری انجام شدند، و تنها کاری که باید انجام شود این است که vector_index را پرس و جو کنید:
if __name__ == "__main__":
if len(sys.argv) > 1:
questin_string = sys.argv[1]
query_engine = vector_index.as_query_engine()
response = query_engine.query(str(questin_string))
print(response)
else:
print("You forgot to pass in your question 🙂 simply put it within quotes after invoking this script: python3 main.py \"what is an instance?\"")
ابتدا، بررسی میکنیم که آیا اسکریپت بهعنوان برنامه اصلی بارگذاری میشود یا خیر، سپس آرگومانهای اسکریپت را بررسی میکنیم تا مطمئن شویم که پس از فراخوانی اسکریپت یک پرسوجو وجود دارد (میخواهیم بتوانیم آن را فراخوانی و یک درخواست را مستقیماً ارسال کنیم، مانند python3 main.py “نمونه چیست؟”).
if __name__ == "__main__":
if len(sys.argv) > 1:
questin_string = sys.argv[1]
query_engine = vector_index.as_query_engine()
response = query_engine.query(str(questin_string))
print(response)
else:
print("You forgot to pass in your question 🙂 simply put it within quotes after invoking this script: python3 main.py \"what is an instance?\"")
نتیجه
هنگامی که اسکریپت خود را برای اولین بار با پرسشی مانند “چگونه یک کار بدون سرور ایجاد کنم؟” اجرا می کنید،
console.log( 'Code is Poetry' );python3 demo.py "how do I create a serverless job?"
پاسخی شبیه به این دریافت خواهید کرد:
console.log( 'Code is Poetry' );You can create a serverless job using the Scaleway console, Terraform, API, or CLI.
Using the Scaleway console, you can easily create a job definition and track your job runs. You can also monitor your jobs using Scaleway Cockpit.
Alternatively, you can use Terraform to integrate serverless jobs into your infrastructure as code via the Terraform provider and resources.
The Scaleway HTTP API allows you to manage your serverless resources via HTTP calls, which can be useful when integrating jobs management into your automated tasks or continuous integration.
You can also use the Scaleway CLI, a simple command-line interface that allows you to create, update, delete, and list your serverless jobs. For example, you can use the CLI to deploy a job with the following command: `scw jobs definition create name=testjob cpu-limit=70 memory-limit=128 image-uri=docker.io/alpine:latest command=ls`.
Finally, Scaleway SDKs are available for Go, JS, and Python, allowing you to manage your resources directly using your favorite languages.
LLM به خودی خود در مورد آخرین نسخه از اسناد Scaleway آموزش ندیده است. می تواند از طریق گره های سند بازیابی شده توسط ‘Query Engine’ از پایگاه داده برداری برای ایجاد پاسخ مناسب بر اساس مجموعه ای از اسناد و گره های موجود برای برگرداندن متن یک سند استفاده کند.
همانطور که وعده داده شده بود، این مثال می تواند نتایج عالی را تنها با 50 خط کد ارائه دهد، کد کامل در اینجا آمده است:
import sys
from pathlib import Path
from llama_index.core import Settings, StorageContext, VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.ollama import Ollama
from llama_index.vector_stores.qdrant import QdrantVectorStore
import qdrant_client
STORAGE_DIR= "./storage"
DOCS_DIR = "./docs-content"
COLLECTION_NAME = "scw_docs"
llm = Ollama(model = "llama2:70b")
embed_model = HuggingFaceEmbedding(model_name = "sentence-transformers/multi-qa-distilbert-dot-v1", embed_batch_size = 768, device = "cuda")
# If you're using a system with lower VRAM than the 80GB of the H100 PCIe Instance, such as the L4 GPU Instance, you can use the smaller models you'll find below. They are not as powerful as their larger pairs, but they'll get the job done
# llm = Ollama(model = "llama2:7b")
# embed_model = HuggingFaceEmbedding(model_name = "sentence-transformers/multi-qa-MiniLM-L6-dot-v1", embed_batch_size = 384, device = "cuda")
Settings.llm = llm
Settings.embed_model = embed_model
client = qdrant_client.QdrantClient()
vector_store = QdrantVectorStore(client = client, collection_name = COLLECTION_NAME)
def get_documents(dir_path):
ignore_these = ['.git/**', '.github/**', '.husky/**', 'assets/**', 'bin/**', 'blocks/**', 'changelog/**', 'components/**', 'docs/**', 'menu/**', 'styles/**', 'contribute.mdx', 'index.mdx']
return SimpleDirectoryReader(
input_dir = dir_path,
required_exts = [".mdx"],
recursive = True,
exclude = ignore_these
).load_data()
if Path(STORAGE_DIR).exists():
storage_context = StorageContext.from_defaults(persist_dir = STORAGE_DIR)
vector_index = VectorStoreIndex.from_vector_store(
vector_store = vector_store, storage_context = storage_context, show_progress = True
)
else:
docs = get_documents(DOCS_DIR)
storage_context = StorageContext.from_defaults(vector_store = vector_store)
vector_index = VectorStoreIndex.from_documents(
documents= docs, storage_context = storage_context, show_progress = True
)
vector_index.storage_context.persist(STORAGE_DIR)
if __name__ == "__main__":
if len(sys.argv) > 1:
questin_string = sys.argv[1]
query_engine = vector_index.as_query_engine()
response = query_engine.query(str(questin_string))
print(response)
else:
print("You forgot to pass in your question 🙂 simply put it within quotes after invoking this script: python3 main.py \"what is an instance?\"")
قدم بعدی
این برنامه می تواند به عنوان پایه ای برای چیزهای بزرگتر عمل کند. در این مورد، ما از یک رویکرد ساده استفاده میکنیم که از تنظیمات پیشفرض LlamaIndex استفاده میکند.
فرض کنید میخواهید یک چت بات بسازید (LlamaIndex از موتور چت نیز پشتیبانی میکند)
یکی از موارد افزودنی که میتواند برنامه نمونه ما را یک گام به جلو ببرد این است که فرآیند بارگیری سند شامل یک مرحله اضافی باشد: سفارشی کردن ابرداده سند. همانطور که قبلا ذکر شد، SimpleDirectoryReader به طور پیشفرض ویژگیهای فایل زیر را بهعنوان فراداده میگیرد(file_path, file_name, file_size, creation_date, و last_modified_date). برخی از این موارد برای ما مفید نیستند. فرآیند ساخت وب سایت اسناد Scaleway مسیرهای فایل نسبی را همانطور که هستند حفظ می کند و فقط مسیر اصلی https://www.scaleway.com/en/docs/ را پیش بینی می کند و پسوند mdx. را حذف می کند. با دانستن این موضوع میتوانیم ابرداده جدیدی ایجاد کنیم که شامل URL عمومی سند است. برای این کار باید یک تابع جدید ایجاد کنیم که به عنوان مقدار آرگومان SimpleDirectoryReader’s file_metadataارسال می کنیم. این تابع به نوبه خود رشته مسیر فایل را دریافت می کند و باید یک فرهنگ لغت از جفت های کلید/مقدار فراداده را برگرداند.
در اینجا تابع get_custom_metadata است:
console.log( 'Code is Poetry' );def get_custom_metadata(file_path_str):
current_dir = Path.cwd()
absolute_file_path = Path(file_path_str)
relative_dir_path = absolute_file_path.relative_to(current_dir).parts[1:-1]
file_name = absolute_file_path.stem
file_path = "/".join(relative_dir_path + (file_name,))
return {
'file_name': file_name,
'file_path': file_path,
'public_url': "https://www.scaleway.com/en/docs/" + file_path,
}
و نحوه انتقال آن به عنوان یک آرگومان جدید به SimpleDirectoryReader آمده است:
console.log( 'Code is Poetry' );def get_nodes_and_docs(dir_path):
# ...
return SimpleDirectoryReader(
# ...
file_metadata=get_custom_metadata,
).load_data()
بعد از این چه چیزی بدست می آوریم؟ این اولین قدم به سوی چیزی مفید است که به LLM دستور می دهد تا مطابق دستورالعمل های ما پاسخی ایجاد کند.
LlamaIndex بسیاری از درخواستهای پیشفرض را به LLM ارسال میکند تا دستورالعملهای لازم را برای مراحل مختلف فرآیند تولید بر اساس چندین عامل مختلف ارائه دهد. با این حال، ما این توانایی را داریم که دستورات سفارشی خود را تنظیم کنیم. یکی از این دستورهایی که می توانیم تنظیم کنیم text_qa_template است که Query Engine می تواند دریافت کند. این اعلان به ما اجازه می دهد تا چندین دستورالعمل را تعریف کنیم، همانطور که در زیر می بینید:
console.log( 'Code is Poetry' );#...
from llama_index.core import PromptTemplate
#...
qa_prompt_str = (
"You're a helpful technical expert who provides answers based on the Scaleway Documentation.\n"
"Assume every question you receive is related to Scaleway. If you can't find the data to answer a question, or the question is out of the scope of Scaleway, say `I don't know.`, suggest visiting the documentation website and don't provide any further information.\n"
"Context information is below.\n"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
"\nInstructions:\n"
"- Based on the above Context information and no prior knowledge, provide a concise answer to the user Query below.\n"
"- Prioritize documents with the shallowest 'file_path' depth. If you can't find data to answer a question within the Scaleway Documentation, say I don't know.\n"
"- Always finish your answer with a separate paragraph linking to the most relevant document using the value of its 'metadata' 'public_url'.\n"
"Query: {query_str}\n"
"Answer: "
)
query_engine = vector_index.as_query_engine(text_qa_template = PromptTemplate(qa_prompt_str))
response = query_engine.query(str(questin_string))
print(response)
#...
ما از این اعلان استفاده میکنیم تا به LLM دستور دهیم تا محدوده پاسخ تولید شده را با استفاده از اسناد زمینه ارائه شده، بدون توجه به دانش قبلی، بر روی پلتفرم Scaleway تنظیم کند، و از آن بخواهیم URL عمومی سندی را که فکر میکند مرتبطترین است ارائه دهد. .
شما دو متغیر مشاهده خواهید کرد، context_str و query_str، که هر دو به طور خودکار توسط LlamaIndex ارسال می شوند، زمانی که qa_prompt_str به PromptTemplate ارسال می شود (کلاس جدیدی که باید وارد کنیم). query_str ارائه شده توسط کاربر است و context_str اطلاعات بازیابی شده از پایگاه داده برداری است که قبلاً با استفاده از query_str کاربر پرس و جو شده بود. LLM دستورالعمل های ارائه شده در اعلان، اطلاعات زمینه و درخواست کاربر را می گیرد تا در نهایت یک پاسخ را ایجاد کند.
هنگام فراخوانی اسکریپت با سؤال “آیا CLI وجود دارد؟”، پاسخ تولید شده که به آن برمیگردیم به این صورت است:
Yes, you can use the Scaleway CLI to manage your resources. The Scaleway CLI allows you to interact with the Scaleway platform using commands instead of the graphical user interface. You can install the Scaleway CLI on your local machine and use it to create, modify, and delete resources.
To get started with the Scaleway CLI, you can refer to the Scaleway CLI documentation. This document provides an overview of the available commands, flags, and options, as well as examples of how to use them. Additionally, you can use the command-line help system to get information about a specific command or flag.
For more information on using the Scaleway CLI, please refer to the following document:
https://developer.scaleway.com/en/compute/instances/api-cli/
و سوال ما برای نسخه اولیه، “چگونه می توانم یک کار بدون سرور ایجاد کنم؟” به این شکل خواهد بود:
Sure! Sure! Here’s how you can create a serverless job:
- Log in to your Scaleway account and navigate to the Serverless section in the side menu.
- Click on “Jobs” and then click on “Create job”.
- Select the Scaleway Container Registry as the source of the container image.
- Choose the desired container registry namespace, select a container image and tag, and enter a name for the job.
- Select the region where you want to create the job and choose the resources that you want to allocate to the job.
- Define a cron schedule to specify when you want the job to run, and add any environment variables or startup commands as needed.
- Set a maximum duration for the job and verify the estimated cost.
- Click “Create a job definition” to finish creating the job.
You can find more detailed instructions and information on creating serverless jobs in the Scaleway documentation here: <https://www.scaleway.com/en/docs/serverless/jobs/how-to/create-job-from-scaleway-registry>.Here’s how you can create a serverless job:
- Log in to your Scaleway account and navigate to the Serverless section in the side menu.
- Click on “Jobs” and then click on “Create job”.
- Select the Scaleway Container Registry as the source of the container image.
- Choose the desired container registry namespace, select a container image and tag, and enter a name for the job.
- Select the region where you want to create the job and choose the resources that you want to allocate to the job.
- Define a cron schedule to specify when you want the job to run, and add any environment variables or startup commands as needed.
- Set a maximum duration for the job and verify the estimated cost.
- Click “Create a job definition” to finish creating the job.
You can find more detailed instructions and information on creating serverless jobs in the Scaleway documentation here:
<https://www.scaleway.com/en/docs/serverless/jobs/how-to/create-job-from-scaleway-registry>.
هر دو پاسخ به طور دقیق پاسخ مختصری به سؤالات ارائه می دهند و پیوندی به صفحه مستندات مربوطه ارائه می دهند تا کاربر در مورد موضوع بیشتر بداند.
بهبودهای بیشتر
همانطور که قبلاً گفته شد، این مثال به عنوان پایه ای برای شروع است و می توان آن را گسترش داد. در مورد ما، فایلهای mdx شامل frontmatter است که حاوی اطلاعات مرتبطی است که میتوان از آن استفاده کرد، مانند عنوان آن، شرحی از محتویات فایل، دستههایی که به آنها اعمال میشود، و برچسبهایی که میتوان در آنها گروه بندی کرد. علاوه بر این، این واقعیت که فایلهای mdx نه تنها از Markdown syntax استفاده میکند، بلکه میتواند شامل عناصر نشانهگذاری یا مؤلفههایی مانند:
<Macro id=”requirements” /> یا <Navigation title=”See also”>میتواند مدل تعبیه شده را گیج کند. در این مورد، تجزیه اسناد با یک Reader مناسب از Llama hub، یا ایجاد مدل خود، میتواند عملکرد کلی و دقت برنامه شما را بهبود بخشد.
سایر بهبودها میتواند شامل اتوماسیون فرآیند استفاده از آخرین نسخه اسناد و بهروزرسانی پایگاه داده برداری مرتبط ، استفاده از روشهای ذخیرهسازی بهبودیافته، آزمایش با پایگاههای داده دیگر، بهینهسازی پارامترهای مدل، آزمایش حالتهای مختلف پاسخ، و محافظت از نمونه ما باشد. به طوری که تنها افرادی که اجازه دسترسی به این منابع را دارند می توانند از آن ها استفاده کنند.
نتیجه
RAG یک تکنیک قدرتمند است که میتواند دقت و قابلیت اطمینان مدلهای هوش مصنوعی تولیدی را بهبود بخشد. RAG با استفاده از منابع اطلاعاتی خارجی، توسعه دهندگان را قادر می سازد تا سیستم های هوش مصنوعی پیچیده ای را ایجاد کنند که دقیق تر و قابل ارتقا باشند. در این مقاله، با استفاده از مدلهای تعبیهشده LlamaIndex، Qdrant، Ollama و sentence-transformers، اصول اولیه نحوه شروع کار با RAG را بررسی کردیم. ما جنبههای مختلف RAG را پوشش دادیم، از جمله راهاندازی محیط، بارگیری اسناد، اجرای یک پایگاه داده برداری، ایجاد یک فروشگاه برداری، و ایجاد یک موتور جستجو.
سپس بسیاری از احتمالات را که فراتر از این تنظیم پایه قرار دارند در نظر گرفتیم و عملکرد آن را با به فعالیت واداشتن مدل برای ایجاد پاسخ هایی که شامل URL صفحه مستندات عمومی پاسخ است، بهبود دادیم. با دنبال کردن این مراحل، میتوانید سیستم RAG خود را ایجاد کنید که میتواند برای برنامههای مختلف که دادههای شما را با قدرت ابزارهای منبع باز، LLM و راهحلهای هوش مصنوعی Scaleway استفاده میکنند، استفاده شود.