Поделиться через


Обзор семантического ядра для .NET

В этой статье рассматриваются основные понятия и возможности семантического ядра . Семантический ядро — это мощный и рекомендуемый вариант для работы с ИИ в приложениях .NET. В следующих разделах вы узнаете:

  • Добавление семантического ядра в проект
  • Основные понятия семантического ядра

Эта статья служит вводным обзором семантического ядра специально в контексте .NET. Для получения более полной информации и обучения по семантическому ядру см. следующие ресурсы.

Добавление семантического ядра в проект .NET

Пакет SDK для семантического ядра доступен в виде пакета NuGet для .NET и интегрируется со стандартными конфигурациями приложений.

Установите пакет с помощью следующей Microsoft.SemanticKernel команды:

dotnet add package Microsoft.SemanticKernel

Или в .NET 10+:

dotnet package add Microsoft.SemanticKernel

Примечание.

Хотя Microsoft.SemanticKernel предоставляет основные функции семантического ядра, дополнительные возможности требуют установки дополнительных пакетов. Например, пакет Microsoft.SemanticKernel.Plugins.Memory предоставляет доступ к функциям, связанным с памятью. Дополнительные сведения см. в документации по семантике ядра.

Создайте и настройте экземпляр Kernel с помощью класса KernelBuilder для доступа к семантическому ядру и работы с ним. Kernel содержит службы, данные и подключения для оркестрации интеграций между вашим кодом и моделями ИИ.

Настройте Kernel в консольном приложении .NET.

var builder = Kernel.CreateBuilder();

// Add builder configuration and services

var kernel = builder.Build();

Настройте ядро в приложении ASP.NET Core:

var builder = WebApplication.CreateBuilder();
builder.Services.AddKernel();

// Add builder configuration and services

var app = builder.Build();

Общие сведения о семантическом ядре

Семантический ядро — это пакет SDK с открытым исходным кодом, который интегрирует модели и службы ИИ, такие как OpenAI, Azure OpenAI и Hugging Face с обычными языками программирования, такими как C#, Python и Java.

Программный пакет SDK для семантического ядра предоставляет корпоративным разработчикам следующие преимущества:

  • Оптимизирует интеграцию возможностей искусственного интеллекта с существующими приложениями, чтобы обеспечить согласованное решение для корпоративных продуктов.
  • Сводит к минимуму кривую обучения для работы с различными моделями или службами ИИ, предоставляя абстракции, которые снижают сложность.
  • Повышает надежность, уменьшая непредсказуемое поведение запросов и ответов из моделей ИИ. Вы можете точно настроить запросы и планировать задачи для создания управляемого и прогнозируемого взаимодействия с пользователем.

Семантический ядро строится на основе нескольких основных понятий:

  • Подключения: интерфейс с внешними службами ИИ и источниками данных.
  • Подключаемые модули: инкапсулируют функции, которые могут использовать приложения.
  • Планировщик: оркеструет планы выполнения и стратегии на основе поведения пользователя.
  • Память: абстрагирование и упрощение управления контекстом для приложений ИИ.

Эти стандартные блоки подробно рассматриваются в следующих разделах.

Связи

Пакет SDK для семантического ядра включает набор соединителей, позволяющих разработчикам интегрировать LLM и другие службы в существующие приложения. Эти соединители служат мостом между кодом приложения и моделями или службами ИИ. Семантическое ядро решает множество общих вопросов и сложностей подключения, чтобы вы могли сосредоточиться на создании своих рабочих процессов и функций.

Следующий фрагмент кода создает Kernel и добавляет подключение к модели Azure OpenAI:

using Microsoft.SemanticKernel;

// Create kernel
var builder = Kernel.CreateBuilder();

// Add a chat completion service:
builder.Services.AddAzureOpenAIChatCompletion(
    "your-resource-name",
    "your-endpoint",
    "your-resource-key",
    "deployment-model");
var kernel = builder.Build();

Подключаемые модули

Плагины Семантического ядра инкапсулируют функции стандартного языка для использования в приложениях и моделях ИИ. Вы можете создавать собственные подключаемые модули или полагаться на подключаемые модули, предоставляемые пакетом SDK. Эти подключаемые модули упрощают задачи, в которых модели ИИ являются выгодными и эффективно объединяют их с более традиционными методами C#. Функции подключаемого модуля обычно классифицируются на два типа: семантические функции и собственные функции.

Семантические функции

Семантические функции по сути являются запросами ИИ, определенными в коде, который семантический ядро может настраивать и вызывать по мере необходимости. Эти запросы можно шаблонизировать для использования переменных, пользовательского запроса и форматирования завершения и т. д.

Следующий фрагмент кода определяет и регистрирует семантику функции:

var userInput = Console.ReadLine();

// Define semantic function inline.
string skPrompt = @"Summarize the provided unstructured text in a sentence that is easy to understand.
                    Text to summarize: {{$userInput}}";

// Register the function
kernel.CreateSemanticFunction(
    promptTemplate: skPrompt,
    functionName: "SummarizeText",
    pluginName: "SemanticFunctions"
);

Собственные функции

Собственные функции — это методы C#, которые семантический ядро может вызывать непосредственно для управления или извлечения данных. Они выполняют операции, которые лучше подходят для традиционных инструкций кода вместо запросов LLM.

Следующий фрагмент кода определяет и регистрирует собственную функцию:

// Define native function
public class NativeFunctions {

    [SKFunction, Description("Retrieve content from local file")]
    public async Task<string> RetrieveLocalFile(string fileName, int maxSize = 5000)
    {
        string content = await File.ReadAllTextAsync(fileName);
        if (content.Length <= maxSize) return content;
        return content.Substring(0, maxSize);
    }
}

//Import native function
string plugInName = "NativeFunction";
string functionName = "RetrieveLocalFile";

var nativeFunctions = new NativeFunctions();
kernel.ImportFunctions(nativeFunctions, plugInName);

Планировщик

Планировщик — это основной компонент семантического ядра, который обеспечивает оркестрацию ИИ для управления простой интеграцией между моделями ИИ и подключаемыми модулями. Этот уровень разрабатывает стратегии выполнения на основе запросов пользователей и динамически оркестрирует подключаемые модули для выполнения сложных задач с помощью планирования с использованием ИИ.

Рассмотрим следующий фрагмент псевдокода:

// Native function definition and kernel configuration code omitted for brevity

// Configure and create the plan
string planDefinition = "Read content from a local file and summarize the content.";
SequentialPlanner sequentialPlanner = new SequentialPlanner(kernel);

string assetsFolder = @"../../assets";
string fileName = Path.Combine(assetsFolder,"docs","06_SemanticKernel", "aci_documentation.txt");

ContextVariables contextVariables = new ContextVariables();
contextVariables.Add("fileName", fileName);

var customPlan = await sequentialPlanner.CreatePlanAsync(planDefinition);

// Execute the plan
KernelResult kernelResult = await kernel.RunAsync(contextVariables, customPlan);
Console.WriteLine($"Summarization: {kernelResult.GetValue<string>()}");

Приведенный выше код создает исполняемый файл, последовательный план для чтения содержимого из локального файла и сводки содержимого. План настраивает инструкции для чтения файла с помощью собственной функции, а затем анализа его с помощью модели ИИ.

Память

Векторные хранилища семантического ядра предоставляют абстракции над моделями встраивания, векторными базами данных и другими источниками данных для упрощения управления контекстом в приложениях ИИ. Хранилища векторов не зависят от базовой базы данных LLM или Vector, предлагая универсальный интерфейс разработчика. Вы можете настроить функции памяти для хранения данных в различных источниках или службах, включая поиск ИИ Azure и Кэш Azure для Redis.

Рассмотрим следующий фрагмент кода:

var facts = new Dictionary<string,string>();
facts.Add(
    "Azure Machine Learning; https://learn.microsoft.com/en-us/azure/machine-learning/",
    @"Azure Machine Learning is a cloud service for accelerating and
    managing the machine learning project lifecycle. Machine learning professionals,
    data scientists, and engineers can use it in their day-to-day workflows"
);

facts.Add(
    "Azure SQL Service; https://learn.microsoft.com/en-us/azure/azure-sql/",
    @"Azure SQL is a family of managed, secure, and intelligent products
    that use the SQL Server database engine in the Azure cloud."
);

string memoryCollectionName = "SummarizedAzureDocs";

foreach (var fact in facts) {
    await memoryBuilder.SaveReferenceAsync(
        collection: memoryCollectionName,
        description: fact.Key.Split(";")[0].Trim(),
        text: fact.Value,
        externalId: fact.Key.Split(";")[1].Trim(),
        externalSourceName: "Azure Documentation"
    );
}

Приведенный выше код загружает набор фактов в память, чтобы данные могли использоваться при взаимодействии с моделями ИИ и задачами оркестрации.