.NET에 대한 의미론적 커널 개요

이 문서에서는 의미론적 커널의 핵심 개념 및 기능을 살펴봅니다. 의미론적 커널은 .NET 애플리케이션에서 AI로 작업할 때 권장되는 강력한 옵션입니다. 앞의 섹션에서는 다음을 알아봅니다.

  • 프로젝트에 의미론적 커널을 추가하는 방법
  • 의미론적 커널의 핵심 개념

이 기사는 특히 .NET의 컨텍스트에서 Semantic Kernel에 대한 소개 개요 역할을 합니다. 의미론적 커널에 대한 좀 더 포괄적인 정보 및 학습은 다음 리소스를 참조하세요.

.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();

의미론적 커널 이해

의미론적 커널은 C#, Python, Java와 같은 기존 프로그래밍 언어로 OpenAI, Azure OpenAI, Hugging Face와 같은 AI 모델 및 서비스를 통합하고 오케스트레이션하는 오픈 소스 SDK입니다.

의미론적 커널 SDK는 다음과 같은 방법으로 엔터프라이즈 개발자에게 혜택을 줍니다.

  • AI 기능을 기존 애플리케이션에 통합하여 엔터프라이즈 제품에 대한 응집력 있는 솔루션을 사용하도록 간소화합니다.
  • 복잡성을 줄이는 추상화 기능을 제공하여 다양한 AI 모델 또는 서비스를 사용하는 학습 곡선을 최소화합니다.
  • AI 모델의 프롬프트 및 응답의 예측할 수 없는 동작을 줄여 안정성을 개선합니다. 프롬프트를 미세 조정하고 작업을 계획하여 제어되고 예측 가능한 사용자 환경을 만들 수 있습니다.

의미론적 커널은 다음과 같은 몇 가지 핵심 개념을 중심으로 빌드됩니다.

  • 연결: 외부 AI 서비스 및 데이터 원본과 인터페이스합니다.
  • 플러그 인: 애플리케이션에서 사용할 수 있는 함수를 캡슐화합니다.
  • Planner: 사용자의 동작에 따라 실행 계획 및 전략을 오케스트레이션합니다.
  • 메모리: 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

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 Search 및 Azure Cache for Redis를 비롯한 다양한 원본 또는 서비스에 데이터를 저장하도록 메모리 기능을 구성할 수 있습니다.

다음 코드 조각을 살펴봅니다.

var facts = new Dictionary<string,string>();
facts.Add(
    "Azure Machine Learning; https://video2.skills-academy.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://video2.skills-academy.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 모델과 상호 작용하고 작업을 오케스트레이션할 때 데이터를 사용할 수 있도록 일련의 팩트를 메모리에 로드합니다.