Module: Desiru::Modules

Defined in:
lib/desiru/modules/react.rb,
lib/desiru/modules/predict.rb,
lib/desiru/modules/majority.rb,
lib/desiru/modules/retrieve.rb,
lib/desiru/modules/best_of_n.rb,
lib/desiru/modules/chain_of_thought.rb,
lib/desiru/modules/program_of_thought.rb,
lib/desiru/modules/multi_chain_comparison.rb

Defined Under Namespace

Classes: Backend, BestOfN, ChainOfThought, InMemoryBackend, MultiChainComparison, Predict, ProgramOfThought, ReAct, Retrieve

Class Method Summary collapse

Class Method Details

.majority(module_instance, **inputs) ⇒ Object

Function-style module for majority voting Returns the most common response from multiple completions

Raises:

  • (ArgumentError)


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/desiru/modules/majority.rb', line 7

def self.majority(module_instance, **inputs)
  raise ArgumentError, "First argument must be a Desiru module instance" unless module_instance.respond_to?(:call)

  # Number of completions to generate
  num_completions = inputs.delete(:num_completions) || 5

  # Generate multiple completions
  results = []
  num_completions.times do
    result = module_instance.call(**inputs)
    results << result
  end

  # Find the majority answer
  # For simplicity, we'll compare the first output field
  output_fields = module_instance.signature.output_fields.keys
  main_field = output_fields.first

  # Count occurrences of each answer
  answer_counts = Hash.new(0)
  answer_to_result = {}

  results.each do |result|
    answer = result[main_field]
    answer_counts[answer] += 1
    answer_to_result[answer] ||= result
  end

  # Return the result with the most common answer
  majority_answer = answer_counts.max_by { |_, count| count }&.first
  winning_result = answer_to_result[majority_answer] || results.first

  # Add voting metadata if requested
  if output_fields.include?(:voting_data)
    winning_result[:voting_data] = {
      votes: answer_counts,
      num_completions: num_completions,
      consensus_rate: answer_counts[majority_answer].to_f / num_completions
    }
  end

  winning_result
end