共用方式為


.NET 的語意核心概觀

在本文中,您會探討語意核心的核心概念和功能。 語意核心是強大的選項,且建議搭配 .NET 應用程式中的 AI 使用。 在以下各節,您將了解:

  • 如何將語意核心新增至專案
  • 語意核心的核心概念

本文專門針對語意核心 (特別是在 .NET 環境中) 進行介紹性概述。 如需語意核心更完整的資訊與訓練,請參閱下列資源:

將語意核心新增至 .NET 專案

語意核心 SDK 可作為適用於 .NET 的 NuGet 套件,並與標準應用程式組態整合。

使用下列命令安裝 Microsoft.SemanticKernel 套件:

dotnet add package Microsoft.SemanticKernel

注意

雖然 Microsoft.SemanticKernel 提供語意核心的核心功能,但您必須為其他功能安裝其他套件。 例如,Microsoft.SemanticKernel.Plugins.Memory 套件可存取記憶體相關功能。 如需其他資訊,請參閱語意核心文件

使用 KernelBuilder 類別建立及設定 Kernel 執行個體,以存取和使用語意核心。 Kernel 包含服務、資料和連線,可協調程式碼與 AI 模型之間的整合。

在 .NET 控制台應用程式設定 Kernel

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 等 AI 模型與服務,以及 C#、Python 和 JAVA 這類傳統程式設計語言。

語意核心 SDK 可透過下列方式讓企業開發人員受益:

  • 簡化 AI 功能與現有應用程式整合的流程,為企業產品實現緊密整合的解決方案。
  • 提供降低複雜性的抽象概念,將處理不同 AI 模型或服務的學習曲線降到最低。
  • 減少 AI 模型提示和回應無法預測的行為,改善可靠性。 您可以微調提示和規劃工作,打造受控且可預測的使用者體驗。

語意核心是根據數個核心概念所建置:

  • 連線:連接外部 AI 服務和資料來源。
  • 外掛程式:封裝應用程式可以使用的函式。
  • 規劃工具:根據使用者行為協調執行計劃和策略。
  • 記憶體:抽象化並簡化 AI 應用程式的內容管理。

下列各節會詳細探討這些基石。

連線

語意核心 SDK 包含一組連接器,可讓開發人員將 LLM 和其他服務整合到現有的應用程式。 這些連接器可作為應用程式程式碼與 AI 模型或服務的橋樑。 語意核心為您處理許多常見的連線考量和難題,讓您可以專注於建置工作流程和功能。

下列程式碼片段會建立 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();

外掛程式

語意核心外掛程式會封裝要取用之應用程式和 AI 模型的標準語言函式。 您可自行建立外掛程式,或採用 SDK 提供的外掛程式。 這些外掛程式簡化了工作,以高效方式將 AI 模型的優勢較傳統的 C# 方法結合。 外掛程式函式通常分為兩種類型:語意函式原生函式

語意函式

語意函式基本上是程式碼中定義的 AI 提示,而且語意核心可視需要自訂及呼叫該提示。 您可將這些提示範本化,以使用變數、自訂提示和完成格式設定等等。

下列程式碼片段定義並註冊語意函式:

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

規劃工具是語意核心的核心元件,提供 AI 協調流程,可管理 AI 模型與外掛程式之間的無縫整合。 此層會設計使用者要求的執行策略,並動態協調外掛程式,利用 AI 輔助規劃執行複雜的工作。

請考慮下列虛擬程式碼片段:

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

上述程式碼會建立可執行的循序計劃,從本機檔案讀取內容並摘要內容。 此計劃會設定指令,使用原生函式讀取檔案,然後使用 AI 模型進行分析。

記憶體

Semantic Kernel 的向量儲存提供內嵌模型、向量資料庫和其他資料的抽象層,以簡化 AI 應用程式的上下文管理。 向量儲存與底層 LLM 或向量資料庫無關,提供統一的開發人員體驗。 您可以設定記憶體功能,以將資料儲存在各種來源或服務中,包括 Azure AI 搜尋服務和 Azure Cache for 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"
    );
}

上述程式碼將一組事實載入記憶體,以便與 AI 模型互動及協調工作時使用資料。