Class: Desiru::Modules::MultiChainComparison

Inherits:
Desiru::Module show all
Defined in:
lib/desiru/modules/multi_chain_comparison.rb

Overview

MultiChainComparison module that generates multiple chain-of-thought reasoning paths and compares them to produce the best answer

Constant Summary collapse

DEFAULT_SIGNATURE =
'question: string -> answer: string, reasoning: string'

Instance Attribute Summary

Attributes inherited from Desiru::Module

#config, #demos, #metadata, #model, #signature

Instance Method Summary collapse

Methods inherited from Desiru::Module

#call, #reset, #to_h, #with_demos

Methods included from AsyncCapable

#call_async, #call_batch_async

Methods included from ErrorHandling

#safe_execute, #with_error_context, #with_retry

Methods included from Core::Traceable

#call, #disable_trace!, #enable_trace!, #trace_enabled?

Constructor Details

#initialize(signature = nil, model: nil, **kwargs) ⇒ MultiChainComparison

Returns a new instance of MultiChainComparison.



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/desiru/modules/multi_chain_comparison.rb', line 10

def initialize(signature = nil, model: nil, **kwargs)
  # Extract our specific options before passing to parent
  @num_chains = kwargs.delete(:num_chains) || 3
  @comparison_strategy = kwargs.delete(:comparison_strategy) || :vote
  @temperature = kwargs.delete(:temperature) || 0.7

  # Use default signature if none provided
  signature ||= DEFAULT_SIGNATURE

  # Pass remaining kwargs to parent (config, demos, metadata)
  super
end

Instance Method Details

#forward(**inputs) ⇒ Object



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
50
51
52
53
54
55
# File 'lib/desiru/modules/multi_chain_comparison.rb', line 23

def forward(**inputs)
  # Handle edge case of zero chains
  return {} if @num_chains <= 0

  # Generate multiple reasoning chains
  chains = generate_chains(inputs)

  # Compare chains to determine best answer
  best_result = case @comparison_strategy
                when :vote
                  vote_on_chains(chains)
                when :llm_judge
                  llm_judge_chains(chains, inputs)
                when :confidence
                  select_by_confidence(chains)
                else
                  chains.first || {} # Fallback to first chain or empty hash
                end

  # Ensure best_result is not nil
  best_result ||= {}

  # Include comparison metadata if requested
  if signature.output_fields.key?('comparison_data') || signature.output_fields.key?(:comparison_data)
    best_result[:comparison_data] = {
      num_chains: chains.length,
      strategy: @comparison_strategy,
      all_chains: chains.map { |c| c[:reasoning] }
    }
  end

  best_result
end