Skip to content

Commit aa57587

Browse files
feat(MrqGenerationService): shuffle options when generating for the first time
1 parent 5c7d6c5 commit aa57587

2 files changed

Lines changed: 70 additions & 2 deletions

File tree

app/services/course/assessment/question/mrq_generation_service.rb

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def generate_questions
5757
}
5858
}
5959
).completion
60-
parse_llm_response(response)
60+
shuffle_output_options!(parse_llm_response(response))
6161
end
6262

6363
private
@@ -66,13 +66,15 @@ def generate_questions
6666
# @return [Array<Hash>] Array of messages formatted for the LLM chat
6767
def build_messages
6868
system_prompt, user_prompt = select_prompts
69+
source_question_options = @source_question_data&.dig('options') || []
70+
@shuffle_options = true if source_question_options.empty?
6971
formatted_system_prompt = system_prompt.format
7072
formatted_user_prompt = user_prompt.format(
7173
custom_prompt: @custom_prompt,
7274
number_of_questions: @number_of_questions,
7375
source_question_title: @source_question_data&.dig('title') || '',
7476
source_question_description: @source_question_data&.dig('description') || '',
75-
source_question_options: format_source_options(@source_question_data&.dig('options') || [])
77+
source_question_options: format_source_options(source_question_options)
7678
)
7779
[
7880
{ role: 'system', content: formatted_system_prompt },
@@ -111,4 +113,13 @@ def parse_llm_response(response)
111113
)
112114
fix_parser.parse(response)
113115
end
116+
117+
def shuffle_output_options!(parsed_output)
118+
return parsed_output unless @shuffle_options
119+
120+
parsed_output['questions'].each do |question|
121+
question['options']&.shuffle!
122+
end
123+
parsed_output
124+
end
114125
end

spec/services/course/assessment/question/mrq_generation_service_spec.rb

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,63 @@
116116
expect(result['questions'].length).to eq(1)
117117
end
118118
end
119+
120+
context 'shuffle behavior based on source question options' do
121+
let(:mock_options) { [{ 'option' => 'A', 'correct' => true }, { 'option' => 'B', 'correct' => false }] }
122+
let(:mock_parsed_output) { { 'questions' => [{ 'title' => 'Q', 'options' => mock_options }] } }
123+
124+
before do
125+
allow(subject).to receive(:parse_llm_response).and_return(mock_parsed_output)
126+
end
127+
128+
context 'when source question has existing options' do
129+
let(:params) do
130+
{
131+
custom_prompt: 'Generate questions about basic mathematics',
132+
number_of_questions: 1,
133+
source_question_data: {
134+
'title' => 'Sample',
135+
'description' => 'Desc',
136+
'options' => [{ 'option' => 'Option 1', 'correct' => true }]
137+
}
138+
}
139+
end
140+
141+
it 'does not shuffle the generated options' do
142+
expect(mock_options).not_to receive(:shuffle!)
143+
subject.generate_questions
144+
end
145+
end
146+
147+
context 'when source question options are empty' do
148+
let(:params) do
149+
{
150+
custom_prompt: 'Generate questions about basic mathematics',
151+
number_of_questions: 1,
152+
source_question_data: { 'title' => 'Sample', 'description' => 'Desc', 'options' => [] }
153+
}
154+
end
155+
156+
it 'shuffles the generated options' do
157+
expect(mock_options).to receive(:shuffle!)
158+
subject.generate_questions
159+
end
160+
end
161+
162+
context 'when source_question_data is absent' do
163+
let(:params) do
164+
{
165+
custom_prompt: 'Generate questions about basic mathematics',
166+
number_of_questions: 1
167+
}
168+
end
169+
170+
it 'shuffles the generated options' do
171+
expect(mock_options).to receive(:shuffle!)
172+
subject.generate_questions
173+
end
174+
end
175+
end
119176
end
120177

121178
describe '#format_source_options' do

0 commit comments

Comments
 (0)