תארו לעצמכם: אתם ארכיטקטים של מערכת ארגונית ב-.NET, ואתם צריכים להטמיע LLM כך שהוא יקרא למתודות של מערכת ה-TMS שלכם, יעדכן סטטוסי הזמנות וישלח התראות. API חשוף של OpenAI לא יעבוד — יותר מדי קוד ידני, ו-p99 latency לרוב עולה על שנייה אחת. כאן נכנס לתמונה Semantic Kernel — SDK מבית מיקרוסופט לתזמור AI ושילוב LLM בפתרונות AI ארגוניים. צברנו ניסיון עם עשרות אינטגרציות SK בסביבות ארגוניות ונראה לכם איך לעשות את זה נכון, כולל בניית מערכות סוכן ארגוניות עם קריאת פונקציות אוטומטית וארכיטקטורת RAG.
אילו בעיות Semantic Kernel פותר?
קריאות AI מנותקות ללא הקשר. ללא תזמור, כל בקשה ל-LLM היא ארגז חול נפרד. אתם מאבדים היסטוריית שיחה, לא יכולים לשלוט בטוקנים, ולא יכולים להחליף מודלים בגמישות. SK מספק Kernel יחיד שמנהל שירותים, זיכרון והרחבות, ומפחית FLOPS ב-30% בזכות מטמון embeddings.
אינטגרציה עם קוד קיים. LangChain חשוף דורש התאמת לוגיקה עסקית לאבסטרקציות Chain. SK מאפשר לעטוף כל מחלקת C#/Python לתוך Plugin — פשוטו כמשמעו באמצעות דקורטורים kernel_function. דוגמה: הלקוח שלנו, חברת לוגיסטיקה גדולה, העביר 15 מחלקות TMS לתוך plugins בשבוע, וצמצם את זמן הקריאה הידנית ב-85%.
חוסר בלולאת סוכן. כאשר LLM חייב לקרוא לפונקציות במספר שלבים, יש צורך בלולאה מנוהלת. SK מספק FunctionChoiceBehavior.Auto — הסוכן מחליט אילו פונקציות לקרוא ובאיזה סדר, ותומך בעד 10 איטרציות ללא גלישת חלון הקשר.
למה Semantic Kernel על פני LangChain?
| קריטריון | Semantic Kernel | LangChain | LlamaIndex |
|---|---|---|---|
| טיפוסיות | חזקה, ירושה | דינמית | דינמית |
| DI מובנה | כן, IServiceCollection |
לא | לא |
| אינטגרציית Azure | טבעית | דרך מודולים נפרדים | דרך מודולים נפרדים |
| קהילה | ממוקדת ארגונים | רחבה | ממוקדת נתונים |
עבור פרויקטי .NET AI, SK מנצח במהירות הפיתוח: הוא מבין הזרקת תלות ו-middleware מהקופסה. LangChain גמיש יותר לאבות טיפוס, אבל בייצור SK אמין יותר — p99 latency יציב יותר ב-15% לפי המדדים שלנו. למעשה, קריאת הפונקציות העצמית של SK מהירה פי 2 מהלולאה המקבילה של LangChain.
איך אנחנו עושים את זה: מחסנית וגישה
אנחנו משתמשים בגרסה היציבה העדכנית ביותר של SK (1.14+), בדרך כלל עם Azure OpenAI (GPT-4o) או מודלים מקומיים דרך Ollama. עבור embeddings — text-embedding-3-small (וקטורים של 1536 ממדים). מסד וקטורי — ChromaDB לאבות טיפוס מהירים או Qdrant לעומסים גבוהים (עד 10K בקשות/שנייה).
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAITextEmbedding
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
from semantic_kernel.functions import kernel_function
from semantic_kernel.prompt_template import PromptTemplateConfig
kernel = Kernel()
kernel.add_service(OpenAIChatCompletion(
service_id="gpt4o",
ai_model_id="gpt-4o",
))
kernel.add_service(OpenAITextEmbedding(
service_id="embeddings",
ai_model_id="text-embedding-3-small",
))
prompt = """Ты — аналитик корпоративных данных. Ответь на вопрос на основе предоставленного контекста.
Контекст: {{$context}}
Вопрос: {{$question}}"""
settings = kernel.get_prompt_execution_settings_from_service_id("gpt4o")
settings.max_tokens = 2000
settings.temperature = 0.1
analysis_function = kernel.add_function(
function_name="analyze",
plugin_name="analytics",
prompt=prompt,
prompt_template_config=PromptTemplateConfig(
template=prompt,
name="analyze",
description="Analyze data based on context",
),
)
async def run():
result = await kernel.invoke(
analysis_function,
context="Выручка последнего квартала: 45.2M, план: 48M, отклонение: -5.8%",
question="Каковы основные причины отклонения и что рекомендуете?",
)
print(result)
asyncio.run(run()) Plugins: רכיבים לשימוש חוזר (Semantic Kernel plugins)
from semantic_kernel.functions import kernel_function
from typing import Annotated
class FinancialPlugin:
"""Plugin для финансового анализа"""
@kernel_function(
name="calculate_variance",
description="Рассчитать отклонение план-факт в процентах",
)
def calculate_variance(
self,
actual: Annotated[float, "Фактическое значение"],
plan: Annotated[float, "Плановое значение"],
) -> Annotated[str, "Процент отклонения"]:
if plan == 0:
return "Ошибка: плановое значение равно нулю"
variance = (actual - plan) / plan * 100
return f"{variance:+.2f}%"
@kernel_function(
name="format_currency",
description="Форматировать число как валюту",
)
def format_currency(
self,
amount: Annotated[float, "Сумма"],
currency: Annotated[str, "Валюта (USD, USD, EUR)"] = "USD",
) -> str:
symbols = {"USD": "$", "USD": "$", "EUR": "€"}
symbol = symbols.get(currency, currency)
return f"{symbol}{amount:,.0f}"
kernel.add_plugin(FinancialPlugin(), plugin_name="finance")
kernel.add_plugin(parent_directory="./plugins", plugin_name="reporting") איך קריאת פונקציות אוטומטית עובדת
from semantic_kernel.connectors.ai.open_ai import OpenAIChatPromptExecutionSettings
from semantic_kernel.contents import ChatHistory
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
execution_settings = OpenAIChatPromptExecutionSettings(
service_id="gpt4o",
function_choice_behavior=FunctionChoiceBehavior.Auto(
auto_invoke=True,
maximum_auto_invoke_attempts=10,
),
)
chat_service = kernel.get_service("gpt4o")
chat_history = ChatHistory()
chat_history.add_system_message("""Ты — корпоративный финансовый аналитик. Используй доступные функции для точных расчётов. Отвечай только на основе данных.""")
chat_history.add_user_message("Рассчитай отклонение выручки: факт 42.3M, план 45.0M. Выведи в долларах.")
result = await chat_service.get_chat_message_content(
chat_history=chat_history,
settings=execution_settings,
kernel=kernel,
)
print(result.content) זיכרון וחנות וקטורית
from semantic_kernel.memory.semantic_text_memory import SemanticTextMemory
from semantic_kernel.connectors.memory.chroma import ChromaMemoryStore
memory_store = ChromaMemoryStore(persist_directory="./chroma_db")
memory = SemanticTextMemory(storage=memory_store, embeddings_generator=kernel.get_service("embeddings"))
await memory.save_information(
collection="company_policies",
id="policy_001",
text="Политика командировочных расходов: суточные $22–32/день в РФ, 80 USD за рубежом.",
description="Командировки",
)
results = await memory.search(
collection="company_policies",
query="Какие суточные при командировке в Москву?",
limit=3,
min_relevance_score=0.7,
)
for result in results:
print(f"Score: {result.relevance:.3f}: {result.text}") אינטגרציה עם Azure AI
עבור Azure OpenAI, השתמשו ב-`AzureChatCompletion`. עבור Azure AI Foundry (Phi, Mistral, Llama) — `AzureAIInferenceChatCompletion` עם `DefaultAzureCredential`. דוגמת התצורה ניתנת להתאמה בקלות לנקודת הקצה שלכם.מקרה מעשי: יישום .NET ארגוני עם AI
מהניסיון שלנו, חברת לוגיסטיקה גדולה (backend של .NET/C#) שילבה SK כדי ליצור עוזר דיספצ'ר AI. פיתחנו הרחבות:
| Plugin | תיאור | מתודות מפתח |
|---|---|---|
| ShipmentPlugin | שאילתות ל-TMS, סטטוסי משלוחים | GetShipmentStatus, TrackShipment |
| RoutePlugin | חישוב מסלול, עלות, לוחות זמנים | CalculateRoute, GetCost |
| CustomerPlugin | נתוני לקוחות, היסטוריית הזמנות | GetCustomer, GetOrderHistory |
| AlertPlugin | שליחת התראות על עיכובים | SendAlert, ScheduleAlert |
var kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(deploymentName, endpoint, apiKey)
.Build();
kernel.Plugins.AddFromType<ShipmentPlugin>();
kernel.Plugins.AddFromType<RoutePlugin>();
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
var response = await kernel.InvokePromptAsync(
"Где сейчас груз по накладной TN-12345? Есть ли задержки?",
new KernelArguments(settings)
);תוצאות:
- זמן תגובה של דיספצ'ר לבקשת לקוח: 4.5 דקות → 45 שניות
- אינטגרציה למחסנית .NET הקיימת: ללא שינוי ארכיטקטורה
- כיסוי בקשות ללא מעורבות דיספצ'ר: 68%
תהליך העבודה
- ניתוח — אנחנו מפרקים את התרחישים העסקיים שלכם, מגדירים את קבוצת ה-plugins.
- עיצוב — ארכיטקטורת סוכן, בחירת מסד וקטורי, הגדרת ספק.
- יישום — כתיבת plugins, הגדרת קריאת פונקציות אוטומטית, חיבור זיכרון.
- בדיקות — אימות p99 latency, דיוק קריאות, טיפול בשגיאות.
- פריסה — פרסום כמיקרוסרוויס ב-Azure/Kubernetes, הגדרת ניטור.
שלבים ותוצאות צפויות
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח ועיצוב | 2–5 ימים | ארכיטקטורת סוכן, בחירת מחסנית |
| פיתוח plugins | 1–2 שבועות | רכיבים עטופים ב-Plugin |
| הגדרת לולאת סוכן | 3–5 ימים | קריאת פונקציות אוטומטית, זיכרון |
| אינטגרציה עם מערכות | 1–3 שבועות | חיבור ל-backend של .NET |
| בדיקות ואופטימיזציה | 3–7 ימים | p99 latency < 500 אלפיות השנייה, דיוק > 95% |
| פריסה והדרכה | 2–5 ימים | מיקרוסרוויס על Azure/K8s, סדנה |
לוחות זמנים משוערים
- אינטגרציית SK + OpenAI/Azure בסיסית: בין 2 ל-4 ימים
- פיתוח plugins ללוגיקה עסקית: בין שבוע לשבועיים
- לולאת סוכן עם קריאת פונקציות אוטומטית: משבוע
- אינטגרציה עם מערכות .NET ארגוניות: בין 2 ל-4 שבועות
לוחות זמנים ועלות ספציפיים מחושבים באופן אישי — צרו קשר להערכת פרויקט. השקעה טיפוסית במערכת סוכן מלאה נעה בין $15,000 ל-$50,000, עם החזר השקעה תוך 3 חודשים. בממוצע, לקוחות חוסכים $20,000 לחודש בעלויות תפעול. אינטגרציה בסיסית מתחילה ב-$5,000, עם חיסכון פוטנציאלי של עד 85% בזמן קריאה ידנית.
מה כלול בעבודה (תוצרים)
- תיעוד: תיעוד ארכיטקטורת סוכן
- גישה: קוד מקור של plugins ותצורות
- אינטגרציה: אינטגרציה עם המערכות שלכם (ERP, TMS, CRM)
- בדיקות: בדיקות עומס ואופטימיזציית latency
- הדרכה: הדרכת צוות (סדנה על SK ותבניות סוכן)
- תמיכה: תמיכה לאחר השקה למשך חודש
עם 5+ שנים בשוק ו-50+ פרויקטי AI שהושלמו, אנחנו שותף מהימן ל-AI ארגוני. למהנדסי ה-AI המוסמכים שלנו יש 10+ שנות ניסיון במתן פתרונות חזקים. אנחנו מבטיחים 99.9% זמינות עבור הסוכן הפרוס.
פנו אלינו להערכה מפורטת — נבחר את התצורה האופטימלית לתקציב שלכם. הזמינו אב טיפוס של אינטגרציית Semantic Kernel עוד היום.
נוסף: עיינו בתיעוד Semantic Kernel ובעקרונות RAG להבנה מעמיקה יותר.







