Что такое Semantic Kernel и чем отличается от LangChain?

Краткий тезис

Semantic Kernel — это фреймворк от Microsoft для интеграции LLM в приложения, написанный на C# и Python. Его ключевое отличие от LangChain — архитектура на плагинах-контейнерах навыков (Plugins), тесная интеграция с экосистемой Microsoft (Azure, .NET, Copilot) и явное разделение на оркестратор, семантические функции и функции нативного кода. LangChain, напротив, более модульный, гибкий и имеет огромное сообщество, что делает его предпочтительным для экспериментов и прототипирования в не-Microsoft средах. На практике выбор зависит от стека: если у вас сплошной C# и Azure — Kernel|Semantic Kernel даёт нативные преимущества; если Python и открытая экосистема — LangChain остаётся стандартом.


1. Термин: Semantic Kernel (SK)

Semantic Kernel — это open-source AI-оркестратор от Microsoft, впервые анонсированный в 2023 году. Он позволяет разработчикам объединять LLM, подсказки (prompts) и обычный код в единый конвейер. Основная идея — представить каждую единицу логики как функцию, которую можно вызывать как в плане (plan), так и в цепочке (chain). SK поддерживает C# и Python, но ориентирован в первую очередь на .NET-экосистему.

Ключевые концепции

  • Kernel — центральный объект, который управляет памятью, подключением к LLM и регистрацией плагинов.
  • Plugin — контейнер, содержащий набор функций (семантических и/или нативных). Это аналог «навыка» в экосистеме Copilot.
  • Semantic function — функция, определённая через шаблон промпта (например, на основе Jinja2 или Handlebars). Выполняется через LLM.
  • Native function — обычная функция на C# или Python, которая может быть вызвана в конвейере.
  • Planner — компонент, который на основе запроса автоматически строит план из зарегистрированных функций (идея автоматической оркестрации).

Пример простого использования на Python

import asyncio
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.plugins.core import PromptPlugin

kernel = Kernel()
kernel.add_chat_service("chat", AzureChatCompletion(deployment_name="gpt-4", endpoint="...", api_key="..."))

plugin = kernel.import_plugin_from_prompt_directory("./plugins", "MyPlugins")
# Внутри плагина лежит файл skprompt.txt с промптом
# Функция вызывается так:
response = await kernel.run_async(plugin["MyFunction"], input_variables={"topic": "AI"})
print(response)

2. Термин: LangChain

LangChain — это фреймворк с открытым исходным кодом (Python и TypeScript) для построения приложений на основе LLM. Он де-факто стал стандартом в сообществе ML/AI благодаря модульной архитектуре: Chain, Agent, Tool, Memory, Retriever и т.д. LangChain позволяет комбинировать вызовы LLM с внешними инструментами и источниками данных, поддерживает сотни провайдеров (OpenAI, Anthropic, HuggingFace, локальные модели) и обладает огромной экосистемой сторонних интеграций.

Ключевые концепции

  • Chain — последовательность шагов (промпт → LLM → парсинг), можно объединять в цепочки.
  • Agent — автономная сущность, которая решает, какие инструменты вызывать и в каком порядке (ReAct, OpenAI Functions).
  • Tool — функция, которую агент может использовать (например, веб-поиск, калькулятор, вызов API).
  • Memory — способ сохранять историю диалога между вызовами.

Пример простого использования LangChain (Python):

from langchain.chat_models import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import tool
from langchain.prompts import PromptTemplate

llm = ChatOpenAI(model="gpt-4")
@tool
def search(query: str) -> str:
    """Поиск в интернете"""
    return f"Результаты по запросу: {query}"

tools = [search]
agent = create_react_agent(llm, tools, prompt=PromptTemplate.from_template("..."))
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input": "Найди последние новости про AI"})
print(result["output"])

3. Сравнение: Semantic Kernel vs LangChain

Ниже приведена таблица ключевых различий.

ХарактеристикаSemantic KernelLangChain
РазработчикMicrosoftСообщество (Harrison Chase и др.)
Основные языкиC# (первичный), PythonPython (первичный), JavaScript
АрхитектураПлагины+функции, центральный KernelЦепочки, агенты, инструменты (модули)
ОркестрацияPlanner (автоматическое составление плана)Agent + Tool (ручной или полуавтоматический выбор)
Интеграция с LLMAzure OpenAI, OpenAI, HuggingFace (через коннекторы)300+ провайдеров, включая локальные
ПромптыХранятся в файлах skprompt.txt рядом с конфигомВ коде через PromptTemplate или в отдельных файлах
Плагины/НавыкиНативная концепция Plugin с функциямиTool — аналог, но менее структурирован
ПамятьВстроенные механизмы (Volatile, FileBased, SemanticMemory)Memory-объекты (Buffer, Window, Summary, VectorStore)
Стейт-менеджмент/длительные задачиВстроенный Async + Stepwise PlannerLangGraph (отдельная библиотека)
Производственная готовностьВысокая (Microsoft поддерживает, есть инструменты безопасности)Высокая (но больше сообщество, меньше корпоративной поддержки)
Размер сообществаОтносительно небольшое, но растётОгромное, тысячи контрибьюторов
ДокументацияХорошая, но ориентирована на .NETОчень обширная, много примеров и туториалов
Когда выбратьC#, Azure, Copilot-экосистема, нужна жёсткая интеграция с MicrosoftPython, эксперименты, нужна гибкость, много внешних интеграций

4. Глубокое отличие: плагины как контейнеры навыков

В Semantic Kernel плагины — это первоклассная сущность. Плагин может содержать как семантические функции (определённые через промпты), так и нативные функции (обычный код). Это напоминает модули в Microsoft Bot Framework или навыки в Cortana/Copilot. Пример структуры папок плагина:

Plugins/
  MyPlugin/
    skprompt.txt          # семантическая функция "GeneratePoem"
    config.json           # настройки (max_tokens, temperature)
    MyNativeSkill.py      # нативная функция "CountTokens"

В LangChain нет такого чёткого контейнера; функции (инструменты) регистрируются отдельно, а промпты привязываются к цепочкам или агентам. Это даёт больше гибкости, но меньше структуры.

Практическое следствие в Semantic Kernel легче организовать переиспользование навыков между проектами (как NuGet-пакеты), в LangChain — проще динамически комбинировать инструменты.


5. Оркестрация: Planner vs Agent

Planner в Semantic Kernel — это механизм, который по запросу пользователя автоматически строит последовательность вызовов функций (план). Он использует LLM для выбора правильных функций и порядка их выполнения. План может быть выполнен как есть или разветвлён на подзадачи.

Agent в LangChain — более гибкая концепция: агент принимает решение на каждом шаге, какой инструмент вызвать и когда остановиться (например, ReAct-цикл). LangChain поддерживает несколько типов агентов: Zero-Shot ReAct, OpenAI Functions, Plan-and-Execute.

СравнениеSemantic Kernel PlannerLangChain Agent
ПодходГенерация полного плана сразуПошаговое принятие решений
ГибкостьСредняя (план фиксируется до выполнения)Высокая (можно менять стратегию)
Поддержка цикловОграниченная (PlanAndExecute в разработке)Полноценная (ReAct)
НастройкаЧерез промпт планера и конфигурациюЧерез тип агента, инструменты, парсеры

Пример плана в Semantic Kernel (упрощённо):
Запрос: "Напиши стих про LLM и переведи его на французский" → План: GeneratePoem(input) -> TranslateToFrench(poem) -> output.


6. Интеграция с Microsoft и Azure

Semantic Kernel нативно интегрируется с:

  • Azure OpenAI (управление ключами, эндпоинты, content safety)
  • Microsoft Graph (доступ к данным пользователя)
  • Copilot (расширение возможностей через плагины)
  • Semantic Memory (векторная БД на Azure Cognitive Search)
  • NET Core (async/await, dependency injection)

LangChain, напротив, предоставляет базовые коннекторы к Azure, но без глубокой интеграции с корпоративными сервисами Microsoft (например, нет встроенной поддержки Azure AD или Managed Identity). Если ваше приложение уже на C# и использует Azure, Semantic Kernel даёт более гладкий опыт.


7. Сообщество и документация: почему можно вернуться к LangChain

Несмотря на сильные стороны Semantic Kernel, многие практики (включая автора) после попытки внедрения возвращаются к LangChain по следующим причинам:

  • Размер сообщества LangChain — тысячи вопросов на Stack Overflow, множество туториалов, готовые интеграции с любыми сервисами. Semantic Kernel пока имеет ограниченный круг пользователей.
  • Документация LangChain документирует каждый модуль с примерами, есть официальные курсы. У Semantic Kernel документация сосредоточена на сценариях .NET, а Python-версия отстаёт.
  • Гибкость LangChain позволяет легко заменить LLM-провайдера, добавить новый инструмент или изменить цепочку без переписывания архитектуры. Semantic Kernel жёстче завязан на концепцию плагинов и центрального Kernel.
  • Экосистема LangChain поддерживает LangServe (деплой как API), LangSmith (мониторинг), LangGraph (графы потоков). Semantic Kernel пока не имеет такого набора сопутствующих продуктов.

Однако для продуктов, где C# — основной язык, а инфраструктура целиком на Azure, Semantic Kernel даёт значительное преимущество в производительности и надёжности.


8. Практические сценарии использования

Когда выбирать Semantic Kernel

  • Приложение на .NET (WPF, ASP.NET Core, MAUI) — нативный вызов без P/Invoke.
  • Используете Azure Cognitive Services, Azure OpenAI, Microsoft Graph.
  • Хотите строго типизированные плагины с конфигурацией в JSON.
  • Разрабатываете плагин для Microsoft Copilot.

Когда выбирать LangChain

  • Python-стек (FastAPI, Django, асинхронка).
  • Нужна поддержка множества LLM-провайдеров (OpenAI, Anthropic, Ollama, Gemini).
  • Экспериментируете с новыми архитектурами (multi-agent, RAG, ReAct).
  • Хотите быстрое прототипирование и широкий набор готовых цепочек.

9. Дополнительные возможности Semantic Kernel (в контексте оркестрации)

  • Memory — встроенная семантическая память (поддержка векторных БД через VectorStore).
  • Filter — цепочка фильтров до и после вызова LLM (логирование, безопасность).
  • Planner — можно строить иерархические планы, разбивать задачу на подзадачи.
  • OpenAPI Plugin — импорт REST API как плагинов (через OpenAPI спецификацию).

Пет-проект для закрепления

Задача Создайте телеграм-бота (или веб-приложение), который может составлять расписание встреч и интегрироваться с календарём (например, Google Calendar). Используйте Semantic Kernel (Python), а затем ту же логику на LangChain, чтобы сравнить удобство.

Инструменты

  • Python 3.10+
  • Semantic Kernel (Python) pip install semantic-kernel
  • LangChain pip install langchain
  • LLM: OpenAI или Azure OpenAI
  • Для календаря: google-auth, google-api-python-client

Шаги:

  1. Создайте в Semantic Kernel плагин CalendarPlugin с нативными функциями: create_event, list_events, delete_event.
  2. Определите семантическую функцию parse_meeting_request (из текста извлекает дату, время, участников).
  3. Настройте Planner, чтобы при запросе "Запланируй встречу со Светой в пятницу в 15:00" он автоматически строил план: parse_meeting_request -> create_event.
  4. Аналогично реализуйте на LangChain: создайте те же функции как Tool, оберните в Agent (тип OpenAI Functions).
  5. Сравните количество кода, читаемость, простоту отладки и гибкость добавления новых функций (например, проверка доступности).

Ожидаемый результат

  • Получите два работающих микросервиса с одинаковой функциональностью.
  • Вы увидите, что в Semantic Kernel плагины легче группировать и переиспользовать, но для нетривиальной логики (условия, циклы) приходится использовать Planner с кастомными промптами.
  • В LangChain агент проще расширять новыми инструментами, но структура кода менее централизована.

Связь с другими вопросами

ВопросТема
53LangChain (сравнение, альтернатива)
55AutoGen (многоагентные системы)
56CrewAI (агентные команды)
57Архитектуры агентов (планировщики)
58Инструменты (tool calling)
60Оркестрация в целом

Навигация