中文翻译暂不可用,显示俄语原文。
Что такое 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 Kernel | LangChain |
|---|---|---|
| Разработчик | Microsoft | Сообщество (Harrison Chase и др.) |
| Основные языки | C# (первичный), Python | Python (первичный), JavaScript |
| Архитектура | Плагины+функции, центральный Kernel | Цепочки, агенты, инструменты (модули) |
| Оркестрация | Planner (автоматическое составление плана) | Agent + Tool (ручной или полуавтоматический выбор) |
| Интеграция с LLM | Azure OpenAI, OpenAI, HuggingFace (через коннекторы) | 300+ провайдеров, включая локальные |
| Промпты | Хранятся в файлах skprompt.txt рядом с конфигом | В коде через PromptTemplate или в отдельных файлах |
| Плагины/Навыки | Нативная концепция Plugin с функциями | Tool — аналог, но менее структурирован |
| Память | Встроенные механизмы (Volatile, FileBased, SemanticMemory) | Memory-объекты (Buffer, Window, Summary, VectorStore) |
| Стейт-менеджмент/длительные задачи | Встроенный Async + Stepwise Planner | LangGraph (отдельная библиотека) |
| Производственная готовность | Высокая (Microsoft поддерживает, есть инструменты безопасности) | Высокая (но больше сообщество, меньше корпоративной поддержки) |
| Размер сообщества | Относительно небольшое, но растёт | Огромное, тысячи контрибьюторов |
| Документация | Хорошая, но ориентирована на .NET | Очень обширная, много примеров и туториалов |
| Когда выбрать | C#, Azure, Copilot-экосистема, нужна жёсткая интеграция с Microsoft | Python, эксперименты, нужна гибкость, много внешних интеграций |
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 Planner | LangChain 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
Шаги:
- Создайте в Semantic Kernel плагин
CalendarPluginс нативными функциями:create_event,list_events,delete_event. - Определите семантическую функцию
parse_meeting_request(из текста извлекает дату, время, участников). - Настройте Planner, чтобы при запросе "Запланируй встречу со Светой в пятницу в 15:00" он автоматически строил план:
parse_meeting_request -> create_event. - Аналогично реализуйте на LangChain: создайте те же функции как
Tool, оберните вAgent(тип OpenAI Functions). - Сравните количество кода, читаемость, простоту отладки и гибкость добавления новых функций (например, проверка доступности).
Ожидаемый результат
- Получите два работающих микросервиса с одинаковой функциональностью.
- Вы увидите, что в Semantic Kernel плагины легче группировать и переиспользовать, но для нетривиальной логики (условия, циклы) приходится использовать Planner с кастомными промптами.
- В LangChain агент проще расширять новыми инструментами, но структура кода менее централизована.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 53 | LangChain (сравнение, альтернатива) |
| 55 | AutoGen (многоагентные системы) |
| 56 | CrewAI (агентные команды) |
| 57 | Архитектуры агентов (планировщики) |
| 58 | Инструменты (tool calling) |
| 60 | Оркестрация в целом |
Навигация
- Предыдущий: 53
- Следующий: 55
- Индекс: 00. Индекс разборов