Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions cmd/cosift/judge_excerpt_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package main

import "testing"

// Regression: with no reranker, the judge scored empty excerpts and dropped every candidate.
func TestJudgeExcerpt(t *testing.T) {
cases := []struct {
name string
rerankText string
title string
excerpt string
want string
}{
{"reranker ran", "reranked body", "Title", "retrieval excerpt", "reranked body"},
{"no reranker falls back", "", "Title", "retrieval excerpt", "Title\nretrieval excerpt"},
{"no reranker, empty title", "", "", "retrieval excerpt", "\nretrieval excerpt"},
}
for _, c := range cases {
if got := judgeExcerpt(c.rerankText, c.title, c.excerpt); got != c.want {
t.Errorf("%s: judgeExcerpt(%q, %q, %q) = %q, want %q",
c.name, c.rerankText, c.title, c.excerpt, got, c.want)
}
}
}
10 changes: 9 additions & 1 deletion cmd/cosift/serve_answer.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,14 @@ func answerLooksLikeNoInfo(s string) bool {
return false
}

// rerankText is only populated when a reranker ran; an empty excerpt makes the judge drop the candidate.
func judgeExcerpt(rerankText, title, excerpt string) string {
if rerankText != "" {
return rerankText
}
return title + "\n" + excerpt
}

func (s *pebbleHTTP) handleAnswer(w http.ResponseWriter, r *http.Request) {
// When clustered + gateway mode +
// not already serving as a leaf for someone else, fan-out retrieval
Expand Down Expand Up @@ -520,7 +528,7 @@ func (s *pebbleHTTP) handleAnswerInner(w http.ResponseWriter, r *http.Request, s
before := len(cands)
jCands := make([]judge.Candidate, len(cands))
for i, c := range cands {
jCands[i] = judge.Candidate{ID: strconv.Itoa(i), Excerpt: c.rerankText}
jCands[i] = judge.Candidate{ID: strconv.Itoa(i), Excerpt: judgeExcerpt(c.rerankText, c.src.Title, c.excerpt)}
}
verdicts := judge.Judge(r.Context(), s.chat, q, jCands, judge.Options{MinScore: 0.3})
keep := make([]cand, 0, len(cands))
Expand Down
Loading