mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-03-06 01:10:28 +00:00
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:
parent
5fb1177f7b
commit
95762723de
@ -51,5 +51,6 @@ end
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_ai_summaries_on_target_type_and_target_id (target_type,target_id)
|
||||
# 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)
|
||||
#
|
||||
|
@ -368,6 +368,7 @@ discourse_ai:
|
||||
default: 0
|
||||
min: 0
|
||||
max: 1000
|
||||
hidden: true
|
||||
ai_hot_topic_gists_allowed_groups:
|
||||
type: group_list
|
||||
list_type: compact
|
||||
|
19
db/migrate/20241125132452_unique_ai_summaries.rb
Normal file
19
db/migrate/20241125132452_unique_ai_summaries.rb
Normal 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
|
@ -20,7 +20,7 @@ module DiscourseAi
|
||||
plugin.register_modifier(:topic_query_create_list_topics) do |topics, options|
|
||||
if Discourse.filters.include?(options[:filter]) && SiteSetting.ai_summarization_enabled &&
|
||||
SiteSetting.ai_summarize_max_hot_topics_gists_per_batch > 0
|
||||
topics.includes(:ai_summaries)
|
||||
topics.includes(:ai_gist_summary)
|
||||
else
|
||||
topics
|
||||
end
|
||||
@ -32,11 +32,7 @@ module DiscourseAi
|
||||
include_condition: -> { scope.can_see_gists? },
|
||||
) do
|
||||
return if !Discourse.filters.include?(options[:filter])
|
||||
summaries = object.ai_summaries.to_a
|
||||
|
||||
# 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
|
||||
object.ai_gist_summary&.summarized_text
|
||||
end
|
||||
|
||||
# To make sure hot topic gists are inmediately up to date, we rely on this event
|
||||
|
@ -4,6 +4,13 @@ module DiscourseAi
|
||||
module TopicExtensions
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user