استخراج البيانات المنظمة في PHP، بدعم من LLMs. مصممة للبساطة والشفافية والتحكم.
Instructor عبارة عن مكتبة تسمح لك باستخراج البيانات المنظمة والتي تم التحقق من صحتها من أنواع متعددة من المدخلات: النص أو الصور أو مصفوفات تسلسل الدردشة بنمط OpenAI. يتم تشغيله بواسطة نماذج اللغات الكبيرة (LLMs).
يقوم المدرب بتبسيط تكامل LLM في مشاريع PHP. فهو يتعامل مع تعقيد استخراج البيانات المنظمة من مخرجات LLM، حتى تتمكن من التركيز على بناء منطق التطبيق الخاص بك والتكرار بشكل أسرع.
إن Instructor for PHP مستوحى من مكتبة Instructor لـ Python التي أنشأها Jason Liu.
فيما يلي تطبيق تجريبي بسيط لـ CLI يستخدم Instructor لاستخراج البيانات المنظمة من النص:
Structure
تحقق من التطبيقات باللغات الأخرى أدناه:
إذا كنت تريد نقل Instructor إلى لغة أخرى، فيرجى التواصل معنا على Twitter، فنحن نرغب في مساعدتك على البدء!
يقدم Instructor ثلاثة تحسينات رئيسية مقارنة بالاستخدام المباشر لواجهة برمجة التطبيقات (API).
ما عليك سوى تحديد فئة PHP لاستخراج البيانات إليها عبر "سحر" إكمال دردشة LLM. وهذا كل شيء.
يقلل المدرب من هشاشة الكود الذي يستخرج المعلومات من البيانات النصية من خلال الاستفادة من استجابات LLM المنظمة.
يساعدك المدرب على كتابة تعليمات برمجية أبسط وأسهل للفهم - لم تعد بحاجة إلى تحديد تعريفات استدعاء دالة طويلة أو كتابة تعليمات برمجية لتعيين JSON الذي تم إرجاعه إلى كائنات البيانات المستهدفة.
يمكن التحقق من صحة نموذج الاستجابة الذي تم إنشاؤه بواسطة LLM تلقائيًا، باتباع مجموعة من القواعد. حاليًا، يدعم Instructor التحقق من صحة Symfony فقط.
يمكنك أيضًا توفير كائن سياق لاستخدام إمكانات التحقق المحسنة.
يمكنك ضبط عدد محاولات إعادة المحاولة للطلبات.
سيقوم المدرب بتكرار الطلبات في حالة وجود خطأ في التحقق من الصحة أو إلغاء التسلسل حتى العدد المحدد من المرات، في محاولة للحصول على استجابة صالحة من LLM.
تثبيت المدرب بسيط. قم بتشغيل الأمر التالي في جهازك الطرفي، وستكون في طريقك إلى تجربة أكثر سلاسة في التعامل مع البيانات!
composer require cognesy/instructor-php
هذا مثال بسيط يوضح كيفية قيام المدرب باسترداد المعلومات المنظمة من النص المقدم (أو تسلسل رسائل الدردشة).
فئة نموذج الاستجابة هي فئة PHP عادية مع تلميحات تحدد أنواع حقول الكائن.
use Cognesy Instructor Instructor ;
// Step 0: Create .env file in your project root:
// OPENAI_API_KEY=your_api_key
// Step 1: Define target data structure(s)
class Person {
public string $ name ;
public int $ age ;
}
// Step 2: Provide content to process
$ text = " His name is Jason and he is 28 years old. " ;
// Step 3: Use Instructor to run LLM inference
$ person = ( new Instructor )-> respond (
messages: $ text ,
responseModel: Person ::class,
);
// Step 4: Work with structured response data
assert ( $ person instanceof Person ); // true
assert ( $ person -> name === ' Jason ' ); // true
assert ( $ person -> age === 28 ); // true
echo $ person -> name ; // Jason
echo $ person -> age ; // 28
var_dump ( $ person );
// Person {
// name: "Jason",
// age: 28
// }
ملاحظة: يدعم المدرب الفئات/الكائنات كنماذج استجابة. في حالة رغبتك في استخراج أنواع أو تعدادات بسيطة، فأنت بحاجة إلى تغليفها بمحول Scalar - راجع القسم أدناه: استخراج القيم العددية.
يسمح لك المدرب بتعريف اتصالات API متعددة في ملف llm.php
. يعد هذا مفيدًا عندما تريد استخدام LLMs أو موفري API مختلفين في تطبيقك.
يوجد التكوين الافتراضي في /config/llm.php
في الدليل الجذر لقاعدة بيانات المدرب. يحتوي على مجموعة من الاتصالات المحددة مسبقًا لجميع واجهات برمجة تطبيقات LLM المدعومة من قبل المدرب.
يحدد ملف التكوين الاتصالات بواجهات برمجة تطبيقات LLM ومعلماتها. كما أنه يحدد الاتصال الافتراضي الذي سيتم استخدامه عند استدعاء المدرب دون تحديد اتصال العميل.
// This is fragment of /config/llm.php file
' defaultConnection ' => ' openai ' ,
// . . .
' connections ' => [
' anthropic ' => [ ... ],
' azure ' => [ ... ],
' cohere1 ' => [ ... ],
' cohere2 ' => [ ... ],
' fireworks ' => [ ... ],
' gemini ' => [ ... ],
' grok ' => [ ... ],
' groq ' => [ ... ],
' mistral ' => [ ... ],
' ollama ' => [
' providerType ' => LLMProviderType :: Ollama -> value ,
' apiUrl ' => ' http://localhost:11434/v1 ' ,
' apiKey ' => Env :: get ( ' OLLAMA_API_KEY ' , '' ),
' endpoint ' => ' /chat/completions ' ,
' defaultModel ' => ' qwen2.5:0.5b ' ,
' defaultMaxTokens ' => 1024 ,
' httpClient ' => ' guzzle-ollama ' , // use custom HTTP client configuration
],
' openai ' => [ ... ],
' openrouter ' => [ ... ],
' together ' => [ ... ],
// ...
لتخصيص الاتصالات المتاحة، يمكنك إما تعديل الإدخالات الموجودة أو إضافة الإدخالات الخاصة بك.
يعد الاتصال بـ LLM API عبر اتصال محدد مسبقًا أمرًا بسيطًا مثل الاتصال بأسلوب withClient
باسم الاتصال.
// ...
$ user = ( new Instructor )
-> withConnection ( ' ollama ' )
-> respond (
messages: " His name is Jason and he is 28 years old. " ,
responseModel: Person ::class,
);
// ...
يمكنك تغيير موقع ملفات التكوين ليستخدمها المدرب عبر متغير البيئة INSTRUCTOR_CONFIG_PATH
. يمكنك استخدام نسخ من ملفات التكوين الافتراضية كنقطة بداية.
يقدم المدرب طريقة لاستخدام البيانات المنظمة كمدخل. يعد هذا مفيدًا عندما تريد استخدام بيانات الكائن كمدخل والحصول على كائن آخر نتيجة لاستدلال LLM.
يمكن أن يكون حقل input
الخاص بطرق respond()
request()
الخاصة بالمدرس كائنًا، ولكن أيضًا مصفوفة أو مجرد سلسلة.
use Cognesy Instructor Instructor ;
class Email {
public function __construct (
public string $ address = '' ,
public string $ subject = '' ,
public string $ body = '' ,
) {}
}
$ email = new Email (
address: ' joe@gmail ' ,
subject: ' Status update ' ,
body: ' Your account has been updated. '
);
$ translation = ( new Instructor )-> respond (
input: $ email ,
responseModel: Email ::class,
prompt: ' Translate the text fields of email to Spanish. Keep other fields unchanged. ' ,
);
assert ( $ translation instanceof Email ); // true
dump ( $ translation );
// Email {
// address: "joe@gmail",
// subject: "Actualización de estado",
// body: "Su cuenta ha sido actualizada."
// }
?>
يقوم المدرب بالتحقق من صحة نتائج استجابة LLM مقابل قواعد التحقق المحددة في نموذج البيانات الخاص بك.
لمزيد من التفاصيل حول قواعد التحقق المتاحة، تحقق من قيود التحقق من صحة Symfony.
use Symfony Component Validator Constraints as Assert ;
class Person {
public string $ name ;
#[ Assert PositiveOrZero ]
public int $ age ;
}
$ text = " His name is Jason, he is -28 years old. " ;
$ person = ( new Instructor )-> respond (
messages: [[ ' role ' => ' user ' , ' content ' => $ text ]],
responseModel: Person ::class,
);
// if the resulting object does not validate, Instructor throws an exception
في حالة توفير معلمة maxRetries وعدم استيفاء استجابة LLM لمعايير التحقق من الصحة، سيقوم المدرب بإجراء محاولات استدلال لاحقة حتى تلبي النتائج المتطلبات أو يتم الوصول إلى maxRetries.
يستخدم المدرب أخطاء التحقق من الصحة لإبلاغ LLM بالمشكلات المحددة في الاستجابة، حتى تتمكن LLM من محاولة التصحيح الذاتي في المحاولة التالية.
use Symfony Component Validator Constraints as Assert ;
class Person {
#[ Assert Length (min: 3 )]
public string $ name ;
#[ Assert PositiveOrZero ]
public int $ age ;
}
$ text = " His name is JX, aka Jason, he is -28 years old. " ;
$ person = ( new Instructor )-> respond (
messages: [[ ' role ' => ' user ' , ' content ' => $ text ]],
responseModel: Person ::class,
maxRetries: 3 ,
);
// if all LLM's attempts to self-correct the results fail, Instructor throws an exception
يمكنك استدعاء طريقة request()
لتعيين معلمات الطلب ثم استدعاء get()
للحصول على الاستجابة.
use Cognesy Instructor Instructor ;
$ instructor = ( new Instructor )-> request (
messages: " His name is Jason, he is 28 years old. " ,
responseModel: Person ::class,
);
$ person = $ instructor -> get ();
يدعم المدرب تدفق النتائج الجزئية، مما يسمح لك ببدء معالجة البيانات بمجرد توفرها.
use Cognesy Instructor Instructor ;
$ stream = ( new Instructor )-> request (
messages: " His name is Jason, he is 28 years old. " ,
responseModel: Person ::class,
options: [ ' stream ' => true ]
)-> stream ();
foreach ( $ stream as $ partialPerson ) {
// process partial person data
echo $ partialPerson -> name ;
echo $ partialPerson -> age ;
}
// after streaming is done you can get the final, fully processed person object...
$ person = $ stream -> getLastUpdate ()
// . . . to, for example, save it to the database
$ db -> save ( $ person );
?>
يمكنك تحديد رد الاتصال onPartialUpdate()
لتلقي النتائج الجزئية التي يمكن استخدامها لبدء تحديث واجهة المستخدم قبل إكمال LLM للاستدلال.
ملاحظة: لم يتم التحقق من صحة التحديثات الجزئية. ولا يتم التحقق من صحة الرد إلا بعد استلامه بالكامل.
use Cognesy Instructor Instructor ;
function updateUI ( $ person ) {
// Here you get partially completed Person object update UI with the partial result
}
$ person = ( new Instructor )-> request (
messages: " His name is Jason, he is 28 years old. " ,
responseModel: Person ::class,
options: [ ' stream ' => true ]
)-> onPartialUpdate (
fn( $ partial ) => updateUI ( $ partial )
)-> get ();
// Here you get completed and validated Person object
$ this -> db -> save ( $ person ); // ...for example: save to DB
يمكنك توفير سلسلة بدلاً من مجموعة من الرسائل. يعد هذا مفيدًا عندما تريد استخراج البيانات من كتلة نصية واحدة وتريد إبقاء التعليمات البرمجية الخاصة بك بسيطة.
// Usually, you work with sequences of messages:
$ value = ( new Instructor )-> respond (
messages: [[ ' role ' => ' user ' , ' content ' => " His name is Jason, he is 28 years old. " ]],
responseModel: Person ::class,
);
// ...but if you want to keep it simple, you can just pass a string:
$ value = ( new Instructor )-> respond (
messages: " His name is Jason, he is 28 years old. " ,
responseModel: Person ::class,
);
في بعض الأحيان نرغب فقط في الحصول على نتائج سريعة دون تحديد فئة لنموذج الاستجابة، خاصة إذا كنا نحاول الحصول على إجابة مباشرة وبسيطة في شكل سلسلة أو عدد صحيح أو منطقي أو عائم. يوفر المدرب واجهة برمجة تطبيقات مبسطة لمثل هذه الحالات.
use Cognesy Instructor Extras Scalar Scalar ;
use Cognesy Instructor Instructor ;
$ value = ( new Instructor )-> respond (
messages: " His name is Jason, he is 28 years old. " ,
responseModel: Scalar :: integer ( ' age ' ),
);
var_dump ( $ value );
// int(28)
في هذا المثال، نقوم باستخراج قيمة عددية واحدة من النص. يمكنك أيضًا استخدام Scalar::string()
و Scalar::boolean()
و Scalar::float()
لاستخراج أنواع أخرى من القيم.
بالإضافة إلى ذلك، يمكنك استخدام محول Scalar لاستخراج أحد الخيارات المتوفرة باستخدام Scalar::enum()
.
use Cognesy Instructor Extras Scalar Scalar ;
use Cognesy Instructor Instructor ;
enum ActivityType : string {
case Work = ' work ' ;
case Entertainment = ' entertainment ' ;
case Sport = ' sport ' ;
case Other = ' other ' ;
}
$ value = ( new Instructor )-> respond (
messages: " His name is Jason, he currently plays Doom Eternal. " ,
responseModel: Scalar :: enum ( ActivityType ::class, ' activityType ' ),
);
var_dump ( $ value );
// enum(ActivityType:Entertainment)
التسلسل عبارة عن فئة مجمعة يمكن استخدامها لتمثيل قائمة بالكائنات التي سيتم استخراجها بواسطة المدرب من السياق المقدم.
عادةً ما يكون من الأفضل عدم إنشاء فئة مخصصة بخاصية مصفوفة واحدة فقط للتعامل مع قائمة الكائنات الخاصة بفئة معينة.
الميزة الإضافية الفريدة للتسلسلات هي أنه يمكن دفقها لكل عنصر مكتمل في تسلسل، بدلاً من أي تحديث للخاصية.
class Person
{
public string $ name ;
public int $ age ;
}
$ text = <<
Jason is 25 years old. Jane is 18 yo. John is 30 years old
and Anna is 2 years younger than him.
TEXT ;
$ list = ( new Instructor )-> respond (
messages: [[ ' role ' => ' user ' , ' content ' => $ text ]],
responseModel: Sequence :: of ( Person ::class),
options: [ ' stream ' => true ]
);
تعرف على المزيد حول التسلسلات في قسم التسلسلات.
استخدم تلميحات نوع PHP لتحديد نوع البيانات المستخرجة.
استخدم الأنواع الخالية للإشارة إلى أن الحقل المحدد اختياري.
class Person {
public string $ name ;
public ? int $ age ;
public Address $ address ;
}
يمكنك أيضًا استخدام تعليقات نمط PHP DocBlock لتحديد نوع البيانات المستخرجة. يعد هذا مفيدًا عندما تريد تحديد أنواع الخصائص لـ LLM، ولكن لا يمكنك أو لا تريد فرض النوع على مستوى التعليمات البرمجية.
class Person {
/** @var string */
public $ name ;
/** @var int */
public $ age ;
/** @var Address $address person's address */
public $ address ;
}
راجع وثائق PHPDoc لمزيد من التفاصيل على موقع DocBlock.
لا يدعم PHP حاليًا الأدوية العامة أو تلميحات الكتابة لتحديد أنواع عناصر المصفوفة.
استخدم تعليقات نمط PHP DocBlock لتحديد نوع عناصر المصفوفة.
class Person {
// ...
}
class Event {
// ...
/** @var Person[] list of extracted event participants */
public array $ participants ;
// ...
}
يمكن للمدرس استرداد هياكل البيانات المعقدة من النص. يمكن أن يحتوي نموذج الاستجابة الخاص بك على كائنات متداخلة ومصفوفات وتعدادات.
use Cognesy Instructor Instructor ;
// define a data structures to extract data into
class Person {
public string $ name ;
public int $ age ;
public string $ profession ;
/** @var Skill[] */
public array $ skills ;
}
class Skill {
public string $ name ;
public SkillType $ type ;
}
enum SkillType {
case Technical = ' technical ' ;
case Other = ' other ' ;
}
$ text = " Alex is 25 years old software engineer, who knows PHP, Python and can play the guitar. " ;
$ person = ( new Instructor )-> respond (
messages: [[ ' role ' => ' user ' , ' content ' => $ text ]],
responseModel: Person ::class,
); // client is passed explicitly, can specify e.g. different base URL
// data is extracted into an object of given class
assert ( $ person instanceof Person ); // true
// you can access object's extracted property values
echo $ person -> name ; // Alex
echo $ person -> age ; // 25
echo $ person -> profession ; // software engineer
echo $ person -> skills [ 0 ]-> name ; // PHP
echo $ person -> skills [ 0 ]-> type ; // SkillType::Technical
// ...
var_dump ( $ person );
// Person {
// name: "Alex",
// age: 25,
// profession: "software engineer",
// skills: [
// Skill {
// name: "PHP",
// type: SkillType::Technical,
// },
// Skill {
// name: "Python",
// type: SkillType::Technical,
// },
// Skill {
// name: "guitar",
// type: SkillType::Other
// },
// ]
// }
إذا كنت تريد تحديد شكل البيانات أثناء وقت التشغيل، فيمكنك استخدام فئة Structure
.
تسمح لك الهياكل بتحديد وتعديل الشكل التعسفي للبيانات التي سيتم استخراجها بواسطة LLM. قد لا تكون الفئات هي الأنسب لهذا الغرض، إذ لا يمكن الإعلان عنها أو تغييرها أثناء التنفيذ.
باستخدام الهياكل، يمكنك تحديد أشكال البيانات المخصصة ديناميكيًا، على سبيل المثال بناءً على إدخال المستخدم أو سياق المعالجة، لتحديد المعلومات التي تحتاج إلى LLM لاستنتاجها من الرسائل النصية أو رسائل الدردشة المتوفرة.
يوضح المثال أدناه كيفية تحديد البنية واستخدامها كنموذج استجابة:
use Cognesy Instructor Extras Structure Field ;
use Cognesy Instructor Extras Structure Structure ;
enum Role : string {
case Manager = ' manager ' ;
case Line = ' line ' ;
}
$ structure = Structure :: define ( ' person ' , [
Field :: string ( ' name ' ),
Field :: int ( ' age ' ),
Field :: enum ( ' role ' , Role ::class),
]);
$ person = ( new Instructor )-> respond (
messages: ' Jason is 25 years old and is a manager. ' ,
responseModel: $ structure ,
);
// you can access structure data via field API...
assert ( $ person -> field ( ' name ' ) === ' Jason ' );
// ...or as structure object properties
assert ( $ person -> age === 25 );
?>
لمزيد من المعلومات راجع قسم الهياكل.
يمكنك تحديد النموذج والخيارات الأخرى التي سيتم تمريرها إلى نقطة نهاية OpenAI / LLM.
use Cognesy Instructor Features LLM Data LLMConfig ;
use Cognesy Instructor Features LLM Drivers OpenAIDriver ;
use Cognesy Instructor Instructor ;
// OpenAI auth params
$ yourApiKey = Env :: get ( ' OPENAI_API_KEY ' ); // use your own API key
// Create instance of OpenAI driver initialized with custom parameters
$ driver = new OpenAIDriver ( new LLMConfig (
apiUrl: ' https://api.openai.com/v1 ' , // you can change base URI
apiKey: $ yourApiKey ,
endpoint: ' /chat/completions ' ,
metadata: [ ' organization ' => '' ],
model: ' gpt-4o-mini ' ,
maxTokens: 128 ,
));
/// Get Instructor with the default client component overridden with your own
$ instructor = ( new Instructor )-> withDriver ( $ driver );
$ user = $ instructor -> respond (
messages: " Jason (@jxnlco) is 25 years old and is the admin of this project. He likes playing football and reading books. " ,
responseModel: User ::class,
model: ' gpt-3.5-turbo ' ,
options: [ ' stream ' => true ]
);
يقدم المدرب دعمًا جاهزًا لموفري واجهة برمجة التطبيقات (API) التاليين:
للحصول على أمثلة الاستخدام، تحقق من قسم Hub أو دليل examples
في مستودع التعليمات البرمجية.
يمكنك استخدام PHP DocBlocks (/** */) لتوفير تعليمات إضافية لـ LLM على مستوى الفصل أو الحقل، على سبيل المثال لتوضيح ما تتوقعه أو كيف يجب على LLM معالجة بياناتك.
يقوم المدرب باستخراج تعليقات PHP DocBlocks من الفئة والخاصية المحددة وتضمينها في مواصفات نموذج الاستجابة المرسل إلى LLM.
ليس من الضروري استخدام تعليمات PHP DocBlocks، ولكن في بعض الأحيان قد ترغب في توضيح نواياك لتحسين نتائج الاستدلال في LLM.
/**
* Represents a skill of a person and context in which it was mentioned.
*/
class Skill {
public string $ name ;
/** @var SkillType $type type of the skill, derived from the description and context */
public SkillType $ type ;
/** Directly quoted, full sentence mentioning person's skill */
public string $ context ;
}
يمكنك استخدام سمة ValidationMixin لإضافة إمكانية التحقق السهل والمخصص من صحة كائن البيانات.
use Cognesy Instructor Features Validation Traits ValidationMixin ;
class User {
use ValidationMixin ;
public int $ age ;
public int $ name ;
public function validate () : array {
if ( $ this -> age < 18 ) {
return [ " User has to be adult to sign the contract. " ];
}
return [];
}
}
يستخدم المدرب مكون التحقق من Symfony للتحقق من صحة البيانات المستخرجة. يمكنك استخدام التعليق التوضيحي #[Assert/Callback] لإنشاء منطق تحقق مخصص بالكامل.
use Cognesy Instructor Instructor ;
use Symfony Component Validator Constraints as Assert ;
use Symfony Component Validator Context ExecutionContextInterface ;
class UserDetails
{
public string $ name ;
public int $ age ;
#[ Assert Callback ]
public function validateName ( ExecutionContextInterface $ context , mixed $ payload ) {
if ( $ this -> name !== strtoupper ( $ this -> name )) {
$ context -> buildViolation ( " Name must be in uppercase. " )
-> atPath ( ' name ' )
-> setInvalidValue ( $ this -> name )
-> addViolation ();
}
}
}
$ user = ( new Instructor )-> respond (
messages: [[ ' role ' => ' user ' , ' content ' => ' jason is 25 years old ' ]],
responseModel: UserDetails ::class,
maxRetries: 2
);
assert ( $ user -> name === " JASON " );
راجع مستندات Symfony لمزيد من التفاصيل حول كيفية استخدام قيد رد الاتصال.
عندما يقوم مدرس لغة PHP بمعالجة طلبك، فإنه يمر عبر عدة مراحل:
يسمح لك المدرب بتلقي معلومات مفصلة في كل مرحلة من مراحل معالجة الطلب والاستجابة عبر الأحداث.
(new Instructor)->onEvent(string $class, callable $callback)
- تلقي رد الاتصال عند إرسال نوع الحدث المحدد(new Instructor)->wiretap(callable $callback)
- تلقي أي حدث يرسله المدرب، وقد يكون مفيدًا لتصحيح الأخطاء أو تحليل الأداءيمكن أن يساعدك تلقي الأحداث في مراقبة عملية التنفيذ ويسهل على المطور فهم أي مشكلات في المعالجة وحلها.
$ instructor = ( new Instructor )
// see requests to LLM
-> onEvent ( RequestSentToLLM ::class, fn( $ e ) => dump ( $ e ))
// see responses from LLM
-> onEvent ( ResponseReceivedFromLLM ::class, fn( $ event ) => dump ( $ event ))
// see all events in console-friendly format
-> wiretap (fn( $ event ) => dump ( $ event -> toConsole ()));
$ instructor -> respond (
messages: " What is the population of Paris? " ,
responseModel: Scalar :: integer (),
);
// check your console for the details on the Instructor execution
يستطيع المدرب معالجة عدة أنواع من المدخلات المقدمة كنموذج استجابة، مما يمنحك مرونة أكبر في كيفية تفاعلك مع المكتبة.
يشير توقيع أسلوب respond()
الخاص بالمعلم إلى أن نموذج responseModel
يمكن أن يكون إما سلسلة أو كائنًا أو مصفوفة.
إذا تم توفير قيمة string
، فسيتم استخدامها كاسم لفئة نموذج الاستجابة.
يتحقق المدرب من وجود الفصل ويحلل معلومات نوع الفصل والخصائص وتعليقات المستند لإنشاء مخطط مطلوب لتحديد قيود استجابة LLM.
أفضل طريقة لتوفير اسم فئة نموذج الاستجابة هي استخدام NameOfTheClass::class
بدلاً من السلسلة، مما يجعل من الممكن لـ IDE تنفيذ عمليات التحقق من النوع، والتعامل مع إعادة البناء، وما إلى ذلك.
إذا تم توفير قيمة object
، فسيتم اعتبارها مثالًا لنموذج الاستجابة. يتحقق المدرب من فئة المثيل، ثم يقوم بتحليله وبيانات نوع الخاصية الخاصة به لتحديد قيود استجابة LLM.
إذا تم توفير قيمة array
، فسيتم اعتبارها مخطط JSON خام، وبالتالي يسمح للمدرس باستخدامها مباشرة في طلبات LLM (بعد التغليف في السياق المناسب - على سبيل المثال، استدعاء الوظيفة).
يتطلب المدرب معلومات عن فئة كل كائن متداخل في مخطط JSON الخاص بك، حتى يتمكن من إلغاء تسلسل البيانات بشكل صحيح إلى النوع المناسب.
تتوفر هذه المعلومات للمدرس عندما تقوم بتمرير $responseModel كاسم فئة أو مثيل، ولكنها مفقودة من مخطط JSON الأولي.
يستخدم التصميم الحالي حقل $comment
على الخاصية للتغلب على ذلك. يتوقع المدرب أن يستخدم المطور حقل $comment
لتوفير اسم مؤهل بالكامل للفئة المستهدفة لاستخدامه في إلغاء تسلسل بيانات الخاصية الخاصة بنوع الكائن أو التعداد.
يتيح لك Instructor تخصيص معالجة قيمة $responseModel أيضًا من خلال النظر في الواجهات التي ينفذها الفصل أو المثيل:
CanProvideJsonSchema
- يتم تنفيذه ليكون قادرًا على توفير مخطط JSON أو نموذج الاستجابة، متجاوزًا النهج الافتراضي للمدرب، الذي يقوم بتحليل معلومات فئة قيمة $responseModel،CanDeserializeSelf
- تنفيذ لتخصيص الطريقة التي يتم بها إلغاء تسلسل الاستجابة من LLM من JSON إلى كائن PHP،CanValidateSelf
- يتم تنفيذه لتخصيص الطريقة التي يتم بها التحقق من صحة الكائن الذي تم إلغاء تسلسله،CanTransformSelf
- يتم تنفيذه لتحويل الكائن الذي تم التحقق من صحته إلى قيمة مستهدفة يتلقاها المتصل (على سبيل المثال، فك نوع بسيط من فئة إلى قيمة عددية). لا يحتوي نظام PHP البيئي (حتى الآن) على مكافئ قوي لـ Pydantic، والذي يقع في قلب Instructor for Python.
لتوفير وظيفة أساسية نحتاجها هنا، يقوم مدرس لغة PHP بالاستفادة من:
يتوافق Instructor for PHP مع PHP 8.2 أو الإصدارات الأحدث، ونظرًا لقلة التبعيات، يجب أن يعمل مع أي إطار عمل من اختيارك.
مطلوبة تبعيات إضافية لبعض الإضافات:
إذا كنت تريد المساعدة، تحقق من بعض المشكلات. نرحب بجميع المساهمات - تحسينات التعليمات البرمجية، أو الوثائق، أو تقارير الأخطاء، أو منشورات/مقالات المدونة، أو كتب الطبخ الجديدة وأمثلة التطبيقات.
هذا المشروع مرخص بموجب شروط ترخيص MIT.
إذا كان لديك أي أسئلة أو كنت بحاجة إلى مساعدة، يرجى التواصل معي على Twitter أو GitHub.