Class: Desiru::Optimizers::COPRO
- Defined in:
- lib/desiru/optimizers/copro.rb
Overview
COPRO (Cooperative Prompt Optimization) optimizer Generates and refines instructions for each module using coordinate ascent
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
- #compile(program, trainset, valset = nil, **kwargs) ⇒ Object
-
#initialize(config = {}) ⇒ COPRO
constructor
A new instance of COPRO.
Methods inherited from Base
Constructor Details
#initialize(config = {}) ⇒ COPRO
Returns a new instance of COPRO.
8 9 10 11 12 13 14 |
# File 'lib/desiru/optimizers/copro.rb', line 8 def initialize(config = {}) super @max_iterations = config[:max_iterations] || 10 @num_candidates = config[:num_candidates] || 5 @temperature = config[:temperature] || 0.7 @improvement_threshold = config[:improvement_threshold] || 0.01 end |
Instance Method Details
#compile(program, trainset, valset = nil, **kwargs) ⇒ Object
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/desiru/optimizers/copro.rb', line 16 def compile(program, trainset, valset = nil, **kwargs) valset ||= trainset # Use trainset for validation if no valset provided # Initialize best score best_score = evaluate_program(program, valset, kwargs[:metric]) best_program = program.dup Desiru.logger.info("[COPRO] Initial score: #{best_score}") # Iterate through optimization rounds @max_iterations.times do |iteration| Desiru.logger.info("[COPRO] Starting iteration #{iteration + 1}/#{@max_iterations}") # Try to improve each predictor improved = false program.predictors.each do |name, predictor| Desiru.logger.info("[COPRO] Optimizing predictor: #{name}") # Generate instruction candidates candidates = generate_instruction_candidates(predictor, trainset, name) # Evaluate each candidate best_candidate_score = best_score best_candidate_instruction = nil candidates.each do |instruction| # Create program with new instruction candidate_program = create_program_with_instruction( best_program, name, instruction ) # Evaluate score = evaluate_program(candidate_program, valset, kwargs[:metric]) if score > best_candidate_score best_candidate_score = score best_candidate_instruction = instruction end end # Update if improved next unless best_candidate_instruction && (best_candidate_score - best_score) > @improvement_threshold Desiru.logger.info("[COPRO] Improved #{name}: #{best_score} -> #{best_candidate_score}") best_program = create_program_with_instruction( best_program, name, best_candidate_instruction ) best_score = best_candidate_score improved = true end # Early stopping if no improvement break unless improved end Desiru.logger.info("[COPRO] Final score: #{best_score}") best_program end |