Software Philosophy – Telegram
Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
ساخت اپلیکیشن‌های هوش مصنوعی با Chroma در NET.

اگر دنبال ارتقای پروژه‌های NET. با قابلیت‌های جستجوی هوشمند هستید، حالا می‌توانید از Chroma استفاده کنید، یک پایگاه داده متن‌باز مخصوص اپ‌های AI!

📌اما Chroma چیست؟
پایگاه داده‌ای برای ذخیره‌سازی embeddingها، جستجوی vector، فیلتر متادیتا، full-text search و بازیابی multi-modal (چند رسانه‌ای). مناسب برای پیاده‌سازی قابلیت‌هایی مثل جستجوی semantic و RAG.

🛠چگونه از Chroma استفاده کنیم؟
با پکیج ChromaDB.Client در سی‌شارپ می‌توانید به راحتی به دیتابیس وصل شوید، مجموعه‌ای بسازید، داده‌ها را اضافه کنید و با vector search، اطلاعات مرتبط را پیدا کنید.

۱. نصب
۲. ساخت یک ChromaClient
using ChromaDB.Client;

var configOptions = new ChromaConfigurationOptions(uri: "http://localhost:8000/api/v1/");
using var httpClient = new HttpClient();
var client = new ChromaClient(configOptions, httpClient);

۳. ساخت کالکشن

var collection = await client.GetOrCreateCollection("movies");

var collectionClient = new ChromaCollectionClient(collection, configOptions, httpClient);

۴. ادامه نمونه کدها به همراه توضیحات رو می‌توانید از این لینک مشاهده کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

______
👍53🔥1
باکسینگ (Boxing) و آنباکسینگ (Unboxing)

#csharp_for_beginners

باکسینگ (Boxing)

باکسینگ Boxing زمانی اتفاق می‌افتد که یک مقدار از نوع‌های مقداری مثل int یا double به یک نوع مرجع مانند object تبدیل شود. در این فرایند یک شیء جدید در حافظهٔ heap ایجاد می‌شود و مقدار داخل آن قرار می‌گیرد. بعد از انجام باکسینگ Boxing، مقدار اولیه و مقدار قرار داده‌شده داخل شیء دو داده‌ی جداگانه خواهند بود و این عملیات به دلیل ایجاد شیء جدید از نظر عملکردی هزینه‌بر است.

نمونه کد:
int i = 123;
object o = i; // جعبه‌سازی
i = 456;
Console.WriteLine(i);
Console.WriteLine(o);


آنباکسینگ (Unboxing)
اما Unboxing تبدیل برعکس Boxing است و زمانی رخ می‌دهد که بخواهیم مقدار موجود در یک شیء از نوع object را دوباره به نوع مقداری اصلی خود تبدیل کنیم. این کار باید به صورت صریح انجام شود، یعنی لازم است نوع مقصد را حتماً با cast مشخص کنیم. در زمان اجرای برنامه بررسی می‌شود که آیا شیء واقعاً حاصل یک عملیات Boxing از همان نوع مقداری مورد انتظار هست یا خیر. اگر بررسی موفق باشد، مقدار ذخیره ‌شده در heap به یک متغیر مقداری کپی می‌شود. اما اگر شیء تهی (null) باشد یا نوع واقعی آن با نوعی که انتظار داریم مطابقت نداشته باشد، برنامه خطاهایی مانند NullReferenceException یا InvalidCastException تولید می‌کند.

نمونه کد:
int i = 123;
object o = i; // جعبه‌سازی

try
{
int j = (int)o; // ازجعبه‌سازی درست
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}


نمونهٔ خطا:
int i = 123;
object o = i;

try
{
short x = (short)o; // خطای InvalidCastException
}
catch (InvalidCastException e)
{
Console.WriteLine("Incorrect unboxing");
}


باکسینگ Boxing و آنباکسینگ Unboxing به دلیل تخصیص حافظه و بررسی نوع در زمان اجرا از نظر عملکردی هزینه‌بر هستند. در بخش‌هایی از برنامه که این عملیات زیاد انجام می‌شود ممکن است باعث کاهش کارایی شوند. برای جلوگیری از این مشکل، استفاده از Genericها می‌تواند بسیار مؤثر باشد زیرا تبدیل‌های غیرضروری را حذف می‌کند.

🔗 مطلب کامل را در این لینک می‌توانید مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
4👍1
تغییر مهم در NET 9. برای توسعه‌دهندگان HTTP

در نسخه جدید NET 9.، رفتار پیش‌فرض HttpClientFactory تغییر کرده است و به‌جای استفاده از HttpClientHandler از SocketsHttpHandler به‌عنوان هندلر اصلی استفاده می‌شود (البته در پلتفرم‌هایی که قابلیت پشتیبانی داشته باشند).

🔧 این تغییر باعث می‌شود تا کدهایی که قبلاً هندلر را به HttpClientHandler تبدیل می‌کردند، با خطای InvalidCastException مواجه شوند.

مثلا کد زیر خطایی که گفته شد را خواهد داد:
services.AddHttpClient("test")
.ConfigurePrimaryHttpMessageHandler((h, _) =>
{
((HttpClientHandler)h).UseCookies = false;
});


دلیل این تغییر؟ بهبود مدیریت اتصال‌ها و حل مشکلات مربوط به تغییرات DNS در کلاینت‌های Singleton. اکنون SocketsHttpHandler با ویژگی PooledConnectionLifetime به‌طور پیش‌فرض تنظیم می‌شود تا اتصال‌ها به‌صورت دوره‌ای بازسازی شوند.

🔗 توضیحات تکمیلی را اینجا بخوانید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

______
7👍1🔥1
داینامیک (dynamic)

#csharp_for_beginners

نوع dynamic یک نوع static است اما وقتی متغیری از نوع dynamic باشد کنترل نوع کامپایلر نادیده گرفته می‌شود. یعنی معمولاً مانند نوع object رفتار می‌کند اما کامپایلر فرض می‌کند که هر عملی روی آن امکان‌پذیر است بدون اینکه نوع دقیق آن را بداند.
نتیجه این کار این است که وقتی با dynamic کار می‌کنید لازم نیست بدانید مقدار آن دقیقاً از کجا آمده مثلا از COM API یا یک زبان دینامیک یا از DOM HTML یا بازتاب (reflection).
اگر کد شما نادرست باشد خطا در زمان اجرا ظاهر می‌شود نه زمان کامپایل

مثال:
class ExampleClass
{
public void exampleMethod1(int i) { }
public void exampleMethod2(string str) { }
}

static void Main(string[] args)
{
ExampleClass ec = new ExampleClass()
dynamic dynamic_ec = new ExampleClass()
dynamic_ec.exampleMethod1(10, 4)
dynamic_ec.someMethod("some argument", 7, null)
dynamic_ec.nonexistentMethod()
}


نتیجه عمل روی متغیر dynamic
بیشتر عملیات روی dynamic باز هم نتیجه‌ای از نوع dynamic می‌دهند مثلا

dynamic d = 1
var testSum = d + 3


در اینجا testSum خودش dynamic خواهد بود، اما بعضی از عملیات‌ها نتیجه‌ای غیر dynamic دارند مثل تبدیل به نوع خاص یا ساخت شی با آرگومان‌های dynamic.

var testInstance = new ExampleClass(d)


در اینجا نوع testInstance برابر ExampleClass خواهد بود نه dynamic

کاربردها
داینامیک زمانی مفید است که بخواهید دیر-بایندینگ (late binding) داشته باشید یعنی تصمیم‌گیری نوع و فراخوانی متدها یا پراپرتی‌ها در زمان اجرا انجام شود نه کامپایل.
برای Interop یا COM زمانی که با APIهای COM کار می‌کنید dynamic دیگر لازم نیست هر بار casting انجام دهید.
برای زبان‌های دینامیک یا DOM یا reflection وقتی ساختار داده یا API تان در زمان اجرا معلوم می‌شود dynamic انعطاف بیشتری می‌دهد.

🔗 مطلب کامل را در این لینک می‌توانید مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
👍62
تولید اطلاعات نادرست با اعتماد به نفس بالا!

توهم (Hallucination) در مدل‌های زبانی به حالتی گفته می‌شود که مدل، اطلاعات نادرست یا ساختگی تولید می‌کند، در حالی که با اطمینان و لحن قانع‌کننده آن را ارائه می‌دهد. این پدیده می‌تواند شامل اشتباهات تاریخی، علمی، یا حتی ساختن منابع و نقل‌قول‌های جعلی باشد.

تصور کنید از یک مدل زبانی می‌پرسید: «چه کسی اولین بار نظریه نسبیت را مطرح کرد؟» و پاسخ می‌دهد: «ایزاک نیوتن در سال ۱۸۷۹». این پاسخ نه‌تنها اشتباه است (چون نظریه نسبیت متعلق به آلبرت اینشتین است)، بلکه با لحنی قاطع ارائه می‌شود که می‌تواند مخاطب را گمراه کند.

چرا مدل‌ها دچار توهم می‌شوند؟
🔘 هدف آموزشی مدل‌ها: پیش‌بینی واژه‌ی بعدی
- مدل‌های زبانی بر اساس احتمال واژه‌ی بعدی آموزش می‌بینند، نه بر اساس صحت اطلاعات.
- این یعنی مدل‌ها بیشتر «حدس» می‌زنند تا «اطلاع» داشته باشند.
🔘نبود داده‌های منفی یا بازخورد اصلاحی
- در فرآیند آموزش، مدل‌ها معمولاً فقط با داده‌های مثبت تغذیه می‌شوند.
- اشتباهاتشان اصلاح نمی‌شود مگر در مراحل خاصی مثل fine-tuning یا RLHF.

🔘تشویق به تولید پاسخ‌های روان و کامل
- مدل‌ها برای تولید پاسخ‌هایی جذاب و کامل پاداش می‌گیرند، حتی اگر دقیق نباشند.
- ابراز «ندانستن» اغلب امتیاز کمتری دارد.

🔘فشار ارزیابی‌های سطحی
- بسیاری از ارزیابی‌ها فقط دقت زبانی یا شباهت به پاسخ‌های انسانی را می‌سنجند.
- صداقت، فروتنی شناختی، یا توانایی تشخیص عدم قطعیت نادیده گرفته می‌شود.

برای ساخت مدل‌هایی قابل اعتمادتر، باید هم در آموزش و هم در ارزیابی تغییراتی ایجاد شود. برخی راهکارهای کلیدی عبارت‌اند از:
🟣 تشویق به ابراز عدم قطعیت
- مدل‌ها باید یاد بگیرند که گاهی «نمی‌دانم» گفتن بهتر از حدس زدن است.
- این رفتار باید در ارزیابی‌ها پاداش داده شود.

🟣 استفاده از داده‌های منفی در آموزش
- آموزش مدل‌ها با نمونه‌هایی از پاسخ‌های اشتباه و اصلاح‌شده، به آن‌ها کمک می‌کند تا بهتر تشخیص دهند چه چیزی نادرست است.

🟣 ارزیابی چندلایه
- علاوه بر دقت زبانی، باید معیارهایی مثل «درستی اطلاعات»، «منبع‌پذیری» و «فروتنی شناختی» نیز سنجیده شوند.

🟣 افزایش شفافیت مدل‌ها
- مدل‌ها باید بتوانند توضیح دهند که چرا یک پاسخ را داده‌اند یا از کجا آن را گرفته‌اند.

🔗 در اینجا می‌توانید بیشتر بخوانید.
___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍5
تفاوت Add و AddAsync در EF Core به همراهی Hi/Lo!

اگه با Entity Framework Core کار می‌کنید، شاید برایتان سوال پیش آمده باشد که بهتر است از Add استفاده کنیم یا AddAsync؟
متد Add فقط موجودیت را به Change Tracker اضافه می‌کند و هیچ ارتباطی با دیتابیس برقرار نمی‌کند تا زمانی که SaveChanges یا SaveChangesAsync صدا زده شود.

متد AddAsync هم همین کار را می‌کند، با این تفاوت که در موارد خاص مثل استفاده از Value Generatorهایی مثل HiLo، ممکن است نیاز باشد در لحظه‌ی اضافه‌کردن، دیتابیس را صدا بزند. برای همین AddAsync به صورت غیرهمزمان طراحی شده است.

در نتیجه اگر از Value Generator خاصی استفاده نمی‌کنید، Add سریع‌تر و سبک‌تر است چون سربار ساخت Task و State Machine را ندارد. اما اگه احتمال می‌دهید EF نیاز داشته باشد در لحظه‌ی اضافه‌کردن با دیتابیس ارتباط بگیرد، AddAsync انتخاب بهتری است.

📌 نکته مهم: تفاوت اصلی در زمان اجرای SaveChanges اتفاق می‌افتد، نه هنگام Add یا AddAsync.

نتیجه‌گیری: در ۹۹٪ موارد، استفاده از Add کفایت می‌کند. AddAsync فقط برای سناریوهای خاص مثل HiLo یا Sequence Generatorها کاربرد دارد.


حال Hi/Lo چیست؟
با Hi/Lo می‌توانیم شناسه‌ها را سمت کلاینت تولید کنیم، بدون اینکه منتظر ذخیره شدن در دیتابیس بمانیم. EF یک مقدار بالا (Hi) از دیتابیس می‌گیرد و با یک آفست پایین (Lo) در حافظه، شناسه‌ها را تولید می‌کند.

🔗 نحوه استفاده از این فیچر را هم می‌توانید اینجا به همراه توضیحات کامل بخوانید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

______
👍95
کلید اصلی در EF Core: عدد یا GUID؟

وقتی با EF Core کار می‌کنیم، یکی از تصمیم‌های مهم اولیه انتخاب نوع کلید اصلی (Primary Key) است. دو گزینه رایج داریم:
🔹 عدد صحیح (int یا long)
🔹 شناسه یکتا گلوبال (GUID)

هر کدام از این دو گزینه مزایا و معایب خود را دارند:

عدد صحیح (int/long):
- عملکرد بهتر در جستجو و ایندکس‌گذاری
- خوانایی بیشتر برای انسان‌ها
- حجم کمتر (۴ یا ۸ بایت)

اما:
- در سیستم‌های توزیع‌شده ممکن است باعث تداخل شود.
- قابل پیش‌بینی بودن مقادیر می‌تواند امنیت را کاهش دهد.

نوع GUID:
- یکتایی گلوبال، مناسب برای سیستم‌های توزیع‌شده.
- ادغام راحت داده‌ها از منابع مختلف.
- امنیت بیشتر به خاطر غیرقابل پیش‌بینی بودن.
- می‌توانیم سمت کد موقع ایجاد آبجکت جدید دیتابیسی یک Id جدید اضافه کنیم. Guid.NewGuid که پرفورمنسی بهتر است.

اما:
- عملکرد ضعیف‌تر نسبت به int
- حجم بیشتر (۱۶ بایت)
- سخت‌تر برای خواندن و تایپ دستی

🔍 جمع‌بندی:
تصمیم شخصی من با توجه به موضوعاتی که گفته شد این است که از GUID استفاده کنم تا دیگر به ازای هر Add نیازی نباشد که یک بار دیگر سمت دیتابیس بروم و خب فواید دیگری هم برای Guid دارم و آن پرفورمنسی که در مورد int صحبت شد برای من آنچنان Game Changer نبوده است و مزایای int نسبت به مزایای Guid برای من کمتر است

انتخاب شما چی است؟

🔗 توضیحات تکمیلی را اینجا بخوانید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

______
👍121
هوش‌مصنوعی به جز دمو!
تکنولوژی‌های هوش‌مصنوعی معمولا در دموها خیلی جذابن، ولی در استفاده واقعی، «واقعیِ واقعی»، لزوما به اون بامزگی نیستن!
تو این گفتگو قراره در مورد استفاده از هوش‌مصنوعی تو محصولات واقعی صحبت کنم. اینکه ما با چطور از LLM هایی که ذاتا با Hallucination همراه هستن تو محصولات تجاری استفاده می‌کنیم.
کمی هم در مورد معماری نرم‌افزاری و مدل تست‌نویسی semantic که توی @CrystaCode ازشون استفاده می‌کنیم می‌گم و توضیح می‌دم که چطور باعث می‌شه با این روش‌ها محصولات قابل اعتمادتر نوشت.

🔗 در این لینک با ما باشید.
🔥72👍2
سلسله مطالب مرتبط با موضوع MCP ها:

ساخت سرورهای MCP با Azure Functions

مطالب قبلی:

ساخت یک MCP Server‌ ساده با سی‌شارپ
نگاهی‌ کمی فلسفی‌تر به MCP
لایو تکمیلی در مورد MCP و LLM ها

پروتکل MCP (Model Context Protocol) راهی نو برای ارتباط بین مدل‌های هوش مصنوعی و ابزارهای کاربردی فراهم کرده. حالا با استفاده از Azure Functions می‌توانید خیلی راحت سرورهای MCP بسازید و آن‌ها را به صورت ریموت اجرا کنید!

ویژگی‌های جذاب:
- استفاده از ویژگی [McpToolTrigger] برای تبدیل فانکشن‌ها به ابزارهای قابل استفاده توسط LLMها.
- ذخیره و بازیابی داده‌ها از Azure Blob Storage با چند خط کد.
- اتصال مستقیم به VS Code و GitHub Copilot برای تعامل هوشمند با کدها.


فقط کافی است پروژه نمونه را کلون کنید، دستور azd up را اجرا کنید و سرور MCP شما روی Azure بالا می‌آید! بعد می‌توانید با Copilot صحبت کنید و بخواهید کدهای انتخاب‌شده شما را ذخیره کند یا دوباره برایتان بیاورد.

📚‌ آموزش کامل و کد نمونه را می‌توانید در وبلاگ رسمی دات‌نت بخوانید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

______
👍31
بازنویسی تاریخی در دنیای دات‌نت با 9 NET.!

تیم NuGet در مایکروسافت موفق شد الگوریتم Restore را در نسخه 9 NET. به‌طور کامل بازنویسی کند؛ نتیجه؟ افزایش سرعت تا ۱۶ برابر!

📉 زمان Restore برای پروژه‌های بزرگ از ۳۲ دقیقه به فقط ۲ دقیقه رسید!

چرا این اتفاق افتاد؟
- الگوریتم قبلی بیش از ۱۰ سال بدون تغییر باقی مانده بود.
- پروژه‌های بزرگ مثل TeamX با کندی شدید مواجه شده بودند.
- ساختار بازگشتی و حافظه‌بر باعث دیباگ سخت و مصرف منابع بالا شده بود.

چه تغییراتی اعمال شد؟
- حذف ساخت گراف کامل و جایگزینی با ساختار تخت و تصمیم‌گیری لحظه‌ای.
- بهینه‌سازی حافظه، کاهش تعداد تکرارها و حذف نودهای تکراری.
- اضافه شدن ویژگی‌هایی مثل transitive pinning و مدیریت بهتر خطاها.

📈 نتیجه نهایی:
- افزایش چشمگیر بهره‌وری توسعه‌دهندگان.
- صرفه‌جویی در منابع زیرساختی.
- آماده‌سازی برای مقیاس‌پذیری در پروژه‌های عظیم.

🔗 توضیحات کامل را در این لینک ببینید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

______
1👍113🔥2
دلیگیت (delegate)

#csharp_for_beginners

دلیگیت‌ها (delgate) در زبان سی‌شارپ نوعی داده‌اند که مرجع به یک یا چند متد را نگه می‌دارند. Delegateها شبیه اشاره‌گر تابع هستند اما به‌صورت شیءگرا پیاده‌سازی شده‌اند. این ویژگی باعث می‌شود فقط متدهایی با امضای مشخص بتوانند به یک delegate متصل شوند.

برای تعریف یک delegate از کلمه کلیدی delegate استفاده می‌شود. تعریف delegate مشابه امضای یک متد است و مشخص می‌کند چه نوع متدی می‌تواند به آن نسبت داده شود:

public delegate void Callback(string message);


این delegate می‌تواند به هر متدی متصل شود که یک پارامتر از نوع string دریافت کند و مقدار بازگشتی نداشته باشد.

پس از تعریف delegate، می‌توان یک نمونه از آن ایجاد کرد و یک متد سازگار را به آن نسبت داد.

static void DelegateMethod(string message)
{
Console.WriteLine(message);
}

Callback handler = DelegateMethod;


در این مثال، متد DelegateMethod به delegate متصل شده است. اکنون می‌توان delegate را مانند یک متد فراخوانی کرد.

handler("Hello World");


یکی از کاربردهای مهم delegate استفاده از آن به‌عنوان callback است. در این حالت، delegate به‌عنوان پارامتر به یک متد دیگر ارسال می‌شود.

static void MethodWithCallback(int a, int b, Callback callback)
{
callback("Result: " + (a + b));
}


متد بالا بدون اطلاع از جزئیات متد callback، آن را در زمان مناسب اجرا می‌کند.

Delegateها می‌توانند چندین متد را به‌صورت هم‌زمان نگه دارند. به این نوع delegate، multicast delegate گفته می‌شود.

Callback handler = DelegateMethod;
handler += AnotherMethod;


در این حالت، هنگام فراخوانی delegate، هر دو متد اجرا می‌شوند.

Delegateها اشیاء هستند و می‌توان آن‌ها را ذخیره کرد، به متدها ارسال کرد یا در propertyها استفاده کرد. همچنین eventها در C# بر پایه delegate ساخته می‌شوند و از همین سازوکار برای اطلاع‌رسانی استفاده می‌کنند.

🔗 مطلب کامل را در این لینک می‌توانید مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
👍31
مهاجرت از تایپ‌اسکریپت (۲.۵ میلیون خط کد) به سی‌شارپ

در بلاگ زیر، CTO شرکت Motion توضیح می‌دهد که چرا تصمیم گرفته‌اند کدهای خود را از #typenoscript به #csharp ببرند...
دلایلی که آورده بسیار قابل توجه هستند و ارزش خواندن و فکر کردن را دارند. ما هم تقریبا به دلایل مشابهی در چند سال گذشته پروژه‌های جاواسکریپتی خود را به سی‌شارپ منتقل کردیم.
حتی در دو پروژه اخیر که با شرکت‌های کانادایی بوده، اولین کار مهاجرت از کدهای #react به #blazor بوده است.

نظر شما چیه؟

🔗 در این صفحه می‌توانید مطلب کامل را بخوانید.

#مهران_داودی (لینکدین - بلاگ)

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
1👍65👎2🔥1
گزارش از دیتابیس لازم داری؟ فقط حرف بزن!

تصور کنید وارد یک پنل مدیریتی می‌شوید، فقط یک جمله ساده تایپ می‌کنید:
«نمایش مشتریانی که بیش از ۵ خرید داشته‌اند»
و بدون اینکه حتی یک خط SQL بنویسید، جدول دقیق با تمام اطلاعات جلو روی شما ظاهر می‌شود.
نه نیاز به دانش دیتابیس دارید، نه وقت گذاشتن برای نوشتن کوئری‌های پیچیده.
این آینده نیست. این حال حاضر توسعه نرم‌افزار با هوش مصنوعی‌ست.
با ظهور مدل‌های زبانی قدرتمند مثل GPT-4، تعامل با داده‌ها وارد مرحله‌ای جدید شده است. حال می‌توانیم با زبان طبیعی، مثل حرف زدن با یک همکار، از دیتابیس اطلاعات بگیریم.

مرحله اول: دریافت ساختار دیتابیس
برای اینکه GPT-4 بتواند کوئری دقیق تولید کند، ابتدا باید ساختار جدول‌ها و ستون‌ها را بشناسد. با استفاده از EF Core، می‌توان لیستی از جدول‌ها و فیلدها را استخراج کرد و به مدل ارسال کرد.
public async Task<string> GetAllTableSchemas()
{
// دریافت اطلاعات جدول‌ها از دیتابیس
}


مرحله دوم: تبدیل زبان طبیعی به SQL
در این مرحله، جمله‌ای مانند "نمایش مشتریانی که بیش از ۵ خرید داشته‌اند" به GPT-4 ارسال می‌شود. مدل با توجه به ساختار دیتابیس، کوئری SQL مناسب تولید می‌کند.
public async Task<string> GenerateSQLQuery(string userPrompt)
{
var prompt = $"Given the following database schema: {schema}, write a SELECT SQL query for: {userPrompt}";
var response = await openAiClient.GetCompletionAsync(prompt);
return response.Text;
}


مرحله سوم: اجرای کوئری و نمایش نتیجه
کوئری تولیدشده روی دیتابیس اجرا می‌شود و نتیجه به کاربر نمایش داده می‌شود. این بخش می‌تواند به‌صورت جدول، نمودار یا حتی فایل خروجی طراحی شود.
public async Task<DataTable> ExecuteQuery(string sql)
{
using var connection = new NpgsqlConnection(connectionString);
var command = new NpgsqlCommand(sql, connection);
var reader = await command.ExecuteReaderAsync();
// تبدیل نتیجه به DataTable
}



⚠️ نکته‌ای که باید در نظر بگیرید این است که فقط کوئری‌های SELECT مجاز هستند تا از تغییر یا حذف داده‌ها جلوگیری شود.

برای دیدن نمونه عملی این پروژه، مقاله اصلی در DZone را ببینید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
1🔥53👎3👍2🤔1