Condividi tramite


Panoramica di Semantic Kernel per .NET

Questo articolo illustra i concetti e funzionalità di base di Semantic Kernel. Semantic Kernel è un'opzione efficace consigliata per l'uso dell'intelligenza artificiale in applicazioni .NET. Le sezioni seguenti illustreranno:

  • Come aggiungere Semantic Kernel a un progetto
  • Concetti di base di Semantic Kernel

Questo articolo funge da panoramica introduttiva sul kernel semantico, in particolare nel contesto di .NET. Per informazioni più esaustive e materiali formativi su Semantic Kernel, vedere le risorse seguenti:

Aggiungere Semantic Kernel a un progetto .NET

L'SDK Semantic Kernel è disponibile come pacchetto NuGet per .NET e si integra con configurazioni di app standard.

Installare il pacchetto Microsoft.SemanticKernel usando il comando seguente:

dotnet add package Microsoft.SemanticKernel

Nota

Anche se Microsoft.SemanticKernel fornisce funzionalità di base di Semantic Kernel, sono necessarie funzionalità aggiuntive per installare pacchetti aggiuntivi. Ad esempio, il pacchetto Microsoft.SemanticKernel.Plugins.Memory fornisce l'accesso alle funzionalità correlate alla memoria. Per altre informazioni, vedere la documentazione di Semantic Kernel.

Creare e configurare un'istanza Kernel usando la classe KernelBuilder per accedere e usare Semantic Kernel. Kernel contiene servizi, dati e connessioni per orchestrare integrazioni tra il codice e i modelli di intelligenza artificiale.

Configurare Kernel in un'app console .NET:

var builder = Kernel.CreateBuilder();

// Add builder configuration and services

var kernel = builder.Build();

Configurare il kernel in un'app ASP.NET Core:

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

// Add builder configuration and services

var app = builder.Build();

Informazioni su Semantic Kernel

Semantic Kernel è un SDK open source che integra e orchestra modelli e servizi di intelligenza artificiale come OpenAI, Azure OpenAI e Hugging Face con linguaggi di programmazione convenzionali come C#, Python e Java.

L'SDK Semantic Kernel offre i vantaggi seguenti agli sviluppatori aziendali:

  • Semplifica l'integrazione delle funzionalità di intelligenza artificiale in applicazioni esistenti per abilitare una soluzione coesiva per i prodotti aziendali.
  • Riduce al minimo la curva di apprendimento dell'uso di diversi modelli o servizi di intelligenza artificiale, fornendo astrazioni che riducono la complessità.
  • Migliora l'affidabilità riducendo il comportamento imprevedibile di richieste e risposte dai modelli di intelligenza artificiale. È possibile ottimizzare le richieste e pianificare le attività per creare un'esperienza utente controllata e prevedibile.

Semantic Kernel si basa su diversi concetti di base:

  • Connessioni: interfaccia con origini dati e servizi di intelligenza artificiale esterni.
  • Plug-in: incapsulare funzioni utilizzabili dalle applicazioni.
  • Planner: orchestra piani e strategie di esecuzione in base al comportamento dell'utente.
  • Memoria: astrae e semplifica la gestione del contesto per le app di intelligenza artificiale.

Questi elementi fondamentali vengono descritti più dettagliatamente nelle sezioni seguenti.

Connessioni

L'SDK Semantic Kernel include un set di connettori che consentono agli sviluppatori di integrare LLM e altri servizi nelle applicazioni esistenti. Questi connettori fungono da ponte tra il codice dell'applicazione e i modelli o servizi di intelligenza artificiale. Semantic Kernel gestisce molti problemi di connessione comuni, in modo da potersi concentrare sulla creazione di flussi di lavoro e funzionalità.

Il frammento di codice seguente crea un Kernel e aggiunge una connessione a un modello di 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();

Plug-in

I plug-in di Semantic Kernel incapsulano funzioni del linguaggio standard per applicazioni e modelli di intelligenza artificiale. È possibile creare plug-in personalizzati o basarsi sui plug-in forniti dall'SDK. Questi plug-in semplificano le attività in cui i modelli di intelligenza artificiale sono vantaggiosi e li combinano in maniera efficiente con metodi C# più tradizionali. Le funzioni dei plug-in generalmente sono suddivise in due tipi: funzioni semantiche e funzioni native.

Funzioni semantiche

Le funzioni semantiche sono essenzialmente richieste di intelligenza artificiale definite nel codice che Semantic Kernel può personalizzare e chiamare in base alle esigenze. È possibile creare modelli di queste richieste per usare variabili, formattazione di completamento e richieste personalizzate, e altro.

Il frammento di codice seguente definisce e registra una funzione semantica:

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

Funzioni native

Le funzioni native sono metodi C# che Semantic Kernel può chiamare direttamente per modificare o recuperare dati. Eseguono operazioni più adatte alle istruzioni di codice tradizionali anziché alle richieste LLM.

Il frammento di codice seguente definisce e registra una funzione nativa:

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

Planner è un componente di base di Semantic Kernel che fornisce orchestrazione IA per facilitare l'integrazione tra plug-in e modelli di intelligenza artificiale. Questo livello concepisce strategie di esecuzione dalle richieste dell'utente e orchestra in modo dinamico i plug-in per eseguire attività complesse con la pianificazione assistita dall'intelligenza artificiale.

Si consideri il seguente frammento di codice:

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

Il codice precedente crea un piano eseguibile sequenziale per leggere il contenuto da un file locale e riepilogarne il contenuto. Il piano configura le istruzioni per la lettura del file usando una funzione nativa e quindi lo analizza usando un modello di intelligenza artificiale.

Memoria

Gli archivi vettoriali del kernel semantico forniscono astrazioni su modelli di incorporamento, database vettoriali e altri dati per semplificare la gestione del contesto per le applicazioni di intelligenza artificiale. Gli archivi vettoriali sono indipendenti dal database LLM o vettoriale sottostante, offrendo un'esperienza di sviluppo uniforme. È possibile configurare le funzionalità di memoria per archiviare i dati in un'ampia gamma di origini o servizi, tra cui Azure AI Search e cache di Azure per Redis.

Si consideri il frammento di codice seguente:

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

Il codice precedente carica in memoria un set di fatti in modo che i dati siano disponibili per l'uso durante l'interazione con i modelli di intelligenza artificiale e l'orchestrazione delle attività.