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.