Обзор семантического ядра для .NET
В этой статье рассматриваются основные понятия и возможности семантического ядра . Семантический ядро — это мощный и рекомендуемый вариант для работы с ИИ в приложениях .NET. В следующих разделах вы узнаете:
- Добавление семантического ядра в проект
- Основные понятия семантического ядра
В следующих разделах представлен краткий обзор семантического ядра в контексте .NET. Дополнительные сведения и обучение по семантической ядре см. в следующих ресурсах:
Добавление семантического ядра в проект .NET
Пакет SDK для семантического ядра доступен в виде пакета NuGet для .NET и интегрируется со стандартными конфигурациями приложений.
Установите пакет с помощью следующей Microsoft.SemanticKernel
команды:
dotnet add package 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);
Planner
Планировщик — это основной компонент семантического ядра, который обеспечивает оркестрацию ИИ для управления простой интеграцией между моделями ИИ и подключаемыми модулями. Этот уровень разрабатывает стратегии выполнения из запросов пользователей и динамически оркестрирует подключаемые модули для выполнения сложных задач с помощью планирования с помощью ИИ.
Рассмотрим следующий фрагмент псевдокода:
// 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 DB, предлагая единый интерфейс разработчика. Функции памяти можно настроить для хранения данных в различных источниках или службах, включая поиск ИИ Azure, Кэш Azure для Redis и многое другое.
Рассмотрим следующий фрагмент кода:
var facts = new Dictionary<string,string>();
facts.Add(
"Azure Machine Learning; https://docs.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://docs.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(";")[1].Trim(),
text: fact.Value,
externalId: fact.Key.Split(";")[2].Trim(),
externalSourceName: "Azure Documentation"
);
}
Приведенный выше код загружает набор фактов в память, чтобы данные могли использоваться при взаимодействии с моделями ИИ и задачами оркестрации.