Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/models/answer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def self.response_for_question_routing_label(label)
has_many :sources, -> { order(relevancy: :asc) }, class_name: "AnswerSource"
has_one :feedback, class_name: "AnswerFeedback"
has_one :topics, class_name: "AnswerAnalysis::Topics"
has_one :answer_relevancy_aggregate, class_name: "AnswerAnalysis::AnswerRelevancyAggregate"

enum :status,
{
Expand Down
11 changes: 11 additions & 0 deletions app/models/answer_analysis/answer_relevancy_aggregate.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module AnswerAnalysis
class AnswerRelevancyAggregate < ApplicationRecord
self.table_name = "answer_analysis_answer_relevancy_aggregates"

belongs_to :answer
has_many :runs,
Comment thread
davidgisbey marked this conversation as resolved.
-> { order(:created_at) },
class_name: "AnswerAnalysis::AnswerRelevancyRun",
foreign_key: :answer_analysis_answer_relevancy_aggregate_id
end
end
11 changes: 11 additions & 0 deletions app/models/answer_analysis/answer_relevancy_run.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module AnswerAnalysis
class AnswerRelevancyRun < ApplicationRecord
include LlmCallsRecordable

self.table_name = "answer_analysis_answer_relevancy_runs"

belongs_to :aggregate,
class_name: "AnswerAnalysis::AnswerRelevancyAggregate",
foreign_key: :answer_analysis_answer_relevancy_aggregate_id
end
end
18 changes: 18 additions & 0 deletions db/migrate/20251216092915_add_answer_relevancy_tables.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class AddAnswerRelevancyTables < ActiveRecord::Migration[8.0]
def change
create_table :answer_analysis_answer_relevancy_aggregates, id: :uuid do |t|
t.decimal :mean_score, null: false
t.references :answer, type: :uuid, null: false, foreign_key: { on_delete: :cascade }, index: { unique: true }
t.timestamps
end

create_table :answer_analysis_answer_relevancy_runs, id: :uuid do |t|
t.decimal :score, null: false
t.string :reason, null: false
t.jsonb :llm_responses
t.jsonb :metrics
t.references :answer_analysis_answer_relevancy_aggregate, type: :uuid, null: false, foreign_key: { on_delete: :cascade }
t.timestamps
end
end
end
23 changes: 22 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[8.0].define(version: 2025_12_15_161508) do
ActiveRecord::Schema[8.0].define(version: 2025_12_16_092915) do
# These are extensions that must be enabled in order to support this database
enable_extension "citext"
enable_extension "pg_catalog.plpgsql"
Expand All @@ -24,6 +24,25 @@
create_enum "guardrails_status", ["pass", "fail", "error"]
create_enum "question_routing_label", ["about_mps", "advice_opinions_predictions", "character_fun", "genuine_rag", "gov_transparency", "greetings", "harmful_vulgar_controversy", "multi_questions", "negative_acknowledgement", "non_english", "personal_info", "positive_acknowledgement", "vague_acronym_grammar", "unclear_intent", "requires_account_data", "about_chat"]

create_table "answer_analysis_answer_relevancy_aggregates", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.decimal "mean_score", null: false
t.uuid "answer_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["answer_id"], name: "index_answer_analysis_answer_relevancy_aggregates_on_answer_id", unique: true
end

create_table "answer_analysis_answer_relevancy_runs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.decimal "score", null: false
Comment thread
davidgisbey marked this conversation as resolved.
t.string "reason", null: false
t.jsonb "llm_responses"
t.jsonb "metrics"
t.uuid "answer_analysis_answer_relevancy_aggregate_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["answer_analysis_answer_relevancy_aggregate_id"], name: "idx_on_answer_analysis_answer_relevancy_aggregate_i_d9d79a637a"
end

create_table "answer_analysis_topics", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "primary_topic"
t.string "secondary_topic"
Expand Down Expand Up @@ -170,6 +189,8 @@
t.datetime "updated_at", null: false
end

add_foreign_key "answer_analysis_answer_relevancy_aggregates", "answers", on_delete: :cascade
add_foreign_key "answer_analysis_answer_relevancy_runs", "answer_analysis_answer_relevancy_aggregates", on_delete: :cascade
add_foreign_key "answer_analysis_topics", "answers", on_delete: :cascade
add_foreign_key "answer_feedback", "answers", on_delete: :cascade
add_foreign_key "answer_sources", "answer_source_chunks", on_delete: :restrict
Expand Down
6 changes: 6 additions & 0 deletions spec/factories/answer_relevancy_aggregate_factory.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FactoryBot.define do
factory :answer_relevancy_aggregate, class: "AnswerAnalysis::AnswerRelevancyAggregate" do
answer
mean_score { 0.5 }
Comment thread
davidgisbey marked this conversation as resolved.
end
end
7 changes: 7 additions & 0 deletions spec/factories/answer_relevancy_run_factory.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FactoryBot.define do
factory :answer_relevancy_run, class: "AnswerAnalysis::AnswerRelevancyRun" do
association :aggregate, factory: :answer_relevancy_aggregate
score { 0.5 }
reason { "The answer was okay." }
end
end
5 changes: 5 additions & 0 deletions spec/models/answer_analysis/answer_relevancy_run_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
RSpec.describe AnswerAnalysis::AnswerRelevancyRun do
include_examples "llm calls recordable" do
let(:model) { build(:answer_relevancy_run) }
end
end