From 4e739f3cd8cf45ecc21d3bc6408ee19877a41c57 Mon Sep 17 00:00:00 2001 From: th-kim0823 Date: Sun, 10 May 2026 17:54:16 +0900 Subject: [PATCH] feat(search): add score_kind to VectorRetriever (Cosine) and hybrid test helpers (Rrf) This commit unblocks Tasks 3 and 4 of fb-38: - VectorRetriever::build_hit now labels hits with ScoreKind::Cosine - Hybrid retriever test helpers (mk_hit functions) label synthetic hits with ScoreKind::Rrf - Updated lexical snapshot fixture to reflect new score_kind field in output Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/kebab-search/src/hybrid.rs | 2 ++ crates/kebab-search/src/vector.rs | 3 ++- crates/kebab-search/tests/fixtures/search/lexical/run-1.json | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/kebab-search/src/hybrid.rs b/crates/kebab-search/src/hybrid.rs index 7f415a9..e285915 100644 --- a/crates/kebab-search/src/hybrid.rs +++ b/crates/kebab-search/src/hybrid.rs @@ -505,6 +505,7 @@ mod tests { // a fixed UNIX_EPOCH so synthetic hits remain deterministic. indexed_at: time::OffsetDateTime::UNIX_EPOCH, stale: false, + score_kind: kebab_core::ScoreKind::Rrf, } } @@ -755,6 +756,7 @@ mod tests { chunker_version: ChunkerVersion("c1".into()), indexed_at: time::OffsetDateTime::UNIX_EPOCH, stale: false, + score_kind: kebab_core::ScoreKind::Rrf, } } diff --git a/crates/kebab-search/src/vector.rs b/crates/kebab-search/src/vector.rs index 9bf74c7..47eda97 100644 --- a/crates/kebab-search/src/vector.rs +++ b/crates/kebab-search/src/vector.rs @@ -21,7 +21,7 @@ use std::sync::Arc; use anyhow::{Context, Result}; use kebab_core::{ ChunkId, ChunkerVersion, DocumentId, Embedder, EmbeddingInput, EmbeddingKind, - IndexVersion, RetrievalDetail, Retriever, SearchHit, SearchMode, SearchQuery, + IndexVersion, RetrievalDetail, Retriever, ScoreKind, SearchHit, SearchMode, SearchQuery, SourceSpan, VectorHit, VectorStore, WorkspacePath, }; use kebab_store_sqlite::SqliteStore; @@ -326,6 +326,7 @@ fn build_hit( // (called from `App::search` / `App::search_uncached`) and the equivalent // in `RagPipeline::ask` against the configured threshold. stale: false, + score_kind: ScoreKind::Cosine, }) } diff --git a/crates/kebab-search/tests/fixtures/search/lexical/run-1.json b/crates/kebab-search/tests/fixtures/search/lexical/run-1.json index 2500cd4..d6ae0dc 100644 --- a/crates/kebab-search/tests/fixtures/search/lexical/run-1.json +++ b/crates/kebab-search/tests/fixtures/search/lexical/run-1.json @@ -26,6 +26,7 @@ "vector_rank": null, "vector_score": null }, + "score_kind": "bm25", "section_label": "Snap", "snippet": "alpha alpha", "stale": false @@ -57,6 +58,7 @@ "vector_rank": null, "vector_score": null }, + "score_kind": "bm25", "section_label": "Snap", "snippet": "alpha bravo charlie", "stale": false