2023-03-15 17:21:45 -03:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
module DiscourseAi
|
|
|
|
|
module Embeddings
|
2023-03-31 11:04:34 +11:00
|
|
|
class SemanticRelated
|
2023-03-31 09:07:22 +11:00
|
|
|
def self.candidates_for(topic)
|
2023-03-31 11:04:34 +11:00
|
|
|
return ::Topic.none if SiteSetting.ai_embeddings_semantic_related_topics < 1
|
|
|
|
|
|
2023-03-15 17:21:45 -03:00
|
|
|
cache_for =
|
|
|
|
|
case topic.created_at
|
|
|
|
|
when 6.hour.ago..Time.now
|
|
|
|
|
15.minutes
|
|
|
|
|
when 1.day.ago..6.hour.ago
|
|
|
|
|
1.hour
|
|
|
|
|
else
|
|
|
|
|
1.day
|
|
|
|
|
end
|
|
|
|
|
|
2023-03-31 15:29:56 -03:00
|
|
|
model =
|
|
|
|
|
DiscourseAi::Embeddings::Model.instantiate(
|
|
|
|
|
SiteSetting.ai_embeddings_semantic_related_model,
|
|
|
|
|
)
|
|
|
|
|
|
2023-03-15 17:21:45 -03:00
|
|
|
begin
|
|
|
|
|
candidate_ids =
|
|
|
|
|
Discourse
|
|
|
|
|
.cache
|
|
|
|
|
.fetch("semantic-suggested-topic-#{topic.id}", expires_in: cache_for) do
|
2023-03-31 15:29:56 -03:00
|
|
|
DiscourseAi::Embeddings::Topic.new.symmetric_semantic_search(model, topic)
|
2023-03-15 17:21:45 -03:00
|
|
|
end
|
|
|
|
|
rescue StandardError => e
|
2023-03-31 11:04:34 +11:00
|
|
|
Rails.logger.error("SemanticRelated: #{e}")
|
2023-03-21 18:20:46 -03:00
|
|
|
Jobs.enqueue(:generate_embeddings, topic_id: topic.id)
|
2023-03-31 09:07:22 +11:00
|
|
|
return ::Topic.none
|
2023-03-15 17:21:45 -03:00
|
|
|
end
|
|
|
|
|
|
2023-05-09 15:30:50 -03:00
|
|
|
topic_list = ::Topic.visible.listable_topics.secured
|
|
|
|
|
|
|
|
|
|
unless SiteSetting.ai_embeddings_semantic_related_include_closed_topics
|
|
|
|
|
topic_list = topic_list.where(closed: false)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
topic_list
|
2023-03-31 12:04:17 +11:00
|
|
|
.where("id <> ?", topic.id)
|
2023-03-31 09:07:22 +11:00
|
|
|
.where(id: candidate_ids)
|
2023-05-09 15:30:50 -03:00
|
|
|
# array_position forces the order of the topics to be preserved
|
2023-03-31 09:07:22 +11:00
|
|
|
.order("array_position(ARRAY#{candidate_ids}, id)")
|
2023-03-31 11:04:34 +11:00
|
|
|
.limit(SiteSetting.ai_embeddings_semantic_related_topics)
|
2023-03-15 17:21:45 -03:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|