Hinweis: Dieses Produkt wurde unabhängig entwickelt und ist nicht mit OpenAI verbunden, unterstützt oder gesponsert.
Installieren Sie dieses Paket als Abhängigkeit mit Composer.
composer require manuelkiessling/ai-tool-bridge
Die größte Herausforderung bei der Integration von KI in ein beliebiges Projekt besteht darin, die Interaktionen zwischen der KI und dem Rest Ihrer Anwendung zu verwalten. Dies wird besonders komplex, wenn die KI API-Aufrufe durchführen muss, um Informationen abzurufen oder Aktionen auszulösen.
AI Tool Bridge für PHP löst dieses Problem auf elegante Weise, indem es eine unkomplizierte Schnittstelle zum Definieren von „Toolfunktionen“ bietet, die die KI nutzen kann, wenn sie mit externen Systemen interagieren muss.
Eine wichtige Optimierung ist die Fähigkeit der Bibliothek, die erforderliche JSON-Struktur für eine Toolfunktion zu generieren. Dazu fordert es nur die erforderlichen Werte von der KI an und generiert dann den JSON basierend auf einem bereitgestellten JSON-Schema. Dieser Ansatz garantiert die Gültigkeit des endgültigen JSON, der Ihren Anwendungscode erreicht.
Zu den Hauptmerkmalen dieser Bibliothek gehören:
Nehmen wir an, Sie betreiben ein E-Commerce-Unternehmen und möchten eine KI-Chat-Schnittstelle bereitstellen, mit der Sie Ihren Produktkatalog durchsuchen können. Zu diesem Zweck haben Sie sich für die Integration in das GPT-4-Modell von OpenAI über die ChatGPT-API entschieden.
Sie werden den KI-Assistenten wahrscheinlich wie folgt auffordern: „Sie sind ein freundlicher und hilfsbereiter Einkaufsassistent, der den Benutzer über unseren Produktkatalog informiert …“ und so weiter.
Sie können der Eingabeaufforderung jedoch nicht Ihren gesamten Produktkatalog hinzufügen. Wenn Ihr Benutzer die KI also bittet, „mir etwas über einige angebotene Küchenhelfer zu erzählen“, müssen Sie erkennen, dass die KI an diesem Punkt des Gesprächs Informationen von Ihren E-Commerce-Backend-Systemen benötigt (z. B. indem Sie eine Anfrage an Ihr Produkt stellen). Such-API mit Abfrage „Küchenhelfer“) müssen Sie diese Informationen für die KI abrufen und die resultierenden Informationen an den KI-Assistenten zurückgeben, der dann die Produktinformationen für den Benutzer zusammenfassen kann.
Die KI weiß am besten, wann es Zeit ist, diese Informationen aus der Außenwelt abzurufen. Weil es komplex und fehleranfällig ist, Ihren eigenen Code dazu zu bringen, der Konversation zuzuhören und ihn raten zu lassen, wann es Zeit ist, den API-Aufruf für die Produktsuche durchzuführen, und die Idee, eine leistungsstarke KI zu verwenden, etwas sinnlos macht.
Der beste Ansatz besteht darin, die KI zu erkennen zu lassen, dass es an der Zeit ist, mit der Außenwelt zu sprechen, und dies auf strukturierte und unmissverständliche Weise zu tun.
Die Lösung besteht darin, der KI innerhalb der ersten Systemaufforderung beizubringen, dass ihr ein oder mehrere Werkzeuge zur Verfügung stehen, die sie nach Belieben verwenden kann.
Dies geschieht, indem zunächst eine sogenannte Tool-Funktionsdefinition geschrieben wird, etwa so:
<?php
declare (strict_types= 1 );
namespace ManuelKiessling AiToolBridge Example ;
use ManuelKiessling AiToolBridge ToolFunctionCallResult ;
use ManuelKiessling AiToolBridge ToolFunctionCallResultStatus ;
use ManuelKiessling AiToolBridge ToolFunction ;
class MyProductSearchToolFunction implements ToolFunction
{
public function getName (): string
{
return ' productSearch ' ;
}
public function getDescription (): string
{
return ' allows to search the product catalogue and retrieve information about products ' ;
}
public function getInputJsonSchema (): string
{
return <<<'JSON'
{
"type": "object",
"properties": {
"searchterms": {
"type": "string"
}
},
"required": [
"searchterms"
]
}
JSON;
}
public function invoke ( string $ json ): ToolFunctionCallResult
{
// we will talk about this in a minute
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
}
Stellen Sie sicher, dass der Name, die Beschreibung und die Objektschlüssel im JSON-Schema nützlich und beschreibend sind – dies hilft der KI zu verstehen, wann und wie diese Toolfunktion verwendet werden soll.
Sie können mehrere Tool-Funktionsdefinitionen definieren – beispielsweise könnte eine weitere Tool-Funktion hinzugefügt werden, die es der KI ermöglicht, Produkte in den Warenkorb zu legen, wenn der Benutzer danach fragt. Wir werden dieses Beispiel jedoch einfach halten.
Als nächstes müssen Sie die Tool Bridge in Ihr bestehendes KI-Setup integrieren. Dies geschieht mit dem AiToolBridge
-Helfer:
class Example
{
private AiToolBridge $ aiToolBridge ;
private MyAiService $ myAiService ;
public function __construct ()
{
$ this -> myAiService = new MyAiService ();
$ myProductSearchToolFunction = new MyProductSearchToolFunction ();
$ this -> aiToolBridge = new AiToolBridge (
new $ this -> myAiService ,
[ $ myProductSearchToolFunction ],
);
$ this -> myAiService -> setSystemPrompt (
" You are a friendly and helpful shopping assistant that informs the user about our product catalog...
{ $ this -> aiToolBridge -> getPrompt ()}"
);
}
}
Dies setzt natürlich mehrere Annahmen voraus – die Art und Weise, wie Ihre Anwendung strukturiert ist und wie Sie einen KI-Dienst integriert haben, könnte völlig unterschiedlich sein.
Die Integrationspunkte sind jedoch immer identisch. Da diese Bibliothek in der Lage sein muss, mit dem KI-Assistenten zu kommunizieren, müssen Sie ein Objekt bereitstellen, das die Schnittstelle AiAssistantMessenger
implementiert. Ein einfaches Beispiel finden Sie unter src/Example/MyAiService.php.
Sie müssen auch die Werkzeugfunktionen anhängen, die Sie beim Erstellen des AiToolBridge-Objekts definiert haben.
Damit die KI versteht, dass sie Ihre Tools verwenden kann, müssen Sie als Nächstes Ihre eigene KI-„System“-Eingabeaufforderung um die von dieser Bibliothek generierte Eingabeaufforderung erweitern. Verwenden Sie dazu die Methode AiToolBridge::getPrompt
wie oben gezeigt.
Ihre Anwendung und diese Bibliothek sind nun vollständig integriert und eingerichtet. Ein zentraler Punkt fehlt jedoch – das tatsächliche Verhalten, das ausgelöst werden sollte, wenn die KI Ihre Werkzeugfunktion nutzt.
Schauen wir uns noch einmal den invoke
der Klasse MyProductSearchToolFunction
an:
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
Hier muss die Magie geschehen – das heißt, hier muss die gesamte Logik – IHRE Logik – implementiert werden, die für die eigentliche Produktsuche erforderlich ist.
Hier müssen Sie sich in keiner Weise um die KI-Integration kümmern – genau darum geht es in dieser Bibliothek, die die schwere Arbeit für Sie erledigt.
Genauer gesagt: Wenn die invoke
aufgerufen wird, ist die schwere Arbeit bereits erledigt – Sie können sicher sein, dass die Methode mit einem JSON-String aufgerufen wird, der einerseits genau die Struktur aufweist, die Sie mit der JSON-Schema-In-Methode definiert haben MyProductSearchToolFunction::getInputJsonSchema
und wird andererseits mit den Werten gefüllt, die die KI bei der Verwendung der Tool-Funktion als nützlich erachtete.
Wenn also beispielsweise das KI-Benutzer-Gespräch so ablaufen würde:
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
Dann hat die KI erkannt, dass sie die Tool-Funktion productSearch
verwenden soll, um nach kitchen helpers
zu suchen, was schließlich zu einem Aufruf von MyProductSearchToolFunction::invoke
mit dem folgenden JSON-String führt:
{
"searchterms" : " kitchen helpers "
}
Sie haben völlige Freiheit hinsichtlich der Implementierung dieser Methode (solange Sie ein ToolFunctionCallResult
-Objekt zurückgeben). In unserem Beispiel ist es natürlich sinnvoll, tatsächlich eine Produktsuche durchzuführen, aber wie Sie dies tun, liegt ganz bei Ihnen. Fragen Sie eine Datenbank ab, sprechen Sie mit einer API oder irgendetwas anderem, das Produktionsinformationen über „Küchenhelfer“ abruft.
Die beiden interessierenden Felder des ToolFunctionCallResult
Objekts, die Sie zurückgeben müssen, sind die message
und die data
. In unserem Beispiel könnte das so aussehen:
public function invoke ( string $ json ): ToolFunctionCallResult
{
$ jsonAsArray = json_decode ( $ json , true );
// use $jsonAsArray['searchterm'] when talking to a DB or an API...
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
' Found 2 matching products ' ,
[
[
' id ' => 84 ,
' name ' => ' Kawaii Chick Egg Separator ' ,
' price ' => 14.99 ,
' description ' => ' Whether you’re a beginner baker or an experienced cook, the Kawaii Chick Egg Separator is a must-have kitchen tool that will make separating eggs a breeze. '
],
[
' id ' => 2389 ,
' name ' => ' BlendJet 2 ' ,
' price ' => 49.99 ,
' description ' => ' Imagine the freedom of being able to go anywhere and blend your favorite smoothies, shakes, margaritas, frappés, or baby food without the limitations of a regular blender. '
]
]
);
}
Das data
ist nicht auf ein bestimmtes Schema beschränkt.
Schauen wir uns das letzte Stück an und kehren zu unserer Example
zurück. Wir gehen davon aus, dass es in Ihrer Implementierung eine Methode handleAssistantMessage
gibt, die immer dann aufgerufen wird, wenn Ihre Anwendung eine neue KI-Assistentennachricht abgerufen hat – auch dies ist ein sehr spezifisches Implementierungsdetail Ihrer Anwendung.
Dies ist der Ort – BEVOR wir die Nachricht an den Benutzer senden! – wo wir uns in das Gespräch einmischen müssen. Dadurch kann die Werkzeugbibliothek jede Werkzeugfunktionsanfrage der KI erkennen und entsprechend verarbeiten.
Wenn eine Tool-Funktion aufgerufen wurde und erfolgreich war, müssen wir das Ergebnis an den KI-Assistenten zurückmelden – auf diese Weise erfährt er, welche Produkte zu seiner Produktsuche passen:
<?php
declare (strict_types= 1 );
class Example
{
// ...
public function handleAssistantMessage ( string $ message ): void
{
$ toolFunctionCallResult = $ this -> aiToolBridge -> handleAssistantMessage ( $ message );
if ( is_null ( $ toolFunctionCallResult )) {
// The AI didn't use a tool function, thus its message is meant for the user
$ this -> sendAssistantMessageToUser ( $ message );
} else {
// The AI used a tool function, we now need to send the result to the AI
$ dataAsJson = json_encode ( $ toolFunctionCallResult -> data );
$ this -> sendUserMessageToAssistant ( $ toolFunctionCallResult -> message . ' ' . $ dataAsJson );
}
}
public function sendAssistantMessageToUser ( string $ message ): void
{
// whatever code is needed to show an AI assistant message to the user
}
public function sendUserMessageToAssistant ( string $ message ): void
{
// whatever code is needed to send a message to the AI assistant
}
}
Wie Sie sehen können, agieren wir, wenn wir den KI-Assistenten über das Ergebnis der Rollfunktion informieren, als Benutzer, der dem Assistenten davon erzählt. Denn aus Sicht des KI-Assistenten ist es der Benutzer, der der KI das Werkzeug überhaupt zur Verfügung stellt! Sehen Sie sich die Methode src/AiToolBridge.php an, um zu verstehen, warum dies der Fall ist.
Beiträge sind willkommen! Um einen Beitrag zu leisten, machen Sie sich bitte mit CONTRIBUTING.md vertraut.
Die Sicherheit der Benutzerinformationen hat oberste Priorität und wir begrüßen den Beitrag externer Sicherheitsforscher. Wenn Sie glauben, ein Sicherheitsproblem in der in diesem Repository verwalteten Software gefunden zu haben, lesen Sie bitte SECURITY.md, um Anweisungen zum Einreichen eines Schwachstellenberichts zu erhalten.
AI Tool Bridge für PHP unterliegt dem Urheberrecht von Manuel Kießling und ist zur Nutzung gemäß den Bedingungen der GNU General Public License (GPL-3.0 oder höher) lizenziert, wie von der Free Software Foundation veröffentlicht.
Weitere Informationen finden Sie unter LIZENZ und HINWEIS.