کلاس Static در سیشارپ
#csharp_for_beginners
در زبان سیشارپ، کلاس Static کلاسی است که با کلیدواژه
تعریف کلاس Static:
استفاده:
در این مثال، بدون ایجاد شیء از کلاس Utility، متد PrintMessage مستقیماً فراخوانی میشود.
ویژگیهای مهم کلاس Static
▫️با کلمه کلیدی static تعریف میشود.
▫️تمام اعضای آن باید استاتیک باشند.
▫️نمیتوان با new از آن نمونهسازی کرد.
▫️به صورت ضمنی sealed است؛ بنابراین قابل ارثبری نیست.
▫️نمیتواند از کلاس دیگری ارث ببرد.
▫️نمیتواند اعضای نمونهای (Instance Members) داشته باشد.
فیلدها و ویژگیهای Static
کلاسهای استاتیک میتوانند دادههای مشترک در کل برنامه را نگهداری کنند:
استفاده:
در این حالت، مقادیر AppName و Version برای تمام بخشهای برنامه مشترک هستند.
محدودیتهای کلاس Static
▫️امکان ایجاد شیء از آن وجود ندارد.
▫️نمیتواند اعضای غیراستاتیک داشته باشد.
▫️قابل ارثبری نیست.
▫️نمیتواند Interfaceها را پیادهسازی کند.
کاربردهای کلاس Static
▫️متدهای کمکی (Utility Methods) مانند توابع ریاضی.
▫️تنظیمات سراسری برنامه (Configuration).
▫️ثبت لاگ (Logging).
▫️توابعی که به وضعیت یک شیء وابسته نیستند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
در زبان سیشارپ، کلاس Static کلاسی است که با کلیدواژه
static تعریف میشود. این نوع کلاس فقط میتواند شامل اعضای استاتیک (مانند فیلدها، متدها، ویژگیها و رویدادها) باشد و امکان ساختن شیء (Object) از آن وجود ندارد. اعضای آن مستقیماً از طریق نام کلاس فراخوانی میشوند.تعریف کلاس Static:
static class Utility
{
public static void PrintMessage(string msg)
{
Console.WriteLine(msg);
}
}
استفاده:
Utility.PrintMessage("Hello World");
در این مثال، بدون ایجاد شیء از کلاس Utility، متد PrintMessage مستقیماً فراخوانی میشود.
ویژگیهای مهم کلاس Static
▫️با کلمه کلیدی static تعریف میشود.
▫️تمام اعضای آن باید استاتیک باشند.
▫️نمیتوان با new از آن نمونهسازی کرد.
▫️به صورت ضمنی sealed است؛ بنابراین قابل ارثبری نیست.
▫️نمیتواند از کلاس دیگری ارث ببرد.
▫️نمیتواند اعضای نمونهای (Instance Members) داشته باشد.
فیلدها و ویژگیهای Static
کلاسهای استاتیک میتوانند دادههای مشترک در کل برنامه را نگهداری کنند:
static class Config
{
public static string AppName { get; set; } = "MyApp";
public static int Version { get; set; } = 1;
}
استفاده:
Console.WriteLine(Config.AppName);
Console.WriteLine(Config.Version);
در این حالت، مقادیر AppName و Version برای تمام بخشهای برنامه مشترک هستند.
محدودیتهای کلاس Static
▫️امکان ایجاد شیء از آن وجود ندارد.
▫️نمیتواند اعضای غیراستاتیک داشته باشد.
▫️قابل ارثبری نیست.
▫️نمیتواند Interfaceها را پیادهسازی کند.
کاربردهای کلاس Static
▫️متدهای کمکی (Utility Methods) مانند توابع ریاضی.
▫️تنظیمات سراسری برنامه (Configuration).
▫️ثبت لاگ (Logging).
▫️توابعی که به وضعیت یک شیء وابسته نیستند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
GeeksforGeeks
Static Class in C# - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
👍10
مفهوم Harness در دنیای AI
خیلی اوقات در حالیکه انتظار داریم پرامپتی که نوشتهایم کار کند ولی کار نمیکند (در برنامهنویسی). بیشتر وقتها کاری که میکنیم بهبود پرامپت و یا استفاده از مدل بهتر است، ولی باز هم تاثیری ندارد، هر چقدر هم توضیح دهیم که اول چک کن که کاربر لاگین باشد و بعد این کار را انجام بده، باز هم نمیشه که نمیشه! واقعیت این است که خیلی از کارها پیچیدهتر از آن هستند که با بهبود پرامپت بتوان ببهبودشان داد.
فکر کنید که GitHub Copilot یا Claude اگه فقط یک پرامپت بود که کل کد را به همراه پرامپت شما اجرا میکرد چقدر ناکارآمد بود.
مفهوم جالبی که این سیستمها از آن استفاده میکنن تا مفاهیم non-determinstic دنیای AI را به مفاهیم deterministic دنیای واقعی نزدیک کنند مفهومی است به نام Harness.
جالب است بدانید که در GitHub Copilot برای هر مدل یک هارنس اختصاصی نوشته میشود و هر وقت یک مدل جدید از راه میرسد قبل اینکه آن مدل به VS Code اضافه شود اول هارنس اختصاصیش نوشته میشود.
در این ویدئو مفهوم Harness خیلی خوب و قابل فهم توسط Tejas Kumar از IBM توضیح داده شده. اگر برنامهنویسی هستید که سیستمهای مبتنی بر LLM مینویسید که کار واقعی انجام میدهد (نه صرفا یه چت ساده برای دمو) پیشنهاد میکنم حتما این ویدئو را ببینید.
این مفهوم همان مفهومی است که ما در CrystaCode برای ساخت «ادیتور ایجنت» از آن استفاده کردیم تا بتوان روی عملکرد سیستم حساب کرد و طبق سناریوهای skUnit تستها پاس شود.
🔗 ویدئو کامل را میتوانید اینجا ببینید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
خیلی اوقات در حالیکه انتظار داریم پرامپتی که نوشتهایم کار کند ولی کار نمیکند (در برنامهنویسی). بیشتر وقتها کاری که میکنیم بهبود پرامپت و یا استفاده از مدل بهتر است، ولی باز هم تاثیری ندارد، هر چقدر هم توضیح دهیم که اول چک کن که کاربر لاگین باشد و بعد این کار را انجام بده، باز هم نمیشه که نمیشه! واقعیت این است که خیلی از کارها پیچیدهتر از آن هستند که با بهبود پرامپت بتوان ببهبودشان داد.
فکر کنید که GitHub Copilot یا Claude اگه فقط یک پرامپت بود که کل کد را به همراه پرامپت شما اجرا میکرد چقدر ناکارآمد بود.
مفهوم جالبی که این سیستمها از آن استفاده میکنن تا مفاهیم non-determinstic دنیای AI را به مفاهیم deterministic دنیای واقعی نزدیک کنند مفهومی است به نام Harness.
جالب است بدانید که در GitHub Copilot برای هر مدل یک هارنس اختصاصی نوشته میشود و هر وقت یک مدل جدید از راه میرسد قبل اینکه آن مدل به VS Code اضافه شود اول هارنس اختصاصیش نوشته میشود.
در این ویدئو مفهوم Harness خیلی خوب و قابل فهم توسط Tejas Kumar از IBM توضیح داده شده. اگر برنامهنویسی هستید که سیستمهای مبتنی بر LLM مینویسید که کار واقعی انجام میدهد (نه صرفا یه چت ساده برای دمو) پیشنهاد میکنم حتما این ویدئو را ببینید.
این مفهوم همان مفهومی است که ما در CrystaCode برای ساخت «ادیتور ایجنت» از آن استفاده کردیم تا بتوان روی عملکرد سیستم حساب کرد و طبق سناریوهای skUnit تستها پاس شود.
🔗 ویدئو کامل را میتوانید اینجا ببینید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
YouTube
Harnesses in AI: A Deep Dive — Tejas Kumar, IBM
The agent hit a login page, panicked, reported success anyway, and the upvote never happened. Tejas Kumar's diagnosis: not a prompt problem. A harness problem.
The demo builds a browser agent on GPT-3.5 Turbo (consciously choosing a VERY old model to show…
The demo builds a browser agent on GPT-3.5 Turbo (consciously choosing a VERY old model to show…
❤9👍1🔥1
پیادهسازی Linked List در سیشارپ
#csharp_for_beginners
در این مقاله، ساختار دادهٔ LinkedList در زبان سیشارپ معرفی شده است. این ساختار یک لیست پیوندی دوطرفه (Doubly Linked List) است که امکان درج و حذف سریع عناصر را در هر نقطه از لیست فراهم میکند. برخلاف آرایهها، عناصر در حافظه بهصورت پشتسرهم ذخیره نمیشوند و هر عنصر در قالب یک گره (Node) نگهداری میشود.
ساختار LinkedList
هر گره در
مقدار داده (Value)
اشارهگر به گره قبلی (Previous)
اشارهگر به گره بعدی (Next)
به همین دلیل میتوان در هر دو جهت لیست حرکت کرد.
ایجاد یک LinkedList
برای استفاده از این ساختار ابتدا باید فضای نام زیر را اضافه کنیم:
سپس لیست را ایجاد میکنیم:
افزودن عناصر:
مهمترین متدهای افزودن عنصر عبارتاند از:
افزودن در ابتدای لیست: ()AddFirst
افزودن در انتهای لیست: ()AddLast
افزودن قبل از یک گره مشخص: ()AddBefore
افزودن بعد از یک گره مشخص: ()AddAfter
نمونه کد:
خروجی:
20
30
40
برای حذف عناصر نیز متدهای مختلفی وجود دارد:
حذف اولین رخداد یک مقدار:
حذف اولین گره:
حذف آخرین گره:
حذف یک گره مشخص:
جستجوی عناصر
متد
خروجی:
True
False
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
در این مقاله، ساختار دادهٔ LinkedList در زبان سیشارپ معرفی شده است. این ساختار یک لیست پیوندی دوطرفه (Doubly Linked List) است که امکان درج و حذف سریع عناصر را در هر نقطه از لیست فراهم میکند. برخلاف آرایهها، عناصر در حافظه بهصورت پشتسرهم ذخیره نمیشوند و هر عنصر در قالب یک گره (Node) نگهداری میشود.
ساختار LinkedList
هر گره در
LinkedList<T> شامل سه بخش است:مقدار داده (Value)
اشارهگر به گره قبلی (Previous)
اشارهگر به گره بعدی (Next)
به همین دلیل میتوان در هر دو جهت لیست حرکت کرد.
ایجاد یک LinkedList
برای استفاده از این ساختار ابتدا باید فضای نام زیر را اضافه کنیم:
using System.Collections.Generic;
سپس لیست را ایجاد میکنیم:
LinkedList<int> list = new LinkedList<int>();
افزودن عناصر:
مهمترین متدهای افزودن عنصر عبارتاند از:
افزودن در ابتدای لیست: ()AddFirst
افزودن در انتهای لیست: ()AddLast
افزودن قبل از یک گره مشخص: ()AddBefore
افزودن بعد از یک گره مشخص: ()AddAfter
نمونه کد:
LinkedList<int> list = new LinkedList<int>();
list.AddFirst(20);
list.AddLast(30);
list.AddLast(40);
foreach (int item in list)
{
Console.WriteLine(item);
}
خروجی:
20
30
40
برای حذف عناصر نیز متدهای مختلفی وجود دارد:
حذف اولین رخداد یک مقدار:
Remove(T value)حذف اولین گره:
RemoveFirst()حذف آخرین گره:
RemoveLast()حذف یک گره مشخص:
Remove(LinkedListNode<T>)
حذف تمام عناصر لیست: Clear()جستجوی عناصر
متد
Contains() بررسی میکند که آیا یک مقدار در لیست وجود دارد یا خیر:
LinkedList<int> list = new LinkedList<int>();
list.AddLast(10);
list.AddLast(20);
list.AddLast(30);
Console.WriteLine(list.Contains(20));
Console.WriteLine(list.Contains(100));
خروجی:
True
False
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
GeeksforGeeks
LinkedList in C# - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
🔥4❤2👎1
مدل Kimi K3 توسط Moonshot AI منتشر شد
این مدل با ۲.۸ تریلیون پارامتر، بزرگترین مدل متنباز جهان است.
ساختار فنی:
از معماری MoE استفاده میکند. برای هر توکن تنها ۱۶ اکسپرت از ۸۹۶ اکسپرت فعال میشوند. بر پایه Kimi Delta Attention ساخته شده و بازدهی مقیاسپذیری آن ۲.۵ برابر K2 است. پنجره زمینه ۱ میلیون توکنی دارد و درک تصویر به صورت بومی در آن ادغام شده است.
عملکرد و مقایسه:
در کدنویسی فرانتاند (Arena.ai) رتبه اول را کسب کرده و مدلهای Claude Fable 5 و GPT-5.6 Sol را پشت سر گذاشته است.
در ارزیابیهای SWE Marathon و Program Bench بالاترین عملکرد را دارد. در Terminal Bench 2.1 با اختلاف نیم امتیاز پس از GPT-5.6 Sol دوم است.
در ردهبندی کلی Artificial Analysis در جایگاه سوم قرار دارد.
هزینه API
۳ دلار برای یک میلیون توکن ورودی و ۱۵ دلار برای یک میلیون توکن خروجی. در اجرای تسکهای برنامهنویسی ۶۰ تا ۸۰ درصد ارزانتر از مدلهای رقیب تموم میشود.
البته Open Source بودنش به این معنی نیست که میتوانید روی کامپیوتر ران کنید! برای ران کردنش یک دیتاسنتر غول میخواهد. پس پول کم بدهید و اندازه Fable و Sol از این محصول استفاده کنید :)
🔗 توضیحات کامل را میتوانید اینجا بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
این مدل با ۲.۸ تریلیون پارامتر، بزرگترین مدل متنباز جهان است.
ساختار فنی:
از معماری MoE استفاده میکند. برای هر توکن تنها ۱۶ اکسپرت از ۸۹۶ اکسپرت فعال میشوند. بر پایه Kimi Delta Attention ساخته شده و بازدهی مقیاسپذیری آن ۲.۵ برابر K2 است. پنجره زمینه ۱ میلیون توکنی دارد و درک تصویر به صورت بومی در آن ادغام شده است.
عملکرد و مقایسه:
در کدنویسی فرانتاند (Arena.ai) رتبه اول را کسب کرده و مدلهای Claude Fable 5 و GPT-5.6 Sol را پشت سر گذاشته است.
در ارزیابیهای SWE Marathon و Program Bench بالاترین عملکرد را دارد. در Terminal Bench 2.1 با اختلاف نیم امتیاز پس از GPT-5.6 Sol دوم است.
در ردهبندی کلی Artificial Analysis در جایگاه سوم قرار دارد.
هزینه API
۳ دلار برای یک میلیون توکن ورودی و ۱۵ دلار برای یک میلیون توکن خروجی. در اجرای تسکهای برنامهنویسی ۶۰ تا ۸۰ درصد ارزانتر از مدلهای رقیب تموم میشود.
البته Open Source بودنش به این معنی نیست که میتوانید روی کامپیوتر ران کنید! برای ران کردنش یک دیتاسنتر غول میخواهد. پس پول کم بدهید و اندازه Fable و Sol از این محصول استفاده کنید :)
🔗 توضیحات کامل را میتوانید اینجا بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Kimi API Platform
Kimi K3 - Kimi API Platform
Explore Kimi K3 for long-horizon coding, knowledge work, deep reasoning, visual understanding, and a 1M-token context window.
❤9👍2🔥1
آشنایی با Union Types در سیشارپ ۱۵
#csharp_for_beginners
یکی از قابلیتهای جذابی که قرار است به سیشارپ ۱۵ اضافه شود، Union Types است. این ویژگی سالهاست در زبانهایی مانند TypeScript وجود دارد و به توسعهدهندگان اجازه میدهد نوعی تعریف کنند که بتواند یکی از چند نوع مشخص را در خود نگه دارد.
فرض کنید میخواهیم مجموعهای از حیوانات خانگی را نگهداری کنیم:
در این مثال از List<object> استفاده کردهایم چون اشیاء موجود در لیست از انواع مختلفی هستند.
اما این راهکار یک مشکل اساسی دارد؛ هر نوع شیء دیگری نیز میتواند وارد این لیست شود:
در حالی که کوسه (Shark) اصلاً جزو حیوانات خانگی موردنظر ما نیست.
برای پردازش این دادهها معمولاً از Pattern Matching استفاده میکنیم:
اما کامپایلر هیچ اطلاعی ندارد که چه نوعهایی مجاز هستند و چه نوعهایی نباید در این مجموعه قرار بگیرند.
راهحل: Union Types در سیشارپ ۱۵ میتوان یک Union تعریف کرد:
این تعریف به کامپایلر اعلام میکند که نوع Pet فقط میتواند یکی از این سه نوع باشد:
اکنون میتوان لیست را به شکل زیر تعریف کرد:
در این حالت اگر بخواهیم یک Shark به لیست اضافه کنیم، کامپایلر خطا خواهد داد؛ چون Shark جزو اعضای Union نیست.
یکی از مزیت های مهم Union Types این است که میتوان مجموعهای مشخص از انواع مرتبط را تحت یک نوع واحد تعریف کرد.
به همین دلیل هنگام استفاده از Switch Expression میتواند بررسی کند که آیا تمام حالتها پوشش داده شدهاند یا خیر.
برای مثال:
اگر یکی از انواع تعریفشده در Union را فراموش کنیم، کامپایلر هشدار نمایش خواهد داد.
این موضوع باعث میشود بسیاری از خطاها قبل از اجرای برنامه شناسایی شوند.
علاوه بر مشخص کردن انواع مجاز، میتوان رفتارها و قابلیتهای مشترک را نیز مستقیماً درون خود Union پیادهسازی کرد.
برای مثال:
در این مثال ویژگی Description مستقیماً داخل Union تعریف شده است.
بنابراین هر شیء از نوع Pet میتواند توضیح مناسب خود را برگرداند، بدون اینکه نیاز باشد این منطق در قسمتهای مختلف برنامه تکرار شود.
این ویژگی باعث میشود کدها تمیزتر و نگهداری آنها سادهتر شود.
تعریف Union با Attributeعلاوه بر سینتکس اختصاصی Union، روش دیگری نیز برای تعریف Unionها در نظر گرفته شده است که مبتنی بر Attribute است.
برای مثال:
چرا Attribute-Based Union اهمیت دارد؟
این روش دو مزیت مهم دارد.
۱. بهبود کارایی (Performance)
بدون استفاده از union ها در برخی شرایط باعث Boxing میشود.
در سناریوهایی که عملکرد برنامه اهمیت زیادی دارد و یک قطعه کد بارها و بارها اجرا میشود، استفاده از یک پیادهسازی کاستوم میتواند به کاهش هزینههای اضافی و بهبود کارایی کمک کند.
برای مثال اگر Union شما از چند Struct کوچک تشکیل شده باشد، جلوگیری از Boxing میتواند تأثیر قابل توجهی روی عملکرد برنامه داشته باشد.
۲. ساخت Unionهای کاستوم با کمترین زحمت قبل از معرفی Union Types، بسیاری از توسعهدهندگان تلاش میکردند با استفاده از کلاسهای پایه، اینترفیسها یا حتی قراردادهای مستندسازی و کامنتها، ساختاری شبیه Union ایجاد کنند.
این روشها معمولاً پیچیده بودند و پشتیبانی مستقیمی از سوی کامپایلر نداشتند.
اما اکنون با استفاده از یک Attribute ساده میتوان همان رفتار را به شکل رسمی و استاندارد پیادهسازی کرد.
🔗 ویدئو را در این لینک میتوانید میتوانید مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
یکی از قابلیتهای جذابی که قرار است به سیشارپ ۱۵ اضافه شود، Union Types است. این ویژگی سالهاست در زبانهایی مانند TypeScript وجود دارد و به توسعهدهندگان اجازه میدهد نوعی تعریف کنند که بتواند یکی از چند نوع مشخص را در خود نگه دارد.
فرض کنید میخواهیم مجموعهای از حیوانات خانگی را نگهداری کنیم:
List<object> pets =
[
new Dog("Fido"),
new Cat("tabby"),
new Bird { Species = "crow" }
];
در این مثال از List<object> استفاده کردهایم چون اشیاء موجود در لیست از انواع مختلفی هستند.
اما این راهکار یک مشکل اساسی دارد؛ هر نوع شیء دیگری نیز میتواند وارد این لیست شود:
pets.Add(new Shark(300));
در حالی که کوسه (Shark) اصلاً جزو حیوانات خانگی موردنظر ما نیست.
برای پردازش این دادهها معمولاً از Pattern Matching استفاده میکنیم:
var description = pet switch
{
Dog dog => dog.Name,
Cat(var adjective) => $"A {adjective} cat",
Bird { Species: var species } => $"A {species}"
};
اما کامپایلر هیچ اطلاعی ندارد که چه نوعهایی مجاز هستند و چه نوعهایی نباید در این مجموعه قرار بگیرند.
راهحل: Union Types در سیشارپ ۱۵ میتوان یک Union تعریف کرد:
union Pet(Dog, Cat, Bird);
این تعریف به کامپایلر اعلام میکند که نوع Pet فقط میتواند یکی از این سه نوع باشد:
اکنون میتوان لیست را به شکل زیر تعریف کرد:
List<Pet> pets =
[
new Dog("Fido"),
new Cat("tabby"),
new Bird { Species = "crow" }
];
در این حالت اگر بخواهیم یک Shark به لیست اضافه کنیم، کامپایلر خطا خواهد داد؛ چون Shark جزو اعضای Union نیست.
یکی از مزیت های مهم Union Types این است که میتوان مجموعهای مشخص از انواع مرتبط را تحت یک نوع واحد تعریف کرد.
به همین دلیل هنگام استفاده از Switch Expression میتواند بررسی کند که آیا تمام حالتها پوشش داده شدهاند یا خیر.
برای مثال:
var description = pet switch
{
Dog dog => dog.Name,
Cat(var adjective) => $"A {adjective} cat",
Bird { Species: var species } => $"A {species}"
};
اگر یکی از انواع تعریفشده در Union را فراموش کنیم، کامپایلر هشدار نمایش خواهد داد.
این موضوع باعث میشود بسیاری از خطاها قبل از اجرای برنامه شناسایی شوند.
علاوه بر مشخص کردن انواع مجاز، میتوان رفتارها و قابلیتهای مشترک را نیز مستقیماً درون خود Union پیادهسازی کرد.
برای مثال:
union Pet(Dog, Cat, Bird)
{
public string Description => this switch
{
Dog dog => dog.Name,
Cat(var adjective) => $"A {adjective} cat",
Bird { Species: var species } => $"A {species}"
};
}
در این مثال ویژگی Description مستقیماً داخل Union تعریف شده است.
بنابراین هر شیء از نوع Pet میتواند توضیح مناسب خود را برگرداند، بدون اینکه نیاز باشد این منطق در قسمتهای مختلف برنامه تکرار شود.
این ویژگی باعث میشود کدها تمیزتر و نگهداری آنها سادهتر شود.
تعریف Union با Attributeعلاوه بر سینتکس اختصاصی Union، روش دیگری نیز برای تعریف Unionها در نظر گرفته شده است که مبتنی بر Attribute است.
برای مثال:
[Union]
struct Result<T>
{
}
چرا Attribute-Based Union اهمیت دارد؟
این روش دو مزیت مهم دارد.
۱. بهبود کارایی (Performance)
بدون استفاده از union ها در برخی شرایط باعث Boxing میشود.
در سناریوهایی که عملکرد برنامه اهمیت زیادی دارد و یک قطعه کد بارها و بارها اجرا میشود، استفاده از یک پیادهسازی کاستوم میتواند به کاهش هزینههای اضافی و بهبود کارایی کمک کند.
برای مثال اگر Union شما از چند Struct کوچک تشکیل شده باشد، جلوگیری از Boxing میتواند تأثیر قابل توجهی روی عملکرد برنامه داشته باشد.
۲. ساخت Unionهای کاستوم با کمترین زحمت قبل از معرفی Union Types، بسیاری از توسعهدهندگان تلاش میکردند با استفاده از کلاسهای پایه، اینترفیسها یا حتی قراردادهای مستندسازی و کامنتها، ساختاری شبیه Union ایجاد کنند.
این روشها معمولاً پیچیده بودند و پشتیبانی مستقیمی از سوی کامپایلر نداشتند.
اما اکنون با استفاده از یک Attribute ساده میتوان همان رفتار را به شکل رسمی و استاندارد پیادهسازی کرد.
🔗 ویدئو را در این لینک میتوانید میتوانید مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
❤6👍6
دیکانستراکشن تاپل (Tuple Deconstruction) در سیشارپ
#csharp_for_beginners
قابلیت دیکانستراکشن تاپل (Tuple Deconstruction) از نسخه سیشارپ ۷.۰ به زبان سیشارپ اضافه شد. این قابلیت به شما اجازه میدهد اعضای یک Tuple را بهطور همزمان در چند متغیر مستقل قرار دهید. به این ترتیب دیگر نیازی نیست برای دسترسی به هر عضو از Item1، Item2 یا نام اعضای Tuple استفاده کنید و میتوانید تمام مقادیر را تنها با یک دستور استخراج کنید.
به عنوان مثال، فرض کنید متد یک Tuple شامل اطلاعات یک حیوان خانگی را برمیگرداند:
میتوان تمام مقادیر بازگشتی را بهصورت همزمان دریافت کرد:
در این مثال، هر عضو Tuple مستقیماً در متغیر متناظر خود قرار میگیرد.
تعیین صریح نوع متغیرها
در این روش، نوع هر متغیر بهصورت صریح داخل پرانتز نوشته میشود.
مقدار اول در type
مقدار دوم در name
مقدار سوم در height
مقدار چهارم در age
مقدار پنجم در color
نادیده گرفتن اعضای غیرضروری با Discard
اگر به همه اعضای Tuple نیاز نداشته باشید، میتوانید از Discard که با علامت _ نمایش داده میشود استفاده کنید.
مقدار اول در type ذخیره میشود.
مقدار دوم نادیده گرفته میشود.
مقدار سوم در height قرار میگیرد.
مقدار چهارم نادیده گرفته میشود.
مقدار پنجم در color ذخیره میشود.
استفاده از _ باعث میشود مقدار مربوطه دریافت شود، اما در هیچ متغیری ذخیره نشود.
قوانین و محدودیتهای دیکانستراکشن تاپل
هنگام استفاده از دیکانستراکشن تاپل باید به چند نکته توجه کنید:
- تعداد متغیرها باید با تعداد اعضای Tuple برابر باشد.
- اگر Tuple پنج عضو داشته باشد، باید در سمت چپ نیز پنج متغیر یا Discard (_) وجود داشته باشد.
نمونه صحیح:
🔗 ویدئو را در این لینک میتوانید میتوانید مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
#csharp_for_beginners
قابلیت دیکانستراکشن تاپل (Tuple Deconstruction) از نسخه سیشارپ ۷.۰ به زبان سیشارپ اضافه شد. این قابلیت به شما اجازه میدهد اعضای یک Tuple را بهطور همزمان در چند متغیر مستقل قرار دهید. به این ترتیب دیگر نیازی نیست برای دسترسی به هر عضو از Item1، Item2 یا نام اعضای Tuple استفاده کنید و میتوانید تمام مقادیر را تنها با یک دستور استخراج کنید.
به عنوان مثال، فرض کنید متد یک Tuple شامل اطلاعات یک حیوان خانگی را برمیگرداند:
(string Type, string Name, int Height, int Age, string Color) GetPet()
{
return ("Dog", "Max", 60, 4, "Brown");
}
میتوان تمام مقادیر بازگشتی را بهصورت همزمان دریافت کرد:
(string type, string name, int height, int age, string color) = GetPet();
در این مثال، هر عضو Tuple مستقیماً در متغیر متناظر خود قرار میگیرد.
تعیین صریح نوع متغیرها
در این روش، نوع هر متغیر بهصورت صریح داخل پرانتز نوشته میشود.
(string type, string name, int height, int age, string color) = GetPet();
مقدار اول در type
مقدار دوم در name
مقدار سوم در height
مقدار چهارم در age
مقدار پنجم در color
نادیده گرفتن اعضای غیرضروری با Discard
اگر به همه اعضای Tuple نیاز نداشته باشید، میتوانید از Discard که با علامت _ نمایش داده میشود استفاده کنید.
(string type, _, int height, _, string color) = GetPet();
مقدار اول در type ذخیره میشود.
مقدار دوم نادیده گرفته میشود.
مقدار سوم در height قرار میگیرد.
مقدار چهارم نادیده گرفته میشود.
مقدار پنجم در color ذخیره میشود.
استفاده از _ باعث میشود مقدار مربوطه دریافت شود، اما در هیچ متغیری ذخیره نشود.
قوانین و محدودیتهای دیکانستراکشن تاپل
هنگام استفاده از دیکانستراکشن تاپل باید به چند نکته توجه کنید:
- تعداد متغیرها باید با تعداد اعضای Tuple برابر باشد.
- اگر Tuple پنج عضو داشته باشد، باید در سمت چپ نیز پنج متغیر یا Discard (_) وجود داشته باشد.
نمونه صحیح:
(var type, var name, var height, var age, var color) = GetPet();
🔗 ویدئو را در این لینک میتوانید میتوانید مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
GeeksforGeeks
C# | Deconstructors with Tuples - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
👍1
ما اخیراً سیستمهای AI خودمون رو به MAF منتقل کردیم و واقعاً فوقالعاده بوده!
این جمله واسه من نیست. کامنت @CrystaCode تویOn .NET Live بود :) البته من ترجمش رو گذاشتم اینجا...
در این ویدیو Daniel Costea، در مورد ساختار Middleware ها در Microsoft Agentic Framework صحبت میکند.
او Middlewareها را به سه نوع تقسیم میکند و با مدل ذهنی prepare → handle → invoke توضیح میدهد؛ مدلی که برای هر کسی که قبلاً با Middleware در ASP.NET Core کار کرده، کاملاً آشناست:
اولین مورد Shared Function Middleware نزدیکترین لایه به Request است. این Middleware از یک pipeline استفاده میکند و میتواند پیامهای ورودی را بررسی و فیلتر کند، اما Response را نمیبیند.
به همین دلیل جای مناسبی برای Guardrailهای ورودی محسوب میشود؛ مثلاً حذف اطلاعات شخصی (PII) یا آدرس ایمیل قبل از اینکه اصلاً به مدل ارسال شوند.
دومین Response Middleware یک قدم فراتر میرود. در حالی که همچنان مثل یک pipeline عمل میکند، میتواند Response کامل را هم ببیند و حتی تغییرش دهد.
اینجا جایی است که میشود مشکلاتی مثل مصرف بیشازحد Token را تشخیص داد و قبل از اینکه یک Call هزینه غیرضروری ایجاد کند، جلوی ادامه آن را گرفت. مثلا میشه Token Usage را هم بررسی و ذخیره کرد.
و در آخر Function Calling Middleware هم Tool Callها را با دسترسی کامل به Conversation History بررسی میکند.
در نتیجه، قبل از اجرای یک Tool میتواند یک Invocation پرریسک را Block کند، محدود کند یا حتی تغییر دهد. در Demo همین قابلیت باعث شد Agent مربوط به یک ماشین رباتیک، مستقیم با دنده عقب به دیوار برخورد نکند!
هرکدام از این Middlewareها میتوانند در دو لایه مختلف اجرا شوند:
در ChatClient که Identity ندارد و میتواند بین چند Agent به اشتراک گذاشته شود و Agent که Session و Identity خود را دارد.
در مجموع یعنی ۶ نقطه مختلف برای Hook کردن Middleware.
ترتیب Middlewareها هم اهمیت زیادی دارد. اگر ترتیب درست نباشد، ممکن است یک Middleware بیشتر از چیزی که انتظار دارید اجرا شود.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
YouTube
On .NET Live - Demystifying Microsoft Agent Framework Middleware
In this session we'll walk through how Daniel Costea uses ChatClient and Agent middleware to turn plain .NET AI agents into production‑ready systems with observability, safety, and cost control. Starting from an agent that talks directly to an LLM, he walks…
1❤7👍1🔥1
دستورها (Statementها) در زبان شیشارپ
یکی از مفاهیم پایهای این زبان یعنی دستورها (Statement ها) است.
دستورها مشخص میکنند که برنامه چه کاری را انجام دهد. در واقع منطق و جریان اجرای برنامههای سی شارپ با استفاده از همین دستورها ساخته میشود.
چند نوع مهم از دستورها در سیشارپ:
تعریف متغیر (Declaration Statement)
برای ایجاد متغیر و مشخص کردن نوع آن استفاده میشود:
دستورهای عبارتی (Expression Statement)
برای انجام کارهایی مانند مقداردهی، تغییر مقدار متغیرها و اجرای متدها استفاده میشوند:
دستورهای انتخابی (Selection Statement)
برای تصمیمگیری و اجرای کد بر اساس شرایط مختلف استفاده میشوند:
دستورهای تکرار (Iteration Statement)
برای اجرای چندبارهی یک بخش از برنامه استفاده میشوند:
دستورهای پرش (Jump Statement)
برای تغییر مسیر اجرای برنامه استفاده میشوند:
دستورهای مدیریت خطا (Exception Handling Statement)
برای کنترل خطاهای احتمالی در برنامه استفاده میشوند:
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
یکی از مفاهیم پایهای این زبان یعنی دستورها (Statement ها) است.
دستورها مشخص میکنند که برنامه چه کاری را انجام دهد. در واقع منطق و جریان اجرای برنامههای سی شارپ با استفاده از همین دستورها ساخته میشود.
چند نوع مهم از دستورها در سیشارپ:
تعریف متغیر (Declaration Statement)
برای ایجاد متغیر و مشخص کردن نوع آن استفاده میشود:
int age = 25;
string name = "Kamyar";
دستورهای عبارتی (Expression Statement)
برای انجام کارهایی مانند مقداردهی، تغییر مقدار متغیرها و اجرای متدها استفاده میشوند:
int number = 10;
number++;
Console.WriteLine(number);
دستورهای انتخابی (Selection Statement)
برای تصمیمگیری و اجرای کد بر اساس شرایط مختلف استفاده میشوند:
if (age >= 18)
{
Console.WriteLine("Adult");
}
دستورهای تکرار (Iteration Statement)
برای اجرای چندبارهی یک بخش از برنامه استفاده میشوند:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
دستورهای پرش (Jump Statement)
برای تغییر مسیر اجرای برنامه استفاده میشوند:
break;
continue;
دستورهای مدیریت خطا (Exception Handling Statement)
برای کنترل خطاهای احتمالی در برنامه استفاده میشوند:
try
{
// code
}
catch
{
// handle error
}
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
C# statements - C#
Learn how C# statements declare variables, perform actions, group code into blocks, and control the flow of execution.
❤5
نگاهی دقیق به LLMها
اجازه دهید با یک مثال شروع کنیم:
فرض کنید از هوش مصنوعی (AI) سوالی ریاضی پرسیدهاید که میتواند به دو شکل زیر جواب دهد. به نظر شما کدام حالت بهتر و دقیقتر است؟ و چرا؟
❓ سوال کاربر:
💡 حالت اول (جواب مستقیم و سریع):
💡 حالت دوم (جواب مرحلهبهمرحله):
شاید در ظاهر هر دو به جوابی درست (۳ دلار) رسیده باشند، ولی از نظر نحوه کارکرد هوش مصنوعی، حالت دوم به مراتب بهتر است!
هدف از طرح این سوال اشاره به دو موضوع مهم بود:
اول این که: شما نباید در محاسبات به gpt اعتماد کامل داشته باشید. همانطور که میدانید gpt در واقع چیزی نیست جز یک ماشین که کلمه (توکن) بعدی هر جمله رو بر اساس آمار حدس میزند (Token Autocomplete).
در مدل جواب دادن اول، احتمال این که به جواب اشتباهی برسیم زیاد بود؛ چون مدل مجبور بود کل بار محاسباتی مسئله را فقط در همان یک کلمه (توکنِ بعد از علامت $) فشرده کند و صرفاً جواب را حدس بزند.
ولی در جواب دوم به این شکل نبود و مدل عملاً داشت به شکلی پیش میرفت که انگار دارد مرحلهبهمرحله محاسبه میکند و بار پردازشی را بین کلمات مختلف پخش میکند.
کارپاتی جملهای معروف دارد: «مدلها برای فکر کردن به توکن نیاز دارند!» (Models need tokens to think). یعنی هر چه توکن بیشتری تولید کنند، فرصت و فضای بیشتری برای محاسبه دارند.
مثل ما انسانها که ناگهانی و چشمبسته نمیتوانیم جواب مسائل منطقی را سریع بگوییم و ذهنم شروع به مرحلهبهمرحله حساب کردن میکند، مدلهای زبانی هم دقیقاً همینطور هستند، مانند جواب دوم در مثال اول متن.
پس مراقب باشید و هر زمان که تصمیم گرفتید از gpt سوالی بپرسید و گفتید «فقط در یک کلمه بگو...» یا «سریع جواب بده»، بدانید که احتمال زیادی وجود دارد که جواب اشتباه بگیرید.
اجازه دهید مدلی که یاد گرفته جواب دهد. یعنی اول توضیح دهد، راه حل را بنویسد و بعد جواب نهایی رو بگوید.
مورد دوم این که: در چنین حالتهایی (مخصوصاً وقتی اعداد بزرگتر یا محاسبات پیچیدهتر میشوند)، حتی بهتر است مثلا در chat gpt در انتها بگویید:
🔗 این نکات جذاب از ویدیوی Andrej Karpathy در آمده است که ویدیویی ۳ ساعته است و برای درک عمیق و دقیق LLMها بسیار کمک میکند که باعث میشود ما خیلی بهتر و اصولیتر با ابزارهای AI کار کنیم.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
اجازه دهید با یک مثال شروع کنیم:
فرض کنید از هوش مصنوعی (AI) سوالی ریاضی پرسیدهاید که میتواند به دو شکل زیر جواب دهد. به نظر شما کدام حالت بهتر و دقیقتر است؟ و چرا؟
❓ سوال کاربر:
Human: "Emily buys 3 apples and 2 oranges. Each orange costs $2. The total cost of all the fruit is $13. What is the cost of apples?"
💡 حالت اول (جواب مستقیم و سریع):
Assistant: "The answer is $3. This is because 2 oranges at $2 are $4 total. So the 3 apples cost $9, and therefore each apple is 9/3 = $3".
💡 حالت دوم (جواب مرحلهبهمرحله):
Assistant: "The total cost of the oranges is $4. 13 - 4 = 9, the cost of the 3 apples is $9. 9/3 = 3, so each apple costs $3. The answer is $3".
شاید در ظاهر هر دو به جوابی درست (۳ دلار) رسیده باشند، ولی از نظر نحوه کارکرد هوش مصنوعی، حالت دوم به مراتب بهتر است!
هدف از طرح این سوال اشاره به دو موضوع مهم بود:
اول این که: شما نباید در محاسبات به gpt اعتماد کامل داشته باشید. همانطور که میدانید gpt در واقع چیزی نیست جز یک ماشین که کلمه (توکن) بعدی هر جمله رو بر اساس آمار حدس میزند (Token Autocomplete).
در مدل جواب دادن اول، احتمال این که به جواب اشتباهی برسیم زیاد بود؛ چون مدل مجبور بود کل بار محاسباتی مسئله را فقط در همان یک کلمه (توکنِ بعد از علامت $) فشرده کند و صرفاً جواب را حدس بزند.
ولی در جواب دوم به این شکل نبود و مدل عملاً داشت به شکلی پیش میرفت که انگار دارد مرحلهبهمرحله محاسبه میکند و بار پردازشی را بین کلمات مختلف پخش میکند.
کارپاتی جملهای معروف دارد: «مدلها برای فکر کردن به توکن نیاز دارند!» (Models need tokens to think). یعنی هر چه توکن بیشتری تولید کنند، فرصت و فضای بیشتری برای محاسبه دارند.
مثل ما انسانها که ناگهانی و چشمبسته نمیتوانیم جواب مسائل منطقی را سریع بگوییم و ذهنم شروع به مرحلهبهمرحله حساب کردن میکند، مدلهای زبانی هم دقیقاً همینطور هستند، مانند جواب دوم در مثال اول متن.
پس مراقب باشید و هر زمان که تصمیم گرفتید از gpt سوالی بپرسید و گفتید «فقط در یک کلمه بگو...» یا «سریع جواب بده»، بدانید که احتمال زیادی وجود دارد که جواب اشتباه بگیرید.
اجازه دهید مدلی که یاد گرفته جواب دهد. یعنی اول توضیح دهد، راه حل را بنویسد و بعد جواب نهایی رو بگوید.
مورد دوم این که: در چنین حالتهایی (مخصوصاً وقتی اعداد بزرگتر یا محاسبات پیچیدهتر میشوند)، حتی بهتر است مثلا در chat gpt در انتها بگویید:
use code. در این حالت، مدل دیگر به «محاسبات ذهنی» خود (که در بسیاری از مواقع خطا دارد) تکیه نمیکند؛ بلکه خود برای این موضوع کدی ساده به زبان پایتون مینویسد، اجرا میکند و نتیجه دقیق را به شما میگوید و شما از جواب chat gpt مطمئن هستید و احتمال خطا به صفر میرسد.🔗 این نکات جذاب از ویدیوی Andrej Karpathy در آمده است که ویدیویی ۳ ساعته است و برای درک عمیق و دقیق LLMها بسیار کمک میکند که باعث میشود ما خیلی بهتر و اصولیتر با ابزارهای AI کار کنیم.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
❤8👍4🔥3
کنترل جریان (Flow Control) در سیشارپ
کنترل جریان در سیشارپ به مجموعهای از دستورات گفته میشود که ترتیب اجرای کد را در یک برنامه کنترل میکنند.
به صورت پیشفرض، برنامهها دستورات را از بالا به پایین و به ترتیب اجرا میکنند، اما در برنامههای واقعی همیشه نیاز داریم که بر اساس شرایط مختلف تصمیم بگیریم، بخشی از کد را چندین بار اجرا کنیم یا اجرای قسمتی از برنامه را تغییر دهیم.
در سیشارپ، Flow Control به ما اجازه میدهد مسیر اجرای برنامه را مدیریت کنیم.
انواع اصلی Flow Control در C# شامل موارد زیر هستند:
۱. دستورات شرطی (Conditional Statements)
برای تصمیمگیری در برنامه و اجرای بخشهای مختلف کد بر اساس شرایط استفاده میشوند.
انواع دستورات شرطی در سیشارپ:
if
if-else
else if
switch
عملگر شرطی (Conditional Operator ?:)
مثال:
۲. دستورات حلقه (Looping Statements)
برای اجرای چندباره یک بخش از کد استفاده میشوند. حلقهها زمانی کاربرد دارند که بخواهیم یک عملیات را چندین بار تکرار کنیم.
انواع حلقهها در سیشارپ:
for
while
do-while
حلقههای تو در تو (Nested Loops)
مثال:
خروجی:
0
1
2
3
4
۳. دستورات پرش (Jump Statements)
برای تغییر مسیر معمول اجرای برنامه استفاده میشوند و به ما اجازه میدهند اجرای کد را متوقف کنیم، رد کنیم یا از یک بخش خارج شویم.
انواع دستورات پرش در سیشارپ:
break → پایان دادن به اجرای حلقه یا switch
continue → رد کردن اجرای فعلی حلقه و رفتن به مرحله بعد
return → خروج از متد و برگرداندن مقدار
goto → انتقال اجرای برنامه به یک بخش مشخص (که معمولاً استفاده از آن توصیه نمیشود)
خروجی:
0 1 2 3 4
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
کنترل جریان در سیشارپ به مجموعهای از دستورات گفته میشود که ترتیب اجرای کد را در یک برنامه کنترل میکنند.
به صورت پیشفرض، برنامهها دستورات را از بالا به پایین و به ترتیب اجرا میکنند، اما در برنامههای واقعی همیشه نیاز داریم که بر اساس شرایط مختلف تصمیم بگیریم، بخشی از کد را چندین بار اجرا کنیم یا اجرای قسمتی از برنامه را تغییر دهیم.
در سیشارپ، Flow Control به ما اجازه میدهد مسیر اجرای برنامه را مدیریت کنیم.
انواع اصلی Flow Control در C# شامل موارد زیر هستند:
۱. دستورات شرطی (Conditional Statements)
برای تصمیمگیری در برنامه و اجرای بخشهای مختلف کد بر اساس شرایط استفاده میشوند.
انواع دستورات شرطی در سیشارپ:
if
if-else
else if
switch
عملگر شرطی (Conditional Operator ?:)
مثال:
int number = 10;
if (number == 10)
{
Console.WriteLine("Number is 10");
}
else
{
Console.WriteLine("Number is not 10");
}
۲. دستورات حلقه (Looping Statements)
برای اجرای چندباره یک بخش از کد استفاده میشوند. حلقهها زمانی کاربرد دارند که بخواهیم یک عملیات را چندین بار تکرار کنیم.
انواع حلقهها در سیشارپ:
for
while
do-while
حلقههای تو در تو (Nested Loops)
مثال:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
خروجی:
0
1
2
3
4
۳. دستورات پرش (Jump Statements)
برای تغییر مسیر معمول اجرای برنامه استفاده میشوند و به ما اجازه میدهند اجرای کد را متوقف کنیم، رد کنیم یا از یک بخش خارج شویم.
انواع دستورات پرش در سیشارپ:
break → پایان دادن به اجرای حلقه یا switch
continue → رد کردن اجرای فعلی حلقه و رفتن به مرحله بعد
return → خروج از متد و برگرداندن مقدار
goto → انتقال اجرای برنامه به یک بخش مشخص (که معمولاً استفاده از آن توصیه نمیشود)
for (int i = 0; i < 10; i++)
{
if (i == 5)
break;
Console.Write(i + " ");
}
خروجی:
0 1 2 3 4
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
❤1🔥1
ایجنتها دارن بزرگ میشن، از پرامپت تا لوپ تا گراف
اولش همهچیز ساده بود: یه پرامپت میدادیم، یه جواب میگرفتیم. اما کمکم کارها پیچیدهتر شدن؛ چند مرحله، چند ابزار، چند تصمیم. اینجا بود که Agent Loop وارد شد و به ایجنتها «قدرت ادامه دادن» داد.
اما یک حقیقت مهم وجود دارد: بعضی کارها ساختار خودشان را دارند.
مثلاً بررسی چند فایل مستقل، یا مرحلهای که باید جداگانه تأیید شود، یا کاری که قبل از اجرا حتما باید انسان اجازه دهد.
وقتی این کارها را داخل یک لوپ میریزید، ایجنت مجبور میشود هر بار حدس بزند «حالا چی؟» در حالی که جواب از قبل معلوم است.
اینجاست که Graph Engineering وارد میشود.
گراف یعنی: ساختار کار را بیرون از مدل تعریف کنیم. بگوییم چه مرحلههایی وجود دارند، چه چیزی ورودی هر مرحلهست، کجا باید متوقف شویم، کجا باید تأیید انسانی داشته باشیم، و کدام شاخهها باید قبل از مرحلهٔ آخر به هم برسند.
گراف ایجنت را باهوشتر نمیکند. فقط کار را از حدس زدن نجات میدهد و اجرای ایجنت را قابل اعتماد، قابل کنترل و قابل پیشبینی میکند.
وقتی کار موازی است، وقتی چند شاخه دارد، وقتی verification لازم دارد، وقتی retry محدود دارد، وقتی human approval لازم دارد، لوپ دیگر جواب نمیدهد. اینجا باید کار را به گراف ارتقا داد.
🔗 در این مقاله موارد گفته شده به خوبی توضیح داده شده است.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
_____
اولش همهچیز ساده بود: یه پرامپت میدادیم، یه جواب میگرفتیم. اما کمکم کارها پیچیدهتر شدن؛ چند مرحله، چند ابزار، چند تصمیم. اینجا بود که Agent Loop وارد شد و به ایجنتها «قدرت ادامه دادن» داد.
اما یک حقیقت مهم وجود دارد: بعضی کارها ساختار خودشان را دارند.
مثلاً بررسی چند فایل مستقل، یا مرحلهای که باید جداگانه تأیید شود، یا کاری که قبل از اجرا حتما باید انسان اجازه دهد.
وقتی این کارها را داخل یک لوپ میریزید، ایجنت مجبور میشود هر بار حدس بزند «حالا چی؟» در حالی که جواب از قبل معلوم است.
اینجاست که Graph Engineering وارد میشود.
گراف یعنی: ساختار کار را بیرون از مدل تعریف کنیم. بگوییم چه مرحلههایی وجود دارند، چه چیزی ورودی هر مرحلهست، کجا باید متوقف شویم، کجا باید تأیید انسانی داشته باشیم، و کدام شاخهها باید قبل از مرحلهٔ آخر به هم برسند.
گراف ایجنت را باهوشتر نمیکند. فقط کار را از حدس زدن نجات میدهد و اجرای ایجنت را قابل اعتماد، قابل کنترل و قابل پیشبینی میکند.
وقتی کار موازی است، وقتی چند شاخه دارد، وقتی verification لازم دارد، وقتی retry محدود دارد، وقتی human approval لازم دارد، لوپ دیگر جواب نمیدهد. اینجا باید کار را به گراف ارتقا داد.
🔗 در این مقاله موارد گفته شده به خوبی توضیح داده شده است.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
_____
Medium
From Prompting to Loops to Graphs: How AI Agent Workflows Evolve
Graph Engineering for AI Agents: When a Loop Becomes a Workflow
❤3👍1
Forwarded from Persian GitHub
اگر در دات نت Agent، MCP Server یا ابزارهای مبتنی بر هوش مصنوعی توسعه میدهی، این پروژه میتواند تست نویسی را ساده تر کند.
ریپو skUnit یک فریمورک برای تست برنامه های مبتنی بر AI در .NET است که به جای کدنویسی پیچیده، تست ها را با Markdown مینویسد و از xUnit، NUnit و MSTest پشتیبانی میکند. همچنین میتواند Agentها، IChatClient، MCP Serverها و سایر یکپارچه سازی های AI را تست کند.
https://github.com/mehrandvd/skunit
@RepoFA
ریپو skUnit یک فریمورک برای تست برنامه های مبتنی بر AI در .NET است که به جای کدنویسی پیچیده، تست ها را با Markdown مینویسد و از xUnit، NUnit و MSTest پشتیبانی میکند. همچنین میتواند Agentها، IChatClient، MCP Serverها و سایر یکپارچه سازی های AI را تست کند.
https://github.com/mehrandvd/skunit
@RepoFA
👍7❤1🔥1
آشنایی با Attributeها در سیشارپ
در سی شارپ، Attributeها برای اضافه کردن metadata یا اطلاعات اضافی به بخشهای مختلف برنامه استفاده میشوند.
این اطلاعات میتوانند به عناصری مثل:
▫️کلاسها (Classها)
▫️متدها (Methodها)
▫️ویژگیها (Propertyها)
▫️فیلدها (Fieldها)
▫️اسمبلیها (Assemblyها)
اضافه شوند و توسط Compiler یا با استفاده از Reflection در زمان اجرا خوانده شوند.
در سیشارپ Attributeهای مختلفی وجود دارند که هرکدام کاربرد خاصی دارند. برای مثال:
CLSCompliantAttribute
برای مشخص کردن این موضوع استفاده میشود که آیا کد با Common Language Specification (CLS) سازگار است یا نه. رعایت CLS باعث میشود کد بتواند در زبانهای مختلف .NET مورد استفاده قرار بگیرد.
FlagsAttribute
برای مشخص کردن اینکه یک enum میتواند به عنوان یک bit field استفاده شود و با عملیات bitwise ترکیب شود.
با استفاده از [Flags]، مقدار ترکیبی enum به شکل خواناتری نمایش داده میشود.
ObsoleteAttribute
برای مشخص کردن کدهای قدیمی (deprecated) استفاده میشود. کامپایلر میتواند هنگام استفاده از این بخشها هشدار یا خطا ایجاد کند.
همچنین در سیشارپ امکان ساخت Custom Attributeها وجود دارد.
برای این کار:
یک کلاس از System.Attribute ارثبری میکنیم. با AttributeUsage مشخص میکنیم Attribute کجا قابل استفاده است. Constructor و Propertyهای مورد نیاز را تعریف میکنیم.مثال:
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
در سی شارپ، Attributeها برای اضافه کردن metadata یا اطلاعات اضافی به بخشهای مختلف برنامه استفاده میشوند.
این اطلاعات میتوانند به عناصری مثل:
▫️کلاسها (Classها)
▫️متدها (Methodها)
▫️ویژگیها (Propertyها)
▫️فیلدها (Fieldها)
▫️اسمبلیها (Assemblyها)
اضافه شوند و توسط Compiler یا با استفاده از Reflection در زمان اجرا خوانده شوند.
در سیشارپ Attributeهای مختلفی وجود دارند که هرکدام کاربرد خاصی دارند. برای مثال:
CLSCompliantAttribute
برای مشخص کردن این موضوع استفاده میشود که آیا کد با Common Language Specification (CLS) سازگار است یا نه. رعایت CLS باعث میشود کد بتواند در زبانهای مختلف .NET مورد استفاده قرار بگیرد.
[assembly: CLSCompliant(true)]
public class Demo
{
public static void Main()
{
Console.WriteLine("This code is CLS-compliant");
}
}
FlagsAttribute
برای مشخص کردن اینکه یک enum میتواند به عنوان یک bit field استفاده شود و با عملیات bitwise ترکیب شود.
[Flags]
enum ColorsFlags
{
Red = 1,
Blue = 2,
Green = 4
}
با استفاده از [Flags]، مقدار ترکیبی enum به شکل خواناتری نمایش داده میشود.
ObsoleteAttribute
برای مشخص کردن کدهای قدیمی (deprecated) استفاده میشود. کامپایلر میتواند هنگام استفاده از این بخشها هشدار یا خطا ایجاد کند.
[Obsolete("Use NewMethod instead", true)]
static void OldMethod()
{
}
همچنین در سیشارپ امکان ساخت Custom Attributeها وجود دارد.
برای این کار:
یک کلاس از System.Attribute ارثبری میکنیم. با AttributeUsage مشخص میکنیم Attribute کجا قابل استفاده است. Constructor و Propertyهای مورد نیاز را تعریف میکنیم.مثال:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class InfoAttribute : Attribute
{
public string Author { get; }
public string Version { get; }
public InfoAttribute(string author, string version)
{
Author = author;
Version = version;
}
}
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
GeeksforGeeks
Attributes in C# - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
👍5❤1🔥1
کد مدریت شده (Managed Code) در داتنت یعنی چی؟
▫️به زبان ساده:
کد مدریت شده (Managed Code) یعنی کدی که اجرای آن توسط یک Runtime مدیریت میشود.
در دنیای داتنت، این Runtime همان CLR (Common Language Runtime) است.
مثلاً وقتی با سیشارپ کد مینویسیم، کدم مستقیماً به Machine Code تبدیل نمیشود.
مسیر کلی به این شکل است:
C# → Compiler → IL → CLR → JIT → Machine Code → CPU
🔹 زبان میانی (Intermediate Language یا IL) — ایال
بعد از اینکه برنامه سیشارپ کامپایل میشود، خروجی مستقیماً Machine Code نیست؛ بلکه کدی به نام IL تولید میشود.
🔹 محیط اجرای .NET (Common Language Runtime یا CLR)
سی ال ار (CLR) همان Runtime داتنت است که اجرای Managed Code را مدیریت میکند و سرویسهایی مثل مدیریت حافظه و Type Safety را فراهم میکند.
🔹 کامپایلر در زمان اجرا (Just-In-Time یا JIT)
جیت (JIT) در زمان اجرای برنامه، IL رو به Machine Code تبدیل میکند تا CPU بتواند آن را اجرا کند.
🔹 مدیریت حافظه (Memory Management)
یکی از مزیتهای مهم Managed Code این است که Runtime میتواند مدیریت حافظه را انجام دهد؛ مثلاً Garbage Collector حافظهای را که دیگر استفاده نمیشود، برای آزادسازی مدیریت میکند.
🔵 کد مدیریتشده در مقابل کد مدیریتنشده
در برنامههای Native مثل C و ++C، کد معمولاً مستقیماً به Machine Code تبدیل میشود و مسئولیتهای بیشتری مانند مدیریت حافظه بر عهده برنامهنویس است.
اما در داتنت مسیر به این شکل است:
C# → IL → CLR → Machine Code
به همین دلیل به کدی که اجرای آن تحت مدیریت CLR انجام میشود، Managed Code میگوییم.
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
▫️به زبان ساده:
کد مدریت شده (Managed Code) یعنی کدی که اجرای آن توسط یک Runtime مدیریت میشود.
در دنیای داتنت، این Runtime همان CLR (Common Language Runtime) است.
مثلاً وقتی با سیشارپ کد مینویسیم، کدم مستقیماً به Machine Code تبدیل نمیشود.
مسیر کلی به این شکل است:
C# → Compiler → IL → CLR → JIT → Machine Code → CPU
🔹 زبان میانی (Intermediate Language یا IL) — ایال
بعد از اینکه برنامه سیشارپ کامپایل میشود، خروجی مستقیماً Machine Code نیست؛ بلکه کدی به نام IL تولید میشود.
🔹 محیط اجرای .NET (Common Language Runtime یا CLR)
سی ال ار (CLR) همان Runtime داتنت است که اجرای Managed Code را مدیریت میکند و سرویسهایی مثل مدیریت حافظه و Type Safety را فراهم میکند.
🔹 کامپایلر در زمان اجرا (Just-In-Time یا JIT)
جیت (JIT) در زمان اجرای برنامه، IL رو به Machine Code تبدیل میکند تا CPU بتواند آن را اجرا کند.
🔹 مدیریت حافظه (Memory Management)
یکی از مزیتهای مهم Managed Code این است که Runtime میتواند مدیریت حافظه را انجام دهد؛ مثلاً Garbage Collector حافظهای را که دیگر استفاده نمیشود، برای آزادسازی مدیریت میکند.
🔵 کد مدیریتشده در مقابل کد مدیریتنشده
در برنامههای Native مثل C و ++C، کد معمولاً مستقیماً به Machine Code تبدیل میشود و مسئولیتهای بیشتری مانند مدیریت حافظه بر عهده برنامهنویس است.
اما در داتنت مسیر به این شکل است:
C# → IL → CLR → Machine Code
به همین دلیل به کدی که اجرای آن تحت مدیریت CLR انجام میشود، Managed Code میگوییم.
🔗 جزئیات بیشتر را در این لینک بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#کامیار_شکیب (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Docs
What is managed code? - .NET
Learn how managed code is code whose execution is managed by a runtime, the Common Language Runtime (CLR).
👍7
ورکشاپ «AI Agents in C# (MAF)»
در این ورکشاپ به بررسی امکانات جدید برنامهنویسی با کتابخانهها و استانداردهای جدید AI در سیشارپ مخصوصا Microsoft Agent Framework میپردازیم.
با هم کد میزنیم و کمی حرفهایتر، با معماریهای مدرن این هوشمصنوعی در دنیای داتنت آشنا میشویم.
ارائه دهنده: مهران داودی
زمان: ۳۰ شهریور، ساعت ۲۰:۰۰ (به تایم ایران)
محل: LinkedIn Live
لینک ثبتنام رایگان:
https://www.linkedin.com/events/7504866466815582208
در این ورکشاپ به بررسی امکانات جدید برنامهنویسی با کتابخانهها و استانداردهای جدید AI در سیشارپ مخصوصا Microsoft Agent Framework میپردازیم.
با هم کد میزنیم و کمی حرفهایتر، با معماریهای مدرن این هوشمصنوعی در دنیای داتنت آشنا میشویم.
ارائه دهنده: مهران داودی
زمان: ۳۰ شهریور، ساعت ۲۰:۰۰ (به تایم ایران)
محل: LinkedIn Live
لینک ثبتنام رایگان:
https://www.linkedin.com/events/7504866466815582208
2❤9👍4🔥3
بازنویسی کل GitHub Copilot Runtime با Rust
🔶 حدود ۱۲۰،۰۰۰ دلار هزینه توکن و سه هفته وقت یک برنامهنویس، هزینه این مایگرشن بوده است.
🔷 در این بلاگ، Stephen Toub توضیح داده که چطور کدهای GitHub Copilot Runtime (حدود ۸۰۰هزار خط کد) رو به #rust مایگریت کردهاند (از #typescript و #nodejs).
▫️ در بخشهایی از این بلاگ قشنگ معلومه استفن از دست node.js و محدودیتهاش عصبانی بوده!
🔗 این مقاله یکم طولانیه، ولی خیلی تجربههای ارزشمندی توش وجود داره که میتونه بهتون تو معماری هوشمصنوعی پروژههای بزرگ کمک کنه.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
🔶 حدود ۱۲۰،۰۰۰ دلار هزینه توکن و سه هفته وقت یک برنامهنویس، هزینه این مایگرشن بوده است.
🔷 در این بلاگ، Stephen Toub توضیح داده که چطور کدهای GitHub Copilot Runtime (حدود ۸۰۰هزار خط کد) رو به #rust مایگریت کردهاند (از #typescript و #nodejs).
▫️ در بخشهایی از این بلاگ قشنگ معلومه استفن از دست node.js و محدودیتهاش عصبانی بوده!
🔗 این مقاله یکم طولانیه، ولی خیلی تجربههای ارزشمندی توش وجود داره که میتونه بهتون تو معماری هوشمصنوعی پروژههای بزرگ کمک کنه.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
The GitHub Blog
Migrating the GitHub Copilot runtime to Rust, using Copilot
A rewrite this size wasn't affordable before agents. Here's what porting the Copilot agent runtime to 800,000 lines of production Rust actually took.
👍14🔥2❤1
نگو JEV بگو System One!
دنیل کانمن (Daniel Kahneman) توی کتاب معروفش «تفکر، سریع و کند» (Thinking, Fast and Slow) ذهن انسان را به دو بخش تقسیم میکنه:
- سیستم ۱ (System 1): تفکر سریع، خودکار، حسی و بدون زحمت؛ مثل تشخیص سریع حالت چهره یا انتخاب مسیر همیشگی.
- سیستم ۲ (System 2): تفکر کند، تحلیلی، متمرکز و نیازمند انرژی محاسباتی؛ مثل حل یک مسئله پیچیده ریاضی.
در دنیای هوش مصنوعی، بیشتر تمرکز ما تا الان روی مدلهای زبانی بزرگ (LLMها) بوده که بیشتر شبیه به سیستم ۲ عمل میکنند؛ متنی تولید میکنند، استدلال میکنند، اما سنگین، کند و پرهزینهاند. ولی برای تصمیمگیریهای لحظهای، مسیریابی درخواستها (Routing) و دستهبندی سریع (Classification)، واقعاً نیازی به لود کردن یا فراخوانی یک LLM غولپیکر نداریم. یعنی برای این قبیل کارها نیازی به هزینههای سنگین بابت GPT و Fable و ... نداریم.
تفاوت مدلهای System 1 با LLMها چیست؟
- هدف: به جای تولید طولانی متن (Text Generation)، تمرکز روی تصمیمگیری آنی، سنجش احتمالات و اکشنهای سریع است.
- سرعت و منابع: فوقالعاده سبک و سریع هستند و میتوانند با کمترین تاخیر (Latency) حتی روی سیستمهای معمولی و لوکال اجرا شوند.
ورودی این مدلها چگونهاند؟ (خیلی ساده)
نیازی به پرامپتهای پیچیده ندارید؛ ورودیها معمولاً شامل:
۱. یک وضعیت یا متن ورودی (State/Body): مثلاً پیام کاربر.
۲. پرسش و گزینهها (Questions/Choices & Criteria): معیارهای دستهبندی یا انتخابی که میخواهید مدل بین آنها تصمیم بگیرد.
اما...
این حوزه فقط به یک معماری یا مدل خاص محدود نمیشود؛ امروزه خانوادهای از مدلهای سبک و تخصصی تحت عنوان System 1 Models در حال شکلگیری هستند که عمدتا در مورد یک مدل از آنها یعنی JEV شنیدیم ولی این سری از مدلها به JEV خلاصه نمیشوند ...
معرفی Laya
یکی از گزینههای متنباز، سریع و کارآمد در این حوزه Laya است که میتوانید آن را به راحتی برروی سیستم دسکتاپ خود اجرا کنید:
من یک نمونه کد ساده با C# / .NET پیادهسازی کردم که نحوه ارسال درخواست به سرور لوکال Laya و دریافت خروجی ساختارمند و تصمیمگیری آنی را نشون میدهد.
🔗 سورسکد و راهنمای کامل را میتونید در گیتهاب من ببینید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
دنیل کانمن (Daniel Kahneman) توی کتاب معروفش «تفکر، سریع و کند» (Thinking, Fast and Slow) ذهن انسان را به دو بخش تقسیم میکنه:
- سیستم ۱ (System 1): تفکر سریع، خودکار، حسی و بدون زحمت؛ مثل تشخیص سریع حالت چهره یا انتخاب مسیر همیشگی.
- سیستم ۲ (System 2): تفکر کند، تحلیلی، متمرکز و نیازمند انرژی محاسباتی؛ مثل حل یک مسئله پیچیده ریاضی.
در دنیای هوش مصنوعی، بیشتر تمرکز ما تا الان روی مدلهای زبانی بزرگ (LLMها) بوده که بیشتر شبیه به سیستم ۲ عمل میکنند؛ متنی تولید میکنند، استدلال میکنند، اما سنگین، کند و پرهزینهاند. ولی برای تصمیمگیریهای لحظهای، مسیریابی درخواستها (Routing) و دستهبندی سریع (Classification)، واقعاً نیازی به لود کردن یا فراخوانی یک LLM غولپیکر نداریم. یعنی برای این قبیل کارها نیازی به هزینههای سنگین بابت GPT و Fable و ... نداریم.
تفاوت مدلهای System 1 با LLMها چیست؟
- هدف: به جای تولید طولانی متن (Text Generation)، تمرکز روی تصمیمگیری آنی، سنجش احتمالات و اکشنهای سریع است.
- سرعت و منابع: فوقالعاده سبک و سریع هستند و میتوانند با کمترین تاخیر (Latency) حتی روی سیستمهای معمولی و لوکال اجرا شوند.
ورودی این مدلها چگونهاند؟ (خیلی ساده)
نیازی به پرامپتهای پیچیده ندارید؛ ورودیها معمولاً شامل:
۱. یک وضعیت یا متن ورودی (State/Body): مثلاً پیام کاربر.
۲. پرسش و گزینهها (Questions/Choices & Criteria): معیارهای دستهبندی یا انتخابی که میخواهید مدل بین آنها تصمیم بگیرد.
اما...
این حوزه فقط به یک معماری یا مدل خاص محدود نمیشود؛ امروزه خانوادهای از مدلهای سبک و تخصصی تحت عنوان System 1 Models در حال شکلگیری هستند که عمدتا در مورد یک مدل از آنها یعنی JEV شنیدیم ولی این سری از مدلها به JEV خلاصه نمیشوند ...
معرفی Laya
یکی از گزینههای متنباز، سریع و کارآمد در این حوزه Laya است که میتوانید آن را به راحتی برروی سیستم دسکتاپ خود اجرا کنید:
py3 -m pip install laya
pip install "laya[serve]"
py -m laya.serve
من یک نمونه کد ساده با C# / .NET پیادهسازی کردم که نحوه ارسال درخواست به سرور لوکال Laya و دریافت خروجی ساختارمند و تصمیمگیری آنی را نشون میدهد.
🔗 سورسکد و راهنمای کامل را میتونید در گیتهاب من ببینید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
GitHub
GitHub - hamedhajiloo/sample.laya
Contribute to hamedhajiloo/sample.laya development by creating an account on GitHub.
1❤19👍2🔥1
امروز تو این ورکشاپ قراره یه ایجنت هوشمصنوعی رو از صفر تا صد با هم درست کنیم.
بدون یک خط کد نویسی!
منتظرتونیم :)
بدون یک خط کد نویسی!
منتظرتونیم :)
🔥2
Forwarded from CrystaCode
"I'd love an AI assistant for my listings, but I don't have a developer" is something we hear constantly from real estate agents.
Dubai Radar is proof: you don't need a developer to build this.
🔗 Try Dubai Radar:
https://crysta.live/go/dubai-radar
Here's the thing: you don't need one.
Building an AI agent for your listings doesn't take a website, a budget for custom software, or someone on staff who codes. It takes a conversation. You describe what you need, Crysta builds it, you load in your actual listings, photos and all, and it's ready.
We're building one of these live next week, start to finish, for a real estate agent. If "I'm not technical enough for this" has been the thing stopping you, come watch what it actually takes.
📌 RSVP for the live workshop:
https://www.linkedin.com/events/7510707482923823104
#CrystaCode #Realestate #BuildWithAI #AIAgent #RealEstateAI #PropTech
Dubai Radar is proof: you don't need a developer to build this.
🔗 Try Dubai Radar:
https://crysta.live/go/dubai-radar
Here's the thing: you don't need one.
Building an AI agent for your listings doesn't take a website, a budget for custom software, or someone on staff who codes. It takes a conversation. You describe what you need, Crysta builds it, you load in your actual listings, photos and all, and it's ready.
We're building one of these live next week, start to finish, for a real estate agent. If "I'm not technical enough for this" has been the thing stopping you, come watch what it actually takes.
📌 RSVP for the live workshop:
https://www.linkedin.com/events/7510707482923823104
#CrystaCode #Realestate #BuildWithAI #AIAgent #RealEstateAI #PropTech
1👍4❤2👏1