Förstå inbyggda funktioner

Slutförd

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 KernelFunctionCompleteTask 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.