البدء باستخدام النواة الدلالية: تنسيق الذكاء الاصطناعي في لغة C#
إذا كنت تقوم ببناء تطبيقات .NET وتشاهد مشهد الذكاء الاصطناعي يتطور، فربما تساءلت: *ما هي أفضل طريقة لدمج نماذج اللغة الكبيرة في مشاريع C# الخاصة بي دون تحويل قاعدة التعليمات البرمجية الخاصة بي إلى معكرونة؟ * هذه هي بالضبط المشكلة التي تحلها Semantic Kernel من Microsoft، وبعد قضاء العام الماضي في بناء تطبيقات الإنتاج باستخدامها، يمكنني أن أخبرك أنها أصبحت واحدة من أهم الأدوات في مجموعة أدوات المطور الخاصة بي.
في هذا المنشور، سأرشدك إلى كل ما تحتاجه للبدء في استخدام Semantic Kernel - بدءًا من فهم المفاهيم الأساسية وحتى إنشاء مساعد الذكاء الاصطناعي في العالم الحقيقي. سواء كنت تغمس أصابع قدميك في تطوير الذكاء الاصطناعي أو تبحث عن طريقة منظمة لتنسيق مكالمات LLM في تطبيقات .NET الموجودة لديك، فإن هذا الدليل يلبي احتياجاتك.
ما هي النواة الدلالية؟
Semantic Kernel (SK) عبارة عن SDK مفتوح المصدر من Microsoft يعمل بمثابة طبقة تنسيق بين رمز التطبيق الخاص بك ونماذج اللغات الكبيرة مثل GPT-4o أو Azure OpenAI أو خدمات الذكاء الاصطناعي الأخرى. فكر في الأمر على أنه برنامج وسيط خفيف الوزن يتيح لك الجمع بين كود C# التقليدي وإمكانيات الذكاء الاصطناعي بطريقة نظيفة وقابلة للتركيب.
ولكن لماذا لا نتصل بـ OpenAI API مباشرة؟ يمكنك فعل ذلك بالتأكيد، ولا بأس بذلك بالنسبة لحالات الاستخدام البسيطة. لكن في اللحظة التي تحتاج فيها إلى:
- دع الذكاء الاصطناعي يقرر الوظائف التي سيتم الاتصال بها بناءً على مدخلات المستخدم
- ادمج مكالمات الذكاء الاصطناعي المتعددة مع التعليمات البرمجية التقليدية في مسار واحد
- أضف الذاكرة والسياق حتى يتذكر الذكاء الاصطناعي التفاعلات السابقة
- قم ببناء وكلاء متعددي الخطوات الذين يقومون بالتفكير من خلال المهام المعقدة
…ستجد نفسك تعيد اختراع العجلة. يمنحك Semantic Kernel كل هذا خارج الصندوق، مع دعم .NET من الدرجة الأولى، وتكامل حقن التبعية، وبنية المكونات الإضافية التي تبدو طبيعية لأي مطور C#.
يتواجد المشروع على GitHub ضمن مستودع microsoft/semantic-kernel ويحتوي على SDKs لـ C# وPython وJava. يعد C# SDK هو الأكثر نضجًا وهو الذي سنركز عليه هنا.
المفاهيم الأساسية
قبل أن نكتب أي كود، دعونا نفهم اللبنات الأساسية.
النواة
Kernel هو الكائن المركزي في Semantic Kernel. إنه المنسق - الشيء الذي يربط بين خدمات الذكاء الاصطناعي والمكونات الإضافية والتكوين. يمكنك إنشاء واحدة، وتسجيل خدماتك ومكوناتك الإضافية عليها، ثم استخدامها لتنفيذ المطالبات أو استدعاء الوظائف. إذا كنت معتادًا على حقن التبعية في ASP.NET Core، فستشعر أن Kernel مألوف جدًا - فهي في الأساس حاوية خدمة ذات قوى خارقة للذكاء الاصطناعي.
الإضافات والوظائف
المكون الإضافي عبارة عن مجموعة من الوظائف ذات الصلة التي يمكن أن يستدعيها Kernel. الوظائف تأتي في نكهتين:
- الوظائف السريعة — يتم تعريفها على أنها قوالب لغة طبيعية يتم إرسالها إلى LLM
- الوظائف الأصلية — أساليب C# العادية المزينة بالسمات التي يمكن لـ Kernel اكتشافها واستدعاءها
على سبيل المثال، قد يكون لديك WeatherPlugin مع وظيفة أصلية GetCurrentWeather(string city) ووظيفة سريعة تلخص بيانات الطقس بطريقة سهلة.### موصلات الذكاء الاصطناعي
الموصلات هي الطريقة التي تتحدث بها Semantic Kernel مع خدمات الذكاء الاصطناعي. الأكثر شيوعا هي:
AzureOpenAIChatCompletion— لخدمة Azure OpenAIOpenAIChatCompletion— لواجهة برمجة تطبيقات OpenAI مباشرة- تضمين موصلات للبحث عن المتجهات والذاكرة
تقوم بتسجيلها على Kernel عند بدء التشغيل، وكل شيء آخر يعمل.
إعداد مشروعك
دعونا الحصول على أيدينا القذرة. ابدأ بإنشاء تطبيق وحدة تحكم جديد:
dotnet new console -n SemanticKernelDemo
cd SemanticKernelDemo
أضف الآن حزم Semantic Kernel NuGet:
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI
إذا كنت تستخدم OpenAI مباشرةً بدلاً من Azure OpenAI:
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
لدعم الذاكرة والتضمينات (سنستخدم هذا لاحقًا):
dotnet add package Microsoft.SemanticKernel.Plugins.Memory
dotnet add package Microsoft.Extensions.VectorData.Abstractions
يجب أن يستهدف .csproj الإصدار .NET 8 أو الأحدث. تستفيد أحدث إصدارات Semantic Kernel استفادة كاملة من ميزات .NET الحديثة.
نواتك الأولى
لنبدأ بأبسط مثال ممكن - إنشاء Kernel، وربطه بخدمة الذكاء الاصطناعي، وطرح سؤال عليه.
using Microsoft.SemanticKernel;
// Build the kernel with Azure OpenAI
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
var kernel = builder.Build();
// Invoke a simple prompt
var result = await kernel.InvokePromptAsync(
"Explain dependency injection in C# in three sentences."
);
Console.WriteLine(result);
إذا كنت تستخدم OpenAI مباشرة، فقم بتبديل تسجيل الخدمة:
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o",
apiKey: "your-openai-api-key"
);
هذا كل شيء. قم بتشغيله وستحصل على شرح موجز لحقن التبعية. ولكن هذا مجرد خدش السطح.
استخدام القوالب السريعة
تتيح لك قوالب الموجهات تحديد معلمات المطالبات الخاصة بك باستخدام المتغيرات باستخدام بناء جملة نمط Handlebars:
var prompt = """
You are a technical writer. Write a brief summary of {{$topic}}
aimed at developers with {{$experienceLevel}} experience.
Keep it under 200 words.
""";
var function = kernel.CreateFunctionFromPrompt(prompt);
var arguments = new KernelArguments
{
["topic"] = "gRPC in .NET",
["experienceLevel"] = "intermediate"
};
var result = await kernel.InvokeAsync(function, arguments);
Console.WriteLine(result);
هذا هو المكان الذي يبدأ فيه Semantic Kernel في التألق - يمكنك تحديد قوالب المطالبة القابلة لإعادة الاستخدام، وإصدارها، وتكوينها في مسارات عمل أكبر.
الإضافات والوظائف الأصلية
المكونات الإضافية هي المكان الذي يقوم فيه Semantic Kernel بسد الفجوة بين الذكاء الاصطناعي ورمز C# الموجود لديك. الوظيفة الأصلية هي مجرد طريقة عادية تعرضها لـ Kernel.
using Microsoft.SemanticKernel;
using System.ComponentModel;
public class TimePlugin
{
[KernelFunction("get_current_time")]
[Description("Gets the current date and time in UTC")]
public string GetCurrentTime()
{
return DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss UTC");
}
[KernelFunction("get_time_in_timezone")]
[Description("Gets the current time in a specific timezone")]
public string GetTimeInTimezone(
[Description("The IANA timezone identifier, e.g. 'America/New_York'")] string timezone)
{
var tz = TimeZoneInfo.FindSystemTimeZoneById(timezone);
var time = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz);
return time.ToString("yyyy-MM-dd HH:mm:ss");
}
}
لاحظ سمات [KernelFunction] و [Description]. هذه الأمور بالغة الأهمية، فالأوصاف هي ما يقرأه الذكاء الاصطناعي لفهم متى وكيف يتم استدعاء وظائفك. الأوصاف الجيدة تُحدث فرقًا بين الذكاء الاصطناعي الذي يستخدم أدواتك بفعالية والذكاء الاصطناعي الذي يرتبك.
سجل البرنامج المساعد على النواة الخاصة بك:
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
builder.Plugins.AddFromType<TimePlugin>();
var kernel = builder.Build();
يمكنك أيضًا إنشاء مكونات إضافية أكثر تعقيدًا تعمل على إدخال الخدمات. نظرًا لأن Semantic Kernel يتكامل مع Microsoft.Extensions.DependencyInjection، فيمكن لمكوناتك الإضافية تلقي تبعيات المُنشئ تمامًا مثل أي خدمة أخرى:
public class OrderPlugin
{
private readonly IOrderRepository _repository;
public OrderPlugin(IOrderRepository repository)
{
_repository = repository;
}
[KernelFunction("get_order_status")]
[Description("Retrieves the status of an order by its ID")]
public async Task<string> GetOrderStatus(
[Description("The order ID to look up")] string orderId)
{
var order = await _repository.GetByIdAsync(orderId);
return order is null
? $"No order found with ID {orderId}"
: $"Order {orderId}: {order.Status}, placed on {order.CreatedAt:d}";
}
}
استدعاء الوظائف والاستدعاء التلقائي
هذا هو المكان الذي تصبح فيه الأمور مثيرة للاهتمام حقًا. من خلال استدعاء الوظائف (المعروف أيضًا باسم استدعاء الأدوات)، يمكنك السماح لنموذج الذكاء الاصطناعي بتحديد الوظائف المسجلة التي سيتم الاتصال بها بناءً على سياق المحادثة. لا ينفذ النموذج تعليمات برمجية — فهو يُرجع طلبًا منظمًا يقول “أريد استدعاء الوظيفة X باستخدام هذه الوسائط”، ويتولى Kernel التعامل مع الاستدعاء الفعلي.
فيما يلي كيفية تمكين استدعاء الوظائف التلقائي:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
builder.Plugins.AddFromType<TimePlugin>();
builder.Plugins.AddFromType<WeatherPlugin>();
var kernel = builder.Build();
// Enable automatic function calling
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
var result = await kernel.InvokePromptAsync(
"What time is it in Tokyo and what's the weather like there?",
new KernelArguments(settings)
);
Console.WriteLine(result);
باستخدام FunctionChoiceBehavior.Auto()، سيقوم النواة بما يلي:
- أرسل مطالبتك إلى الذكاء الاصطناعي مع وصف جميع الوظائف المتاحة
- يقرر الذكاء الاصطناعي أنه بحاجة إلى الاتصال بـ
get_time_in_timezoneوget_weather - يقوم Kernel تلقائيًا بتنفيذ هذه الوظائف
- يتم إرسال النتائج مرة أخرى إلى الذكاء الاصطناعي
- يقوم الذكاء الاصطناعي بتأليف استجابة لغة طبيعية باستخدام نتائج الوظيفةيمكن أن تحدث هذه الحلقة عدة مرات في استدعاء واحد - قد يستدعي الذكاء الاصطناعي عدة وظائف بالتسلسل لجمع كل المعلومات التي يحتاجها. يمكنك أيضًا استخدام
FunctionChoiceBehavior.Required()لإجبار الذكاء الاصطناعي على استدعاء وظيفة واحدة على الأقل، أو تقديم قائمة محددة من الوظائف المسموح له باستخدامها.
استكمال الدردشة مع التاريخ
بالنسبة لتطبيقات المحادثة، ستحتاج إلى استخدام ChatCompletionService مباشرة مع كائن ChatHistory:
using Microsoft.SemanticKernel.ChatCompletion;
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
history.AddSystemMessage("""
You are a helpful developer assistant. You have access to tools
for checking the time and weather. Be concise and friendly.
""");
while (true)
{
Console.Write("You: ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input)) break;
history.AddUserMessage(input);
var response = await chatService.GetChatMessageContentAsync(
history,
executionSettings: settings,
kernel: kernel
);
history.AddAssistantMessage(response.Content ?? "");
Console.WriteLine($"Assistant: {response.Content}");
}
يمنحك هذا برنامج chatbot تفاعلي بالكامل يحافظ على سجل المحادثات ويمكنه استدعاء المكونات الإضافية حسب الحاجة.
الذاكرة والتضمينات
أحد أقوى الأنماط في تطبيقات الذكاء الاصطناعي هو الجيل المعزز للاسترجاع (RAG) — مما يتيح للذكاء الاصطناعي الوصول إلى بياناتك الخاصة عن طريق تضمينها في مساحة متجهة واسترداد الأجزاء ذات الصلة في وقت الاستعلام.
يوفر Semantic Kernel تجريدات للعمل مع مخازن المتجهات والتضمينات. فيما يلي كيفية إعداد متجر متجهات في الذاكرة للتطوير:
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
using Microsoft.SemanticKernel.Embeddings;
#pragma warning disable SKEXP0010
// Create an embedding generation service
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAITextEmbeddingGeneration(
deploymentName: "text-embedding-ada-002",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
var kernel = builder.Build();
var embeddingService = kernel.GetRequiredService<ITextEmbeddingGenerationService>();
// Generate embeddings for your documents
var documents = new[]
{
"Semantic Kernel is an open-source SDK for AI orchestration.",
"Azure OpenAI provides enterprise-grade AI models.",
"Plugins in SK allow you to expose C# methods to AI models."
};
var embeddings = await embeddingService.GenerateEmbeddingsAsync(documents);
بالنسبة لسيناريوهات الإنتاج، يمكنك تخزين هذه التضمينات في قاعدة بيانات متجهة مخصصة مثل Azure AI Search أو Qdrant أو Pinecone. يحتوي Kernel الدلالي على موصلات لكل هذه الروابط من خلال تجريدات Microsoft.Extensions.VectorData.
يبدو تدفق RAG النموذجي كما يلي:
- الاستيعاب: قم بتقطيع مستنداتك، وإنشاء التضمينات، وتخزينها في قاعدة بيانات متجهة
- استرداد: عندما يطرح المستخدم سؤالاً، قم بتضمين الاستعلام وابحث عن المستندات الأكثر تشابهًا
- إنشاء: قم بتمرير المستندات المستردة كسياق إلى LLM مع سؤال المستخدم
[KernelFunction("search_knowledge_base")]
[Description("Searches the internal knowledge base for relevant information")]
public async Task<string> SearchKnowledgeBase(
[Description("The search query")] string query)
{
var queryEmbedding = await _embeddingService.GenerateEmbeddingAsync(query);
var results = await _vectorStore.SearchAsync(queryEmbedding, limit: 3);
return string.Join("\n\n", results.Select(r => r.Text));
}
من خلال الكشف عن مسار RAG الخاص بك كوظيفة kernel، يمكن للذكاء الاصطناعي أن يقرر تلقائيًا متى يحتاج إلى البحث في قاعدة المعرفة الخاصة بك - مع الحفاظ على التنسيق نظيفًا والسماح للنموذج بالقيام بما يفعله على أفضل وجه.
المخططون والوكلاء
مع ازدياد تعقيد تطبيقات الذكاء الاصطناعي لديك، ستحتاج إلى الذكاء الاصطناعي لتخطيط المهام متعددة الخطوات وتنفيذها. هذا هو المكان الذي يأتي فيه إطار عمل وكيل Semantic Kernel.
الأساسيات: وكيل إكمال الدردشة
أبسط نوع وكيل يغلف نموذج إكمال الدردشة مع التعليمات والمكونات الإضافية:
using Microsoft.SemanticKernel.Agents;
#pragma warning disable SKEXP0110
var agent = new ChatCompletionAgent
{
Name = "DevAssistant",
Instructions = """
You are a senior .NET developer assistant. Help users with code
reviews, architecture decisions, and debugging. Always provide
code examples when relevant. Use your available tools to look up
current information when needed.
""",
Kernel = kernel,
Arguments = new KernelArguments(settings)
};
var history = new ChatHistory();
history.AddUserMessage("How should I structure a clean architecture project in .NET 8?");
await foreach (var message in agent.InvokeAsync(history))
{
Console.WriteLine(message.Content);
history.Add(message);
}
التعاون متعدد الوكلاء
تصبح الأمور قوية حقًا عندما يكون لديك وكلاء متعددون يعملون معًا. يدعم Semantic Kernel أنماط الدردشة الجماعية حيث يتعاون الوكلاء ذوو التخصصات المختلفة:
#pragma warning disable SKEXP0110
var codeReviewer = new ChatCompletionAgent
{
Name = "CodeReviewer",
Instructions = """
You review C# code for bugs, performance issues, and best practices.
Be specific about what you find and suggest concrete fixes.
""",
Kernel = kernel
};
var securityAuditor = new ChatCompletionAgent
{
Name = "SecurityAuditor",
Instructions = """
You focus exclusively on security vulnerabilities in code.
Look for injection attacks, authentication issues, data exposure,
and OWASP Top 10 violations.
""",
Kernel = kernel
};
var groupChat = new AgentGroupChat(codeReviewer, securityAuditor)
{
ExecutionSettings = new AgentGroupChatSettings
{
TerminationStrategy = new MaximumIterationTerminationStrategy(4)
}
};
groupChat.AddChatMessage(
new ChatMessageContent(AuthorRole.User, "Review this code: ...")
);
await foreach (var message in groupChat.InvokeAsync())
{
Console.WriteLine($"[{message.AuthorName}]: {message.Content}");
}
يعد هذا النمط مفيدًا بشكل لا يصدق للمهام المعقدة التي تحتاج إلى مراعاة وجهات نظر أو مجالات خبرة مختلفة. يعمل كل وكيل بموجه النظام الخاص به ويمكن أن يكون لديه مجموعة خاصة به من المكونات الإضافية.
مثال من العالم الحقيقي: بناء مساعد توثيق المشروع
دعونا نربط كل شيء معًا بمثال عملي - مساعد الذكاء الاصطناعي الذي يساعد المطورين على فهم قاعدة التعليمات البرمجية من خلال قراءة الملفات والإجابة على الأسئلة.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System.ComponentModel;
// Define our plugins
public class FileSystemPlugin
{
private readonly string _rootPath;
public FileSystemPlugin(string rootPath)
{
_rootPath = rootPath;
}
[KernelFunction("read_file")]
[Description("Reads the contents of a file from the project directory")]
public async Task<string> ReadFile(
[Description("Relative path to the file")] string path)
{
var fullPath = Path.Combine(_rootPath, path);
if (!File.Exists(fullPath))
return $"File not found: {path}";
var content = await File.ReadAllTextAsync(fullPath);
// Truncate very large files
if (content.Length > 8000)
content = content[..8000] + "\n... [truncated]";
return content;
}
[KernelFunction("list_files")]
[Description("Lists files in a directory, optionally filtered by extension")]
public string ListFiles(
[Description("Relative directory path")] string directory,
[Description("File extension filter like '.cs' or '.json'")] string? extension = null)
{
var fullPath = Path.Combine(_rootPath, directory);
if (!Directory.Exists(fullPath))
return $"Directory not found: {directory}";
var files = Directory.GetFiles(fullPath, "*.*", SearchOption.AllDirectories)
.Select(f => Path.GetRelativePath(_rootPath, f))
.Where(f => extension is null || f.EndsWith(extension))
.Take(50);
return string.Join("\n", files);
}
}
public class DocumentationPlugin
{
[KernelFunction("generate_summary")]
[Description("Generates a structured markdown summary for documentation")]
public string GenerateSummaryTemplate(
[Description("Name of the component")] string componentName,
[Description("Brief description")] string description,
[Description("Key responsibilities as comma-separated values")] string responsibilities)
{
var items = responsibilities.Split(',', StringSplitOptions.TrimEntries);
var bullets = string.Join("\n", items.Select(r => $"- {r}"));
return $"""
## {componentName}
{description}
### Responsibilities
{bullets}
---
*Generated documentation — review and expand as needed.*
""";
}
}
// Wire it all up
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
builder.Plugins.AddFromObject(new FileSystemPlugin("./src"));
builder.Plugins.AddFromType<DocumentationPlugin>();
var kernel = builder.Build();
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
history.AddSystemMessage("""
You are a codebase documentation assistant. You help developers understand
projects by reading source files and explaining architecture, patterns,
and design decisions.
When asked about code, use your tools to read the actual files rather
than guessing. Be specific and reference actual code when possible.
Generate documentation artifacts when asked.
""");
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
Console.WriteLine("Documentation Assistant ready. Ask me about your codebase!");
Console.WriteLine("Type 'exit' to quit.\n");
while (true)
{
Console.Write("You: ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input) || input.Equals("exit", StringComparison.OrdinalIgnoreCase))
break;
history.AddUserMessage(input);
var response = await chatService.GetChatMessageContentAsync(
history,
executionSettings: settings,
kernel: kernel
);
Console.WriteLine($"\nAssistant: {response.Content}\n");
history.AddAssistantMessage(response.Content ?? "");
}
يمكن لهذا المساعد:- إدراج الملفات وقراءتها من دليل مشروعك
- أجب عن الأسئلة حول قاعدة التعليمات البرمجية من خلال قراءة ملفات المصدر الفعلية
- إنشاء وثائق بتنسيق تخفيض السعر
- حافظ على سياق المحادثة حتى تعمل أسئلة المتابعة بشكل طبيعي
يقرر الذكاء الاصطناعي تلقائيًا متى يتم الاتصال بـ read_file أو list_files أو generate_summary بناءً على ما تطلبه. اسأله “ماذا تفعل خدمة OrderService؟” وسوف يقرأ الملف ويحلله ويشرحه. اطلب منه “إنشاء وثائق لوحدة المصادقة” وسوف يستكشف الملفات ويفهم البنية وينتج ملخصًا منسقًا.
نصائح للإنتاج
قبل أن تقوم بشحن تطبيق Semantic Kernel الخاص بك، تعلمت بعض الأشياء بالطريقة الصعبة:
استخدم حقن التبعية بشكل صحيح. في تطبيقات ASP.NET Core، قم بتسجيل Kernel والخدمات في حاوية DI الخاصة بك بدلاً من إنشائها في السطر:
builder.Services.AddKernel()
.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: configuration["AzureOpenAI:Endpoint"]!,
apiKey: configuration["AzureOpenAI:ApiKey"]!
)
.Plugins.AddFromType<TimePlugin>()
.AddFromType<OrderPlugin>();
** التعامل مع الأخطاء بأمان. ** يمكن أن تفشل مكالمات LLM، أو تنقضي المهلة، أو ترجع نتائج غير متوقعة. قم بتجميع دعواتك في كتل محاولة الالتقاط وتنفيذ سياسات إعادة المحاولة باستخدام Polly أو ميزات المرونة المضمنة.
مراقبة استخدام الرمز المميز. كل مطالبة، وكل وصف وظيفة، وكل جزء من سجل الدردشة يستهلك الرموز المميزة. استخدم المرشحات لتسجيل الاستخدام وتتبعه:
kernel.FunctionInvocationFilters.Add(new LoggingFilter());
حافظ على دقة أوصاف وظيفتك. تؤدي الأوصاف الغامضة إلى استدعاء وظائف الذكاء الاصطناعي بشكل غير صحيح. اختبر أوصافك عن طريق طرح السؤال التالي: “إذا قرأت الوصف فقط، فهل سأعرف بالضبط متى وكيف أستخدم هذه الوظيفة؟”
الخلاصة
Semantic Kernel هي إحدى تلك المكتبات التي تغير بشكل جذري طريقة تفكيرك في إنشاء التطبيقات. إنه ليس مجرد غلاف لواجهة برمجة التطبيقات - إنه إطار عمل للتنسيق يتيح لك إنشاء إمكانات الذكاء الاصطناعي باستخدام التعليمات البرمجية التقليدية بطريقة قابلة للصيانة والاختبار وجاهزة للإنتاج.
أكثر ما أحبه فيه هو أنه يحترم النظام البيئي .NET. فهو يستخدم الأنماط التي تعرفها بالفعل - حقن التبعية، والسمات، وعدم المزامنة/الانتظار، والواجهات - ويوسعها لتشمل عالم الذكاء الاصطناعي. ليس عليك أن تتعلم نموذجًا جديدًا تمامًا؛ ما عليك سوى إضافة الذكاء الاصطناعي كقدرة أخرى في مجموعة أدواتك.
إذا كنت تقوم بإنشاء تطبيقات .NET ولم تستكشف Semantic Kernel بعد، فهذا هو الوقت المناسب. تتميز مجموعة SDK بأنها مستقرة، والمجتمع نشط، والأنماط التي تتيحها - بدءًا من التنسيق السريع البسيط وحتى التعاون بين الوكلاء المتعددين - أصبحت مهارات أساسية للمطورين المعاصرين.
ابدأ صغيرًا. قم بإنشاء Kernel، وقم بتسجيل مكون إضافي، وشاهد الذكاء الاصطناعي وهو يتصل بالرمز الخاص بك. بمجرد النقر على ذلك، ستبدأ في رؤية فرص لإضافة الذكاء في كل مكان في تطبيقاتك.
تعد الوثائق الرسمية ومستودع GitHub من الموارد الممتازة لمواصلة رحلتك. بناء سعيد!