<?php
require 'examples/boot.php';
use Cognesy\Instructor\StructuredOutput;
class MultihopExpert { public string $chain_of_thought; public string $answer; }
class FactualExpert { public string $answer; }
class ModelScore { public float $score; }
class MoRE {
public function factual(string $query, array $evidences) : FactualExpert {
$formatted = '- ' . implode("\n-", $evidences);
$system = "<query>\n{$query}\n</query>\n\n<evidences>\n{$formatted}\n</evidences>";
return (new StructuredOutput)->with(
messages: [ ['role'=>'system','content'=>$system] ],
responseModel: FactualExpert::class,
)->get();
}
public function multihop(string $query) : MultihopExpert {
$system = "<query>\n{$query}\n</query>";
return (new StructuredOutput)->with(
messages: [ ['role'=>'system','content'=>$system] ],
responseModel: MultihopExpert::class,
)->get();
}
public function score(string $query, string $answer) : ModelScore {
$messages = [
['role'=>'system','content'=>'You score answers by how well they answer the user query (0..1).'],
['role'=>'user','content'=>"<user query>\n{$query}\n</user query>\n\n<response>\n{$answer}\n</response>"],
];
return (new StructuredOutput)->with(
messages: $messages,
responseModel: ModelScore::class,
)->get();
}
}
$query = "Who's the original singer of Help Me Make It Through The Night?";
$evidences = ["Help Me Make It Through The Night is a country music ballad written and composed by Kris Kristofferson and released on his 1970 album 'Kristofferson'"];
$threshold = 0.8;
$more = new MoRE();
$factual = $more->factual($query, $evidences);
$multihop = $more->multihop($query);
$fScore = $more->score($query, $factual->answer)->score ?? 0.0;
$mScore = $more->score($query, $multihop->answer)->score ?? 0.0;
$answer = '';
if (max($fScore, $mScore) < $threshold) {
$answer = 'Abstaining from responding';
} else {
$answer = ($fScore > $mScore) ? $factual->answer : $multihop->answer;
}
dump($answer);
?>