Інтеграція Semantic Kernel (Microsoft) для AI-оркестрації

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Інтеграція Semantic Kernel (Microsoft) для AI-оркестрації
Середній
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Інтеграція Semantic Kernel для AI-оркестрації

Semantic Kernel (SK) — це SDK Microsoft для інтеграції LLM в .NET, Python та Java додатків. Орієнтований на розробників enterprise, яким потрібна сувора типізація, dependency injection, інтеграція з Azure AI та корпоративними системами. На відміну від LangChain та LlamaIndex, SK надає SDK-досвід, близький до традиційної enterprise-розробки.

Базова структура Semantic Kernel

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()

# Додавання AI-сервісів
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="Виручка Q1 2025: 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")

# Плагін з директорії з YAML/txt промптами
kernel.add_plugin(parent_directory="./plugins", plugin_name="reporting")

Auto Function Calling: агентний цикл

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)
# Агент автоматично викличе calculate_variance та format_currency

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="Політика командирування: добові 2500 руб/день в РФ, 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

from semantic_kernel.connectors.ai.azure_ai_inference import AzureAIInferenceChatCompletion
from azure.ai.inference.aio import ChatCompletionsClient
from azure.identity.aio import DefaultAzureCredential

# Azure OpenAI
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
kernel.add_service(AzureChatCompletion(
    service_id="azure-gpt4o",
    deployment_name="gpt-4o",
    endpoint="https://your-endpoint.openai.azure.com",
    api_key="...",
))

# Azure AI Foundry (Phi, Mistral, Llama через Azure)
client = ChatCompletionsClient(
    endpoint="https://your-model.inference.ai.azure.com",
    credential=DefaultAzureCredential(),
)
kernel.add_service(AzureAIInferenceChatCompletion(
    service_id="phi-4",
    ai_model_id="phi-4",
    client=client,
))

Практичний кейс: .NET enterprise-додаток з AI

Контекст: велика логістична компанія (.NET/C# backend) інтегрувала SK для створення AI-помічника диспетчера.

Плагіни:

  • ShipmentPlugin — запити до TMS (транспортна система)
  • RoutePlugin — розрахунок маршрутів, вартості, строків
  • CustomerPlugin — дані клієнтів, історія замовлень
  • AlertPlugin — відправка сповіщень про затримки
// C# версія
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%

Графік

  • Базова інтеграція SK + OpenAI/Azure: 2–4 дні
  • Розробка плагінів для бізнес-логіки: 1–2 тижні
  • Агентний цикл з автоматичним викликом функцій: 1 тиждень
  • Інтеграція з корпоративними .NET системами: 2–4 тижні

Semantic Kernel (SK) — SDK Microsoft для інтеграції LLM у .NET, Python та Java-додатки. Орієнтований на enterprise-розробників, яким потрібна строга типізація, dependency injection, інтеграція з Azure AI та корпоративними системами. На відміну від LangChain та LlamaIndex, SK надає SDK-досвід, близький до традиційної enterprise-розробки.

Базова структура Semantic Kernel

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()

# Додавання AI-сервісів
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="Виручка Q1 2025: 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")

# Плагін з директорії з YAML/txt промптами
kernel.add_plugin(parent_directory="./plugins", plugin_name="reporting")

Auto Function Calling: агентний цикл

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)
# Агент автоматично вызове calculate_variance та format_currency

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="Політика командировочных расходів: суточные 2500 руб/день в РФ, 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

from semantic_kernel.connectors.ai.azure_ai_inference import AzureAIInferenceChatCompletion
from azure.ai.inference.aio import ChatCompletionsClient
from azure.identity.aio import DefaultAzureCredential

# Azure OpenAI
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
kernel.add_service(AzureChatCompletion(
    service_id="azure-gpt4o",
    deployment_name="gpt-4o",
    endpoint="https://your-endpoint.openai.azure.com",
    api_key="...",
))

# Azure AI Foundry (Phi, Mistral, Llama через Azure)
client = ChatCompletionsClient(
    endpoint="https://your-model.inference.ai.azure.com",
    credential=DefaultAzureCredential(),
)
kernel.add_service(AzureAIInferenceChatCompletion(
    service_id="phi-4",
    ai_model_id="phi-4",
    client=client,
))

Практичний кейс: .NET enterprise-приложение з AI

Контекст: крупна логістична компанія (.NET/C# backend) інтегрувала SK для створення AI-ассистента диспетчера.

Плагіни:

  • ShipmentPlugin — запроси до TMS (транспортна система)
  • RoutePlugin — розрахунок маршрутів, вартості, строків
  • CustomerPlugin — дані клієнтів, історія заказів
  • AlertPlugin — відправка сповіщень про затримки
// C# версія
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%

Строки

  • Базова інтеграція SK + OpenAI/Azure: 2–4 дні
  • Розробка плагінів для бізнес-логіки: 1–2 тижні
  • Агентний цикл з auto function calling: 1 тиждень
  • Інтеграція з корпоративними .NET системами: 2–4 тижні