Files
compras/app/Services/SyntheticAiAssessment.php
nala c6373365bf
tests / ci (push) Canceled after 0s
commit9
2026-10-30 20:02:30 +02:00

35 lines
1.6 KiB
PHP

<?php
namespace App\Services;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class SyntheticAiAssessment
{
/** @param array<int,array<string,mixed>> $claims
* @return array<string,mixed>
*/
public function assess(array $claims): array
{
$facts = app(SyntheticAiRehearsal::class)->preview()['facts'];
$ids = array_column($facts, 'id');
Validator::make(['claims' => $claims], ['claims' => 'required|array|list|min:1|max:3', 'claims.*' => 'required|array:text,source_ids',
'claims.*.text' => 'required|string|max:1000', 'claims.*.source_ids' => 'required|array|list|min:1|max:3',
'claims.*.source_ids.*' => ['required', 'string', Rule::in($ids)]])->validate();
$byId = array_column($facts, 'text', 'id');
$cited = [];
$exact = 0;
foreach ($claims as $claim) {
$sourceIds = array_values(array_unique($claim['source_ids']));
$cited = [...$cited, ...$sourceIds];
$exact += in_array(trim($claim['text']), array_map(fn ($id) => $byId[$id], $sourceIds), true) ? 1 : 0;
}
$missing = array_values(array_diff($ids, $cited));
return ['method' => 'synthetic_ai_assessment_v1', 'facts' => count($facts), 'claims' => count($claims),
'cited_facts' => count(array_unique($cited)), 'uncited_fact_ids' => $missing, 'citation_coverage_complete' => $missing === [],
'exact_source_text_matches' => $exact, 'requires_human_review' => true, 'semantic_accuracy' => 'not_automatically_verified'];
}
}