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.
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:
Semantic Kernel unterstützt verschiedene Arten von Plugins. In diesem Beitrag konzentrieren wir uns auf zwei davon: Prompt Plugin und Native 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:
Ein Prompt Plugin wird durch zwei Dateien definiert:
{ "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": "" } ] }
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": "" } ] }
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")
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)
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.
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")
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.
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.
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": "" } ] }
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")
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)
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")
/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 )
Es ist unkompliziert, das Plugin zum Kernel hinzuzufügen:
class BookModel(TypedDict): author: str title: str first_sentence: str
Einige Vorschläge basierend auf der vorhandenen Literatur und meiner eigenen Erfahrung:
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!