Avec ChatGPT 3.5, j’obtiens des résultats inattendus lorsque je fournis le schéma complet. Par exemple, il continue d’essayer de trouver l’auteur du sujet dans la table topic_users.
J’obtiens des résultats réussis en limitant les informations dans l’invite aux tables et colonnes nécessaires pour écrire la requête. Cela fonctionne aussi en ajoutant des informations supplémentaires sur la façon dont les colonnes sont utilisées. Par exemple :
# Nom de la table : 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'utilisateur à qui l'action doit être créditée)
# target_topic_id :integer
# acting_user_id :integer (l'utilisateur qui a effectué l'action, par exemple, un utilisateur du personnel peut effectuer une action au nom d'un utilisateur régulier)
# created_at :datetime not null
Une autre façon de voir les choses pour faire fonctionner cela avec le plugin Data Explorer serait de demander aux utilisateurs de remplir un formulaire généré dynamiquement listant les données qu’ils recherchent et les conditions qu’ils souhaitent appliquer aux données. L’invite pourrait être générée de manière programmatique par Discourse, puis envoyée au LLM pour qu’il écrive la requête.
Édition : @jordan-violet, cela pourrait être un point de départ utile. Voici un schéma partiel annoté qui fonctionne pour moi. Cela fonctionne bien tant que je limite mes requêtes de manière à ce qu’elles puissent être répondues par le schéma fourni. J’ai ajouté des détails supplémentaires au schéma pour clarifier des points qui semblent confondre ChatGPT. L’inconvénient évident de cette approche est qu’un schéma entièrement annoté dépassera la limite de jetons de ChatGPT 3.5. J’ai inclus certaines informations dans le schéma qui pourraient être omises pour réduire le nombre de jetons utilisés.
Résumé
# == Informations sur le schéma
#
# Nom de la table : 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
#
# Nom de la table : users
#
# id :integer not null, primary key
# username :string(60) not null
# created_at :datetime not null
# updated_at :datetime not null
# name :string (le vrai nom de l'utilisateur)
# 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
#
# Nom de la table : 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 de l'utilisateur qui a créé le sujet)
# last_post_user_id :integer not null (l'ID de l'utilisateur qui a créé le dernier post dans le sujet)
# 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 (peut être défini sur "regular" ou "private_message")
# slug :string
# deleted_by_id :integer (l'ID de l'utilisateur qui a supprimé le sujet)
# participant_count :integer default(1)
# word_count :integer
# excerpt :string
# highest_staff_post_number :integer default(0), not null
#
# Nom de la table : posts
#
# id :integer not null, primary key
# user_id :integer (l'ID de l'utilisateur qui a créé le post)
# topic_id :integer not null
# post_number :integer not null (indique l'ordre du post dans son sujet)
# raw :text not null (le contenu du post)
# created_at :datetime not null
# updated_at :datetime not null
# reply_to_post_number :integer (le post_number auquel le post répond)
# 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 (le nombre de fois où le post a été lu)
# post_type :integer default(1), not null (:regular=1, :moderator_action=2, :small_action=3, :whisper=4)
# last_editor_id :integer (l'ID de l'utilisateur qui a dernièrement édité le 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
#
# Nom de la table : categories
#
# id :integer not null, primary key
# name :string(50) not null
# topic_id :integer (l'ID du sujet utilisé pour la description de la catégorie)
# topic_count :integer default(0), not null
# created_at :datetime not null
# updated_at :datetime not null
# user_id :integer not null (l'ID de l'utilisateur qui a créé le sujet)
# 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)
#
# Nom de la table : 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 description du groupe)
# allow_membership_requests :boolean default(FALSE), not null
# full_name :string
# visibility_level :integer default(0), not null (qui peut voir le groupe :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
# messageable_level :integer default(0) (qui peut envoyer un message au groupe :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
# mentionable_level :integer default(0) (qui peut mentionner le groupe :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
# members_visibility_level :integer default(0), not null (qui voit les membres du groupe :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#
# Nom de la table : group_users
#
# id :integer not null, primary key
# group_id :integer not null
# user_id :integer not null
# created_at :datetime not null
#
# Nom de la table : 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'utilisateur à qui l'action doit être créditée)
# target_topic_id :integer
# target_post_id :integer
# target_user_id :integer (par exemple, l'ID de l'utilisateur dont le post a été liké)
# acting_user_id :integer (l'utilisateur qui a effectué l'action, par exemple, un utilisateur du personnel peut effectuer une action au nom d'un utilisateur régulier)
# created_at :datetime not null
# updated_at :datetime not null
#
# Nom de la table : topic_views
#
# topic_id :integer not null
# viewed_at :date not null
# user_id :integer (sera défini si le sujet a été consulté par un utilisateur connecté)
# ip_address :inet (sera défini si le sujet a été consulté par un utilisateur anonyme)
#
# Nom de la table : 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) (sera défini sur TRUE si l'utilisateur a visité depuis un appareil mobile)
# time_read :integer default(0), not null (la valeur retournée est le nombre de secondes de la visite)
Voici un lien vers une session de chat où je l’ai testé : ChatGPT
Si vous souhaitez essayer d’étendre cette liste, le moyen le plus simple est de copier le schéma depuis le bas du modèle qui vous intéresse, directement depuis le code de Discourse : discourse/app/models at main · discourse/discourse · GitHub.