Förstå inbyggda funktioner
Inbyggda funktioner är funktioner skrivna i inbyggd kod som kan anropas av Semantic Kernel SDK i ditt program. De är användbara för att utföra uppgifter som stora språkmodeller (LLM) inte kan utföra på egen hand. Du kan tänka dig en intern funktion som en färdighet som ditt program kan utföra.
I senare moduler får du lära dig hur du använder semantisk kernel för att automatiskt anropa inbyggda funktioner som du skapar och kombinera logiken med uppmaningar till LLM. Genom att kombinera tjänster för chattens slutförande med funktionella färdigheter kan du skapa en AI-agent som kan utföra en mängd olika uppgifter. Men nu ska vi fokusera på att utforma inbyggda funktioner.
Inbyggda funktioner har ett visst format och en rekommenderad filstruktur som ska användas av kerneln. Interna funktioner bör använda dekoratören KernelFunction
i sina definitioner. De använder också ett Description
fält för parametrar. Till exempel:
[KernelFunction, Description("Convert an amount of currency to USD")]
public static string ConvertCurrency(
[Description("The currency")] string currency,
[Description("The amount")] double amount)
{
// Code to convert currency
}
Du kan importera dina inbyggda funktioner till kerneln som ett plugin-program. Klasser som innehåller inbyggda funktioner bör placeras i en "Plugins"-katalog. Relaterade funktioner bör placeras i samma fil för att hålla koden organiserad. Du kan också använda underkataloger i katalogen "Plugins" för att organisera koden ytterligare.
Anta till exempel att du har ett att göra-lista-program. En användare vill slutföra ett objekt i sin att göra-lista. Den stora språkmodellen (LLM) kan inte komma åt användarens att göra-lista direkt, men du kan skriva en intern funktion för att komma åt listan och markera ett objekt som slutfört. Att göra-listfilen kan till exempel innehålla följande:
{
"todoList": [
{
"task": "Complete coding exercise",
"completed": false
},
{
"task": "Practice Mandarin",
"completed": false
},
{
"task": "Buy groceries",
"completed": false
}
]
}
Du kan skapa en fil TodoListPlugin.cs
i katalogen Plugins med kod för att markera uppgiften som slutförd:
using System.ComponentModel;
using System.Text.Json;
using System.Text.Json.Nodes;
using Microsoft.SemanticKernel;
public class TodoListPlugin
{
[KernelFunction, Description("Mark a todo list item as complete")]
public static string CompleteTask([Description("The task to complete")] string task)
{
// Read the JSON file
string jsonFilePath = $"{Directory.GetCurrentDirectory()}/todo.txt";
string jsonContent = File.ReadAllText(jsonFilePath);
// Parse the JSON content
JsonNode todoData = JsonNode.Parse(jsonContent);
// Find the task and mark it as complete
JsonArray todoList = (JsonArray) todoData["todoList"];
foreach (JsonNode taskNode in todoList)
{
if (taskNode["task"].ToString() == task)
{
taskNode["completed"] = true;
break;
}
}
// Save the modified JSON back to the file
File.WriteAllText(jsonFilePath, JsonSerializer.Serialize(todoData));
return $"Task '{task}' marked as complete.";
}
}
Lägg märke till dekoratören KernelFunction
på CompleteTask
funktionen. Den här dekoratören talar om för kerneln att den här funktionen kan nås. Dekoratören Description
talar om för kerneln vad funktionen gör. Funktionen accepterar task
som en sträng. Variabler för kernelfunktioner bör innehålla en beskrivning som förklarar vad variabeln är. Den här funktionen returnerar också en sträng som låter användaren veta att uppgiften har markerats som slutförd.
Program.cs
I filen kan du importera och anropa den här inbyggda funktionen på liknande sätt som du anropar ett av de inbyggda plugin-program. Till exempel:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
"your-deployment-name",
"your-endpoint",
"your-api-key",
"deployment-model");
var kernel = builder.Build();
kernel.ImportPluginFromType<TodoListPlugin>();
var result = await kernel.InvokeAsync<string>(
"TodoListPlugin",
"CompleteTask",
new() {{ "task", "Buy groceries" }}
);
Console.WriteLine(result);
I det här exemplet kernel.InvokeAsync
anropas med plugin-namnet, funktionsnamnet och argumenten. Argumentet task
är inställt på "Köp matvaror". Funktionen markerar uppgiften som slutförd i att göra-listfilen och returnerar ett meddelande till användaren.
Nu kan AI-agenten hjälpa användaren att slutföra uppgifter i sin att göra-lista. Du kan också välja att ange returtypen för funktionen i anropet InvokeAsync
. Annars returneras ett FunctionResult
objekt.
I nästa övning övar du på att skapa egna plugin-program med inbyggda funktioner.