Heim > Backend-Entwicklung > Python-Tutorial > Erstellen eines Chatbots mit Semantic Kernel – Teil-Plugins

Erstellen eines Chatbots mit Semantic Kernel – Teil-Plugins

Linda Hamilton
Freigeben: 2024-12-06 07:33:15
Original
628 Leute haben es durchsucht

In unserem vorherigen Kapitel haben wir einige der Grundkonzepte des Semantic Kernel durchgegangen und mit einem funktionierenden Agenten abgeschlossen, der in der Lage war, auf allgemeine Fragen zu antworten, jedoch mit einem vordefinierten Ton und Zweck anhand der Anweisungen.

In diesem zweiten Kapitel werden wir unserem Bibliothekar mithilfe von Plugins spezifische Fähigkeiten hinzufügen.

Was ist ein Plugin?

Ein Plugin ist eine Reihe von Funktionen, die den KI-Diensten zur Verfügung gestellt werden. Plugins kapseln Funktionalitäten und ermöglichen es dem Assistenten, Aktionen auszuführen, die nicht Teil seines nativen Verhaltens sind.

Zum Beispiel könnten wir mit Plugins dem Assistenten ermöglichen, einige Daten von einer API oder einer Datenbank abzurufen. Darüber hinaus könnte der Assistent einige Aktionen im Namen des Benutzers ausführen, typischerweise über APIs. Darüber hinaus wäre es dem Assistenten möglich, einige Teile der Benutzeroberfläche mithilfe eines Plugins zu aktualisieren.

Wie ich bereits erwähnt habe, besteht ein Plugin aus verschiedenen Funktionen. Jede Funktion wird hauptsächlich durch Folgendes definiert:

  • Beschreibung: Der Zweck der Funktion und wann sie aufgerufen werden soll. Dies hilft dem Modell bei der Entscheidung, wann es aufgerufen werden soll, wie wir im Abschnitt Funktionsaufruf sehen werden.
  • Eingabevariablen: werden zur Parametrisierung der Funktion verwendet, damit sie wiederverwendbar ist.

Semantic Kernel unterstützt verschiedene Arten von Plugins. In diesem Beitrag konzentrieren wir uns auf zwei davon: Prompt Plugin und Native Plugin.

Prompt-Plugin

Ein Prompt-Plugin ist im Grunde eine spezifische Eingabeaufforderung, die unter bestimmten Umständen aufgerufen wird. In einem typischen Szenario verfügen wir möglicherweise über eine komplexe Systemaufforderung, in der wir den Ton, den Zweck und das allgemeine Verhalten unseres Agenten definieren. Es ist jedoch möglich, dass wir möchten, dass der Agent einige konkrete Aktionen ausführt, bei denen wir bestimmte Einschränkungen und Regeln definieren müssen. In diesem Fall würden wir versuchen zu vermeiden, dass die Systemaufforderung ins Unendliche wächst, um Halluzinationen zu reduzieren und die Modellreaktion relevant und kontrolliert zu halten. Das ist der perfekte Fall für ein Prompt Plugin:

  1. Systemaufforderung: Ton, Zweck und allgemeines Verhalten.
  2. Zusammenfassungsaufforderung: einschließlich Regeln und Einschränkungen für die Erstellung einer Zusammenfassung. Beispielsweise sollte es nicht länger als zwei Absätze sein.

Ein Prompt Plugin wird durch zwei Dateien definiert:

  • config.json: Konfigurationsdatei inklusive Beschreibung, Variablen und Ausführungseinstellungen:
{
    "schema": 1,
    "description": "Plugin description",
    "execution_settings": {
        "default": {
            "max_tokens": 200,
            "temperature": 1,
            "top_p": 0.0,
            "presence_penalty": 0.0,
            "frequency_penalty": 0.0
        }
    },
    "input_variables": [
        {
            "name": "parameter_1",
            "description": "Parameter description",
            "default": ""
        }
    ]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  • skprompt.txt: Eingabeaufforderungsinhalt im Klartext. Auf Variablen aus der Konfigurationsdatei kann mit der Syntax {{$parameter_1}} zugegriffen werden.

Um ein Prompt-Plugin zum Kernel hinzuzufügen, müssen wir nur den Ordner angeben. Wenn wir beispielsweise die Ordnerstruktur /plugins/plugin_name/skprompt.txt haben, wird das Plugin wie folgt registriert:

{
    "schema": 1,
    "description": "Plugin description",
    "execution_settings": {
        "default": {
            "max_tokens": 200,
            "temperature": 1,
            "top_p": 0.0,
            "presence_penalty": 0.0,
            "frequency_penalty": 0.0
        }
    },
    "input_variables": [
        {
            "name": "parameter_1",
            "description": "Parameter description",
            "default": ""
        }
    ]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Natives Plugin

Ein natives Plugin ermöglicht es dem Modell, nativen Code (Python, C# oder Java) aufzurufen. Ein Plugin wird als Klasse dargestellt, in der jede Funktion mithilfe von Anmerkungen als vom Agenten aufrufbar definiert werden kann. Der Entwickler muss dem Modell mit den Anmerkungen einige Informationen zur Verfügung stellen: Name, Beschreibung und Argumente.

Um ein Native Plugin zu definieren, müssen wir nur die Klasse erstellen und die entsprechenden Anmerkungen hinzufügen:

self.kernel.add_plugin(parent_directory="./plugins", plugin_name="plugin_name")
Nach dem Login kopieren
Nach dem Login kopieren

Um ein natives Plugin zum Kernel hinzuzufügen, müssen wir eine neue Instanz der Klasse erstellen:

from datetime import datetime
from typing import Annotated
from semantic_kernel.functions.kernel_function_decorator import kernel_function

class MyFormatterPlugin():

    @kernel_function(name='format_current_date', description='Call to format current date to specific strftime format') # Define the function as invokable
    def formate_current_date(
        self,
        strftime_format: Annotated[str, 'Format, must follow strftime syntax'] # Describe the arguments
    ) -> Annotated[str, 'Current date on the specified format']: # Describe the return value
    return datetime.today().strftime(strftime_format)
Nach dem Login kopieren
Nach dem Login kopieren

Funktionsaufruf

Funktionsaufruf oder Planung im Semantic Kernel ist eine Möglichkeit für das Modell, eine im Kernel registrierte Funktion aufzurufen.

Für jede Benutzernachricht erstellt das Modell einen Plan, um zu entscheiden, wie geantwortet werden soll. Zunächst werden der Chatverlauf und die Funktionsinformationen verwendet, um zu entscheiden, welche Funktion (falls vorhanden) aufgerufen werden muss. Sobald es aufgerufen wurde, hängt es das Ergebnis der Funktion an den Verlauf an und entscheidet anhand der Benutzernachricht, ob die Aufgabe abgeschlossen wurde oder weitere Schritte erforderlich sind. Falls es noch nicht fertig ist, beginnt es erneut mit dem ersten Schritt, bis es die Aufgabe abgeschlossen hat oder Hilfe vom Benutzer benötigt.

Dank dieser Schleife kann das Modell Aufrufe an verschiedene Funktionen verketten. Beispielsweise könnten wir eine Funktion haben, die eine user_session (einschließlich der ID des Benutzers) zurückgibt, und eine andere, die eine current_user_id als Argument erfordert. Das Modell erstellt einen Plan, in dem es die erste Funktion aufruft, um die Benutzersitzung abzurufen, die Antwort analysiert und die Benutzer-ID als Argument für die zweite Funktion verwendet.

Building a chatbot with Semantic Kernel - Part Plugins

Im Semantic Kernel müssen wir den Agenten anweisen, Funktionsaufrufe zu verwenden. Dies erfolgt durch Definieren einer Ausführungseinstellung mit dem Funktionsauswahlverhalten als automatisch:

self.kernel.add_plugin(MyFormatterPlugin(), plugin_name="my_formatter_plugin")
Nach dem Login kopieren
Nach dem Login kopieren

Es ist wichtig zu betonen, dass je detaillierter die Beschreibungen sind, desto mehr Token werden verwendet und desto teurer ist es. Es ist wichtig, ein Gleichgewicht zwischen guten detaillierten Beschreibungen und den verwendeten Token zu finden.

Plugins für unseren Bibliothekar

Da nun klar ist, was eine Funktion ist und welchen Zweck sie hat, wollen wir sehen, wie wir sie für unseren BibliothekarAgenten optimal nutzen können.

Zu Lernzwecken definieren wir ein Native Plugin und ein Prompt Plugin:

  • Buch-Repository-Plugin: Es handelt sich um ein natives Plugin zum Abrufen von Büchern aus einem Repository.

  • Poem Creator Plugin: Es handelt sich um ein Prompt Plugin zum Erstellen eines Gedichts aus dem ersten Satz eines Buches.

Buch-Repository-Plugin

Wir verwenden die Open Library API, um die Informationen zu den Büchern abzurufen. Das Plugin gibt die Top-5-Ergebnisse der Suche zurück, einschließlich Titel, Autor und erster Satz des Buches.

Konkret verwenden wir den folgenden Endpunkt, um die Informationen abzurufen: https://openlibrary.org/search.json?q={user-query}&fields=key,title,author_name,first_sentence&limit=5.

Zuerst definieren wir das BookModel, das ein Buch in unserem System darstellt:

{
    "schema": 1,
    "description": "Plugin description",
    "execution_settings": {
        "default": {
            "max_tokens": 200,
            "temperature": 1,
            "top_p": 0.0,
            "presence_penalty": 0.0,
            "frequency_penalty": 0.0
        }
    },
    "input_variables": [
        {
            "name": "parameter_1",
            "description": "Parameter description",
            "default": ""
        }
    ]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Und jetzt ist es Zeit für die Funktion. Wir verwenden eine klare Beschreibung sowohl der Funktion als auch des Arguments. In diesem Fall verwenden wir ein komplexes Objekt als Antwort, das Modell kann es jedoch später für weitere Antworten verwenden.

self.kernel.add_plugin(parent_directory="./plugins", plugin_name="plugin_name")
Nach dem Login kopieren
Nach dem Login kopieren

Endlich können wir dieses Plugin zum Kernel hinzufügen:

from datetime import datetime
from typing import Annotated
from semantic_kernel.functions.kernel_function_decorator import kernel_function

class MyFormatterPlugin():

    @kernel_function(name='format_current_date', description='Call to format current date to specific strftime format') # Define the function as invokable
    def formate_current_date(
        self,
        strftime_format: Annotated[str, 'Format, must follow strftime syntax'] # Describe the arguments
    ) -> Annotated[str, 'Current date on the specified format']: # Describe the return value
    return datetime.today().strftime(strftime_format)
Nach dem Login kopieren
Nach dem Login kopieren

Plugin zum Erstellen von Gedichten

Wir werden dieses Plugin als Prompt-Plugin mit einigen spezifischen Einschränkungen definieren. So sehen die Eingabeaufforderung und ihre Konfiguration aus:

/plugins/poem-plugin/poem-creator/config.json:

self.kernel.add_plugin(MyFormatterPlugin(), plugin_name="my_formatter_plugin")
Nach dem Login kopieren
Nach dem Login kopieren

/plugins/poem-plugin/poem-creator/skprompt.txt:

# Create the settings
settings = AzureChatPromptExecutionSettings()

# Set the behavior as automatic
settings.function_choice_behavior = FunctionChoiceBehavior.Auto()

# Pass the settings to the agent
self.agent = ChatCompletionAgent(
    service_id='chat_completion',
    kernel=self.kernel,
    name='Assistant',
    instructions="The prompt",
    execution_settings=settings
)
Nach dem Login kopieren

Es ist unkompliziert, das Plugin zum Kernel hinzuzufügen:

class BookModel(TypedDict):
    author: str
    title: str
    first_sentence: str
Nach dem Login kopieren

Gute Praktiken

Einige Vorschläge basierend auf der vorhandenen Literatur und meiner eigenen Erfahrung:

  • Verwenden Sie Python-Syntax, um Ihre Funktion auch in .NET oder Java zu beschreiben. Aufgrund der trainierten Daten sind Modelle in der Regel besser mit Python vertraut ?
  • Konzentrieren Sie sich auf die Funktionen, insbesondere auf die Beschreibungen. Eine Funktion, ein Zweck. Versuchen Sie nicht, eine Funktion zu erstellen, die zu viele Dinge erledigt, das wäre kontraproduktiv?
  • Einfache Argumente und eine geringe Anzahl davon. Je einfacher und weniger sie sind, desto zuverlässiger ist der Aufruf der Modelle an die Funktionen ?
  • Wenn Sie viele Funktionen haben, lesen Sie die Beschreibungen sorgfältig durch, um sicherzustellen, dass es keine potenziellen Konflikte gibt, die das Modell verwirren könnten?
  • Bitten Sie ein Model (über Chatgpt oder ähnliches) um Feedback zu den Funktionsbeschreibungen. Sie sind in der Regel recht gut darin, Verbesserungen zu finden. Das gilt übrigens auch für die Entwicklung von Prompts im Allgemeinen ❓
  • Testen, testen und testen. Gerade bei Unternehmenssoftware ist Zuverlässigkeit von entscheidender Bedeutung. Stellen Sie sicher, dass das Modell in der Lage ist, die erwarteten Funktionen mit den Informationen aufzurufen, die Sie ihm per Annotation bereitgestellt haben ?

Zusammenfassung

In diesem Kapitel haben wir unseren Bibliotheksagenten mit einigen spezifischen Fähigkeiten mithilfe von Plugins und semantischer Kernel-Planung erweitert.

Erinnern Sie sich, dass der gesamte Code bereits in meinem GitHub-Repository verfügbar ist? PyChatbot für Semantic Kernel.

Im nächsten Kapitel werden wir einige Funktionen in den Chat integrieren, um in Echtzeit zu überprüfen, wie unser Modell unsere Plugins aufruft und mit ihnen interagiert, indem wir einen Inspektor erstellen.

Das obige ist der detaillierte Inhalt vonErstellen eines Chatbots mit Semantic Kernel – Teil-Plugins. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage