*/ public array $comparisonPhrases = ['', '', '']; /** @var array> */ public array $comparisonEntries = []; /** @var array> */ public array $comparisonMatrix = []; /** @var array */ public array $comparisonPairs = []; /** @var array|null */ public ?array $closestPair = null; public function mount(EmbeddingWorkbench $workbench): void { $this->initializeWorkbench($workbench); } public function comparePhrases(EmbeddingWorkbench $workbench, RecordEmbeddingUsageEvent $recordUsageEvent): void { if (! $this->ensureWorkbenchAvailable($workbench, 'comparisonPhrases')) { return; } $this->validate([ 'comparisonPhrases' => ['required', 'array', 'min:2', 'max:12'], 'comparisonPhrases.*' => ['nullable', 'string', 'max:1000'], 'embeddingModel' => ['required', 'string'], ]); $phrases = $this->comparisonPhraseValues(); if (count($phrases) < 2) { $this->addError('comparisonPhrases', __('Enter at least two unique phrases.')); return; } try { $comparison = $workbench->compare($phrases, $this->embeddingModel); $this->comparisonEntries = $comparison['entries'] ->map(fn (EmbeddingEntry $entry): array => $workbench->presentEntry($entry)) ->all(); $this->comparisonMatrix = collect($comparison['matrix']) ->map(fn (array $row): array => [ 'source_text' => $row['entry']->source_text, 'scores' => $row['scores'], ]) ->all(); $this->comparisonPairs = $this->comparisonPairsFromMatrix($comparison['entries'], $comparison['matrix']); $this->closestPair = $comparison['closest_pair'] === null ? null : [ 'first' => $comparison['closest_pair']['first']->source_text, 'second' => $comparison['closest_pair']['second']->source_text, 'similarity' => $comparison['closest_pair']['similarity'], ]; $recordUsageEvent->handle( user: auth()->user(), workbench: $workbench, selectedModel: $this->embeddingModel, tool: 'compare', inputCount: count($phrases), resultCount: count($this->comparisonPairs), ); $this->refreshSummary($workbench); Flux::toast(variant: 'success', text: __('Comparison ready.')); } catch (\Throwable $exception) { $this->addError('embeddingModel', $exception->getMessage()); } } public function addComparisonPhrase(): void { if (count($this->comparisonPhrases) >= 12) { return; } $this->comparisonPhrases[] = ''; $this->resetComparisonResults(); } public function removeComparisonPhrase(int $index): void { if (count($this->comparisonPhrases) <= 2 || ! array_key_exists($index, $this->comparisonPhrases)) { return; } unset($this->comparisonPhrases[$index]); $this->comparisonPhrases = array_values($this->comparisonPhrases); $this->resetComparisonResults(); } /** * @return list */ protected function comparisonPhraseValues(): array { return EmbeddingVector::phrasesFromText(implode("\n", $this->comparisonPhrases), 12); } /** * @param Collection $entries * @param array}> $matrix * @return array */ protected function comparisonPairsFromMatrix(Collection $entries, array $matrix): array { $pairs = []; foreach ($matrix as $rowIndex => $row) { foreach ($row['scores'] as $columnIndex => $similarity) { if ($rowIndex >= $columnIndex) { continue; } $firstEntry = $entries->get($rowIndex); $secondEntry = $entries->get($columnIndex); if (! $firstEntry instanceof EmbeddingEntry || ! $secondEntry instanceof EmbeddingEntry) { continue; } $pairs[] = [ 'first' => $firstEntry->source_text, 'second' => $secondEntry->source_text, 'similarity' => $similarity, 'distance' => round(1 - $similarity, 6), ]; } } return collect($pairs) ->sortByDesc('similarity') ->values() ->all(); } protected function resetComparisonResults(): void { $this->comparisonEntries = []; $this->comparisonMatrix = []; $this->comparisonPairs = []; $this->closestPair = null; } }; ?>
@include('pages.embeddings.partials.navigation', ['heading' => __('Proximity comparison')])
@if ($closestPair !== null)
{{ __('Closest pair') }}
{{ $closestPair['first'] }} {{ __('vs') }} {{ $closestPair['second'] }} {{ number_format($closestPair['similarity'], 3) }}
@endif
{{ __('Compare') }} {{ __('Comparing') }}
{{ __('Phrases') }} {{ __('Add phrase') }}
@foreach ($comparisonPhrases as $index => $phrase)
{{ __('Phrase :number', ['number' => $index + 1]) }}
@endforeach
@if ($comparisonEntries !== [])
@foreach ($comparisonPairs as $pair) @endforeach
{{ __('First phrase') }} {{ __('Second phrase') }} {{ __('Similarity') }} {{ __('Distance') }}
{{ $pair['first'] }} {{ $pair['second'] }} {{ number_format($pair['similarity'], 3) }} {{ number_format($pair['distance'], 3) }}
@foreach ($comparisonEntries as $entry) @endforeach @foreach ($comparisonMatrix as $row) @foreach ($row['scores'] as $score) @endforeach @endforeach
{{ __('Compared phrase') }}{{ $entry['source_text'] }}
#{{ $loop->iteration }} {{ $row['source_text'] }} {{ number_format($score, 3) }}
@endif