Skip to content

Commit 25b0651

Browse files
committed
Add Rerank and RerankResult specs
1 parent 96acb68 commit 25b0651

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
RSpec.describe RubyLLM::RerankResult do
6+
include_context 'with configured RubyLLM'
7+
8+
9+
describe 'class behavior' do
10+
let(:result_hash) do
11+
{
12+
index: 0,
13+
relevance_score: 0.85,
14+
document: 'Ruby is a dynamic, object-oriented programming language'
15+
}
16+
end
17+
18+
it 'can be created from hash' do # rubocop:disable RSpec/MultipleExpectations
19+
result = described_class.from_hash(result_hash)
20+
21+
expect(result.index).to eq(result_hash[:index])
22+
expect(result.relevance_score).to eq(result_hash[:relevance_score])
23+
expect(result.document).to eq(result_hash[:document])
24+
end
25+
26+
it 'has accessible attributes' do # rubocop:disable RSpec/MultipleExpectations
27+
result = described_class.new(**result_hash)
28+
29+
expect(result.index).to eq(result_hash[:index])
30+
expect(result.relevance_score).to eq(result_hash[:relevance_score])
31+
expect(result.document).to eq(result_hash[:document])
32+
end
33+
end
34+
end

spec/ruby_llm/rerank_spec.rb

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
RSpec.describe RubyLLM::Rerank do
6+
include_context 'with configured RubyLLM'
7+
8+
let(:test_query) { 'What is Ruby programming?' }
9+
let(:test_documents) do
10+
[
11+
'Ruby is a dynamic, object-oriented programming language',
12+
'Cooking recipes for beginners',
13+
'Ruby was created by Yukihiro Matsumoto in 1995',
14+
'Weather patterns in different climates',
15+
'Ruby on Rails is a popular web framework for Ruby'
16+
]
17+
end
18+
19+
describe 'basic functionality' do
20+
RERANK_MODELS.each do |model_info|
21+
model = model_info[:model]
22+
provider = model_info[:provider]
23+
it "#{provider}/#{model} can rerank documents" do # rubocop:disable RSpec/MultipleExpectations,RSpec/ExampleLength
24+
rerank = described_class.rank(test_query, test_documents, model: model)
25+
26+
expect(rerank.results).to be_an(Array)
27+
expect(rerank.results).not_to be_empty
28+
expect(rerank.results.first).to be_a(RubyLLM::RerankResult)
29+
expect(rerank.model).to eq(model)
30+
expect(rerank.search_units).to be >= 0
31+
end
32+
33+
it "#{provider}/#{model} returns results sorted by relevance" do
34+
rerank = described_class.rank(test_query, test_documents, model: model)
35+
36+
scores = rerank.results.map(&:relevance_score)
37+
expect(scores).to eq(scores.sort.reverse)
38+
end
39+
40+
it "#{provider}/#{model} includes document indices and content" do # rubocop:disable RSpec/MultipleExpectations,RSpec/ExampleLength
41+
rerank = described_class.rank(test_query, test_documents, model: model)
42+
43+
rerank.results.each do |result|
44+
expect(result.index).to be_a(Integer)
45+
expect(result.index).to be_between(0, test_documents.length - 1)
46+
expect(result.document).to be_a(String)
47+
expect(test_documents).to include(result.document)
48+
expect(result.relevance_score).to be_a(Float)
49+
end
50+
end
51+
52+
it "#{provider}/#{model} can limit results with top_n" do
53+
top_n = 2
54+
rerank = described_class.rank(test_query, test_documents, model: model, top_n: top_n)
55+
56+
expect(rerank.results.length).to eq(top_n)
57+
end
58+
59+
it "#{provider}/#{model} raises error for empty document arrays" do
60+
expect {
61+
described_class.rank(test_query, [], model: model)
62+
}.to raise_error(ArgumentError, 'No documents provided for reranking')
63+
end
64+
65+
it "#{provider}/#{model} can handle max_tokens_per_doc parameter" do # rubocop:disable RSpec/MultipleExpectations
66+
rerank = described_class.rank(test_query, test_documents, model: model, max_tokens_per_doc: 100)
67+
68+
expect(rerank.results).to be_an(Array)
69+
expect(rerank.model).to eq(model)
70+
end
71+
end
72+
end
73+
end

spec/spec_helper.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@
150150
{ provider: :cohere, model: 'embed-v4.0', default_dimensions: 1024 }
151151
].freeze
152152

153+
RERANK_MODELS = [
154+
{ provider: :cohere, model: 'rerank-v3.5' }
155+
].freeze
156+
153157
PDF_MODELS = [
154158
{ provider: :anthropic, model: 'claude-3-5-haiku-20241022' },
155159
{ provider: :gemini, model: 'gemini-2.0-flash' },

0 commit comments

Comments
 (0)