Discourse AI + Data Explorer?

Con ChatGPT 3.5 estoy obteniendo resultados inesperados cuando proporciono el esquema completo. Por ejemplo, sigue intentando encontrar al autor del tema en la tabla topic_users.

Obtengo resultados exitosos limitando la información en el prompt a las tablas y columnas necesarias para escribir la consulta. También añadiendo información adicional sobre cómo se utilizan las columnas. Por ejemplo:

# Nombre de la tabla: user_actions
#
#  id              :integer          no nulo, clave primaria
#  action_type     :integer          no nulo (: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          no nulo (el usuario al que se le acreditará la acción)
#  target_topic_id :integer
#  acting_user_id  :integer (el usuario que realizó la acción, por ejemplo, un usuario de staff puede realizar una acción en nombre de un usuario regular)
#  created_at      :datetime         no nulo

Otra forma de ver cómo hacer que esto funcione con el plugin Data Explorer sería que los usuarios rellenen un formulario generado dinámicamente que liste los datos que buscan y las condiciones que quieren aplicar a los datos. El prompt podría generarse programáticamente por Discourse y luego enviarse al LLM para que escriba la consulta.

Edición: @jordan-violet, esto podría ser un punto de partida útil. Aquí hay un esquema parcial anotado que me está funcionando. Funciona bien siempre que limite mis consultas para que puedan responderse con el esquema proporcionado. He añadido detalles adicionales al esquema para aclarar aspectos que parecen confundir a ChatGPT. La desventaja obvia de este enfoque es que un esquema totalmente anotado excederá el límite de tokens de ChatGPT 3.5. He incluido cierta información en el esquema que podría omitirse para reducir el número de tokens utilizados.

Resumen
# == Información del Esquema
#
# Nombre de la tabla: application_requests
#
#  id       :integer          no nulo, clave primaria
#  date     :date             no nulo
#  req_type :integer          no nulo ("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          por defecto(0), no nulo
#
# Nombre de la tabla: users
#
#  id                        :integer          no nulo, clave primaria
#  username                  :string(60)       no nulo
#  created_at                :datetime         no nulo
#  updated_at                :datetime         no nulo
#  name                      :string           (el nombre real del usuario)
#  last_posted_at            :datetime
#  active                    :boolean          por defecto(FALSO), no nulo
#  username_lower            :string(60)       no nulo
#  last_seen_at              :datetime
#  admin                     :boolean          por defecto(FALSO), no nulo
#  trust_level               :integer          no nulo
#  approved                  :boolean          por defecto(FALSO), no nulo
#  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          por defecto(FALSO)
#  title                     :string
#  locale                    :string(10)
#  primary_group_id          :integer
#  registration_ip_address   :inet
#  staged                    :boolean          por defecto(FALSO), no nulo
#  first_seen_at             :datetime
#  silenced_till             :datetime
#
# Nombre de la tabla: topics
#
#  id                        :integer          no nulo, clave primaria
#  title                     :string           no nulo
#  last_posted_at            :datetime
#  created_at                :datetime         no nulo
#  updated_at                :datetime         no nulo
#  views                     :integer          por defecto(0), no nulo
#  posts_count               :integer          por defecto(0), no nulo
#  user_id                   :integer          (el id del usuario que creó el tema)
#  last_post_user_id         :integer          no nulo (el id del usuario que creó el último post en el tema)
#  reply_count               :integer          por defecto(0), no nulo
#  deleted_at                :datetime
#  highest_post_number       :integer          por defecto(0), no nulo
#  like_count                :integer          por defecto(0), no nulo
#  category_id               :integer
#  visible                   :boolean          por defecto(VERDADERO), no nulo
#  moderator_posts_count     :integer          por defecto(0), no nulo
#  closed                    :boolean          por defecto(FALSO), no nulo
#  archived                  :boolean          por defecto(FALSO), no nulo
#  bumped_at                 :datetime         no nulo
#  archetype                 :string           por defecto("regular"), no nulo (puede establecerse en "regular" o "private_message")
#  slug                      :string
#  deleted_by_id             :integer          (el id del usuario que eliminó el tema)
#  participant_count         :integer          por defecto(1)
#  word_count                :integer
#  excerpt                   :string
#  highest_staff_post_number :integer          por defecto(0), no nulo
#
# Nombre de la tabla: posts
#
#  id                      :integer          no nulo, clave primaria
#  user_id                 :integer          (el id del usuario que creó el post)
#  topic_id                :integer          no nulo
#  post_number             :integer          no nulo (indica el orden del post en su tema)
#  raw                     :text             no nulo (el contenido del post)
#  created_at              :datetime         no nulo
#  updated_at              :datetime         no nulo
#  reply_to_post_number    :integer          (el post_number al que el post responde)
#  reply_count             :integer          por defecto(0), no nulo
#  deleted_at              :datetime
#  like_count              :integer          por defecto(0), no nulo
#  bookmark_count          :integer          por defecto(0), no nulo
#  reads                   :integer          por defecto(0), no nulo (el número de veces que se ha leído el post)
#  post_type               :integer          por defecto(1), no nulo (:regular=1, :moderator_action=2, :small_action=3, :whisper=4)
#  last_editor_id          :integer          (el id del usuario que editó por última vez el post)
#  hidden                  :boolean          por defecto(FALSO), no nulo
#  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          por defecto(FALSO), no nulo
#
# Nombre de la tabla: categories
#
#  id                                        :integer          no nulo, clave primaria
#  name                                      :string(50)       no nulo
#  topic_id                                  :integer          (el id del tema que se usa para la descripción de la categoría)
#  topic_count                               :integer          por defecto(0), no nulo
#  created_at                                :datetime         no nulo
#  updated_at                                :datetime         no nulo
#  user_id                                   :integer          no nulo (el id del usuario que creó el tema)
#  topics_year                               :integer          por defecto(0)
#  topics_month                              :integer          por defecto(0)
#  topics_week                               :integer          por defecto(0)
#  slug                                      :string           no nulo
#  description                               :text
#  text_color                                :string(6)        por defecto("FFFFFF"), no nulo
#  read_restricted                           :boolean          por defecto(FALSO), no nulo
#  auto_close_hours                          :float
#  post_count                                :integer          por defecto(0), no nulo
#  latest_post_id                            :integer
#  latest_topic_id                           :integer
#  position                                  :integer
#  parent_category_id                        :integer
#  posts_year                                :integer          por defecto(0)
#  posts_month                               :integer          por defecto(0)
#  posts_week                                :integer          por defecto(0)
#  topics_day                                :integer          por defecto(0)
#  posts_day                                 :integer          por defecto(0)
#
# Nombre de la tabla: groups
#
#  id                                 :integer          no nulo, clave primaria
#  name                               :string           no nulo
#  created_at                         :datetime         no nulo
#  automatic                          :boolean          por defecto(FALSO), no nulo
#  user_count                         :integer          por defecto(0), no nulo
#  title                              :string
#  bio_raw                            :text             (la descripción del grupo)
#  allow_membership_requests          :boolean          por defecto(FALSO), no nulo
#  full_name                          :string
#  visibility_level                   :integer          por defecto(0), no nulo (quién puede ver el grupo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#  messageable_level                  :integer          por defecto(0) (quién puede enviar mensajes al grupo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#  mentionable_level                  :integer          por defecto(0) (quién puede mencionar al grupo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#  members_visibility_level           :integer          por defecto(0), no nulo (quién ve los miembros del grupo :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#
# Nombre de la tabla: group_users
#
#  id                 :integer          no nulo, clave primaria
#  group_id           :integer          no nulo
#  user_id            :integer          no nulo
#  created_at         :datetime         no nulo
#
# Nombre de la tabla: user_actions
#
#  id              :integer          no nulo, clave primaria
#  action_type     :integer          no nulo (: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          no nulo (el usuario al que se le acreditará la acción)
#  target_topic_id :integer
#  target_post_id  :integer
#  target_user_id  :integer          (por ejemplo, el id del usuario cuyo post fue dado "like")
#  acting_user_id  :integer          (el usuario que realizó la acción, por ejemplo, un usuario de staff puede realizar una acción en nombre de un usuario regular)
#  created_at      :datetime         no nulo
#  updated_at      :datetime         no nulo
#
# Nombre de la tabla: topic_views
#
#  topic_id   :integer          no nulo
#  viewed_at  :date             no nulo
#  user_id    :integer         (se establecerá si el tema fue visto por un usuario conectado)
#  ip_address :inet            (se establecerá si el tema fue visto por un usuario anónimo)
#
# Nombre de la tabla: user_visits
#
#  id         :integer          no nulo, clave primaria
#  user_id    :integer          no nulo
#  visited_at :date             no nulo
#  posts_read :integer          por defecto(0)
#  mobile     :boolean          por defecto(FALSO) (se establecerá en VERDADERO si el usuario visitó desde un dispositivo móvil)
#  time_read  :integer          por defecto(0), no nulo (el valor devuelto es el número de segundos de la visita)

Aquí hay un enlace a una sesión de chat donde lo probé: ChatGPT

Si quieres intentar ampliar esta lista, la forma más fácil es copiar el esquema desde la parte inferior del modelo que te interese, directamente desde el código de Discourse: discourse/app/models at main · discourse/discourse · GitHub.

3 Me gusta