Udostępnij za pośrednictwem


Omówienie jądra semantycznego dla platformy .NET

W tym artykule zapoznasz się z podstawowymi pojęciami i możliwościami jądra semantycznego. Semantyczne jądro to zaawansowany i zalecany wybór do pracy ze sztuczną inteligencją w aplikacjach platformy .NET. W poniższych sekcjach nauczysz się:

  • Jak dodać jądro semantyczne do projektu
  • Podstawowe pojęcia dotyczące jądra semantycznego

Ten artykuł służy jako wstępny przegląd semantycznego jądra specjalnie w kontekście platformy .NET. Aby uzyskać bardziej kompleksowe informacje i szkolenia dotyczące jądra semantycznego, zobacz następujące zasoby:

Dodawanie jądra semantycznego do projektu platformy .NET

Zestaw SDK jądra semantycznego jest dostępny jako pakiet NuGet dla platformy .NET i integruje się ze standardowymi konfiguracjami aplikacji.

Microsoft.SemanticKernel Zainstaluj pakiet przy użyciu następującego polecenia:

dotnet add package Microsoft.SemanticKernel

Uwaga

Mimo że Microsoft.SemanticKernel zapewnia podstawowe funkcje jądra semantycznego, dodatkowe możliwości wymagają zainstalowania dodatkowych pakietów. Na przykład Microsoft.SemanticKernel.Plugins.Memory pakiet zapewnia dostęp do funkcji związanych z pamięcią. Aby uzyskać więcej informacji, zobacz dokumentację jądra semantycznego.

Utwórz i skonfiguruj Kernel wystąpienie przy użyciu KernelBuilder klasy , aby uzyskać dostęp do jądra semantycznego i pracować z tym jądrem. Przechowuje Kernel usługi, dane i połączenia z orkiestracją integracji między kodem a modelami sztucznej inteligencji.

Skonfiguruj aplikację Kernel konsolową platformy .NET:

var builder = Kernel.CreateBuilder();

// Add builder configuration and services

var kernel = builder.Build();

Skonfiguruj jądro w aplikacji ASP.NET Core:

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

// Add builder configuration and services

var app = builder.Build();

Omówienie jądra semantycznego

Semantyczne jądro to zestaw SDK typu open source, który integruje i organizuje modele i usługi sztucznej inteligencji, takie jak OpenAI, Azure OpenAI i Hugging Face z konwencjonalnymi językami programowania, takimi jak C#, Python i Java.

Zestaw SDK jądra semantycznego zapewnia deweloperom korporacyjnym następujące korzyści:

  • Usprawnia integrację funkcji sztucznej inteligencji z istniejącymi aplikacjami, aby umożliwić współistniejące rozwiązanie dla produktów dla przedsiębiorstw.
  • Minimalizuje krzywą nauki pracy z różnymi modelami lub usługami sztucznej inteligencji, zapewniając abstrakcje, które zmniejszają złożoność.
  • Zwiększa niezawodność, zmniejszając nieprzewidywalne zachowanie monitów i odpowiedzi z modeli sztucznej inteligencji. Możesz dostosować monity i zaplanować zadania, aby utworzyć kontrolowane i przewidywalne środowisko użytkownika.

Semantyczne jądro jest tworzone na podstawie kilku podstawowych pojęć:

  • Połączenia: interfejs z zewnętrznymi usługami sztucznej inteligencji i źródłami danych.
  • Wtyczki: hermetyzują funkcje, których mogą używać aplikacje.
  • Planista: orkiestruje plany wykonywania i strategie na podstawie zachowania użytkownika.
  • Pamięć: abstrakcji i upraszcza zarządzanie kontekstem aplikacji sztucznej inteligencji.

Te bloki konstrukcyjne zostały szczegółowo opisane w poniższych sekcjach.

Połączenia

Zestaw SDK jądra semantycznego zawiera zestaw łączników, które umożliwiają deweloperom integrowanie usług LLM i innych usług z istniejącymi aplikacjami. Te łączniki służą jako most między kodem aplikacji a modelami lub usługami sztucznej inteligencji. Semantyczne jądro obsługuje wiele typowych problemów i wyzwań związanych z połączeniem, dzięki czemu można skupić się na tworzeniu własnych przepływów pracy i funkcji.

Poniższy fragment kodu tworzy Kernel element i dodaje połączenie z modelem usługi 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();

Dodatki plug-in

Semantyczne wtyczki jądra hermetyzują standardowe funkcje języka dla aplikacji i modeli sztucznej inteligencji do użytku. Możesz tworzyć własne wtyczki lub polegać na wtyczkach udostępnianych przez zestaw SDK. Te wtyczki usprawniają zadania, w których modele sztucznej inteligencji są korzystne i wydajnie łączą je z bardziej tradycyjnymi metodami języka C#. Funkcje wtyczki są zazwyczaj podzielone na dwa typy: funkcje semantyczne i funkcje natywne.

Funkcje semantyczne

Funkcje semantyczne są zasadniczo monitami sztucznej inteligencji zdefiniowanymi w kodzie, które semantyczne jądro może dostosować i wywołać w razie potrzeby. Możesz templatize tych monitów używać zmiennych, niestandardowego formatowania monitu i uzupełniania i nie tylko.

Poniższy fragment kodu definiuje i rejestruje funkcję semantyczną:

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"
);

Funkcje natywne

Funkcje natywne to metody języka C#, które semantyczne jądro może wywoływać bezpośrednio w celu manipulowania lub pobierania danych. Wykonują operacje, które są lepiej dostosowane do tradycyjnych instrukcji kodu zamiast monitów LLM.

Poniższy fragment kodu definiuje i rejestruje funkcję natywną:

// 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

Planista jest podstawowym składnikiem semantycznego jądra, który zapewnia orkiestrację sztucznej inteligencji w celu zarządzania bezproblemową integracją modeli AI i wtyczek. Ta warstwa opracowuje strategie wykonywania od żądań użytkowników i dynamicznie organizuje wtyczki w celu wykonywania złożonych zadań przy użyciu planowania wspomaganego przez sztuczną inteligencję.

Rozważmy następujący fragment kodu przykładowego:

// 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>()}");

Powyższy kod tworzy wykonywalny, sekwencyjny plan odczytywania zawartości z pliku lokalnego i podsumowywania zawartości. Plan konfiguruje instrukcje dotyczące odczytywania pliku przy użyciu funkcji natywnej, a następnie analizowania go przy użyciu modelu AI.

Pamięć

Magazyny wektorów jądra semantycznego zapewniają abstrakcje w przypadku osadzania modeli, wektorowych baz danych i innych danych, aby uprościć zarządzanie kontekstem aplikacji sztucznej inteligencji. Magazyny wektorów są niezależne od bazowej bazy danych LLM lub Vector, oferując jednolite środowisko deweloperskie. Funkcje pamięci można skonfigurować do przechowywania danych w różnych źródłach lub usłudze, w tym usługi Azure AI Search i Azure Cache for Redis.

Rozważmy następujący fragment kodu:

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"
    );
}

Powyższy kod ładuje zestaw faktów do pamięci, dzięki czemu dane są dostępne do użycia podczas interakcji z modelami sztucznej inteligencji i organizowania zadań.