mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-03-06 09:20:14 +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
|
# 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
|
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
|
||||||
|
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|
|
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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user