كيفية استخدام Semantic Kernel: دليل عملي مع أنماط وموجهات ومكونات إضافية
هل حاولت يومًا ربط نموذج لغوي كبير (LLM) بتطبيقك وانتهى بك الأمر بفوضى هشة من الموجهات ووظائف المساعدة والحالة؟ Semantic Kernel (SK) موجود لإصلاح ذلك بالضبط. إنه إطار عمل تنسيق خفيف الوزن ومفتوح المصدر من Microsoft لبناء تطبيقات تعتمد على الذكاء الاصطناعي وتمزج بين اللغة الطبيعية والأدوات والذاكرة - دون تحويل قاعدة التعليمات البرمجية الخاصة بك إلى وعاء من معكرونة الموجهات.
في هذا الدليل، سنقوم بجولة عملية وموجهة نحو الحلول حول كيفية استخدام Semantic Kernel من الصفر إلى أنماط الإنتاج. ستتعلم كيفية هيكلة الموجهات، وتوصيل الأدوات، وإضافة الذاكرة، واستدعاء نماذج متعددة، ونشر الوكلاء الذين يتصرفون باستمرار. سنحافظ على الأمثلة واقعية ونعرض لك ما يهم.
ما هو Semantic Kernel - ولماذا نستخدمه؟
Semantic Kernel هو SDK يساعدك على:
- تكوين الموجهات والوظائف ("المهارات"/المكونات الإضافية) في مسارات.
- استدعاء نماذج متعددة (OpenAI، Azure OpenAI، النماذج المحلية) بالتبادل.
- إضافة ذاكرة للسياق والاسترجاع طويل الأجل عبر التضمينات.
- تخطيط وتنسيق المهام متعددة الخطوات بحالة موثوقة.
- دمج الأدوات (واجهات برمجة التطبيقات، قواعد البيانات، إدخال/إخراج الملفات) بأمان وبشكل حتمي.
فكر في SK على أنه وحدة التحكم التي تنسق النماذج اللغوية الكبيرة (LLMs) ومنطق تطبيقك وبيانات المستخدم. بدلاً من الترميز الثابت للموجهات الطويلة واستدعاءات الأدوات المخصصة، يمكنك تحديد وظائف دلالية قابلة لإعادة الاستخدام ووظائف أصلية بمدخلات/مخرجات واضحة.
حالات الاستخدام الشائعة:
- طيارين مساعدين لدعم العملاء مع توليد معزز بالاسترجاع (RAG)
- وكلاء سير العمل (تلخيص ← تصنيف ← اتخاذ إجراء)
- أسئلة وأجوبة حول المستندات مع الذاكرة والاستشهادات
- محتوى إبداعي ومسارات توليد التعليمات البرمجية
بداية سريعة: أول تطبيق Semantic Kernel لك
فيما يلي تدفق بسيط لإظهار كيفية استخدام Semantic Kernel مع نموذج دردشة وموجه بسيط. سنستخدم C# للوضوح؛ يمكنك فعل الشيء نفسه في Python أو Java.
1) تثبيت الحزم
# .NET
dotnet add package Microsoft.SemanticKernel
# اختياري: تختلف الموصلات والمخططون حسب الإصدار
2) تكوين النواة والنموذج
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder;
// اختر مزود الخدمة الخاص بك: OpenAI أو Azure OpenAI
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o-mini", // أو النموذج المفضل لديك
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")
);
var kernel = builder.Build;
3) تحديد وظيفة دلالية (موجه)
using Microsoft.SemanticKernel.SemanticFunctions;
var prompt = @"أنت شارح موجز.
اشرح مفهوم '{topic}' في 3 نقاط تعداد نقطي للمبتدئين.";
var explainFunc = kernel.CreateFunctionFromPrompt(prompt);
var result = await explainFunc.InvokeAsync(kernel, new { ["topic"] = "vector embeddings" });
Console.WriteLine(result);
هذا هو الجوهر: نواة، ونموذج، وموجه تم تحويله إلى وظيفة قابلة لإعادة الاستخدام مع مدخلات.
الوظائف الدلالية مقابل الوظائف الأصلية
- الوظائف الدلالية: مدعومة بالموجه. يمكنك إنشاؤها من القوالب، وتمرير المتغيرات، والحصول على نصوص أو مخرجات منظمة.
- الوظائف الأصلية: وظائف التعليمات البرمجية العادية التي يعرضها SK للنموذج اللغوي الكبير (LLM) لاستخدام الأدوات.
مثال على وظيفة أصلية تجلب الطقس من واجهة برمجة التطبيقات الخاصة بك وتعرضها للنموذج:
public class WeatherPlugin
{
[KernelFunction, Description("Get weather for a city")]
public async Task<string> GetWeatherAsync(
[Description("City name")] string city)
{
// Call your weather API here
var temp = 22; // placeholder
return $"Weather in {city}: {temp}°C and clear";
}
}
// Register plugin
var weather = new WeatherPlugin;
kernel.Plugins.AddFromObject(weather, pluginName: "weather");
الآن يمكن لموجهاتك استدعاء weather.GetWeatherAsync كأداة، مما يسمح للنموذج بتأسيس الاستجابات في بيانات حقيقية.
أنماط الموجهات التي تعمل بالفعل
عند تعلم كيفية استخدام Semantic Kernel، فإن المكاسب الأسرع تأتي من أنماط الموجهات المنضبطة:
- النظام أولاً: استخدم رسالة نظام قوية لقفل النبرة والشخصية والسلامة وتنسيق الإخراج.
- فتحات المتغيرات: قم بتسمية العناصر النائبة بوضوح (على سبيل المثال،
{topic}، {audience}) وتحقق من صحة الإدخال.
- عقود الإخراج: اطلب تنسيقات منظمة مثل JSON؛ قم بتضمين مخطط في الموجه.
- عدد قليل من اللقطات: قدم أمثلة موجزة للأسلوب والتنسيق، وليس تضخم المحتوى.
- الحواجز الواقية: قم بتضمين القيود ("إذا كانت البيانات مفقودة، اطرح سؤالاً توضيحيًا أولاً").
مثال على موجه منظم داخل SK:
var prompt = @"
أنت محرك تصنيف.
المهمة: قم بتصنيف `message` إلى واحدة من [Billing, Tech Support, Sales].
إرجاع JSON صارم: { \"label\": string, \"confidence\": number }
message: {message}
";
var classify = kernel.CreateFunctionFromPrompt(prompt);
var output = await classify.InvokeAsync(kernel, new { ["message"] = "I can’t log into my account." });
Console.WriteLine(output); // {"label":"Tech Support","confidence":0.89}
إضافة الذاكرة: التضمينات، وRAG، ونوافذ السياق
النماذج اللغوية الكبيرة (LLMs) تنسى. الذاكرة تجعلها مفيدة.
- سياق قصير المدى: تلقائي عبر سجل المحادثات.
- ذاكرة طويلة المدى: قم بتخزين تضمينات ملاحظات المستخدم أو المستندات أو الأحداث واسترجع الأجزاء ذات الصلة للسياق.
- RAG: قبل استدعاء وظيفة التوليد، استعلم عن متجر المتجهات الخاص بك وقم بحقن النتائج في الموجه.
مثال: إضافة ذاكرة نصية مع تضمينات واسترجاع السياق.
using Microsoft.SemanticKernel.Memory;
var memory = new MemoryBuilder
.WithMemoryStore(new VolatileMemoryStore) // استبدل بـ vector DB (Qdrant, Pinecone, Azure AI Search)
.WithTextEmbeddingGeneration(
new OpenAITextEmbeddingGeneration("text-embedding-3-small", Environment.GetEnvironmentVariable("OPENAI_API_KEY")))
.Build;
await memory.SaveInformationAsync(
collection: "policies", id: "refund-policy",
text: "Customers can request a refund within 30 days of purchase with proof of receipt."
);
// Later: retrieve and stuff into prompt
var results = memory.SearchAsync("refund window", collection: "policies", limit: 3, minRelevanceScore: 0.7);
await foreach (var item in results)
{
Console.WriteLine($"Relevant: {item.Metadata.Text}");
}
ثم قم بتغذية أفضل التطابقات في وظيفتك الدلالية كمتغيرات سياقية. نصيحة: حافظ على الأجزاء صغيرة (200-400 رمز) وإزالة التكرارات.
استخدام الأدوات والتخطيط: مهام سير العمل متعددة الخطوات
يدعم Semantic Kernel المخططين الذين يمكنهم تقسيم هدف المستخدم إلى خطوات واختيار الوظائف التي سيتم استدعاؤها. هذا مثالي عندما يكون لديك صندوق أدوات من الوظائف الأصلية والدلالية.
نمط:
- اجمع الهدف والقيود من المستخدم.
- قم بصياغة خطة (تسلسل استدعاءات الوظائف مع الوسائط).
- نفذ خطوة بخطوة، وتحقق من المخرجات، وتعافى من الأخطاء.
مثال على التعليمات البرمجية الزائفة:
// 1) Define plugins (semantic + native) as before
// 2) Use a planner (API surface may vary by version)
var goal = "Summarize the attached policy, classify risk, and email a report";
// Assume we have plugins: files, summarize, classify, email
// Planner will assemble a plan: files.Load → summarize.Run → classify.Run → email.Send
// Execute plan sequentially, validate JSON outputs between steps
أفضل الممارسات:
- اجعل الخطوات عديمة التأثير وقابلة للاختبار.
- قم بتعيين مخططات إخراج صريحة بين الخطوات.
- استخدم عمليات إعادة المحاولة/التراجع على الأدوات المتصلة بالشبكة.
- سجل المدخلات/المخرجات للمراقبة (ولكن قم بتنظيف معلومات التعريف الشخصية (PII)).
إستراتيجية النماذج المتعددة: اختر النموذج المناسب للمهمة
باستخدام Semantic Kernel، يمكنك توجيه المهام إلى نماذج مختلفة:
- مسودات سريعة ← نماذج صغيرة ورخيصة
- خطوات ثقيلة التفكير ← نماذج أكبر
- التضمينات ← نموذج تضمين متخصص
- التعليمات البرمجية ← نماذج محسنة للتعليمات البرمجية
في الممارسة العملية:
var kernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey)
.Build;
var fastKernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey) // speed-optimized
.Build;
// Route simpler prompts to fastKernel; complex tasks to kernel
أو قم بتكوين خدمات متعددة في نفس النواة وحدد لكل وظيفة.
من النموذج الأولي إلى الإنتاج: الحواجز الواقية والاختبار
بينما تتعلم كيفية استخدام Semantic Kernel في تطبيقات حقيقية، فإن الموثوقية مهمة:
- مخرجات أولية للمخطط: استخدم مخططات JSON وبوابات
TryParse.
- الحتمية عند الحاجة: اضبط درجة الحرارة منخفضة وقيد المخرجات.
- مرشحات السلامة: أضف مرشحات المحتوى وموجهات الفريق الأحمر.
- التخزين المؤقت: قم بتخزين نتائج RAG والتوليدات المستقرة مؤقتًا.
- المراقبة: سجل قوالب الموجهات والمتغيرات ووقت الاستجابة واستخدام الرمز المميز.
- اختبارات الوحدة: موجهات اختبار ذهبية مع مقارنات اللقطات.
مثال: التحقق من صحة إخراج JSON.
record Classification(string label, double confidence);
bool TryParseClassification(string text, out Classification cls)
{
try { cls = System.Text.Json.JsonSerializer.Deserialize<Classification>(text)!; return true; }
catch { cls = default!; return false; }
}
أنماط واقعية يمكنك إعادة استخدامها
- روبوت محادثة RAG:
استرجاع (السياق) ← إجابة (السؤال، السياق) مع الاستشهادات.
- مهام سير عمل الموافقة: تصنيف ← إنشاء مسودة ← مراجعة بشرية ← إرسال.
- عمليات المحتوى: تحديد الخطوط العريضة ← مسودة ← التحقق من الحقائق ← تعديل النبرة ← نشر.
- وكيل مع أدوات: calendar.lookup، docs.search، email.send؛ مع التخطيط والذاكرة.
نصيحة: قم بتغليف كل خطوة كوظيفة (دلالية أو أصلية) وقم بتكوينها في مسارات.
مثال: أسئلة وأجوبة حول المستندات مع الاستشهادات
دعنا نوصل مسار أسئلة وأجوبة بسيط يستشهد بالمصادر باستخدام RAG.
// 1) Ingest docs into memory
await memory.SaveInformationAsync("handbook", "vacation-policy",
"Employees accrue 1.5 days of PTO per month and can carry over 5 days.");
// 2) Retrieve context for a question
var top = memory.SearchAsync("carry over PTO", "handbook", limit: 3, minRelevanceScore: 0.75);
var contexts = new List<string>;
await foreach (var r in top) contexts.Add(r.Metadata.Text);
// 3) Ask with context and request citations
var qaPrompt = @"
You answer strictly from the provided context. If missing, say you don't know.
Include inline citations like [source i] using the index of context items starting at 1.
Context:
1) {{ctx1}}
2) {{ctx2}}
Question: {{q}}
";
var qa = kernel.CreateFunctionFromPrompt(qaPrompt);
var variables = new KernelArguments
{
["ctx1"] = contexts.ElementAtOrDefault(0) ?? "",
["ctx2"] = contexts.ElementAtOrDefault(1) ?? "",
["q"] = "How many PTO days can I carry over?"
};
var answer = await qa.InvokeAsync(kernel, variables);
Console.WriteLine(answer);
المزالق الشائعة (وكيفية تجنبها)
- موجه عملاق واحد: قسّم إلى وظائف؛ مرر فقط السياق الذي تحتاجه.
- لا توجد عقود إخراج: حدد دائمًا مخططات للخطوات التي يمكن قراءتها آليًا.
- RAG بدون نظافة: قسّم جيدًا، وأزل التكرارات، ورتب حسب الأهمية والحداثة.
- انتشار الأدوات: حافظ على واجهات المكونات الإضافية صغيرة وموثقة.
- لا يوجد إنسان في الحلقة: أضف الموافقات للإجراءات عالية المخاطر.
كيفية استخدام Semantic Kernel مع الواجهات الأمامية
- تطبيقات الويب: استضف تنسيق SK الخاص بك في طبقة واجهة برمجة التطبيقات؛ قم ببث الرموز المميزة إلى واجهة المستخدم.
- واجهات مستخدم الدردشة: حافظ على حالة المحادثة من جانب الخادم؛ تقليم وتلخيص.
- المصادقة: مكالمات آمنة لانتحال الهوية - لا تدع النموذج أبدًا يصدر رموزًا مميزة. قم ببوابة استدعاءات الأدوات من خلال الواجهة الخلفية الخاصة بك.
قائمة تحقق النشر
- متغيرات البيئة للمفاتيح ونقاط النهاية
- تحديد المعدل وإعادة المحاولة لمكالمات النموذج/الأداة
- التحكم في مصدر قالب الموجه
- نسخ احتياطية لمتجر المتجهات ومعالجة معلومات التعريف الشخصية (PII)
- لوحات معلومات المراقبة (وقت الاستجابة والتكلفة والأخطاء)
- اختبار A/B للموجهات والتوجيه
استكشاف الأخطاء وإصلاحها على غرار الأسئلة الشائعة
- "النموذج يهذي حتى مع RAG." شدد التعليمات: "أجب فقط من السياق" وقم بتضمين مثال رفض. قم بزيادة خصوصية الاسترجاع وتقليل درجة الحرارة.
- "JSON يستمر في التعطل." أضف مثالًا صغيرًا لـ JSON صالح وامنع التعليق. تحقق من الصحة بعد المكالمة وأعد الصياغة عند الفشل.
- "وقت الاستجابة مرتفع." استرجع عددًا أقل من الأجزاء الأكثر صلة؛ قم بتبديل الخطوات البسيطة إلى نماذج أصغر؛ قم بتوازي الخطوات المستقلة.
- "التكاليف آخذة في الارتفاع." قم بالتخزين المؤقت وضغط السياق وتوجيه المهام السهلة إلى نماذج أرخص.
جدير بالذكر: بناء أسرع مع Sider.AI
إذا كنت تقوم بإنشاء نماذج أولية للموجهات، أو اختبار تدفقات الأدوات، أو مقارنة الاستجابات عبر النماذج، فيمكن لرفيق مثل Sider.ai تسريع التكرار. يمكنك صياغة الموجهات وتشغيل مقارنات A/B والتقاط مقتطفات قابلة لإعادة الاستخدام قبل نقلها إلى قوالب Semantic Kernel - رائعة لشحذ التعليمات ومخططات الإخراج. الخطوات التالية: حول هذا إلى وكيل عامل
- ابدأ بمهمة واضحة واحدة (على سبيل المثال، تصنيف رسائل البريد الإلكتروني للدعم).
- حدد وظائف دلالية/أصلية بمدخلات/مخرجات صارمة.
- أضف الذاكرة فقط حيث تحسن الإجابات بشكل ملحوظ.
- قم بقياس كل شيء؛ اختبر بعينات من العالم الحقيقي.
- كرر الموجهات باستخدام بيئة الاختبار المعزولة، ثم قم بتدوينها في SK.
النقاط الرئيسية:
- يساعدك Semantic Kernel على تكوين الموجهات والأدوات والذاكرة في مهام سير عمل موثوقة.
- استخدم مخططات الإخراج والمخططين والتوجيه متعدد النماذج لتحقيق المتانة والتحكم في التكاليف.
- RAG بالإضافة إلى الحواجز الواقية يتفوق على الموجهات العملاقة في كل مرة.
بمجرد أن تتقن كيفية استخدام Semantic Kernel مع هذه الأنماط، ستقوم بشحن ميزات الذكاء الاصطناعي التي ليست مجرد عروض توضيحية مثيرة للإعجاب - ولكنها أنظمة يمكن الاعتماد عليها.
الأسئلة الشائعة
س1: ما هو Semantic Kernel المستخدم في تطبيقات الذكاء الاصطناعي؟
Semantic Kernel هو SDK للتنسيق لبناء مهام سير عمل الذكاء الاصطناعي التي تجمع بين موجهات LLM والأدوات (الوظائف الأصلية) والذاكرة. فهو يساعدك على هيكلة المهام وإضافة RAG واستدعاء نماذج متعددة بشكل موثوق.
س2: كيف أستخدم Semantic Kernel لـ RAG مع مستنداتي؟
قم بإدخال مستنداتك في متجر متجه عبر واجهات برمجة تطبيقات الذاكرة الخاصة بـ SK، ثم استرجع الأجزاء الأكثر صلة لكل استعلام وقم بحقنها في الموجه الخاص بك. هذا يحسن الدقة ويقلل من الهلوسة.
س3: هل يمكن لـ Semantic Kernel استدعاء واجهات برمجة تطبيقات وخدمات خارجية؟
نعم. قم بتغليف واجهات برمجة التطبيقات كوظائف أصلية في مكون إضافي وقم بتسجيلها في النواة حتى يتمكن النموذج من استخدامها كأدوات. حافظ على الواجهات صغيرة وفرض التحقق من صحة الإدخال/الإخراج.
س4: ما هي النماذج التي تعمل مع Semantic Kernel؟
يدعم Semantic Kernel OpenAI وAzure OpenAI والموصلات الأخرى. يمكنك توجيه المهام إلى نماذج مختلفة - على سبيل المثال، نماذج أصغر للمسودات ونماذج أكبر للخطوات كثيفة التفكير.
س5: كيف أجعل مخرجات Semantic Kernel متسقة (على سبيل المثال، JSON)؟
استخدم موجهات منظمة تطلب JSON صارمًا وقم بتضمين مثالًا أو مخططًا بسيطًا. اضبط درجة حرارة منخفضة، وتحقق من صحة المخرجات بعد المكالمة، وأعد المحاولة أو أصلح عند فشل التحليل.