Overview

We start by defining the structures.

For multi-label classification, we introduce a new enum class and a different PHP class to handle multiple labels.

<?php
$loader = require 'vendor/autoload.php';
$loader->add('Cognesy\\Instructor\\', __DIR__.'../../src/');

use Cognesy\Instructor\Instructor;

/** Potential ticket labels */
enum Label : string {
    case TECH_ISSUE = "tech_issue";
    case BILLING = "billing";
    case SALES = "sales";
    case SPAM = "spam";
    case OTHER = "other";
}

/** Represents analysed ticket data */
class TicketLabels {
    /** @var Label[] */
    public array $labels = [];
}
?>

Classifying Text

The function multi_classify executes multi-label classification using LLM.

<?php
// Perform single-label classification on the input text.
function multi_classify(string $data) : TicketLabels {
    return (new Instructor())->respond(
        messages: [[
            "role" => "user",
            "content" => "Label following support ticket: {$data}",
        ]],
        responseModel: TicketLabels::class,
    );
}
?>

Testing and Evaluation

Finally, we test the multi-label classification function using a sample support ticket.

<?php
// Test single-label classification
$ticket = "My account is locked and I can't access my billing info.";
$prediction = multi_classify($ticket);

dump($prediction);

assert(in_array(Label::TECH_ISSUE, $prediction->labels));
assert(in_array(Label::BILLING, $prediction->labels));
?>