LLM을 활용하여 PHP로 구조화된 데이터를 추출합니다. 단순성, 투명성 및 제어를 위해 설계되었습니다.
Instructor는 텍스트, 이미지 또는 OpenAI 스타일 채팅 시퀀스 배열 등 다양한 유형의 입력에서 구조화되고 검증된 데이터를 추출할 수 있는 라이브러리입니다. LLM(대형 언어 모델)을 기반으로 합니다.
강사는 PHP 프로젝트에서 LLM 통합을 단순화합니다. LLM 출력에서 구조화된 데이터를 추출하는 복잡성을 처리하므로 애플리케이션 로직 구축에 집중하고 더 빠르게 반복할 수 있습니다.
Instructor for PHP는 Jason Liu가 만든 Python용 강사 라이브러리에서 영감을 받았습니다.
다음은 Instructor를 사용하여 텍스트에서 구조화된 데이터를 추출하는 간단한 CLI 데모 앱입니다.
Structure
클래스를 사용한 동적 데이터 셰이프 등 원하는 방식으로 응답 데이터 모델 정의아래에서 다른 언어로 구현된 내용을 확인하세요.
Instructor를 다른 언어로 포팅하려면 Twitter로 문의해 주세요. 시작하는 데 도움을 드리겠습니다!
강사는 직접 API 사용과 비교하여 세 가지 주요 개선 사항을 소개합니다.
LLM 채팅 완료의 '마법'을 통해 데이터를 추출할 PHP 클래스를 지정하기만 하면 됩니다. 그리고 그게 다입니다.
강사는 구조화된 LLM 응답을 활용하여 텍스트 데이터에서 정보를 추출하는 코드의 취약성을 줄입니다.
Instructor는 더 간단하고 이해하기 쉬운 코드를 작성하는 데 도움이 됩니다. 더 이상 긴 함수 호출 정의를 정의하거나 반환된 JSON을 대상 데이터 개체에 할당하기 위한 코드를 작성할 필요가 없습니다.
LLM에서 생성된 응답 모델은 일련의 규칙에 따라 자동으로 검증될 수 있습니다. 현재 강사는 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
// }
참고: 강사는 클래스/객체를 응답 모델로 지원합니다. 단순 유형이나 열거형을 추출하려는 경우 이를 스칼라 어댑터로 래핑해야 합니다. 아래 섹션: 스칼라 값 추출을 참조하세요.
강사를 사용하면 llm.php
파일에서 여러 API 연결을 정의할 수 있습니다. 이는 애플리케이션에서 다양한 LLM 또는 API 제공자를 사용하려는 경우에 유용합니다.
기본 구성은 강사 코드베이스의 루트 디렉터리에 있는 /config/llm.php
에 있습니다. 여기에는 강사가 기본적으로 지원하는 모든 LLM API에 대한 사전 정의된 연결 세트가 포함되어 있습니다.
구성 파일은 LLM API 및 해당 매개변수에 대한 연결을 정의합니다. 또한 클라이언트 연결을 지정하지 않고 강사를 호출할 때 사용할 기본 연결을 지정합니다.
// 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 추론 결과로 다른 개체를 가져오려는 경우에 유용합니다.
강사의 respond()
및 request()
메소드의 input
필드는 객체일 수도 있고 배열이거나 문자열일 수도 있습니다.
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 ();
Instructor는 부분 결과 스트리밍을 지원하므로 데이터가 제공되는 즉시 데이터 처리를 시작할 수 있습니다.
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 );
?>
LLM이 추론을 완료하기 전에 UI 업데이트를 시작하는 데 사용할 수 있는 부분 결과를 수신하도록 onPartialUpdate()
콜백을 정의할 수 있습니다.
참고: 부분 업데이트는 검증되지 않습니다. 응답은 완전히 수신된 후에만 유효성이 검사됩니다.
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,
);
때로는 응답 모델에 대한 클래스를 정의하지 않고 빠른 결과를 얻고 싶을 때가 있습니다. 특히 문자열, 정수, 부울 또는 부동 소수점 형식으로 직접적이고 간단한 답변을 얻으려는 경우에는 더욱 그렇습니다. 강사는 이러한 경우를 위해 단순화된 API를 제공합니다.
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 ;
}
DocBlock 웹사이트에 대한 자세한 내용은 PHPDoc 설명서를 참조하세요.
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 제공업체에 대해 즉시 지원을 제공합니다.
사용 예제는 허브 섹션이나 코드 저장소의 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 문서를 참조하세요.
Instructor for PHP는 요청을 처리하면서 여러 단계를 거칩니다.
Instructor를 사용하면 이벤트를 통해 요청 및 응답 처리의 모든 단계에서 자세한 정보를 받을 수 있습니다.
(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 스키마에는 누락되어 있습니다.
현재 디자인에서는 이를 극복하기 위해 속성에 JSON 스키마 $comment
필드를 사용합니다. 강사는 개발자가 $comment
필드를 사용하여 개체 또는 열거형 유형의 속성 데이터를 역직렬화하는 데 사용할 대상 클래스의 정규화된 이름을 제공할 것을 기대합니다.
Instructor를 사용하면 클래스나 인스턴스가 구현하는 인터페이스를 살펴봄으로써 $responseModel 값의 처리를 사용자 정의할 수도 있습니다.
CanProvideJsonSchema
- $responseModel 값 클래스 정보를 분석하는 Instructor의 기본 접근 방식을 재정의하여 JSON 스키마 또는 응답 모델을 제공할 수 있도록 구현합니다.CanDeserializeSelf
- LLM의 응답이 JSON에서 PHP 객체로 역직렬화되는 방식을 사용자 정의하기 위해 구현합니다.CanValidateSelf
- 역직렬화된 개체의 유효성을 검사하는 방식을 사용자 지정하기 위해 구현합니다.CanTransformSelf
- 검증된 객체를 호출자가 수신한 대상 값으로 변환하기 위해 구현합니다(예: 클래스의 단순 유형을 스칼라 값으로 래핑 해제). PHP 생태계에는 (아직) Instructor for Python의 핵심인 Pydantic과 동등한 강력한 기능이 없습니다.
여기에 필요한 필수 기능을 제공하기 위해 Instructor for PHP는 다음을 활용합니다.
Instructor for PHP는 PHP 8.2 이상과 호환되며 최소한의 종속성으로 인해 선택한 모든 프레임워크에서 작동합니다.
일부 추가 항목에는 추가 종속성이 필요합니다.
도움을 주고 싶다면 몇 가지 문제를 확인해 보세요. 코드 개선, 문서, 버그 보고서, 블로그 게시물/기사, 새로운 요리책 및 애플리케이션 예제 등 모든 기여를 환영합니다.
이 프로젝트는 MIT 라이선스 조건에 따라 라이선스가 부여됩니다.
질문이 있거나 도움이 필요하시면 Twitter나 GitHub를 통해 저에게 연락해주세요.