Примечание. Этот продукт разработан независимо и не связан, не одобрен и не спонсируется OpenAI.
Установите этот пакет как зависимость с помощью Composer.
composer require manuelkiessling/ai-tool-bridge
Основная проблема при интеграции ИИ в любой проект — управление взаимодействием между ИИ и остальной частью вашего приложения. Это становится особенно сложным, когда ИИ необходимо выполнять вызовы API для получения информации или запуска действий.
AI Tool Bridge для PHP элегантно решает эту проблему, предлагая простой интерфейс для определения «инструментальных функций», которые ИИ может использовать, когда ему необходимо взаимодействовать с внешними системами.
Важной оптимизацией является способность библиотеки генерировать необходимую структуру JSON для функции инструмента. Для этого он запрашивает у ИИ только необходимые значения, а затем генерирует JSON на основе предоставленной схемы JSON. Этот подход гарантирует достоверность окончательного JSON, который достигает кода вашего приложения.
Ключевые особенности этой библиотеки включают в себя:
Предположим, у вас есть бизнес в области электронной коммерции, и вы хотите предоставить интерфейс чата с искусственным интеллектом, который позволит просматривать каталог вашей продукции. Для этого вы решили интегрироваться с моделью OpenAI GPT-4 через API ChatGPT.
Вероятно, вы подскажете ИИ-помощнику что-то вроде: «Вы дружелюбный и полезный помощник по покупкам, который информирует пользователя о нашем каталоге товаров…» и так далее.
Однако вы не можете добавить в приглашение весь каталог продукции. Таким образом, когда ваш пользователь просит ИИ «рассказать мне о предлагаемых кухонных помощниках», вам необходимо определить, что на этом этапе разговора ИИ нуждается в информации из ваших серверных систем электронной коммерции (например, сделав запрос к вашему продукту). API поиска по запросу «помощники на кухне»), вам необходимо получить эту информацию для ИИ и предоставить полученную информацию обратно ИИ-помощнику, который затем может обобщить информацию о продукте для пользователя.
ИИ лучше всех знает, когда пришло время получить эту информацию из внешнего мира. Потому что заставить свой собственный код прослушивать разговор и заставлять его угадывать, когда пришло время сделать вызов API поиска продуктов, сложно и подвержено ошибкам, а это делает идею использования мощного ИИ немного бессмысленной.
Лучший подход — заставить ИИ осознать, что пришло время поговорить с внешним миром, и сделать это структурированным и безошибочным способом.
Решение состоит в том, чтобы научить ИИ в рамках первоначального системного приглашения тому, что в его распоряжении есть один или несколько инструментов, которые он может использовать по своему желанию.
Это делается путем написания так называемого определения функции инструмента, например:
<?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 ,
'' ,
[]
);
}
}
Убедитесь, что имя, описание и ключи объекта в схеме JSON являются полезными и описательными — это помогает ИИ понять, когда и как использовать эту функцию инструмента.
Вы можете определить несколько определений функций инструмента — например, можно добавить еще одну функцию инструмента, которая позволит ИИ помещать продукты в корзину для оформления заказа, когда пользователь об этом просит. Однако мы оставим этот пример простым.
Затем вам необходимо интегрировать мост инструментов с существующей настройкой ИИ. Это делается с помощью помощника 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 ()}"
);
}
}
Очевидно, это предполагает несколько предположений: способ структурирования вашего приложения и способ интеграции службы ИИ могут сильно различаться.
Однако точки интеграции всегда идентичны. Поскольку эта библиотека должна иметь возможность взаимодействовать с AI-помощником, вы должны предоставить объект, реализующий интерфейс AiAssistantMessenger
. См. src/Example/MyAiService.php для простого примера.
Вам также необходимо прикрепить функции инструмента, которые вы определили при создании объекта AiToolBridge.
Далее, чтобы дать ИИ понять, что он может использовать ваши инструменты, вам необходимо расширить свою собственную «системную» подсказку ИИ с помощью подсказки, сгенерированной этой библиотекой. Для этого используйте метод AiToolBridge::getPrompt
как показано выше.
Ваше приложение и эта библиотека теперь полностью интегрированы и настроены. Однако отсутствует один центральный элемент — фактическое поведение, которое должно запускаться, когда ИИ использует функцию вашего инструмента.
Давайте еще раз посмотрим на invoke
метода класса MyProductSearchToolFunction
:
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
Именно здесь должно произойти волшебство — то есть это место для реализации всей логики — ВАШЕЙ логики — необходимой для фактического поиска продукта.
Здесь вам не нужно каким-либо образом учитывать интеграцию ИИ — именно в этом смысл этой библиотеки — сделать за вас тяжелую работу.
Точнее, когда вызывается метод invoke
, тяжелая работа уже проделана — вы можете быть уверены, что метод будет вызван со строкой JSON, которая, с одной стороны, имеет точную структуру, которую вы определили с помощью схемы JSON в методе. MyProductSearchToolFunction::getInputJsonSchema
, а с другой стороны заполняется значениями, которые ИИ посчитал полезными при использовании функции инструмента.
Итак, если, например, разговор ИИ-пользователь выглядел бы так:
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
тогда ИИ поймет, что ему следует использовать функцию инструмента productSearch
для поиска kitchen helpers
, что в конечном итоге приводит к вызову MyProductSearchToolFunction::invoke
со следующей строкой JSON:
{
"searchterms" : " kitchen helpers "
}
У вас есть полная свобода в реализации этого метода (при условии, что вы возвращаете объект ToolFunctionCallResult
). В нашем примере, очевидно, имеет смысл выполнить поиск продукта, но то, как вы это сделаете, полностью зависит от вас. Запросите базу данных, обратитесь к API или к чему-нибудь еще, что получает производственную информацию о «помощниках на кухне».
Два поля объекта ToolFunctionCallResult
, которые вам необходимо вернуть, — это message
и data
. В нашем примере это может выглядеть так:
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. '
]
]
);
}
Формат data
не ограничивается какой-либо конкретной схемой.
Давайте посмотрим на последнюю часть и вернемся к нашему классу Example
. Мы предполагаем, что в вашей реализации есть метод handleAssistantMessage
, который вызывается всякий раз, когда ваше приложение получает новое сообщение помощника ИИ — опять же, это очень специфическая деталь реализации вашего приложения.
Это место — ДО того, как мы отправим сообщение пользователю! — где нам нужно «подключиться» к разговору. Это позволяет библиотеке инструментов обнаруживать любой запрос функции инструмента от ИИ и обрабатывать его соответствующим образом.
Если функция инструмента была вызвана и прошла успешно, нам нужно передать результат обратно ИИ-помощнику — таким образом он узнает о продуктах, которые соответствуют его поиску:
<?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
}
}
Как видите, когда мы сообщаем ИИ-помощнику о результате функции броска, мы действуем как пользователь, сообщающий об этом помощнику. Это потому, что с точки зрения ИИ-помощника именно пользователь в первую очередь предоставляет инструмент ИИ! См. метод src/AiToolBridge.php, чтобы понять, почему это так.
Вклады приветствуются! Чтобы внести свой вклад, пожалуйста, ознакомьтесь с CONTRIBUTING.md.
Обеспечение безопасности и защиты пользовательской информации является главным приоритетом, и мы приветствуем вклад внешних исследователей в области безопасности. Если вы считаете, что обнаружили проблему безопасности в программном обеспечении, хранящемся в этом репозитории, прочтите SECURITY.md, чтобы получить инструкции по отправке отчета об уязвимости.
AI Tool Bridge для PHP защищен авторскими правами © Мануэля Кисслинга и лицензируется для использования в соответствии с условиями Стандартной общественной лицензии GNU (GPL-3.0 или более поздней версии), опубликованной Фондом свободного программного обеспечения.
Пожалуйста, ознакомьтесь с ЛИЦЕНЗИЕЙ и УВЕДОМЛЕНИЕМ для получения дополнительной информации.