برنامه نویسی

بازیابی نسل افزوده با Azure SQL

Summarize this content to 400 words in Persian Lang
Retrieval Augmented Generation یا RAG یکی از داغ‌ترین موضوعات در حال حاضر است زیرا امکان تعامل با داده‌ها را با استفاده از زبان طبیعی باز می‌کند، که رویای دیرینه‌ای است که در نهایت محقق می‌شود.

این احتمال وجود دارد که بسیاری از داده‌های شما قبلاً در Azure SQL ذخیره شده یا ذخیره شوند، بنابراین یک درخواست رایج این است که مثالی در مورد نحوه اعمال الگوی RAG به داده‌های ذخیره شده خود در پایگاه داده Azure SQL داشته باشید.

این پست وبلاگ همه چیز در مورد آن است. بیایید از اصول اولیه شروع کنیم و مطمئن شویم که الگوی RAG به وضوح درک شده است.

الگوی RAG 101

برای سهولت درک توضیح، حتی اگر در موضوع کاملاً تازه کار هستید، اجازه دهید از یک سناریوی ساده شروع کنیم. شما یک پایگاه داده دارید که در آن جزئیات – عنوان، چکیده، زمان، سخنرانان – تمام جلسات یک کنفرانس را ذخیره کرده اید. یک مثال خوب می تواند کنفرانس .NET Focus on AI یا کنفرانس آینده .NET Conf 2024 یا یکی از موارد مورد علاقه من، کنفرانس VS Live باشد.

چرا RAG؟

قبلاً می‌دانید که مدل‌های زبانی مانند GPT-4 یا Phi-3 می‌توانند هر متنی را که به آنها ارائه می‌دهید بپذیرند، و تقریباً برای هر سؤالی که بخواهید بپرسید، پاسخ دهند. بنابراین، چرا یک الگوی خاص مانند RAG مورد نیاز است؟ چرا ما نمی‌توانیم تمام عناوین و چکیده و تمام اطلاعات ذخیره شده در پایگاه داده را به LM ارسال کنیم و آن را یک روز فراخوانی کنیم؟ سپس می‌توانیم با استفاده از یک تماس ساده API هر چیزی را بپرسیم و کارمان تمام می‌شود.

دو دلیل وجود دارد که چرا نمی خواهید این کار را انجام دهید.

اول از همه، اگر چیزی مرتبط با Blazor می‌پرسید، نیازی به ارائه جزئیات LM در مورد جلسه‌ای نیست که کاملاً خارج از محدوده است: این به LM در پاسخگویی کمک نمی‌کند و در واقع می‌تواند پاسخ را دقیق‌تر کند (نگاه کنید به : “Lost in the Middle: How Language Models Use Long Contexts”). ثانیاً، هزینه تماس با هوش مصنوعی بر اساس تعداد توکن‌هایی است که متن ارسالی باید به آن تقسیم شود – توکن‌سازی چیزی است که به طور شفاف در پشت صحنه اتفاق می‌افتد – و بنابراین هرچه متن کمتری ارسال کنید، رمز کمتری ارسال می‌کنید که به این معنی است که شما از منابع کمتری استفاده خواهید کرد. کارایی بیشتر، ضایعات دیجیتال کمتر (که به معنای مصرف انرژی کمتر است)، هزینه کمتری برای پرداخت: این یک پیروزی برای همه است!

مراحل RAG

اولین گام الگوی RAG فیلتر کردن تمام داده هایی است که به سوال مطرح شده مرتبط نیستند. برای این مرحله اول، معمولاً جستجوی معنایی روی متن انجام می شود. برای انجام یک جستجوی معنایی، جاسازی‌ها و بنابراین بردارها برای انجام جستجوی شباهت برداری استفاده می‌شوند و فقط نتایج مربوطه را برمی‌گردانند. از آنجایی که Azure SQL یک پایگاه داده رابطه‌ای و چند مدلی مدرن و قدرتمند است، می‌توانید سایر قابلیت‌های فیلترینگ دیگر را که قبلاً داشته است، جستجوی برداری را غنی کنید. فیلتر کردن بر اساس مقادیر دقیق (مثلاً همه جلسات در یک روز خاص)، با داده‌های JSON (مثلاً جلسات با برچسب‌های خاص) یا حتی استفاده از فیلترهای مکانی (مثلاً جلسه در فاصله 1 کیلومتری من تحویل داده می‌شود).

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

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

اکنون که با الگوی RAG آشنا شدید، زمان آن رسیده است که ببینید چگونه می توان آن را با استفاده از سرویس های Azure تحقق بخشید.

الگوی RAG در Azure

راه های زیادی برای پیاده سازی الگوی RAG در Azure وجود دارد. من شخصاً رویکرد بدون سرور ارائه شده توسط ابر را دوست دارم، بنابراین از خدمات بدون سرور در این نمونه استفاده می کنم. اگر یک رویکرد کانتینری را ترجیح می دهید، به خاطر داشته باشید که اگر ترجیح می دهید همه چیز را در اینجا به راحتی در یک ظرف میزبانی کنید.

معماری سطح بالای الگوی RAG اعمال شده در Azure به شرح زیر است:

خدمات Azure مورد استفاده عبارتند از:

برنامه های وب استاتیک AzureAzure OpenAIتوابع لاجوردیAzure Functions SQL Trigger Bindingپایگاه داده Azure SQLسازنده API داده

Frontend

fronted یک برنامه ساده React است که در Azure Static Web Apps میزبانی شده است. این برای اجازه دادن به کاربران برای پرسیدن سؤالی استفاده می شود که سپس با استفاده از الگوی RAG به آن پاسخ داده می شود. همچنین گزینه ای وجود دارد که فقط جستجوی شباهت انجام دهید تا به وضوح تفاوت از نظر پاسخ بین یک جستجوی مشابه ساده و الگوی RAG کامل را مشاهده کنید.

Backend

از توابع Azure برای رسیدگی به سوال پرسیده شده توسط کاربر و هماهنگ سازی الگوی RAG استفاده می شود. هنگامی که سؤال پرسیده می شود، تابع Azure به نام، جستجوی شباهت را در Azure SQL انجام می دهد، سپس نتایج را در قالبی جدا از لوله بسته بندی می کند.

string.Join(“\r”, sessions.Select(s => $”{s.Title}|{s.Abstract}|{s.Speakers}|{s.Start}|{s.End}”));

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و سپس سوال، لیست جلسه و دستور زیر را به LM که در Azure OpenAI میزبانی شده است ارسال کنید:

“You are a system assistant who helps users find the right session to watch from the conference, based off the sessions that are provided to you. Sessions will be provided in an assistant message in the format of `title|abstract|speakers|start-time|end-time`. You can use only the provided session list to help you answer the user’s question. If the user asks a question that is not related to the provided sessions, you can respond with a message that you can’t help with that question.”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سازنده API داده برای نمایش آسان رویه‌های ذخیره‌شده که از طریق تماس‌های REST از فرانت‌اند فراخوانی می‌شوند استفاده می‌شود تا نشان دهد چند جلسه ایندکس شده است (در برگه «درباره») و برای فراخوانی رویه find_session که جستجوی برداری را انجام می‌دهد (موجود در « جستجو»). سازنده API داده به طور خودکار اشیاء پایگاه داده مورد نظر را به عنوان نقاط پایانی REST یا GraphQL نشان می دهد، که برای استقرار سریع یک سرویس CRUD که می تواند توسط هر چارچوبی فقط در چند دقیقه فراخوانی شود عالی است.

همچنین از توابع Azure برای تبدیل فوری عنوان جلسه و چکیده به یک جاسازی به محض ایجاد تغییرات در جدول پایگاه داده استفاده می شود. این کار با فراخوانی Azure OpenAI embedding model انجام می شود. Azure SQL Trigger Binding چیزی است که امکان نظارت بر جداول برای تغییرات را فراهم می کند و سپس با اجرای کدی در خود تابع Azure به آن تغییرات واکنش نشان می دهد. بسیار سبک وزن است (از قابلیت های بومی Azure SQL Change Tracking در پشت صحنه استفاده می کند) و تمام انعطاف پذیری و قدرت محاسباتی مورد نیاز برای تقریباً هر چیزی را فراهم می کند.

پایگاه داده

پشتیبانی Azure SQL برای ذخیره سازی بومی و پرس و جو بردارها در Early Adopter Preview است. این شامل قابلیت ذخیره بردارها در فرمت باینری فشرده و محاسبه فاصله بین دو بردار – و در نتیجه محاسبه شباهت معنایی موضوعات مرتبط به عنوان بردارهای موجود در این نمونه، تعبیه عنوان جلسه و چکیده است – به طوری که تنها جلسه مربوطه فیلتر می شود. با دادن یک پرس و جو کاربر به سادگی نوشتن پرس و جو زیر است:

select top(10)
id,
title,
vector_distance(‘cosine’, @qv, embeddings) as cosine_distance
from
web.sessions
order by
cosine_distance

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با توجه به بردار جستجو @qv که حاوی جاسازی موضوع مورد جستجو است، پرس و جو 10 جلسه مشابه را برمی گرداند. دریافت جاسازی‌ها برای برخی از متن‌ها را می‌توان به روش‌های مختلفی با بسیاری از زبان‌ها انجام داد، اما در پایان روز فقط یک تماس REST است، بنابراین در Azure SQL می‌توان آن را به راحتی با استفاده از sp_invoke_external_rest_endpoint همانطور که در این نمونه رویه Get_Embeddings نشان داده شده است انجام داد.

کد و نسخه ی نمایشی

همین است. پیاده سازی الگوی RAG در Azure SQL فوق العاده آسان است. اگر می‌خواهید خودتان آن را ببینید، من همین چند روز پیش در مورد این موضوع در .NET Conf Focus on AI ارائه کرده‌ام، جایی که الگوی کامل سرتاسری را به نمایش گذاشتم. شما می توانید مخزن را دریافت کنید و نسخه ی نمایشی را به صورت محلی اجرا کنید (به جز Azure SQL DB، اما هی! یک ردیف رایگان برای آن وجود دارد!) یا در Azure و سپس از آنجا می توانید شروع به استفاده از داده های خود به جای داده های نمونه آزمایشی کنید. ارائه شده است و شما در حال حاضر در مسیر خوبی قرار خواهید گرفت تا به کاربران خود اجازه دهید با داده های شما چت کنند.

نتیجه گیری

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

و، به هر حال، نمونه‌هایی با استفاده از آن کتابخانه‌هایی که ذکر کردم به زودی دنبال می‌شوند، پس با ما همراه باشید!

Retrieval Augmented Generation یا RAG یکی از داغ‌ترین موضوعات در حال حاضر است زیرا امکان تعامل با داده‌ها را با استفاده از زبان طبیعی باز می‌کند، که رویای دیرینه‌ای است که در نهایت محقق می‌شود.

نمونه RAG در ترمینال

این احتمال وجود دارد که بسیاری از داده‌های شما قبلاً در Azure SQL ذخیره شده یا ذخیره شوند، بنابراین یک درخواست رایج این است که مثالی در مورد نحوه اعمال الگوی RAG به داده‌های ذخیره شده خود در پایگاه داده Azure SQL داشته باشید.

این پست وبلاگ همه چیز در مورد آن است. بیایید از اصول اولیه شروع کنیم و مطمئن شویم که الگوی RAG به وضوح درک شده است.

الگوی RAG 101

برای سهولت درک توضیح، حتی اگر در موضوع کاملاً تازه کار هستید، اجازه دهید از یک سناریوی ساده شروع کنیم. شما یک پایگاه داده دارید که در آن جزئیات – عنوان، چکیده، زمان، سخنرانان – تمام جلسات یک کنفرانس را ذخیره کرده اید. یک مثال خوب می تواند کنفرانس .NET Focus on AI یا کنفرانس آینده .NET Conf 2024 یا یکی از موارد مورد علاقه من، کنفرانس VS Live باشد.

چرا RAG؟

قبلاً می‌دانید که مدل‌های زبانی مانند GPT-4 یا Phi-3 می‌توانند هر متنی را که به آنها ارائه می‌دهید بپذیرند، و تقریباً برای هر سؤالی که بخواهید بپرسید، پاسخ دهند. بنابراین، چرا یک الگوی خاص مانند RAG مورد نیاز است؟ چرا ما نمی‌توانیم تمام عناوین و چکیده و تمام اطلاعات ذخیره شده در پایگاه داده را به LM ارسال کنیم و آن را یک روز فراخوانی کنیم؟ سپس می‌توانیم با استفاده از یک تماس ساده API هر چیزی را بپرسیم و کارمان تمام می‌شود.

دو دلیل وجود دارد که چرا نمی خواهید این کار را انجام دهید.

اول از همه، اگر چیزی مرتبط با Blazor می‌پرسید، نیازی به ارائه جزئیات LM در مورد جلسه‌ای نیست که کاملاً خارج از محدوده است: این به LM در پاسخگویی کمک نمی‌کند و در واقع می‌تواند پاسخ را دقیق‌تر کند (نگاه کنید به : “Lost in the Middle: How Language Models Use Long Contexts”). ثانیاً، هزینه تماس با هوش مصنوعی بر اساس تعداد توکن‌هایی است که متن ارسالی باید به آن تقسیم شود – توکن‌سازی چیزی است که به طور شفاف در پشت صحنه اتفاق می‌افتد – و بنابراین هرچه متن کمتری ارسال کنید، رمز کمتری ارسال می‌کنید که به این معنی است که شما از منابع کمتری استفاده خواهید کرد. کارایی بیشتر، ضایعات دیجیتال کمتر (که به معنای مصرف انرژی کمتر است)، هزینه کمتری برای پرداخت: این یک پیروزی برای همه است!

مراحل RAG

اولین گام الگوی RAG فیلتر کردن تمام داده هایی است که به سوال مطرح شده مرتبط نیستند. برای این مرحله اول، معمولاً جستجوی معنایی روی متن انجام می شود. برای انجام یک جستجوی معنایی، جاسازی‌ها و بنابراین بردارها برای انجام جستجوی شباهت برداری استفاده می‌شوند و فقط نتایج مربوطه را برمی‌گردانند. از آنجایی که Azure SQL یک پایگاه داده رابطه‌ای و چند مدلی مدرن و قدرتمند است، می‌توانید سایر قابلیت‌های فیلترینگ دیگر را که قبلاً داشته است، جستجوی برداری را غنی کنید. فیلتر کردن بر اساس مقادیر دقیق (مثلاً همه جلسات در یک روز خاص)، با داده‌های JSON (مثلاً جلسات با برچسب‌های خاص) یا حتی استفاده از فیلترهای مکانی (مثلاً جلسه در فاصله 1 کیلومتری من تحویل داده می‌شود).

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

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

نمودار الگوی RAG سطح بالا

اکنون که با الگوی RAG آشنا شدید، زمان آن رسیده است که ببینید چگونه می توان آن را با استفاده از سرویس های Azure تحقق بخشید.

الگوی RAG در Azure

راه های زیادی برای پیاده سازی الگوی RAG در Azure وجود دارد. من شخصاً رویکرد بدون سرور ارائه شده توسط ابر را دوست دارم، بنابراین از خدمات بدون سرور در این نمونه استفاده می کنم. اگر یک رویکرد کانتینری را ترجیح می دهید، به خاطر داشته باشید که اگر ترجیح می دهید همه چیز را در اینجا به راحتی در یک ظرف میزبانی کنید.

معماری سطح بالای الگوی RAG اعمال شده در Azure به شرح زیر است:

معماری راه حل سطح بالا در Azure

خدمات Azure مورد استفاده عبارتند از:

برنامه های وب استاتیک Azure
Azure OpenAI
توابع لاجوردی
Azure Functions SQL Trigger Binding
پایگاه داده Azure SQL
سازنده API داده

Frontend

fronted یک برنامه ساده React است که در Azure Static Web Apps میزبانی شده است. این برای اجازه دادن به کاربران برای پرسیدن سؤالی استفاده می شود که سپس با استفاده از الگوی RAG به آن پاسخ داده می شود. همچنین گزینه ای وجود دارد که فقط جستجوی شباهت انجام دهید تا به وضوح تفاوت از نظر پاسخ بین یک جستجوی مشابه ساده و الگوی RAG کامل را مشاهده کنید.

اسکرین شات رابط کاربری

Backend

از توابع Azure برای رسیدگی به سوال پرسیده شده توسط کاربر و هماهنگ سازی الگوی RAG استفاده می شود. هنگامی که سؤال پرسیده می شود، تابع Azure به نام، جستجوی شباهت را در Azure SQL انجام می دهد، سپس نتایج را در قالبی جدا از لوله بسته بندی می کند.

string.Join("\r", sessions.Select(s => $"{s.Title}|{s.Abstract}|{s.Speakers}|{s.Start}|{s.End}"));
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و سپس سوال، لیست جلسه و دستور زیر را به LM که در Azure OpenAI میزبانی شده است ارسال کنید:

"You are a system assistant who helps users find the right session to watch from the conference, based off the sessions that are provided to you. Sessions will be provided in an assistant message in the format of `title|abstract|speakers|start-time|end-time`. You can use only the provided session list to help you answer the user's question. If the user asks a question that is not related to the provided sessions, you can respond with a message that you can't help with that question."
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سازنده API داده برای نمایش آسان رویه‌های ذخیره‌شده که از طریق تماس‌های REST از فرانت‌اند فراخوانی می‌شوند استفاده می‌شود تا نشان دهد چند جلسه ایندکس شده است (در برگه «درباره») و برای فراخوانی رویه find_session که جستجوی برداری را انجام می‌دهد (موجود در « جستجو»). سازنده API داده به طور خودکار اشیاء پایگاه داده مورد نظر را به عنوان نقاط پایانی REST یا GraphQL نشان می دهد، که برای استقرار سریع یک سرویس CRUD که می تواند توسط هر چارچوبی فقط در چند دقیقه فراخوانی شود عالی است.

همچنین از توابع Azure برای تبدیل فوری عنوان جلسه و چکیده به یک جاسازی به محض ایجاد تغییرات در جدول پایگاه داده استفاده می شود. این کار با فراخوانی Azure OpenAI embedding model انجام می شود. Azure SQL Trigger Binding چیزی است که امکان نظارت بر جداول برای تغییرات را فراهم می کند و سپس با اجرای کدی در خود تابع Azure به آن تغییرات واکنش نشان می دهد. بسیار سبک وزن است (از قابلیت های بومی Azure SQL Change Tracking در پشت صحنه استفاده می کند) و تمام انعطاف پذیری و قدرت محاسباتی مورد نیاز برای تقریباً هر چیزی را فراهم می کند.

پایگاه داده

پشتیبانی Azure SQL برای ذخیره سازی بومی و پرس و جو بردارها در Early Adopter Preview است. این شامل قابلیت ذخیره بردارها در فرمت باینری فشرده و محاسبه فاصله بین دو بردار – و در نتیجه محاسبه شباهت معنایی موضوعات مرتبط به عنوان بردارهای موجود در این نمونه، تعبیه عنوان جلسه و چکیده است – به طوری که تنها جلسه مربوطه فیلتر می شود. با دادن یک پرس و جو کاربر به سادگی نوشتن پرس و جو زیر است:

select top(10)
    id, 
    title,
    vector_distance('cosine', @qv, embeddings) as cosine_distance
from
    web.sessions
order by
    cosine_distance
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با توجه به بردار جستجو @qv که حاوی جاسازی موضوع مورد جستجو است، پرس و جو 10 جلسه مشابه را برمی گرداند. دریافت جاسازی‌ها برای برخی از متن‌ها را می‌توان به روش‌های مختلفی با بسیاری از زبان‌ها انجام داد، اما در پایان روز فقط یک تماس REST است، بنابراین در Azure SQL می‌توان آن را به راحتی با استفاده از sp_invoke_external_rest_endpoint همانطور که در این نمونه رویه Get_Embeddings نشان داده شده است انجام داد.

کد و نسخه ی نمایشی

همین است. پیاده سازی الگوی RAG در Azure SQL فوق العاده آسان است. اگر می‌خواهید خودتان آن را ببینید، من همین چند روز پیش در مورد این موضوع در .NET Conf Focus on AI ارائه کرده‌ام، جایی که الگوی کامل سرتاسری را به نمایش گذاشتم. شما می توانید مخزن را دریافت کنید و نسخه ی نمایشی را به صورت محلی اجرا کنید (به جز Azure SQL DB، اما هی! یک ردیف رایگان برای آن وجود دارد!) یا در Azure و سپس از آنجا می توانید شروع به استفاده از داده های خود به جای داده های نمونه آزمایشی کنید. ارائه شده است و شما در حال حاضر در مسیر خوبی قرار خواهید گرفت تا به کاربران خود اجازه دهید با داده های شما چت کنند.

اسکرین شات ویدیوی یوتیوب

نتیجه گیری

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

و، به هر حال، نمونه‌هایی با استفاده از آن کتابخانه‌هایی که ذکر کردم به زودی دنبال می‌شوند، پس با ما همراه باشید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا