Nota: Este producto está desarrollado de forma independiente y no está afiliado, respaldado ni patrocinado por OpenAI.
Instale este paquete como una dependencia usando Composer.
composer require manuelkiessling/ai-tool-bridge
El principal desafío al integrar la IA en cualquier proyecto es gestionar las interacciones entre la IA y el resto de su aplicación. Esto se vuelve especialmente complejo cuando la IA necesita realizar llamadas a la API para recuperar información o desencadenar acciones.
AI Tool Bridge para PHP resuelve elegantemente este problema al ofrecer una interfaz sencilla para definir "funciones de herramienta" que la IA puede utilizar cuando necesita interactuar con sistemas externos.
Una optimización importante es la capacidad de la biblioteca para generar la estructura JSON requerida para una función de herramienta. Lo hace solicitando solo los valores requeridos de la IA y luego generando el JSON basado en un esquema JSON proporcionado. Este enfoque garantiza la validez del JSON final que llega al código de su aplicación.
Las características clave de esta biblioteca incluyen:
Supongamos que tiene un negocio de comercio electrónico y desea proporcionar una interfaz de chat de IA que le permita explorar su catálogo de productos. Para hacerlo, decidió integrarse con el modelo GPT-4 de OpenAI a través de la API ChatGPT.
Probablemente le indicará al asistente de IA algo como "Usted es un asistente de compras amigable y servicial que informa al usuario sobre nuestro catálogo de productos..." y así sucesivamente.
Sin embargo, no puede agregar todo su catálogo de productos al mensaje. Por lo tanto, cuando su usuario le pide a la IA que "me cuente sobre algunos ayudantes de cocina que se ofrecen", debe identificar que en este punto de la conversación, la IA necesita información de sus sistemas backend de comercio electrónico (por ejemplo, haciendo una solicitud a su Producto). Busque la API con la consulta "ayudantes de cocina"), debe recuperar esta información para la IA y debe proporcionar la información resultante al asistente de la IA, que luego puede resumir la información del producto para el usuario.
La IA sabe mejor cuándo es el momento de recuperar esta información del mundo externo. Porque hacer que su propio código escuche la conversación y adivine cuándo es el momento de realizar la llamada a la API de búsqueda de productos es complejo y propenso a errores, y hace que la idea de utilizar una IA poderosa sea un poco inútil.
El mejor enfoque es hacer que la IA reconozca que ha llegado el momento de hablar con el mundo exterior y que lo haga de forma estructurada e inequívoca.
La solución es enseñarle a la IA, dentro del mensaje inicial del sistema, que tiene una o más herramientas a su disposición que puede usar a voluntad.
Esto se hace escribiendo primero la llamada definición de función de herramienta, como esta:
<?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 ,
'' ,
[]
);
}
}
Asegúrese de que el nombre, la descripción y las claves de objeto en el esquema JSON sean útiles y descriptivos; esto ayuda a la IA a comprender cuándo y cómo utilizar esta función de herramienta.
Puede definir múltiples definiciones de funciones de herramientas; por ejemplo, se podría agregar otra función de herramienta que permita a la IA colocar productos en la cesta de pago cuando el usuario lo solicite. Sin embargo, mantendremos este ejemplo simple.
A continuación, debe integrar el puente de herramientas con su configuración de IA existente. Esto se hace usando el asistente 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 ()}"
);
}
}
Obviamente, esto implica varias suposiciones: la forma en que está estructurada su aplicación y la forma en que ha integrado un servicio de IA podrían ser tremendamente diferentes.
Sin embargo, los puntos de integración son siempre idénticos. Debido a que esta biblioteca debe poder comunicarse con el asistente de IA, debe proporcionar un objeto que implemente la interfaz AiAssistantMessenger
. Consulte src/Example/MyAiService.php para ver un ejemplo básico.
También debe adjuntar las funciones de herramienta que definió al crear el objeto AiToolBridge.
A continuación, para que la IA comprenda que puede utilizar sus herramientas, debe ampliar su propio mensaje de "sistema" de IA con el mensaje generado por esta biblioteca. Para hacerlo, use el método AiToolBridge::getPrompt
como se muestra arriba.
Su aplicación y esta biblioteca ahora están completamente integradas y configuradas. Sin embargo, falta una pieza central: el comportamiento real que debería activarse cuando la IA utiliza la función de su herramienta.
Veamos nuevamente la invoke
del método de la clase MyProductSearchToolFunction
:
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
Aquí es donde debe ocurrir la magia, es decir, este es el lugar para implementar toda la lógica (TU lógica) necesaria para realizar la búsqueda real del producto.
En este caso, no es necesario considerar la integración de la IA de ninguna manera; este es exactamente el objetivo de esta biblioteca, hacer el trabajo pesado por usted.
Más precisamente, cuando se llama al método invoke
, el trabajo pesado ya está hecho; puede estar seguro de que el método se llamará con una cadena JSON que, por un lado, tiene la estructura precisa que ha definido con el esquema JSON en el método. MyProductSearchToolFunction::getInputJsonSchema
, y por otro lado se rellena con los valores que la IA consideró útiles al utilizar la función de herramienta.
Entonces, si, por ejemplo, la conversación entre IA y usuario fuera así:
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
entonces la IA habrá reconocido que debería usar la función de herramienta productSearch
para buscar kitchen helpers
, lo que eventualmente resulta en una llamada a MyProductSearchToolFunction::invoke
con la siguiente cadena JSON:
{
"searchterms" : " kitchen helpers "
}
Tiene total libertad con respecto a cómo implementar este método (siempre que devuelva un objeto ToolFunctionCallResult
). En nuestro ejemplo, obviamente tiene sentido realizar una búsqueda de producto, pero cómo hacerlo depende completamente de usted. Consulta una base de datos, habla con una API o cualquier otra cosa que recupere información de producción sobre "ayudantes de cocina".
Los dos campos de interés en el objeto ToolFunctionCallResult
que debe devolver son el message
y los data
. En nuestro ejemplo, podría verse así:
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. '
]
]
);
}
El formato data
no se limita a ningún esquema específico.
Veamos la pieza final y volvamos a nuestra clase Example
. Suponemos que en su implementación hay un método handleAssistantMessage
que se invoca cada vez que su aplicación recupera un nuevo mensaje del asistente de IA; nuevamente, este es un detalle de implementación muy específico de su aplicación.
Este es el lugar: ¡ANTES de enviar el mensaje al usuario! — donde necesitamos "engancharnos" a la conversación. Esto permite que la biblioteca de herramientas detecte cualquier solicitud de función de herramienta de la IA y la maneje en consecuencia.
Si se invocó una función de herramienta y tuvo éxito, debemos enviar el resultado al asistente de IA; de esta manera, aprende sobre los productos que coincidieron con su búsqueda de productos:
<?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
}
}
Como puede ver, cuando informamos al asistente de IA sobre el resultado de la función de tirada, actuamos como el usuario que se lo informa al asistente. Esto se debe a que, desde la perspectiva del asistente de IA, ¡ES el usuario quien proporciona la herramienta a la IA en primer lugar! Consulte el método src/AiToolBridge.php para comprender por qué es así.
¡Las contribuciones son bienvenidas! Para contribuir, familiarícese con CONTRIBUTING.md.
Mantener la información del usuario segura y protegida es una prioridad absoluta y agradecemos la contribución de investigadores de seguridad externos. Si cree que ha encontrado un problema de seguridad en el software que se mantiene en este repositorio, lea SECURITY.md para obtener instrucciones sobre cómo enviar un informe de vulnerabilidad.
AI Tool Bridge para PHP tiene copyright © Manuel Kießling y está autorizado para su uso según los términos de la Licencia Pública General GNU (GPL-3.0 o posterior) publicada por la Free Software Foundation.
Consulte LICENCIA y AVISO para obtener más información.