ملحوظة: تم تطوير هذا المنتج بشكل مستقل وليس تابعًا أو معتمدًا أو مدعومًا من OpenAI.
قم بتثبيت هذه الحزمة باعتبارها تبعية باستخدام Composer.
composer require manuelkiessling/ai-tool-bridge
التحدي الرئيسي عند دمج الذكاء الاصطناعي في أي مشروع هو إدارة التفاعلات بين الذكاء الاصطناعي وبقية التطبيق الخاص بك. يصبح هذا الأمر معقدًا بشكل خاص عندما يحتاج الذكاء الاصطناعي إلى إجراء استدعاءات واجهة برمجة التطبيقات (API) لاسترداد المعلومات أو تنفيذ الإجراءات.
يعمل AI Tool Bridge لـ PHP على حل هذه المشكلة بشكل أنيق من خلال تقديم واجهة مباشرة لتحديد "وظائف الأداة" التي يمكن للذكاء الاصطناعي استخدامها عندما يحتاج إلى التفاعل مع الأنظمة الخارجية.
أحد التحسينات المهمة هو قدرة المكتبة على إنشاء بنية JSON المطلوبة لوظيفة الأداة. يقوم بذلك عن طريق طلب القيم المطلوبة فقط من الذكاء الاصطناعي ثم إنشاء JSON بناءً على مخطط JSON المقدم. يضمن هذا الأسلوب صلاحية ملف JSON النهائي الذي يصل إلى رمز التطبيق الخاص بك.
تشمل الميزات الرئيسية لهذه المكتبة ما يلي:
لنفترض أن لديك نشاطًا تجاريًا للتجارة الإلكترونية وتريد توفير واجهة دردشة تعمل بالذكاء الاصطناعي والتي تتيح لك تصفح كتالوج المنتجات الخاصة بك. للقيام بذلك، قررت التكامل مع نموذج GPT-4 الخاص بـ OpenAI من خلال ChatGPT API.
من المحتمل أن تطالب مساعد الذكاء الاصطناعي على غرار "أنت مساعد تسوق ودود ومفيد لإعلام المستخدم بكتالوج منتجاتنا..." وما إلى ذلك.
ومع ذلك، لا يمكنك إضافة كتالوج المنتجات بالكامل إلى الموجه. وبالتالي، عندما يطلب المستخدم من الذكاء الاصطناعي "إخباري عن بعض مساعدي المطبخ المعروضين"، فإنك تحتاج إلى تحديد أنه في هذه المرحلة من المحادثة، يحتاج الذكاء الاصطناعي إلى معلومات من أنظمة الواجهة الخلفية للتجارة الإلكترونية لديك (على سبيل المثال، عن طريق تقديم طلب إلى منتجك بحث API مع الاستعلام "مساعدي المطبخ")، فأنت بحاجة إلى استرداد هذه المعلومات للذكاء الاصطناعي، وتحتاج إلى تقديم المعلومات الناتجة مرة أخرى إلى مساعد الذكاء الاصطناعي، والذي يمكنه بعد ذلك تلخيص معلومات المنتج للمستخدم.
يعرف الذكاء الاصطناعي بشكل أفضل عندما يحين وقت استرداد هذه المعلومات من العالم الخارجي. نظرًا لأن إنشاء التعليمات البرمجية الخاصة بك للاستماع إلى المحادثة وتخمين الوقت الذي يحين فيه إجراء استدعاء Product Search 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 ()}"
);
}
}
من الواضح أن هذا يتضمن عدة افتراضات - قد تكون الطريقة التي يتم بها تنظيم التطبيق الخاص بك والطريقة التي قمت بها بدمج خدمة الذكاء الاصطناعي مختلفة تمامًا.
لكن نقاط التكامل تكون دائمًا متطابقة. نظرًا لأن هذه المكتبة تحتاج إلى أن تكون قادرة على التحدث إلى مساعد الذكاء الاصطناعي، فيجب عليك توفير كائن ينفذ الواجهة 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
يتم استدعاؤها عندما يسترد تطبيقك رسالة مساعد 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
}
}
كما ترون، عندما نبلغ مساعد الذكاء الاصطناعي بنتيجة وظيفة التدحرج، فإننا نتصرف كمستخدم لإخبار المساعد عنها. وذلك لأنه من وجهة نظر مساعد الذكاء الاصطناعي، فإن المستخدم هو الذي يوفر الأداة للذكاء الاصطناعي في المقام الأول! راجع الطريقة src/AiToolBridge.php لفهم سبب حدوث ذلك.
المساهمات هي موضع ترحيب! للمساهمة، يرجى التعرف على CONTRIBUTING.md.
يعد الحفاظ على سلامة وأمان معلومات المستخدم أولوية قصوى، ونحن نرحب بمساهمة الباحثين الأمنيين الخارجيين. إذا كنت تعتقد أنك وجدت مشكلة أمنية في البرنامج الذي تم الاحتفاظ به في هذا المستودع، فيرجى قراءة SECURITY.md للحصول على إرشادات حول إرسال تقرير الثغرات الأمنية.
حقوق الطبع والنشر لـ AI Tool Bridge لـ PHP محفوظة © Manuel Kießling ومرخصة للاستخدام بموجب شروط رخصة GNU العامة (GPL-3.0 أو الأحدث) كما نشرتها مؤسسة البرمجيات الحرة.
يرجى الاطلاع على الترخيص والإشعار لمزيد من المعلومات.