Freigeben über


Grundlegendes zur Ki-Bibliothek von Teams

Die KI-Bibliothek von Teams unterstützt JavaScript und vereinfacht die Erstellung von Bots, die mit Microsoft Teams interagieren können. Außerdem wird die Migration vorhandener Bots zur Verwendung VON KI-gestützten Features erleichtert. Es unterstützt die Migration von Messaging-, Nachrichtenerweiterungs- und adaptiven Kartenfunktionen zum neuen Format. Sie können ihre vorhandenen Teams-Apps auch mit diesen Features aktualisieren.

Zuvor haben Sie das BotBuilder SDK zum Erstellen von Bots für Teams verwendet. Die KI-Bibliothek von Teams wurde entwickelt, um diesen Prozess zu vereinfachen und umfasst KI-Unterstützung. Zunächst können Sie Ihren Bot ohne KI aktualisieren, aber nach dem Upgrade kann er eine Verbindung mit KI oder llMs (Large Language Models) herstellen, die in der KI-Bibliothek verfügbar sind.

Mit der KI-Bibliothek von Teams können Sie sich auf Folgendes konzentrieren:

Aktivitätshandler

Die KI-Bibliothek von Teams unterstützt die folgenden Aktivitätshandler:

Sie müssen die KI-Bibliothek verwenden, um bot- und adaptive Kartenhandler für die Quelldatei zu gerüsten. In den folgenden Abschnitten haben wir die Beispiele aus der KI-Bibliothek verwendet, um jede Funktion und den Pfad zur Migration zu erläutern.

Senden oder Empfangen von Nachrichten

Sie können Nachrichten mithilfe von Bot Framework senden und empfangen. Die App lauscht auf Benutzernachrichten, löscht den Konversationszustand beim Empfang und antwortet. Es verfolgt auch die Anzahl der Nachrichten in einer Unterhaltung und gibt die Nachricht des Benutzers mit der Anzahl zurück.

 // Listen for user to say "/reset" and then delete conversation state
    app.OnMessage("/reset", ActivityHandlers.ResetMessageHandler);

    // Listen for ANY message to be received. MUST BE AFTER ANY OTHER MESSAGE HANDLERS
    app.OnActivity(ActivityTypes.Message, ActivityHandlers.MessageHandler);

    return app;

Nachrichtenerweiterungen

Richten Sie im Bot Framework SDK TeamsActivityHandlerden Abfragehandler für Nachrichtenerweiterungen ein, indem Sie Handlermethoden erweitern. Die App lauscht auf Suchaktionen und Tippen auf Elemente. Es formatiert Suchergebnisse als Hero-Karten, die Paketinformationen anzeigen, und zeigt sie in der Messaging-Erweiterung an.

// Listen for search actions
    app.MessageExtensions.OnQuery("searchCmd", activityHandlers.QueryHandler);
    // Listen for item tap
    app.MessageExtensions.OnSelectItem(activityHandlers.SelectItemHandler);

    return app;

 // Format search results in ActivityHandlers.cs

            List<MessagingExtensionAttachment> attachments = packages.Select(package => new MessagingExtensionAttachment
            {
                ContentType = HeroCard.ContentType,
                Content = new HeroCard
                {
                    Title = package.Id,
                    Text = package.Description
                },
                Preview = new HeroCard
                {
                    Title = package.Id,
                    Text = package.Description,
                    Tap = new CardAction
                    {
                        Type = "invoke",
                        Value = package
                    }
                }.ToAttachment()
            }).ToList();

            // Return results as a list

            return new MessagingExtensionResult
            {
                Type = "result",
                AttachmentLayout = "list",
                Attachments = attachments
            };

Funktionen für adaptive Karten

Registrieren Sie Aktionshandler für adaptive Karten mithilfe der app.adaptiveCards -Eigenschaft. Die App lauscht auf Nachrichten mit static oder dynamic Schlüsselwörtern und gibt eine adaptive Karte mit StaticMessageHandler() oder DynamicMessageHandler()zurück. Außerdem lauscht es auf Abfragen aus einer dynamischen Such- Karte und Absendenschaltflächen.

// Listen for messages that trigger returning an adaptive card
    app.OnMessage(new Regex(@"static", RegexOptions.IgnoreCase), activityHandlers.StaticMessageHandler);
    app.OnMessage(new Regex(@"dynamic", RegexOptions.IgnoreCase), activityHandlers.DynamicMessageHandler);

    // Listen for query from dynamic search card
    app.AdaptiveCards.OnSearch("nugetpackages", activityHandlers.SearchHandler);
    // Listen for submit buttons
    app.AdaptiveCards.OnActionSubmit("StaticSubmit", activityHandlers.StaticSubmitHandler);
    app.AdaptiveCards.OnActionSubmit("DynamicSubmit", activityHandlers.DynamicSubmitHandler);

    // Listen for ANY message to be received. MUST BE AFTER ANY OTHER HANDLERS
    app.OnActivity(ActivityTypes.Message, activityHandlers.MessageHandler);

    return app;

Botlogik zum Behandeln einer Aktion

Der Bot reagiert auf die Eingabe des Benutzers mit der Aktion LightsOn , um das Licht einzuschalten.

Das folgende Beispiel zeigt, wie die Teams KI-Bibliothek es ermöglicht, die Botlogik für die Behandlung einer Aktion LightsOn zu verwalten oder LightsOff mit der mit OpenAI verwendeten Eingabeaufforderung zu verbinden:

/ Create AI Model
if (!string.IsNullOrEmpty(config.OpenAI?.ApiKey))
{
    builder.Services.AddSingleton<OpenAIModel>(sp => new(
        new OpenAIModelOptions(config.OpenAI.ApiKey, "gpt-3.5-turbo")
        {
            LogRequests = true
        },
        sp.GetService<ILoggerFactory>()
    ));
}
else if (!string.IsNullOrEmpty(config.Azure?.OpenAIApiKey) && !string.IsNullOrEmpty(config.Azure.OpenAIEndpoint))
{
    builder.Services.AddSingleton<OpenAIModel>(sp => new(
        new AzureOpenAIModelOptions(
            config.Azure.OpenAIApiKey,
            "gpt-35-turbo",
            config.Azure.OpenAIEndpoint
        )
        {
            LogRequests = true
        },
        sp.GetService<ILoggerFactory>()
    ));
}
else
{
    throw new Exception("please configure settings for either OpenAI or Azure");
}

// Create the bot as transient. In this case the ASP Controller is expecting an IBot.
builder.Services.AddTransient<IBot>(sp =>
{
    // Create loggers
    ILoggerFactory loggerFactory = sp.GetService<ILoggerFactory>()!;

    // Create Prompt Manager
    PromptManager prompts = new(new()
    {
        PromptFolder = "./Prompts"
    });

    // Adds function to be referenced in the prompt template
    prompts.AddFunction("getLightStatus", async (context, memory, functions, tokenizer, args) =>
    {
        bool lightsOn = (bool)(memory.GetValue("conversation.lightsOn") ?? false);
        return await Task.FromResult(lightsOn ? "on" : "off");
    });

    // Create ActionPlanner
    ActionPlanner<AppState> planner = new(
        options: new(
            model: sp.GetService<OpenAIModel>()!,
            prompts: prompts,
            defaultPrompt: async (context, state, planner) =>
            {
                PromptTemplate template = prompts.GetPrompt("sequence");
                return await Task.FromResult(template);
            }
        )
        { LogRepairs = true },
        loggerFactory: loggerFactory
    );

    return new TeamsLightBot(new()
    {
        Storage = sp.GetService<IStorage>(),
        AI = new(planner),
        LoggerFactory = loggerFactory,
        TurnStateFactory = () =>
        {
            return new AppState();
        }
    });
});

// LightBotActions defined in LightBotActions.cs
    
[Action("LightsOn")]
        public async Task<string> LightsOn([ActionTurnContext] ITurnContext turnContext, [ActionTurnState] AppState turnState)
        {
            turnState.Conversation.LightsOn = true;
            await turnContext.SendActivityAsync(MessageFactory.Text("[lights on]"));
            return "the lights are now on";
        }

        [Action("LightsOff")]
        public async Task<string> LightsOff([ActionTurnContext] ITurnContext turnContext, [ActionTurnState] AppState turnState)
        {
            turnState.Conversation.LightsOn = false;
            await turnContext.SendActivityAsync(MessageFactory.Text("[lights off]"));
            return "the lights are now off";
        }

        [Action("Pause")]
        public async Task<string> LightsOff([ActionTurnContext] ITurnContext turnContext, [ActionParameters] Dictionary<string, object> args)
        {
            // Try to parse entities returned by the model.
            // Expecting "time" to be a number of milliseconds to pause.
            if (args.TryGetValue("time", out object? time))
            {
                if (time != null && time is string timeString)
                {
                    if (int.TryParse(timeString, out int timeInt))
                    {
                        await turnContext.SendActivityAsync(MessageFactory.Text($"[pausing for {timeInt / 1000} seconds]"));
                        await Task.Delay(timeInt);
                    }
                }
            }

            return "done pausing";
        }

Abfrage der Nachrichtenerweiterung

Die KI-Bibliothek von Teams bietet eine intuitivere Möglichkeit zum Erstellen von Handlern für Abfragebefehle der Nachrichtenerweiterung, die zusammen mit dem vorhandenen Teams Bot Framework SDK verwendet werden.

Im Folgenden finden Sie ein Beispiel dafür, wie Sie den Code so strukturieren können, dass eine Nachrichtenerweiterungsabfrage für den searchCmd Befehl verarbeitet wird.

// Listen for search actions
    app.MessageExtensions.OnQuery("searchCmd", activityHandlers.QueryHandler);
    // Listen for item tap
    app.MessageExtensions.OnSelectItem(activityHandlers.SelectItemHandler);

    return app;

 // Format search results
            List<MessagingExtensionAttachment> attachments = packages.Select(package => new MessagingExtensionAttachment
            {
                ContentType = HeroCard.ContentType,
                Content = new HeroCard
                {
                    Title = package.Id,
                    Text = package.Description
                },
                Preview = new HeroCard
                {
                    Title = package.Id,
                    Text = package.Description,
                    Tap = new CardAction
                    {
                        Type = "invoke",
                        Value = package
                    }
                }.ToAttachment()
            }).ToList();

            return new MessagingExtensionResult
            {
                Type = "result",
                AttachmentLayout = "list",
                Attachments = attachments
            };

Absichten für Aktionen

Eine einfache Schnittstelle für Aktionen und Vorhersagen ermöglicht Bots, sicher zu reagieren. Umgebungspräsenz hilft Bots dabei, die Absicht zu erlernen, Eingabeaufforderungen basierend auf der Geschäftslogik zu verwenden und Antworten zu generieren. Mit der Teams KI-Bibliothek werden in der Eingabeaufforderung die Aktionen des Bots beschrieben und Beispiele bereitgestellt.

Der Unterhaltungsverlauf ermöglicht einen natürlichen Dialog, z. B . das Hinzufügen von Müsli zur Einkaufsliste, gefolgt von Kaffee, was darauf hinweist, dass Kaffee zur Liste hinzugefügt werden sollte.

Im Folgenden wird eine Konversation mit einem KI-Assistent dargestellt. Die KI-Assistent kann Listen verwalten und erkennt die folgenden Befehle:

  • TUN <action> <optional entities>
  • SAGEN <response>

Die folgenden Aktionen werden unterstützt:

  • addItem list="<list name>" item="<text>"
  • removeItem list="<list name>" item="<text>"
  • summarizeLists

Alle Entitäten sind erforderliche Parameter für Aktionen.

  • Aktuelle Listennamen:

    {{conversation.listNames}} 
    
    
    Examples:  
    
    Human: remind me to buy milk
    AI: DO addItem list="groceries" item="milk" THEN SAY Ok I added milk to your groceries list
    Human: we already have milk
    AI: DO removeItem list="groceries" item="milk" THEN SAY Ok I removed milk from your groceries list
    Human: buy ingredients to make margaritas
    AI: DO addItem list="groceries" item="tequila" THEN DO addItem list="groceries" item="orange liqueur" THEN DO addItem list="groceries" item="lime juice" THEN SAY Ok I added tequila, orange liqueur, and lime juice to your groceries list
    Human: do we have milk
    AI: DO findItem list="groceries" item="milk"
    Human: what's in my grocery list
    AI: DO summarizeLists  
    Human: what's the contents of all my lists?
    AI: DO summarizeLists
    Human: show me all lists but change the title to Beach Party
    AI: DO summarizeLists
    Human: show me all lists as a card and sort the lists alphabetically
    AI: DO summarizeLists
    
    
  • Unterhaltungsverlauf:

    {{conversation.(history}} 
    
  • Aktuelle Abfrage:

    Human: {{activity.text}} 
    
  • Aktuelle Listennamen:

    {{conversation.listNames}}
    
  • KI: Die Botlogik ist optimiert, um Handler für Aktionen wie addItem und removeItemeinzuschließen. Diese Unterscheidung zwischen Aktionen und Eingabeaufforderungen dient als leistungsstarkes Tool, da sie KI bei der Ausführung der Aktionen und Eingabeaufforderungen anleitet.

        [Action("AddItem")]
        public string AddItem([ActionTurnState] ListState turnState, [ActionParameters] Dictionary<string, object> parameters)
        {
            ArgumentNullException.ThrowIfNull(turnState);
            ArgumentNullException.ThrowIfNull(parameters);

            string listName = GetParameterString(parameters, "list");
            string item = GetParameterString(parameters, "item");

            IList<string> items = GetItems(turnState, listName);
            items.Add(item);
            SetItems(turnState, listName, items);

            return "item added. think about your next action";
        }

        [Action("RemoveItem")]
        public async Task<string> RemoveItem([ActionTurnContext] ITurnContext turnContext, [ActionTurnState] ListState turnState, [ActionParameters] Dictionary<string, object> parameters)
        {
            ArgumentNullException.ThrowIfNull(turnContext);
            ArgumentNullException.ThrowIfNull(turnState);
            ArgumentNullException.ThrowIfNull(parameters);

            string listName = GetParameterString(parameters, "list");
            string item = GetParameterString(parameters, "item");

            IList<string> items = GetItems(turnState, listName);

            if (!items.Contains(item))
            {
                await turnContext.SendActivityAsync(ResponseBuilder.ItemNotFound(listName, item)).ConfigureAwait(false);
                return "item not found. think about your next action";
            }

            items.Remove(item);
            SetItems(turnState, listName, items);
            return "item removed. think about your next action";
        }

Nächster Schritt