Skip to content

Commit 2f73ae6

Browse files
committed
Add core Rerank and RerankResult classes
1 parent f91143a commit 2f73ae6

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

lib/ruby_llm/rerank.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
module RubyLLM
4+
# Core reranking interface. Provides a clean way to generate rerankings
5+
# for a given query and set of documents using various provider models.
6+
class Rerank
7+
attr_reader :results, :model, :search_units
8+
9+
def initialize(results:, model:, search_units:)
10+
@results = results.sort_by { |r| -r.relevance_score }
11+
@model = model
12+
@search_units = search_units
13+
end
14+
15+
def self.rank(query, # rubocop:disable Metrics/ParameterLists
16+
documents,
17+
model: nil,
18+
provider: nil,
19+
assume_model_exists: false,
20+
context: nil,
21+
top_n: nil,
22+
max_tokens_per_doc: nil)
23+
raise ArgumentError, 'No documents provided for reranking' if documents.empty?
24+
25+
config = context&.config || RubyLLM.config
26+
model ||= config.default_rerank_model
27+
model, provider = Models.resolve(model, provider: provider, assume_exists: assume_model_exists)
28+
model_id = model.id
29+
30+
provider = Provider.for(model_id) if provider.nil?
31+
connection = context ? context.connection_for(provider) : provider.connection(config)
32+
provider.rank(query, documents, model: model_id, connection:, top_n:, max_tokens_per_doc:)
33+
end
34+
end
35+
end

lib/ruby_llm/rerank_result.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
module RubyLLM
4+
# Represents a single rerank result with index, relevance score, and document
5+
class RerankResult
6+
attr_reader :index, :relevance_score, :document
7+
8+
def initialize(index:, relevance_score:, document:)
9+
@index = index
10+
@relevance_score = relevance_score
11+
@document = document
12+
end
13+
14+
def self.from_hash(hash)
15+
new(
16+
index: hash[:index],
17+
relevance_score: hash[:relevance_score],
18+
document: hash[:document]
19+
)
20+
end
21+
end
22+
end

0 commit comments

Comments
 (0)