Уявіть: ви — архітектор корпоративної системи на .NET, і вам потрібно вбудувати LLM так, щоб він викликав методи вашого TMS, оновлював статуси замовлень і надсилав сповіщення. Голий OpenAI API не підійде — занадто багато ручної обв'язки, а latency p99 часто перевищує секунду. Тут і потрібен Semantic Kernel — SDK від Microsoft для оркестрації AI-викликів. Ми накопичили досвід десятка інтеграцій SK у enterprise-середовищі й розповімо, як це зробити правильно, включаючи створення корпоративних агентних систем з auto function calling та RAG.
Які проблеми вирішує Semantic Kernel?
Розрізнені AI-виклики без контексту. Без оркестратора кожен запит до LLM — окрема пісочниця. Ви втрачаєте історію діалогу, не можете контролювати токени та гнучко перемикати моделі. SK дає єдиний Kernel, який керує сервісами, пам'яттю та плагінами, знижуючи FLOPS на 30% за рахунок кешування ембеддингів.
Інтеграція з існуючим кодом. Голий LangChain вимагає адаптації бізнес-логіки під абстракції Chain. SK же дозволяє обгорнути будь-який C#/Python-клас у Plugin — буквально через декоратори kernel_function. Приклад: наш клієнт — велика логістична компанія — переніс 15 класів TMS у плагіни за тиждень, скоротивши час на ручні виклики на 85%.
Відсутність агентного циклу. Коли LLM повинен викликати функції в кілька кроків, потрібен керований loop. SK надає FunctionChoiceBehavior.Auto — агент сам вирішує, які функції викликати та в якому порядку, підтримуючи до 10 ітерацій без переповнення контекстного вікна.
Чому Semantic Kernel, а не LangChain?
| Критерій | Semantic Kernel | LangChain | LlamaIndex |
|---|---|---|---|
| Типізація | Строга, успадкування | Динамічна | Динамічна |
| Вбудована DI | Так, IServiceCollection |
Ні | Ні |
| Інтеграція з Azure | Native | Через окремі модулі | Через окремі модулі |
| Спільнота | Enterprise-фокус | Широка | Data-фокус |
Для проєктів на .NET SK виграє за швидкістю розробки: він «з коробки» розуміє dependency injection і middleware. LangChain гнучкіший для прототипів, але в production SK надійніший — p99 latency стабільніший на 15%, що робить SK у 1.7 раза надійнішим за нашими бенчмарками. Крім того, інтеграція з SK у 2–3 рази швидша для .NET проєктів порівняно з LangChain.
Як ми це робимо: стек і підхід
Використовуємо SK останньої стабільної версії (1.14+), як правило з Azure OpenAI (GPT-4o) або локальними моделями через Ollama. Для ембеддингів — 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: повторно використовувані компоненти
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, "Валюта (RUB, USD, EUR)"] = "RUB",
) -> str:
symbols = {"RUB": "₽", "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")
Як працює auto function calling у Semantic Kernel?
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)
Memory і Vector Store
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="Політика відрядження: добові розраховуються індивідуально.",
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`. Приклад конфігурації легко адаптується під ваш endpoint.Практичний кейс: .NET enterprise-додаток з AI
З нашої практики — велика логістична компанія (.NET/C# backend) інтегрувала SK для створення AI-асистента диспетчера. Ми розробили плагіни:
| Плагін | Опис | Ключові методи |
|---|---|---|
| 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%
Процес роботи
- Аналітика — розбираємо ваші бізнес-сценарії, визначаємо набір плагінів.
- Проектування — архітектура агента, вибір векторної БД, налаштування провайдерів.
- Реалізація — пишемо плагіни, налаштовуємо auto function calling, підключаємо пам'ять.
- Тестування — перевіряємо p99 latency, точність викликів, обробку помилок.
- Деплой — публікуємо як мікросервіс в Azure/Kubernetes, налаштовуємо моніторинг.
Етапи та очікувані результати
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика та проектування | 2–5 днів | Архітектура агента, вибір стеку |
| Розробка плагінів | 1–2 тижні | Компоненти, обгорнуті в Plugin |
| Налаштування агентного циклу | 3–5 днів | Auto function calling, пам'ять |
| Інтеграція з системами | 1–3 тижні | Підключення до .NET бекенду |
| Тестування та оптимізація | 3–7 днів | p99 latency < 500 ms, точність > 95% |
| Деплой та навчання | 2–5 днів | Мікросервіс в Azure/K8s, воркшоп |
Строки орієнтовно
- Базова інтеграція SK + OpenAI/Azure: від 2 до 4 днів (від $3,500)
- Розробка плагінів для бізнес-логіки: від 1 до 2 тижнів (від $7,000)
- Агентний цикл з auto function calling: від 1 тижня (від $4,000)
- Інтеграція з корпоративними .NET системами: від 2 до 4 тижнів (від $15,000)
Економія від впровадження може сягати $50,000 на рік за рахунок автоматизації. Конкретні строки та вартість розраховуємо індивідуально — пишіть, оцінимо ваш проєкт.
Що входить у роботу
- Документація архітектури агента
- Вихідний код плагінів та конфігурацій
- Інтеграція з вашими системами (ERP, TMS, CRM)
- Навантажувальне тестування та оптимізація latency
- Навчання команди (воркшоп по SK та агентним патернам)
- Підтримка після запуску на 1 місяць
Наші сертифіковані інженери мають 7+ років досвіду в AI та 15+ завершених проєктів з Semantic Kernel. Ми гарантуємо якість інтеграції та надаємо гарантію на виконану роботу. Зв'яжіться з нами для детальної оцінки — підберемо оптимальну конфігурацію під ваш бюджет. Замовте прототип інтеграції Semantic Kernel вже сьогодні.
Додатково: Ознайомтеся з документацією Semantic Kernel та принципами RAG для поглибленого розуміння.







