PERF: Preload only gists when including summaries in topic list (#948)

* PERF: Preload only gists when including summaries in topic list

* Add unique index on summaries and dedup existing records

* Make hot topics batch size setting hidden
This commit is contained in:
Roman Rizzi 2024-11-25 12:24:02 -03:00 committed by GitHub
parent 5fb1177f7b
commit 95762723de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 32 additions and 8 deletions

View File

@ -51,5 +51,6 @@ end
# #
# Indexes # Indexes
# #
# idx_on_target_id_target_type_summary_type_3355609fbb (target_id,target_type,summary_type) UNIQUE
# index_ai_summaries_on_target_type_and_target_id (target_type,target_id) # index_ai_summaries_on_target_type_and_target_id (target_type,target_id)
# #

View File

@ -368,6 +368,7 @@ discourse_ai:
default: 0 default: 0
min: 0 min: 0
max: 1000 max: 1000
hidden: true
ai_hot_topic_gists_allowed_groups: ai_hot_topic_gists_allowed_groups:
type: group_list type: group_list
list_type: compact list_type: compact

View File

@ -0,0 +1,19 @@
# frozen_string_literal: true
class UniqueAiSummaries < ActiveRecord::Migration[7.1]
def up
execute <<~SQL
DELETE FROM ai_summaries ais1
USING ai_summaries ais2
WHERE ais1.id < ais2.id
AND ais1.target_id = ais2.target_id
AND ais1.target_type = ais2.target_type
AND ais1.summary_type = ais2.summary_type
SQL
add_index :ai_summaries, %i[target_id target_type summary_type], unique: true
end
def down
remove_index :ai_summaries, column: %i[target_id target_type summary_type]
end
end

View File

@ -20,7 +20,7 @@ module DiscourseAi
plugin.register_modifier(:topic_query_create_list_topics) do |topics, options| plugin.register_modifier(:topic_query_create_list_topics) do |topics, options|
if Discourse.filters.include?(options[:filter]) && SiteSetting.ai_summarization_enabled && if Discourse.filters.include?(options[:filter]) && SiteSetting.ai_summarization_enabled &&
SiteSetting.ai_summarize_max_hot_topics_gists_per_batch > 0 SiteSetting.ai_summarize_max_hot_topics_gists_per_batch > 0
topics.includes(:ai_summaries) topics.includes(:ai_gist_summary)
else else
topics topics
end end
@ -32,11 +32,7 @@ module DiscourseAi
include_condition: -> { scope.can_see_gists? }, include_condition: -> { scope.can_see_gists? },
) do ) do
return if !Discourse.filters.include?(options[:filter]) return if !Discourse.filters.include?(options[:filter])
summaries = object.ai_summaries.to_a object.ai_gist_summary&.summarized_text
# Summaries should always have one or zero elements here.
# This is an extra safeguard to avoid including regular summaries.
summaries.find { |s| s.summary_type == "gist" }&.summarized_text
end end
# To make sure hot topic gists are inmediately up to date, we rely on this event # To make sure hot topic gists are inmediately up to date, we rely on this event

View File

@ -4,6 +4,13 @@ module DiscourseAi
module TopicExtensions module TopicExtensions
extend ActiveSupport::Concern extend ActiveSupport::Concern
prepended { has_many :ai_summaries, as: :target } prepended do
has_many :ai_summaries, as: :target
has_one :ai_gist_summary,
-> { where(summary_type: AiSummary.summary_types[:gist]) },
class_name: "AiSummary",
as: :target
end
end end
end end