🚀 🤑 مثال عملی پیادهسازی RAG (قسمت ۲)
🚀 🤑 مثال عملی پیادهسازی RAG (قسمت ۲)
پاسخ به پرسشهای ارزی! با دیتای لحظهای... 😎🤑
توجه!
قرار بود از مدل Phi-3 mini استفاده کنیم که ۲ گیگ باشه و روی لپتاپ راحت اجرا شه، اینقدر احمق بود که رفتم سراغ llama3.2 که اونم ۲ گیگ است، ولی بسی باشعورتر!
نکته: مدلها نیاز به سنجش و انتخاب دارن (چه در مثال ساده چه در کارهای بزرگ که خودش بخشی از فرایند AIOps است. Phi3 برای این کار مناسب نبود. گرچه صرفا بر اساس سایز کوچک برای مثال انتخاب کرده بودم ولی خیلی بیشعور بود!
کد آماده است و قابل دسترس رو گیتهاب، ولی باید توضیحات رو به فایل read me اضافه کنم و «شاید، اگر فرصت شه» ویدیو ضبط کنم براش.
🤓 میبینید که برعکس چیزی که انتظار میرفت، RAG اصلا خوب نیست!!! چرا؟ چون بدون RAG، یورو ۶۹۰۰ تومنه، ولی بعد از RAG میشه ۱۰۶هزار تومن. نتیجه میگیریم عامل گرونی ارز RAG است، و شایسته است که سریعتر به دار آویخته شود ☠️☠️
*️⃣اپلیکیشن یک console app است که کل کد در program.cs قرار دارد.
*️⃣کتابخونههای مورد استفاده:
HtmlAgilityPack
برای استخراج نرخ ارز از دل html دریافت شده از سایت اعلام نرخ.
(توی یک تگ table قرار دارد). تمام فرایند دریافت صفحه و استخراج مقادیر، در متد GetExchangeRatesAsync است.
Microsoft.SemanticKernel
Microsoft.SemanticKernel.Connectors.Ollama
برای استفاده از قابلیتهای Semantic Kernel و همچنین اتصال به ollama برای استفاده از مدلهایی که روی ollama داریم. کرنل در حقیقت قلب و رابط بین کد ما و مدلهای هوش مصنوعی است، کانکتورهای مختلف داره که به مدلهای لوکال یا ابری متصل شه و کار متن (مثل چت) یا کارهای تولید عکس، صدا، و... رو با مدلها انجام بده. استفاده ازش هم ساده است و اول کرنل رو تعریف، بعد هم پلاگینهای مورد نیازمون رو بهش متصل و شروع به کار میکنیم. مثلا اینجا با دو خط کد به راحتی به ollama متصل میشه و از مدل llama3.2 با ۳ میلیارد پارامتر استفاده میشه کرد (مثلا چت کرد باهاش).
همزمان با سیشارپ، semantic kernel برای پایتون و جاوا هم بهصورت رسمی توسعه و منتشر میشه.
var builder = Kernel.CreateBuilder();
builder.AddOllamaChatCompletion(
modelId: "llama3.2:3b",
endpoint: new Uri("http://127.0.0.1:11434"));
Microsoft.KernelMemory
Microsoft.SemanticKernel.Plugins.Memory
برای افزودن قابلیت «حافظه» به semantic kernel یعنی دیتای خودمون رو داخل حافظه قرار بدیم و کرنل از اون دیتا در کنار دیتای مدل استفاده کنه. اینجا memory رو استفاده کردیم. ولی میتونیم از وکتور دیتابیس هم استفاده کنیم. البته این ساختارها (مموری یا وکتور دیتابیس) اینقدر عادی شدند که نیازی ندارید تا جزئیات فنی داخلیشون رو الزاما یاد بگیرید و مهم نحوه استفاده ازشون است. به بیان خیلی ساده شده، دیتا توی یک ماتریس قرار میگیره که مشابهت/قرابت سطر و ستون که هر کدوم یک کلمه میتونیم در نظر بگیریم با یک عدد مشخص میشه.
ایجاد مموری:
var embeddingGenerator = kernel.Services.GetRequiredService
var memory = new SemanticTextMemory(new VolatileMemoryStore(), embeddingGenerator);
حالا ذخیره دادهها داخل مموری:
const string MemoryCollectionName = "exchangeRates";
string url = "https://bonbast.org";
var exchangeRates = await GetExchangeRatesAsync(url);
foreach (var rate in exchangeRates)
{
string memoryKey = $"{rate.Key} to Iranian Rial";
await memory.SaveInformationAsync(MemoryCollectionName, id: memoryKey, text: $"1 {rate.Key} equals {rate.Value.AverageRate} Iranian Tomans...");
}
TextMemoryPlugin memoryPlugin = new(memory);
kernel.ImportPluginFromObject(memoryPlugin);
فایل راهنما و توضیحات بیشتر در پست بعدی... لطفا اجرا کنید و یه مقدار باهاش سر و کله بزنید که پستهای بعدی مفید باشن 😉 اگر مفید بود و کاربردی، بگید تا بریم سراغ وکتور یا دریافت ورودی خروجی ساختار یافته به جای متن...
💬 سوال؟ پیشنهاد؟
البته Memory Store قابلیتهای کمتری نسبت به Vector Store داره و خیلی ابتداییتره. توی اولین مثال از مموری استفاده کردم فقط تا حداکثر سادگی رو داشته باشه.