Discourse AI + Data Explorer ?

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.

3 « J'aime »