Nota: Este produto é desenvolvido de forma independente e não é afiliado, endossado ou patrocinado pela OpenAI.
Instale este pacote como uma dependência usando o Composer.
composer require manuelkiessling/ai-tool-bridge
O maior desafio ao integrar a IA em qualquer projeto é gerenciar as interações entre a IA e o restante da sua aplicação. Isso se torna especialmente complexo quando a IA precisa fazer chamadas de API para recuperar informações ou desencadear ações.
O AI Tool Bridge para PHP resolve esse problema com elegância, oferecendo uma interface simples para definir “funções de ferramenta” que a IA pode utilizar quando precisar interagir com sistemas externos.
Uma otimização importante é a capacidade da biblioteca de gerar a estrutura JSON necessária para uma função de ferramenta. Isso é feito solicitando apenas os valores necessários da IA e, em seguida, gerando o JSON com base em um esquema JSON fornecido. Essa abordagem garante a validade do JSON final que chega ao código da sua aplicação.
Os principais recursos desta biblioteca incluem:
Vamos supor que você tenha um negócio de comércio eletrônico e queira fornecer uma interface de chat de IA que permita navegar em seu catálogo de produtos. Para fazer isso, você decidiu integrar-se ao modelo GPT-4 da OpenAI por meio da API ChatGPT.
Você provavelmente solicitará ao assistente de IA algo como "Você é um assistente de compras amigável e prestativo que informa o usuário sobre nosso catálogo de produtos..." e assim por diante.
No entanto, você não pode adicionar todo o seu catálogo de produtos ao prompt. Assim, quando o seu usuário pede à IA para “fale-me sobre alguns ajudantes de cozinha em oferta”, você precisa identificar que neste ponto da conversa, a IA precisa de informações dos seus sistemas backend de comércio eletrônico (por exemplo, fazendo uma solicitação ao seu Produto API de pesquisa com consulta "ajudantes de cozinha"), você precisa recuperar essas informações para a IA e fornecer as informações resultantes ao assistente de IA, que pode então resumir as informações do produto para o usuário.
A IA sabe melhor quando é hora de recuperar essas informações do mundo externo. Porque fazer seu próprio código ouvir a conversa e adivinhar quando é a hora de fazer a chamada da API do Product Search é complexo e sujeito a erros, e torna a ideia de usar uma IA poderosa um pouco inútil.
A melhor abordagem é fazer com que a IA reconheça que chegou a hora de falar com o mundo exterior, e fazê-lo de forma estruturada e inequívoca.
A solução é ensinar à IA, no prompt inicial do sistema, que ela tem uma ou mais ferramentas à sua disposição que pode usar à vontade.
Isso é feito primeiro escrevendo uma chamada definição de função de ferramenta, 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 ,
'' ,
[]
);
}
}
Certifique-se de que o nome, a descrição e as chaves do objeto no esquema JSON sejam úteis e descritivos - isso ajuda a IA a entender quando e como usar esta função da ferramenta.
Você pode definir várias definições de funções de ferramenta - por exemplo, outra função de ferramenta pode ser adicionada, permitindo que a IA coloque produtos na cesta de finalização da compra quando o usuário solicitar. Manteremos este exemplo simples, no entanto.
Em seguida, você precisa integrar a ponte de ferramentas à sua configuração de IA existente. Isso é feito usando o auxiliar 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, isso pressupõe várias suposições - a forma como seu aplicativo está estruturado e a forma como você integrou um serviço de IA podem ser totalmente diferentes.
Os pontos de integração são sempre idênticos. Como esta biblioteca precisa ser capaz de se comunicar com o assistente de IA, você deve fornecer um objeto que implemente a interface AiAssistantMessenger
. Consulte src/Example/MyAiService.php para obter um exemplo básico.
Você também precisa anexar as funções da ferramenta definidas ao criar o objeto AiToolBridge.
Em seguida, para fazer com que a IA entenda que pode usar suas ferramentas, você precisa estender o prompt do seu próprio "sistema" de IA com o prompt gerado por esta biblioteca. Para fazer isso, use o método AiToolBridge::getPrompt
conforme mostrado acima.
Seu aplicativo e esta biblioteca agora estão totalmente integrados e configurados. Porém, falta uma peça central – o comportamento real que deve ser acionado quando a IA usa a função de sua ferramenta.
Vejamos novamente a invoke
do método da classe MyProductSearchToolFunction
:
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
É aqui que a mágica precisa acontecer - ou seja, este é o lugar para implementar toda a lógica - SUA lógica - necessária para fazer a pesquisa real do produto.
Aqui, você não precisa considerar a integração de IA de forma alguma – este é exatamente o objetivo desta biblioteca, fazer o trabalho pesado para você.
Mais precisamente, quando o método invoke
é chamado, o trabalho pesado já foi feito — você pode ter certeza de que o método será chamado com uma string JSON que por um lado possui a estrutura precisa que você definiu com o esquema JSON no método MyProductSearchToolFunction::getInputJsonSchema
, e por outro lado é preenchido com os valores que a IA considerou úteis ao usar a função da ferramenta.
Então, se, por exemplo, a conversa AI-Usuário fosse assim:
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
então a IA terá reconhecido que deveria usar a função da ferramenta productSearch
para procurar kitchen helpers
, o que eventualmente resulta em uma chamada para MyProductSearchToolFunction::invoke
com a seguinte string JSON:
{
"searchterms" : " kitchen helpers "
}
Você tem total liberdade em relação à forma como implementa esse método (desde que retorne um objeto ToolFunctionCallResult
). Em nosso exemplo, obviamente faz sentido fazer uma pesquisa de produto, mas a maneira como você faz isso depende totalmente de você. Consulte um banco de dados, fale com uma API ou qualquer outra coisa que recupere informações de produção sobre “ajudantes de cozinha”.
Os dois campos de interesse no objeto ToolFunctionCallResult
que você precisa retornar são a message
e os data
. Em nosso exemplo, isso poderia ser assim:
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. '
]
]
);
}
O formato data
não está limitado a nenhum esquema específico.
Vejamos a peça final e retornemos à nossa classe Example
. Presumimos que em sua implementação existe um método handleAssistantMessage
que é invocado sempre que seu aplicativo recupera uma nova mensagem do assistente de IA — novamente, este é um detalhe de implementação muito específico de seu aplicativo.
Este é o lugar – ANTES de enviarmos a mensagem ao usuário! – onde precisamos nos “enganchar” na conversa. Isso permite que a biblioteca de ferramentas detecte qualquer solicitação de função de ferramenta da IA e trate-a adequadamente.
Se uma função de ferramenta foi invocada e teve sucesso, precisamos enviar o resultado de volta ao assistente de IA – dessa forma, ele aprende sobre os produtos que correspondem à sua pesquisa de produto:
<?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 você pode ver, quando informamos o assistente de IA sobre o resultado da função de rolagem, agimos como o usuário informando ao assistente sobre isso. Isso ocorre porque, da perspectiva do assistente de IA, é o usuário quem fornece a ferramenta para a IA em primeiro lugar! Consulte o método src/AiToolBridge.php para entender por que isso acontece.
Contribuições são bem-vindas! Para contribuir, familiarize-se com CONTRIBUTING.md.
Manter as informações dos usuários seguras e protegidas é uma prioridade máxima e agradecemos a contribuição de pesquisadores de segurança externos. Se você acredita ter encontrado um problema de segurança no software mantido neste repositório, leia SECURITY.md para obter instruções sobre como enviar um relatório de vulnerabilidade.
AI Tool Bridge para PHP é protegido por copyright © Manuel Kießling e licenciado para uso sob os termos da Licença Pública Geral GNU (GPL-3.0 ou posterior), conforme publicada pela Free Software Foundation.
Consulte LICENÇA e AVISO para obter mais informações.