Remarque : ce produit est développé indépendamment et n'est pas affilié, approuvé ou sponsorisé par OpenAI.
Installez ce package en tant que dépendance à l'aide de Composer.
composer require manuelkiessling/ai-tool-bridge
Le défi majeur lors de l’intégration de l’IA dans n’importe quel projet est de gérer les interactions entre l’IA et le reste de votre application. Cela devient particulièrement complexe lorsque l’IA doit effectuer des appels API pour récupérer des informations ou déclencher des actions.
AI Tool Bridge pour PHP résout ce problème avec élégance en offrant une interface simple pour définir des « fonctions d'outils » que l'IA peut utiliser lorsqu'elle a besoin d'interagir avec des systèmes externes.
Une optimisation importante est la capacité de la bibliothèque à générer la structure JSON requise pour une fonction d'outil. Pour ce faire, il demande uniquement les valeurs requises à l'IA, puis génère le JSON basé sur un schéma JSON fourni. Cette approche garantit la validité du JSON final qui atteint le code de votre application.
Les principales fonctionnalités de cette bibliothèque incluent :
Supposons que vous ayez une entreprise de commerce électronique et que vous souhaitiez fournir une interface de chat IA qui permet de parcourir votre catalogue de produits. Pour ce faire, vous avez décidé d'intégrer le modèle GPT-4 d'OpenAI via l'API ChatGPT.
Vous demanderez probablement à l'assistant IA "Vous êtes un assistant d'achat convivial et utile qui informe l'utilisateur sur notre catalogue de produits..." et ainsi de suite.
Cependant, vous ne pouvez pas ajouter l'intégralité de votre catalogue de produits à l'invite. Ainsi, lorsque votre utilisateur demande à l'IA de "me parler de certains aides de cuisine proposés", vous devez identifier qu'à ce stade de la conversation, l'IA a besoin d'informations provenant de vos systèmes backend de commerce électronique (par exemple en faisant une demande à votre Product API de recherche avec la requête « aides de cuisine »), vous devez récupérer ces informations pour l'IA et vous devez fournir les informations résultantes à l'assistant IA, qui peut ensuite résumer les informations sur le produit pour l'utilisateur.
L’IA sait mieux quand il est temps de récupérer ces informations du monde extérieur. Parce que faire en sorte que votre propre code écoute la conversation et lui fasse deviner quand il est temps de faire l'appel de l'API de recherche de produits est complexe et sujet aux erreurs, et rend l'idée d'utiliser une IA puissante un peu inutile.
La meilleure approche consiste à faire reconnaître à l’IA que le moment est venu de parler au monde extérieur, et qu’elle le fasse de manière structurée et sans équivoque.
La solution consiste à apprendre à l’IA, dès l’invite initiale du système, qu’elle dispose d’un ou plusieurs outils qu’elle peut utiliser à volonté.
Cela se fait en écrivant d'abord une définition de fonction outil, comme ceci :
<?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 ,
'' ,
[]
);
}
}
Assurez-vous que le nom, la description et les clés d'objet dans le schéma JSON sont utiles et descriptifs - cela aide l'IA à comprendre quand et comment utiliser cette fonction d'outil.
Vous pouvez définir plusieurs définitions de fonctions d'outil - par exemple, une autre fonction d'outil pourrait être ajoutée pour permettre à l'IA de mettre des produits dans le panier de paiement lorsque l'utilisateur le demande. Nous garderons cependant cet exemple simple.
Ensuite, vous devez intégrer le pont d'outils à votre configuration d'IA existante. Cela se fait à l'aide de l'assistant AiToolBridge
:
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 ()}"
);
}
}
Cela repose évidemment sur plusieurs hypothèses : la manière dont votre application est structurée et la manière dont vous avez intégré un service d'IA peuvent être très différentes.
Cependant, les points d'intégration sont toujours identiques. Étant donné que cette bibliothèque doit pouvoir communiquer avec l'assistant AI, vous devez fournir un objet qui implémente l'interface AiAssistantMessenger
. Voir src/Example/MyAiService.php pour un exemple simple.
Vous devez également attacher les fonctions d'outils que vous avez définies lors de la création de l'objet AiToolBridge.
Ensuite, afin de faire comprendre à l'IA qu'elle peut utiliser vos outils, vous devez étendre votre propre invite "système" d'IA avec l'invite générée par cette bibliothèque. Pour ce faire, utilisez la méthode AiToolBridge::getPrompt
comme indiqué ci-dessus.
Votre application et cette bibliothèque sont désormais entièrement intégrées et configurées. Il manque cependant un élément central : le comportement réel qui devrait être déclenché lorsque l’IA utilise la fonction de votre outil.
Regardons à nouveau l' invoke
de méthode de la classe MyProductSearchToolFunction
:
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
C’est là que la magie doit opérer – c’est-à-dire que c’est l’endroit où mettre en œuvre toute la logique – VOTRE logique – nécessaire pour effectuer la recherche de produit proprement dite.
Ici, vous n'avez en aucun cas besoin de considérer l'intégration de l'IA - c'est exactement le but de cette bibliothèque, faire le gros du travail à votre place.
Plus précisément, lorsque la méthode invoke
est appelée, le gros du travail a déjà été fait — vous pouvez être assuré que la méthode sera appelée avec une chaîne JSON qui, d'une part, a la structure précise que vous avez définie avec le schéma JSON dans la méthode. MyProductSearchToolFunction::getInputJsonSchema
, et d'autre part est rempli des valeurs que l'IA a jugées utiles lors de l'utilisation de la fonction outil.
Ainsi, si, par exemple, la conversation AI-Utilisateur se déroulait comme ceci :
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
alors l'IA aura reconnu qu'elle doit utiliser la fonction outil productSearch
pour rechercher des kitchen helpers
, ce qui aboutit finalement à un appel à MyProductSearchToolFunction::invoke
avec la chaîne JSON suivante :
{
"searchterms" : " kitchen helpers "
}
Vous avez une totale liberté quant à la manière dont vous implémentez cette méthode (tant que vous renvoyez un objet ToolFunctionCallResult
). Dans notre exemple, il est évidemment logique d’effectuer une recherche de produits, mais la manière de procéder dépend entièrement de vous. Interrogez une base de données, parlez à une API ou toute autre chose permettant de récupérer des informations de production sur les « aides de cuisine ».
Les deux champs d'intérêt de l'objet ToolFunctionCallResult
que vous devez renvoyer sont le message
et les data
. Dans notre exemple, cela pourrait ressembler à ceci :
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. '
]
]
);
}
Le format data
n'est limité à aucun schéma spécifique.
Regardons la pièce finale et revenons à notre classe Example
. Nous supposons que dans votre implémentation, il existe une méthode handleAssistantMessage
qui est invoquée chaque fois que votre application récupère un nouveau message de l'assistant AI - encore une fois, il s'agit d'un détail d'implémentation très spécifique de votre application.
C'est l'endroit idéal — AVANT d'envoyer le message à l'utilisateur ! – où nous devons « nous accrocher » à la conversation. Cela permet à la bibliothèque d'outils de détecter toute demande de fonction d'outil émanant de l'IA et de la traiter en conséquence.
Si une fonction de l'outil a été invoquée et a réussi, nous devons renvoyer le résultat à l'assistant IA — de cette façon, il découvre les produits qui correspondent à sa recherche de produits :
<?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
}
}
Comme vous pouvez le voir, lorsque nous informons l'assistant IA du résultat de la fonction roll, nous agissons comme l'utilisateur qui en informe l'assistant. En effet, du point de vue de l'assistant IA, c'EST l'utilisateur qui fournit l'outil à l'IA en premier lieu ! Voir la méthode src/AiToolBridge.php pour comprendre pourquoi c'est le cas.
Les contributions sont les bienvenues ! Pour contribuer, veuillez vous familiariser avec CONTRIBUTING.md.
Assurer la sécurité des informations des utilisateurs est une priorité absolue, et nous apprécions la contribution de chercheurs externes en sécurité. Si vous pensez avoir trouvé un problème de sécurité dans un logiciel conservé dans ce référentiel, veuillez lire SECURITY.md pour obtenir des instructions sur la soumission d'un rapport de vulnérabilité.
AI Tool Bridge pour PHP est protégé par copyright © Manuel Kießling et est utilisé sous licence selon les termes de la licence publique générale GNU (GPL-3.0 ou version ultérieure) telle que publiée par la Free Software Foundation.
Veuillez consulter LICENCE et AVIS pour plus d'informations.