Discourse AI + Data Explorer?

Con ChatGPT 3.5 ottengo risultati inaspettati quando fornisco lo schema completo. Ad esempio, continua a cercare l’autore dell’argomento nella tabella topic_users.

Ottengo risultati positivi limitando le informazioni nel prompt alle tabelle e alle colonne necessarie per scrivere la query. Inoltre, aggiungendo alcune informazioni aggiuntive su come vengono utilizzate le colonne. Ad esempio:

# Nome tabella: user_actions
#
#  id              :integer          not null, primary key
#  action_type     :integer          not null (:like=1,:was_liked=2,:new_topic=4,:reply=5,:response=6,:mention=7,:quote=9,:edit=11,:new_private_message=12,:got_private_message=13,:solved=15,:assigned=16)
#  user_id         :integer          not null (l'utente a cui attribuire l'azione)
#  target_topic_id :integer
#  acting_user_id  :integer (l'utente che ha eseguito l'azione, ad esempio un utente staff può eseguire un'azione per conto di un utente regolare)
#  created_at      :datetime         not null

Un altro modo per far funzionare questo approccio con il plugin Data Explorer sarebbe far compilare agli utenti un modulo generato dinamicamente che elenca i dati che stanno cercando e le condizioni che vogliono applicare ai dati. Il prompt potrebbe essere generato programmaticamente da Discourse, quindi inviato all’LLM per scrivere la query.

Modifica: @jordan-violet, questo potrebbe essere un punto di partenza utile. Ecco uno schema parziale annotato che funziona per me. Funziona bene finché limito le mie query in modo che possano essere risposte dallo schema fornito. Ho aggiunto dettagli aggiuntivi allo schema per chiarire aspetti che sembrano confondere ChatGPT. Lo svantaggio ovvio di questo approccio è che uno schema completamente annotato supererà il limite di token di ChatGPT 3.5. Ho incluso alcune informazioni nello schema che potrebbero essere omesse per ridurre il numero di token utilizzati.

Riepilogo
# == Schema Information
#
# Nome tabella: application_requests
#
#  id       :integer          not null, primary key
#  date     :date             not null
#  req_type :integer          not null ("http_total"=0,"http_2xx"=1,"http_background"=2,"http_3xx"=3,"http_4xx"=4,"http_5xx"=5,"page_view_crawler"=6,"page_view_logged_in"=7,"page_view_anon"=8,"page_view_logged_in_mobile"=9,"page_view_anon_mobile"=10,"api"=11,"user_api"=12)
#  count    :integer          default(0), not null
#
# Nome tabella: users
#
#  id                        :integer          not null, primary key
#  username                  :string(60)       not null
#  created_at                :datetime         not null
#  updated_at                :datetime         not null
#  name                      :string           (il nome reale dell'utente)
#  last_posted_at            :datetime
#  active                    :boolean          default(FALSE), not null
#  username_lower            :string(60)       not null
#  last_seen_at              :datetime
#  admin                     :boolean          default(FALSE), not null
#  trust_level               :integer          not null
#  approved                  :boolean          default(FALSE), not null
#  approved_by_id            :integer
#  approved_at               :datetime
#  previous_visit_at         :datetime
#  suspended_at              :datetime
#  suspended_till            :datetime
#  date_of_birth             :date
#  ip_address                :inet
#  moderator                 :boolean          default(FALSE)
#  title                     :string
#  locale                    :string(10)
#  primary_group_id          :integer
#  registration_ip_address   :inet
#  staged                    :boolean          default(FALSE), not null
#  first_seen_at             :datetime
#  silenced_till             :datetime
#
# Nome tabella: topics
#
#  id                        :integer          not null, primary key
#  title                     :string           not null
#  last_posted_at            :datetime
#  created_at                :datetime         not null
#  updated_at                :datetime         not null
#  views                     :integer          default(0), not null
#  posts_count               :integer          default(0), not null
#  user_id                   :integer          (l'id dell'utente che ha creato l'argomento)
#  last_post_user_id         :integer          not null (l'id dell'utente che ha creato l'ultimo post nell'argomento)
#  reply_count               :integer          default(0), not null
#  deleted_at                :datetime
#  highest_post_number       :integer          default(0), not null
#  like_count                :integer          default(0), not null
#  category_id               :integer
#  visible                   :boolean          default(TRUE), not null
#  moderator_posts_count     :integer          default(0), not null
#  closed                    :boolean          default(FALSE), not null
#  archived                  :boolean          default(FALSE), not null
#  bumped_at                 :datetime         not null
#  archetype                 :string           default("regular"), not null (può essere impostato su "regular" o "private_message")
#  slug                      :string
#  deleted_by_id             :integer          (l'id dell'utente che ha eliminato l'argomento)
#  participant_count         :integer          default(1)
#  word_count                :integer
#  excerpt                   :string
#  highest_staff_post_number :integer          default(0), not null
#
# Nome tabella: posts
#
#  id                      :integer          not null, primary key
#  user_id                 :integer          (l'id dell'utente che ha creato il post)
#  topic_id                :integer          not null
#  post_number             :integer          not null (indica l'ordine del post nel suo argomento)
#  raw                     :text             not null (il contenuto del post)
#  created_at              :datetime         not null
#  updated_at              :datetime         not null
#  reply_to_post_number    :integer          (il post_number a cui il post è una risposta)
#  reply_count             :integer          default(0), not null
#  deleted_at              :datetime
#  like_count              :integer          default(0), not null
#  bookmark_count          :integer          default(0), not null
#  reads                   :integer          default(0), not null (il numero di volte che il post è stato letto)
#  post_type               :integer          default(1), not null (:regular=1, :moderator_action=2, :small_action=3, :whisper=4)
#  last_editor_id          :integer          (l'id dell'utente che ha modificato per ultimo il post)
#  hidden                  :boolean          default(FALSE), not null
#  hidden_reason_id        :integer          (:flag_threshold_reached=1,:flag_threshold_reached_again=2,:new_user_spam_threshold_reached=3,:flagged_by_tl3_user=4,:email_spam_header_found=5,:flagged_by_tl4_user=6,:email_authentication_result_header=7,:imported_as_unlisted=8)
#  edit_reason             :string
#  word_count              :integer
#  wiki                    :boolean          default(FALSE), not null
#
# Nome tabella: categories
#
#  id                                        :integer          not null, primary key
#  name                                      :string(50)       not null
#  topic_id                                  :integer          (l'id dell'argomento utilizzato per la descrizione della categoria)
#  topic_count                               :integer          default(0), not null
#  created_at                                :datetime         not null
#  updated_at                                :datetime         not null
#  user_id                                   :integer          not null (l'id dell'utente che ha creato l'argomento)
#  topics_year                               :integer          default(0)
#  topics_month                              :integer          default(0)
#  topics_week                               :integer          default(0)
#  slug                                      :string           not null
#  description                               :text
#  text_color                                :string(6)        default("FFFFFF"), not null
#  read_restricted                           :boolean          default(FALSE), not null
#  auto_close_hours                          :float
#  post_count                                :integer          default(0), not null
#  latest_post_id                            :integer
#  latest_topic_id                           :integer
#  position                                  :integer
#  parent_category_id                        :integer
#  posts_year                                :integer          default(0)
#  posts_month                               :integer          default(0)
#  posts_week                                :integer          default(0)
#  topics_day                                :integer          default(0)
#  posts_day                                 :integer          default(0)
#
# Nome tabella: groups
#
#  id                                 :integer          not null, primary key
#  name                               :string           not null
#  created_at                         :datetime         not null
#  automatic                          :boolean          default(FALSE), not null
#  user_count                         :integer          default(0), not null
#  title                              :string
#  bio_raw                            :text             (la descrizione del gruppo)
#  allow_membership_requests          :boolean          default(FALSE), not null
#  full_name                          :string
#  visibility_level                   :integer          default(0), not null (chi può vedere il gruppo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#  messageable_level                  :integer          default(0) (chi può inviare messaggi al gruppo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#  mentionable_level                  :integer          default(0) (chi può menzionare il gruppo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#  members_visibility_level           :integer          default(0), not null (chi vede i membri del gruppo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#
# Nome tabella: group_users
#
#  id                 :integer          not null, primary key
#  group_id           :integer          not null
#  user_id            :integer          not null
#  created_at         :datetime         not null
#
# Nome tabella: user_actions
#
#  id              :integer          not null, primary key
#  action_type     :integer          not null (:like=1,:was_liked=2,:new_topic=4,:reply=5,:response=6,:mention=7,:quote=9,:edit=11,:new_private_message=12,:got_private_message=13,:solved=15,:assigned=16)
#  user_id         :integer          not null (l'utente a cui attribuire l'azione)
#  target_topic_id :integer
#  target_post_id  :integer
#  target_user_id  :integer          (ad esempio, l'id dell'utente il cui post è stato messo mi piace)
#  acting_user_id  :integer          (l'utente che ha eseguito l'azione, ad esempio un utente staff può eseguire un'azione per conto di un utente regolare)
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#
# Nome tabella: topic_views
#
#  topic_id   :integer          not null
#  viewed_at  :date             not null
#  user_id    :integer         (verrà impostato se l'argomento è stato visualizzato da un utente connesso)
#  ip_address :inet            (verrà impostato se l'argomento è stato visualizzato da un utente anonimo)
#
# Nome tabella: user_visits
#
#  id         :integer          not null, primary key
#  user_id    :integer          not null
#  visited_at :date             not null
#  posts_read :integer          default(0)
#  mobile     :boolean          default(FALSE) (verrà impostato su TRUE se l'utente ha visitato da un dispositivo mobile)
#  time_read  :integer          default(0), not null (il valore restituito è il numero di secondi della visita)

Ecco un link a una sessione di chat in cui l’ho provato: ChatGPT

Se vuoi provare ad espandere questa lista, il modo più semplice è copiare lo schema dalla parte inferiore del modello che ti interessa, direttamente dal codice di Discourse: discourse/app/models at main · discourse/discourse · GitHub.

3 Mi Piace