@@ -535,6 +535,69 @@ func (m *Model) Close() error {
535535 return nil
536536}
537537
538+ // ============================================================================
539+ // RERANKER (Stage-2 search reranking)
540+ // ============================================================================
541+
542+ // RerankerModel wraps a model for reranking (query, document) pairs.
543+ //
544+ // Note: yzma does not currently expose a dedicated reranker/logit API here,
545+ // so we approximate relevance with embedding cosine similarity.
546+ type RerankerModel struct {
547+ model * Model
548+ }
549+
550+ // LoadRerankerModel loads a GGUF model for reranking.
551+ func LoadRerankerModel (opts Options ) (* RerankerModel , error ) {
552+ model , err := LoadModel (opts )
553+ if err != nil {
554+ return nil , err
555+ }
556+ return & RerankerModel {model : model }, nil
557+ }
558+
559+ // Score returns a relevance score in [0,1] for a (query, document) pair.
560+ //
561+ // Implementation detail:
562+ // - Computes normalized embeddings for query and document
563+ // - Uses cosine similarity
564+ // - Maps from [-1,1] to [0,1]
565+ func (r * RerankerModel ) Score (ctx context.Context , query , document string ) (float32 , error ) {
566+ if r == nil || r .model == nil {
567+ return 0 , fmt .Errorf ("reranker model not loaded" )
568+ }
569+
570+ qVec , err := r .model .Embed (ctx , query )
571+ if err != nil {
572+ return 0 , err
573+ }
574+ dVec , err := r .model .Embed (ctx , document )
575+ if err != nil {
576+ return 0 , err
577+ }
578+ if len (qVec ) == 0 || len (dVec ) == 0 {
579+ return 0 , fmt .Errorf ("reranker returned empty embedding" )
580+ }
581+
582+ cos := vector .CosineSimilarity (qVec , dVec )
583+ if cos > 1 {
584+ cos = 1
585+ }
586+ if cos < - 1 {
587+ cos = - 1
588+ }
589+
590+ return float32 ((cos + 1.0 ) / 2.0 ), nil
591+ }
592+
593+ // Close releases reranker resources.
594+ func (r * RerankerModel ) Close () error {
595+ if r == nil || r .model == nil {
596+ return nil
597+ }
598+ return r .model .Close ()
599+ }
600+
538601// ============================================================================
539602// TEXT GENERATION (for Heimdall SLM)
540603// ============================================================================
0 commit comments