ساخت عوامل هوش مصنوعی با هسته معنایی

عوامل هوش مصنوعی فراتر از رباتهای چت سنتی تکامل مییابند و وظایف حل مسئله پیچیدهای را انجام میدهند که نیاز به درک عمیق زمینه و استدلال هوشمندانه دارد. امروزه توسعهدهندگان تلاش میکنند تا سیستمهایی بسازند که نه تنها میتوانند هوشمندانه پاسخ دهند، بلکه به طور مستقل عمل میکنند – ترکیب دانش دامنه، منطق تجاری و ابزارهای تخصصی برای ایجاد عوامل تصمیمگیری متناسب با مشکلات خاص. دستیابی به این امر مستلزم یک ارکستراتور قدرتمند است که قادر به هماهنگی یکپارچه مدل ها، ابزارها و گردش کار باشد.
هسته معنایی (SK) مایکروسافت دقیقاً همین را ارائه میکند: یک چارچوب سبک وزن که مدلهای زبانی در مقیاس بزرگ (LLM) را با کد، دادهها و APIهای خود شما متصل میکند. در این مقاله، ما یک عامل ساده هوش مصنوعی میسازیم و اجزای کلیدی که باعث کارکرد آن میشوند را بررسی میکنیم.
هسته معنایی چیست؟
Semantic Kernel (SK) چارچوب منبع باز مایکروسافت برای ساخت عوامل هوش مصنوعی است که LLM را با کد و داده های شما ترکیب می کند. این برنامه به گونهای طراحی شده است که عواملی را برای انجام کارها کاربردی و ساده کند: شما قابلیتهای عامل خود را به عنوان افزونه (ابزار) ثبت میکنید، SK ورودیها و خروجیهای مبتنی بر JSON را برای آن ابزارها نمایش میدهد، و LLM تصمیم میگیرد که کدام ابزار را بر اساس زمینه مکالمه فراخوانی کند. SK ارکستراسیون را مدیریت میکند – ابزار درخواستی را اجرا میکند، نتایج را به مدل برمیگرداند، و ارتباطات ساختاریافته را حفظ میکند – بنابراین میتوانید روی منطق کسبوکارتان تمرکز کنید، نه روی سیمکشی سریع سطح پایین.
سه ستون عامل هوش مصنوعی
در قلب هر عامل Semantic Kernel سه جزء وجود دارد – هستهدر LLMو پلاگین ها (ابزارها).
1. هسته: ارکستر
هسته هماهنگ کننده مرکزی است. تعاملات بین مدل و ابزارهای شما را مدیریت میکند، زمینه را مدیریت میکند و جریان روان بین استدلال و اجرا را تضمین میکند.
2. LLM (مدل استدلال): مغز
مدل زبان بزرگ فرصت هایی برای استدلال فراهم می کند. هدف کاربر را تفسیر می کند، تعیین می کند که به چه داده ها یا ابزارهایی نیاز دارد و به هسته دستور می دهد تا آنها را اجرا کند.
3. موارد اضافی: ابزار
افزونه ها توابع منظمی در کد شما هستند که اقداماتی مانند بازیابی داده ها یا محاسبه مقادیر را انجام می دهند. با قرار دادن آنها در هسته اصلی، نماینده شما می تواند به جای اینکه صرفا محاوره ای باقی بماند، با سیستم های واقعی تعامل داشته باشد. LLM های اخیر به خوبی در فراخوانی ابزار آموزش دیده اند و می توانند ابزار صحیح را بر اساس زمینه فعلی که با آن آشنا هستند انتخاب کنند.
اکنون بیایید یک عامل هوش مصنوعی ساده مجهز به ابزارهایی برای انجام اقدامات، LLM برای درک قصد و تصمیم گیری کاربر، و یک هسته قدرتمند برای کمک به عامل برای رسیدن به هدف بسازیم. در این مقاله، قطعات کد را با استفاده از کتابخانههای مخصوص Azure پیدا خواهید کرد، اما میتوانید معادلهای آنها را بر اساس ارائهدهنده LLM خود در نسخه رسمی پیدا کنید. هسته معنایی اسناد.
مرحله 0: نماینده خود را شناسایی کنید
قبل از اینکه هر کدی بنویسیم، بیایید با مشخص کردن اینکه عامل ما چیست و چگونه باید رفتار کند، شروع کنیم. این تعریف که شخصیت عامل نامیده میشود، بعداً در کد ما به دستور سیستم تبدیل میشود که لحن، سبک و مرزهای موتیفهای مدل را هدایت میکند. در مثال خود، عاملی میسازیم که میتواند با لحنی شاد به کاربر خوش آمد بگوید و آن را بر اساس موقعیت مکانی کاربر شخصیسازی کند.
مرحله 1: هسته را بسازید
هر پروژه Semantic Kernel با هسته ای شروع می شود که به عنوان ارکستراتور عمل می کند و LLM و ابزارهای شما را به هم متصل می کند. ایجاد آن ساده است – شما مدل خود و نقطه پایانی که مدل در آن میزبانی می شود و اعتبارنامه هایی که برای authN/Z استفاده می شود را ثبت می کنید. اگر از Azure برای مصارف تولیدی استفاده می کنید، بهتر است از آن استفاده کنید Azure RBAC با هویت مدیریت شده به جای ذخیره کردن کلیدهای API این تنظیم به طور ایمن نماینده شما را به مدل متصل میکند بدون اینکه هیچ رازی در کد شما جاسازی کند.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Azure.Identity; // for RBAC
// Build the kernel and register the model (e.g., Azure OpenAI GPT-4)
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "", // name of your LLM deployment (e.g., gpt-4.1, gpt-4o)
endpoint: "",
credential: new DefaultAzureCredential()); // uses managed identity or local credentials
var kernel = builder.Build();
Console.WriteLine("Kernel is ready (RBAC enabled)!");
مرحله 2: ثبت افزونه ها (ابزارها)
پلاگین ها قابلیت های عامل را گسترش می دهند. هر پلاگین یک کلاس سی شارپ ساده است که در صورت درخواست مدل، می توان متدهای آن را توسط هسته فراخوانی کرد. شما یک روش را با اضافه کردن در معرض دید قرار می دهید [KernelFunction] و [Description]که به مدل می گوید ابزار چه کاری انجام می دهد. برای مثال ما دو افزونه ساده و یک سرویس گیرنده کمکی کوچک تعریف می کنیم. همه [KernelFunction] روش تبدیل به یک ابزار فراخوانی می شود و آن [Description] به مدل می گوید که چه کاری انجام دهد، و اجازه می دهد تا ارکستراسیون با انگیزه انجام دهد. همچنین میتوانید درخواستها را به عنوان ابزار ثبت کنید، که اساساً ماژولار بودن در درخواستها ایجاد میشود. این زمانی مفید است که یک مورد استفاده برای استفاده مجدد از اعلانهای خاص، برای مثال دستورات خلاصه وجود داشته باشد.
using Microsoft.SemanticKernel;
using System.ComponentModel;
// Simple client to resolve a time zone from a city name
public class LocationClient
{
public string GetTimeZone(string city)
{
return city.ToLower() switch
{
"seattle" => "Pacific Standard Time",
"new york" => "Eastern Standard Time",
"london" => "GMT Standard Time",
"tokyo" => "Tokyo Standard Time",
_ => "UTC"
};
}
}
// Plugin 1: Get user location and time zone
public class LocationPlugin
{
private readonly LocationClient _client = new();
[KernelFunction, Description("Get the user's current city.")]
public string GetUserLocation() => "Seattle";
[KernelFunction, Description("Get the time zone for a given city.")]
public string GetTimeZone(string city) => _client.GetTimeZone(city);
}
// Plugin 2: Get time of day for a given time zone
public class TimePlugin
{
[KernelFunction, Description("Get the current time of day (morning, afternoon, evening, or night) for a given time zone.")]
public string GetTimeOfDay(string timeZone)
{
try
{
var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
var localTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);
var hour = localTime.Hour;
return hour switch
{
>= 5 and "morning",
>= 12 and "afternoon",
>= 17 and "evening",
_ => "night"
};
}
catch
{
return "unknown time of day";
}
}
}
// Register plugins
var locationPlugin = new LocationPlugin();
var timePlugin = new TimePlugin();
kernel.Plugins.AddFromObject(locationPlugin, "Location");
kernel.Plugins.AddFromObject(timePlugin, "Time");
Console.WriteLine("Plugins registered: Location, Time");
مرحله 3: یک عامل ایجاد کنید
با وجود هسته و افزونهها، بیایید عامل خود را با استفاده از الگوهای عامل داخلی SK ایجاد کنیم، که بسیاری از معنایی پشت فراخوانی هسته را از بین میبرد.
using Microsoft.SemanticKernel.Agents;
// Define the agent's persona
string systemPrompt = """
You generate a short, upbeat Message of the Day.
Personalize it using the user’s city and the local time of day there.
Keep responses concise and warm.
""";
// Create the chat-completion agent
var agent = new ChatCompletionAgent(
kernel,
instructions: systemPrompt,
name: "MotdAssistant");
Console.WriteLine($"Agent '{agent.Name}' created.");
مرحله 4: با نماینده تماس بگیرید
تماس با نماینده ساده است – فقط یک پیام ارسال کنید. اما هنگامی که با عامل تماس می گیرید، می توانید نحوه مدیریت تماس های ابزار را با استفاده از تنظیمات زمان اجرا مشخص کنید. با تنظیم FunctionCallBehavior.Autoبه هسته اجازه میدهید تا هر فراخوانی ابزاری را که مدل لازم بداند بهطور خودکار اجرا کند. با این تنظیمات، مدل تعیین می کند که کدام تابع و چه زمانی فراخوانی شود، در حالی که هسته فراخوانی واقعی را انجام می دهد و نتایج را به مدل برمی گرداند.
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.ChatCompletion;
// Define execution settings to automatically handle tool calls
var executionSettings = new ChatRequestSettings
{
FunctionCallBehavior = FunctionCallBehavior.Auto
};
// Invoke the agent with a simple greeting
var reply = await agent.InvokeAsync("Hello", executionSettings);
Console.WriteLine($"\nAgent: {reply}");
پشت این تماس واحد، یک مکالمه ساختاریافته آشکار می شود:
| گام | جریان | توضیح |
|---|---|---|
| 1 | کاربر → نماینده: “سلام” | کاربر به نماینده سلام می کند. |
| 2 | Core → LLM: System Prompt + “Hello” | هسته شخصیت و پیام را به مدل می فرستد. |
| 3 | LLM → هسته: {ابزار: GetUserLocation} | مدل متوجه می شود که به شهر کاربر نیاز دارد. |
| 4 | Core → Plugin: GetUserLocation() | هسته پلاگین مکان را اجرا می کند. |
| 5 | Core → LLM: فرمان سیستم + “Hello” + “Seattle” | هسته نتیجه را به مدل برمی گرداند. |
| 6 | LLM → هسته: {ابزار: GetTimeZone، آرگومان: “Seattle”} | مدل منطقه زمانی را میپرسد. |
| 7 | Core → Plugin: GetTimeZone (“Seattle”) | هسته آن را اجرا می کند. |
| 8 | Core → LLM: System Prompt + “Hello” + “Seattle” + “Pacific Standard Time” | هسته این نتیجه را منتقل می کند. |
| 9 | LLM → هسته: {ابزار: GetTimeOfDay، آرگومان: “زمان استاندارد اقیانوس آرام”} | الگو به زمان روز نیاز دارد. |
| 10 | Core → Plugin: GetTimeOfDay() را پیاده سازی می کند | هسته ابزار را اجرا می کند. |
| 11 | Core → LLM: فرمان سیستم + “سلام” + “سیاتل” + “زمان استاندارد اقیانوس آرام” + “صبح” | هسته زمینه نهایی مدل را فراهم می کند. |
| 12 | LLM → Kernel → کاربر: “صبح بخیر! با آرزوی شروعی پرانرژی برای شما.” | مدل پیام نهایی را می سازد. |
از یک ساده InvokeAsync("Hello")شما یک چرخه کامل از استدلال و اجرا را دریافت می کنید که برای کاربر طبیعی است. در جدول بالا، من “جریان” را فقط برای نشان دادن جریان داده ارائه کرده ام، نه قرارداد واقعی استفاده شده برای این تعامل.
قابلیت مشاهده: ورود به سیستم، معیارها و ردیابی
سیستمهای تولیدی به چیزی بیش از اعلانهای هوشمند نیاز دارند – آنها نیاز به دید دارند. مشاهده پذیری توانایی درک وضعیت داخلی سیستم از طریق گزارش ها، متریک ها و ردیابی ها است. Semantic Kernel از OpenTelemetry پشتیبانی میکند، دادههایی را در مورد زمانهای فراخوانی تابع، استفاده از توکن، تأخیر و معیارهای تکمیل مدل ارائه میدهد و به توسعهدهندگان دید کاملی از هزینه و عملکرد میدهد.
فیلتر ورود به سیستم را اضافه کنید
می توانید فیلترهایی اضافه کنید که قبل و بعد از فراخوانی توابع اجرا می شوند. به عنوان مثال، یک فیلتر ورود به سیستم ساده می تواند زمان شروع و پایان هر روش افزونه را ضبط کند:
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Filters;
public sealed class LoggingFilter(ILogger logger) : IFunctionInvocationFilter
{
public async Task OnFunctionInvocationAsync(
FunctionInvocationContext context,
Func next)
{
logger.LogInformation("Invoking {Plugin}.{Function}", context.Function.PluginName, context.Function.Name);
await next(context);
logger.LogInformation("Invoked {Plugin}.{Function}", context.Function.PluginName, context.Function.Name);
}
}
// Register the filter
builder.Services.AddSingleton();
این امر ردیابی استفاده از ویژگی و تأخیر را در زمان واقعی آسان می کند. شما همچنین می توانید از این فیلترها برای اهداف مختلف استفاده کنید، به عنوان مثال. قبل از اینکه نماینده بتواند هرگونه اقدام حساس، بررسی تخلفات فوری و غیره را انجام دهد، از کاربر رضایت بگیرید.
مفاهیم پیشرفته
حافظه و زمینه پایدار
حافظه به عوامل اجازه می دهد تا زمینه بین جلسات را حفظ کنند – به عنوان مثال، به خاطر سپردن نام یا ترجیحات کاربر. هسته معنایی از حافظه های خارجی مانند Redis یا پایگاه های داده برداری برای حفظ و بازیابی این زمینه پشتیبانی می کند. SK اکنون پشتیبانی می کند کانکتورهای خارج از جعبه همچنین برای پایگاه های داده برداری خود، RAG و سایر قابلیت های جستجوی معنایی را در دسترس عامل قرار دهید و آن را حتی قدرتمندتر کنید.
آمادگی تولید نماینده
1. پیام های سیستم را پاک کنید
اعلان سیستم قرارداد رفتاری نماینده شما است. یک اعلان محدوده واضح، استدلال غیرضروری را کاهش می دهد و استفاده از رمز را کاهش می دهد.
2. شناخت توکن ها
برای مدیریت هزینهها و جلوگیری از افزونگی، تعداد توکنها را برای درخواستها و تکمیلها پیگیری کنید.
3. امنیت
ورودی کاربر را تأیید کنید، قابلیتهای ابزار را محدود کنید و اعتبارنامهها را بهطور ایمن ذخیره کنید.
4. مقیاس پذیری
- ذخیره سازی نتایج رایج ابزار (مانند مکان استاتیک یا جستجوهای پیکربندی)
- الگوهای درخواستی کش یا جاسازیها برای استفاده مجدد
- از عملیات اجرای مدل و ابزار ناهمزمان برای به حداکثر رساندن عملکرد استفاده کنید
- عوامل را بدون وضعیت نگه دارید یا زمینه مشترک را برای مقیاس افقی ذخیره کنید
- از داده های نظارتی برای شناسایی تماس های ابزار با فرکانس بالا استفاده کنید که بیشترین سود را از حافظه پنهان دارند
با ترکیب اعلانهای کوتاه، قابلیت مشاهده نشانه، امنیت قوی و حافظه پنهان هوشمند، میتوانید یک عامل اثبات مفهوم ساده را به یک سرویس تولیدی مقیاسپذیر، کارآمد و قابل اعتماد تبدیل کنید.
غذا برای بردن به خانه
- Semantic Kernel ساخت عوامل هوش مصنوعی را با اتصال LLM با کد و داده های خود ساده می کند.
- هسته جریان بین استدلال و اجرا را هماهنگ می کند، در حالی که افزونه ها قابلیت های واقعی را به عنوان ابزارهای قابل فراخوانی در معرض نمایش می گذارند.
- یک اعلان سیستمی که به خوبی تعریف شده است، پایه و اساس سازگاری عامل و وضوح استدلال است.
- اعلانهای واضح سیستم و طراحی مختصر، رفت و آمد غیر ضروری بین هسته و LLM را کاهش میدهد و هزینه و تأخیر را بهبود میبخشد.
- ویژگی های نظارتی مانند پشتیبانی otel و فیلترها، نظارت بر استفاده از ابزار و رفتار مدل را آسان می کند.
- مفاهیم پیشرفته مانند اتصال دهنده ها، جستجوی متن برای RAG و حافظه، استدلال چند مرحله ای و زمینه پایدار را امکان پذیر می کند.
به طور خلاصه، Semantic Kernel مدلهای زبان بزرگ را به عوامل قابل اعتماد، قابل مشاهده و توسعهپذیر تبدیل میکند که میتوانند استدلال کنند، عمل کنند و مقیاسپذیر باشند.



