注: この製品は独自に開発されたものであり、OpenAI と提携、承認、または後援されていません。
Composer を使用して、このパッケージを依存関係としてインストールします。
composer require manuelkiessling/ai-tool-bridge
AI をプロジェクトに統合する場合の主な課題は、AI とアプリケーションの残りの部分の間の相互作用を管理することです。 AI が情報を取得したりアクションをトリガーしたりするために API 呼び出しを行う必要がある場合、これは特に複雑になります。
AI Tool Bridge for PHP は、AI が外部システムと対話する必要があるときに利用できる「ツール関数」を定義するための簡単なインターフェイスを提供することで、この問題をエレガントに解決します。
重要な最適化は、ツール関数に必要な JSON 構造を生成するライブラリの機能です。これは、AI から必要な値のみをリクエストし、提供された JSON スキーマに基づいて JSON を生成することによって行われます。このアプローチにより、アプリケーション コードに到達する最終的な JSON の有効性が保証されます。
このライブラリの主な機能は次のとおりです。
e コマース ビジネスを経営しており、製品カタログを閲覧できる AI チャット インターフェイスを提供したいと仮定します。そのために、ChatGPT API を介して OpenAI の GPT-4 モデルと統合することにしました。
おそらく、あなたは AI アシスタントに、「あなたはフレンドリーで親切なショッピング アシスタントで、当社の製品カタログについてユーザーに情報を提供してくれます...」などと促すでしょう。
ただし、製品カタログ全体をプロンプトに追加することはできません。したがって、ユーザーが AI に「提供されているキッチン ヘルパーについて教えて」と尋ねるときは、会話のこの時点で AI が e コマース バックエンド システムからの情報を必要としている (たとえば、製品にリクエストを行うなど) ことを特定する必要があります。 API をクエリ「キッチン ヘルパー」で検索する場合)、AI のためにこの情報を取得する必要があり、結果の情報を AI アシスタントに返す必要があります。これにより、AI アシスタントがユーザー向けに製品情報を要約することができます。
AI は、外部世界からこれらの情報をいつ取得するかを最もよく知っています。なぜなら、独自のコードを作成して会話をリッスンし、Product Search API 呼び出しを行う時期を推測させることは複雑でエラーが発生しやすく、強力な AI を使用するというアイデアが少し無意味になってしまうからです。
最善のアプローチは、外部の世界と対話する時期が来たことを AI に認識させ、構造化された間違いのない方法で対話させることです。
解決策は、最初のシステム プロンプト内で、自由に使用できる 1 つ以上のツールがあることを AI に教えることです。
これは、最初に次のようにいわゆるツール関数定義を記述することによって行われます。
<?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 スキーマ内の名前、説明、およびオブジェクト キーが便利でわかりやすいものであることを確認してください。これにより、AI がこのツールの機能をいつどのように使用するかを理解するのに役立ちます。
複数のツール関数定義を定義できます。たとえば、ユーザーが要求したときに AI が商品をチェックアウト バスケットに入れることを可能にする別のツール関数を追加できます。ただし、この例は単純にしておきます。
次に、ツール ブリッジを既存の AI セットアップと統合する必要があります。これは、 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 サービスの統合方法は大きく異なる可能性があります。
ただし、統合ポイントは常に同一です。このライブラリは AI アシスタントと通信できる必要があるため、インターフェイスAiAssistantMessenger
実装するオブジェクトを提供する必要があります。基本的な例については、src/Example/MyAiService.php を参照してください。
AiToolBridge オブジェクトの作成時に定義したツール関数をアタッチする必要もあります。
次に、AI にツールを使用できることを理解させるには、このライブラリによって生成されたプロンプトを使用して独自の AI 「システム」プロンプトを拡張する必要があります。これを行うには、上記のようにAiToolBridge::getPrompt
メソッドを使用します。
これで、アプリケーションとこのライブラリが完全に統合され、セットアップされました。ただし、中心となる部分が 1 つ欠けています。それは、AI がツールの機能を使用するときにトリガーされるべき実際の動作です。
クラスMyProductSearchToolFunction
のメソッドinvoke
をもう一度見てみましょう。
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
ここで魔法が起こる必要があります。つまり、ここは、実際の製品検索を行うために必要なすべてのロジック (あなたのロジック) を実装する場所です。
ここでは、AI の統合をまったく考慮する必要はありません。これがまさにこのライブラリのポイントであり、面倒な作業を自動的に実行します。
より正確には、 invoke
メソッドが呼び出される時点で、面倒な作業はすでに行われています。メソッドは、メソッド内の JSON スキーマで定義した正確な構造を持つ JSON 文字列を使用して呼び出されるので安心してください。 MyProductSearchToolFunction::getInputJsonSchema
には、ツール関数を使用するときに AI が有用と考えた値が含まれています。
たとえば、AI とユーザーの会話が次のようになったとします。
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
その後、AI はkitchen helpers
を検索するためにツール関数productSearch
使用する必要があることを認識し、最終的に次の JSON 文字列を使用してMyProductSearchToolFunction::invoke
ます。
{
"searchterms" : " kitchen helpers "
}
このメソッドの実装方法は完全に自由です ( ToolFunctionCallResult
オブジェクトを返す限り)。この例では、実際に製品検索を行うことは明らかに意味がありますが、これをどのように行うかは完全にあなた次第です。データベースにクエリを実行したり、API と通信したり、その他「キッチン ヘルパー」に関する生産情報を取得したりできます。
ToolFunctionCallResult
オブジェクトで返す必要がある 2 つのフィールドは、 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
クラスに戻りましょう。実装には、アプリケーションが新しい AI アシスタント メッセージを取得するたびに呼び出されるメソッドhandleAssistantMessage
があると想定します。繰り返しになりますが、これはアプリケーションの非常に具体的な実装の詳細です。
これは、ユーザーにメッセージを送信する前の場所です。 — 会話に「引っ掛ける」必要がある場合。これにより、ツール ライブラリは AI からのツール機能リクエストを検出し、それに応じて処理できるようになります。
ツール機能が呼び出され、成功した場合は、結果を AI アシスタントにフィードバックする必要があります。これにより、AI アシスタントは、製品検索に一致した製品について学習します。
<?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
}
}
ご覧のとおり、AI アシスタントにロール関数の結果を通知するとき、私たちはユーザーがアシスタントにその結果を伝える役割を果たします。これは、AI アシスタントの観点から見ると、そもそも AI にツールを提供するのはユーザーであるためです。この理由を理解するには、メソッド src/AiToolBridge.php を参照してください。
貢献は大歓迎です!貢献するには、CONTRIBUTING.md をよく理解してください。
ユーザー情報を安全に保つことは最優先事項であり、外部のセキュリティ研究者の貢献を歓迎します。このリポジトリで管理されているソフトウェアにセキュリティ上の問題が見つかったと思われる場合は、SECURITY.md を読んで脆弱性レポートの送信手順を確認してください。
AI Tool Bridge for PHP の著作権は © Manuel Kießling にあり、Free Software Foundation が発行する GNU General Public License (GPL-3.0 以降) の条件に基づいて使用がライセンスされています。
詳細については、「ライセンスと通知」を参照してください。