Обзор семантического ядра для .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, предлагая универсальный интерфейс разработчика. Вы можете настроить функции памяти для хранения данных в различных источниках или службах, включая поиск ИИ 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(";")[1].Trim(),
text: fact.Value,
externalId: fact.Key.Split(";")[2].Trim(),
externalSourceName: "Azure Documentation"
);
}
Приведенный выше код загружает набор фактов в память, чтобы данные могли использоваться при взаимодействии с моделями ИИ и задачами оркестрации.