Skip to content

Commit e1b06d6

Browse files
committed
Extract run persistance logic into a concern
This commit introduces the AnalysisResultsRecordable concern to encapsulate the logic for persisting analysis results into runs. This can be reused by future aggregate models.
1 parent d240b06 commit e1b06d6

4 files changed

Lines changed: 63 additions & 52 deletions

File tree

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,8 @@
11
module AnswerAnalysis
22
class AnswerRelevancyAggregate < ApplicationRecord
3+
include AnalysisResultsRecordable
4+
35
belongs_to :answer
46
has_many :runs, class_name: "AnswerAnalysis::AnswerRelevancyRun"
5-
6-
def create_run_from_result(result)
7-
run = runs.build(
8-
score: result.score,
9-
reason: result.reason,
10-
)
11-
12-
result.llm_responses.stringify_keys.each do |name, llm_response|
13-
run.assign_llm_response(name, llm_response)
14-
end
15-
result.metrics.stringify_keys.each do |name, metrics|
16-
run.assign_metrics(name, metrics)
17-
end
18-
19-
run.save!
20-
end
217
end
228
end
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module AnalysisResultsRecordable
2+
extend ActiveSupport::Concern
3+
4+
included do
5+
def create_run_from_result(result)
6+
run = runs.build(
7+
score: result.score,
8+
reason: result.reason,
9+
)
10+
11+
result.llm_responses.stringify_keys.each do |name, llm_response|
12+
run.assign_llm_response(name, llm_response)
13+
end
14+
result.metrics.stringify_keys.each do |name, metrics|
15+
run.assign_metrics(name, metrics)
16+
end
17+
18+
run.save!
19+
end
20+
end
21+
end
Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,5 @@
11
RSpec.describe AnswerAnalysis::AnswerRelevancyAggregate do
2-
describe "#create_run_from_result" do
2+
include_examples "analysis results recordable" do
33
let(:aggregate) { create(:answer_relevancy_aggregate) }
4-
let(:result) do
5-
AutoEvaluation::AnswerRelevancy::Result.new(
6-
score: 0.85,
7-
reason: "The answer is relevant to the question.",
8-
success: true,
9-
llm_responses: {
10-
"response_1" => { "content" => "LLM response content 1" },
11-
"response_2" => { "content" => "LLM response content 2" },
12-
},
13-
metrics: {
14-
"metric_1" => { "detail" => "Metric detail 1" },
15-
"metric_2" => { "detail" => "Metric detail 2" },
16-
},
17-
)
18-
end
19-
20-
it "creates a run with correct attributes and associations" do
21-
expect {
22-
aggregate.create_run_from_result(result)
23-
}.to change { aggregate.runs.count }.by(1)
24-
25-
run = aggregate.runs.strict_loading(false).last
26-
expect(run).to have_attributes(
27-
score: 0.85,
28-
reason: "The answer is relevant to the question.",
29-
llm_responses: {
30-
"response_1" => { "content" => "LLM response content 1" },
31-
"response_2" => { "content" => "LLM response content 2" },
32-
},
33-
metrics: {
34-
"metric_1" => { "detail" => "Metric detail 1" },
35-
"metric_2" => { "detail" => "Metric detail 2" },
36-
},
37-
)
38-
end
394
end
405
end
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
shared_examples "analysis results recordable" do
2+
describe "#create_run_from_result" do
3+
let(:result) do
4+
AutoEvaluation::AnswerRelevancy::Result.new(
5+
score: 0.85,
6+
reason: "The answer is relevant to the question.",
7+
success: true,
8+
llm_responses: {
9+
"response_1" => { "content" => "LLM response content 1" },
10+
"response_2" => { "content" => "LLM response content 2" },
11+
},
12+
metrics: {
13+
"metric_1" => { "detail" => "Metric detail 1" },
14+
"metric_2" => { "detail" => "Metric detail 2" },
15+
},
16+
)
17+
end
18+
19+
it "creates a run with correct attributes and associations" do
20+
expect {
21+
aggregate.create_run_from_result(result)
22+
}.to change { aggregate.runs.count }.by(1)
23+
24+
run = aggregate.runs.strict_loading(false).last
25+
expect(run).to have_attributes(
26+
score: 0.85,
27+
reason: "The answer is relevant to the question.",
28+
llm_responses: {
29+
"response_1" => { "content" => "LLM response content 1" },
30+
"response_2" => { "content" => "LLM response content 2" },
31+
},
32+
metrics: {
33+
"metric_1" => { "detail" => "Metric detail 1" },
34+
"metric_2" => { "detail" => "Metric detail 2" },
35+
},
36+
)
37+
end
38+
end
39+
end

0 commit comments

Comments
 (0)