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.