Перейти к основному содержимому

Semantic Kernel и генеративный AI в .NET

Разработчику Архитектору

Semantic Kernel (SK) — SDK от Microsoft для встраивания больших языковых моделей (LLM) в приложения на .NET. Типичные задачи — чат, суммаризация текста, классификация, ответы по корпоративным документам.

Рядом в экосистеме живёт ML.NET — библиотека классической машинного обучения (прогноз по таблице, классификация изображений). ML.NET и SK решают разные классы задач и часто используются в одном продукте для разных целей.

Контекст платформы — история .NET, обзор.


Словарь

ТерминЗначение
LLMLarge Language Model — модель, обученная на тексте (GPT и аналоги).
PromptТекст-инструкция для модели.
RAG (Retrieval-Augmented Generation)Сначала поиск фрагментов в ваших документах, затем ответ модели по найденному контексту.
EmbeddingЧисловой вектор смысла текста; похожие тексты — близкие векторы.
Vector storeБаза для хранения и поиска embeddings.
TokenЕдиница текста для модели; от неё зависит стоимость и лимит контекста.
ГаллюцинацияУверенный ответ модели с выдуманными фактами.

Когда подходит Semantic Kernel

ЗадачаИнструмент
Чат-бот по документации компанииSK + RAG + vector store
Извлечение полей из письмаSK + prompt + function calling
Прогноз спроса по CSVML.NET
Расчёт цены, скидок, налоговКод и БД; LLM — только для текста пользователю

Критичную бизнес-логику (деньги, права доступа) держите в коде и базе. LLM — для формулировок, черновиков, поиска по тексту.


Основные части SK

  • Kernel — точка входа: модель, настройки, подключённые сервисы.
  • Plugins — обычные функции C#, которые модель может вызвать (получить погоду, статус заказа).
  • Prompt template — шаблон с переменными {{$input}}.
  • Memory / RAG — поиск релевантных фрагментов перед генерацией ответа.

Пакеты NuGet: Microsoft.SemanticKernel, коннекторы к OpenAI, Azure OpenAI, локальным моделям.

Документация — learn.microsoft.com/semantic-kernel.


Минимальный пример

using Microsoft.SemanticKernel;

var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o-mini",
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")!);

var kernel = builder.Build();

var result = await kernel.InvokePromptAsync(
"Суммируй в трёх пунктах: {{$input}}",
new() { ["input"] = "Длинный текст документа..." });

Console.WriteLine(result);

Ключи API — из переменных окружения, User Secrets или Key Vault, не в git. См. безопасность C#, конфигурации.


RAG — ответ по своим документам

  1. Индексация — разбить документы на фрагменты (chunks), посчитать embeddings, сохранить в vector store (Azure AI Search, Qdrant, pgvector в PostgreSQL).
  2. Запрос пользователя — embedding вопроса, поиск top-K похожих фрагментов.
  3. Промпт — инструкция "отвечай только по контексту" + фрагменты + вопрос.
  4. Ответ — текст модели; желательно со ссылками на источники.

Риски и меры

РискМера
ГаллюцинацииЖёсткий system prompt, ответ "не знаю"
Утечка данных в облакоPrivate endpoint, on-prem модель
Стоимость токеновКэш embeddings, лимиты, меньшая модель для черновика
PII в логахНе логировать полный prompt с персональными данными

PostgreSQL с pgvector — 888.


Архитектура в ASP.NET Core

Клиент → API (ASP.NET) → сервис приложения

Semantic Kernel
/ | \
LLM API Plugins Vector DB
  • Долгий контекст чата храните в БД или кэше, не бесконечно в памяти процесса.
  • Streaming — отдавайте ответ частями (IAsyncEnumerable, SSE) для отзывчивого UI.
  • Логируйте correlation id; полный prompt с PII — только в защищённом хранилище.

Веб-стек — ASP.NET, первая программа Web API.


Semantic Kernel и прямой HTTP к OpenAI

КритерийSemantic KernelHttpClient + JSON вручную
Плагины и цепочки шаговГотовые абстракцииПисать самим
Смена провайдера (OpenAI → Azure)Меньше переписыванияНовый клиент
Один простой вызовИзбыточенДостаточно

Для прототипа с одним запросом достаточно HTTP. Когда появляются плагины, RAG и несколько моделей — SK окупает структуру.


Частые ошибки

  • LLM как единственный источник правды для цен и прав — нужна верификация по БД.
  • Нет лимита на размер контекста — обрезка, summarization по частям.
  • API key в appsettings.json в репозитории — User Secrets / vault.

Краткая шпаргалка

ЦельИнструмент
Чат с вызовом функцийSK Plugins
Ответы по документамRAG + embeddings
Табличная MLML.NET
НаблюдаемостьOpenTelemetry, логи без PII

См. также