Discourse AI + Explorador de Dados?

Com o ChatGPT 3.5, estou obtendo resultados inesperados quando forneço o esquema completo. Por exemplo, ele continua tentando encontrar o autor do tópico na tabela topic_users.

Obtenho resultados bem-sucedidos limitando as informações no prompt às tabelas e colunas necessárias para escrever a consulta. Também ao adicionar algumas informações adicionais sobre como as colunas são usadas. Por exemplo:

# Nome da tabela: 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 (o usuário que receberá crédito pela ação)
#  target_topic_id :integer
#  acting_user_id  :integer (o usuário que realizou a ação, por exemplo, um usuário da equipe pode realizar uma ação em nome de um usuário regular)
#  created_at      :datetime         not null

Outra maneira de fazer isso funcionar com o plugin Data Explorer seria ter os usuários preenchendo um formulário gerado dinamicamente que lista os dados que estão procurando e quais condições desejam aplicar aos dados. O prompt poderia ser gerado programaticamente pelo Discourse e, em seguida, enviado ao LLM para que a consulta seja escrita.

Edição: @jordan-violet, isso pode ser um ponto de partida útil. Aqui está um esquema parcial anotado que está funcionando para mim. Funciona bem desde que eu limite minhas consultas de modo que possam ser respondidas pelo esquema fornecido. Adicionei detalhes adicionais ao esquema para esclarecer pontos que parecem confundir o ChatGPT. A desvantagem óbvia dessa abordagem é que um esquema totalmente anotado excederá o limite de tokens do ChatGPT 3.5. Incluí algumas informações no esquema que poderiam ser omitidas para reduzir o número de tokens utilizados.

Resumo
# == Informações do Esquema
#
# Nome da tabela: 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 da tabela: users
#
#  id                        :integer          not null, primary key
#  username                  :string(60)       not null
#  created_at                :datetime         not null
#  updated_at                :datetime         not null
#  name                      :string           (nome real do usuário)
#  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 da tabela: 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          (o ID do usuário que criou o tópico)
#  last_post_user_id         :integer          not null (o ID do usuário que criou a última postagem no tópico)
#  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 (pode ser definido como "regular" ou "private_message")
#  slug                      :string
#  deleted_by_id             :integer          (o ID do usuário que excluiu o tópico)
#  participant_count         :integer          default(1)
#  word_count                :integer
#  excerpt                   :string
#  highest_staff_post_number :integer          default(0), not null
#
# Nome da tabela: posts
#
#  id                      :integer          not null, primary key
#  user_id                 :integer          (o ID do usuário que criou a postagem)
#  topic_id                :integer          not null
#  post_number             :integer          not null (indica a ordem da postagem em seu tópico)
#  raw                     :text             not null (o conteúdo da postagem)
#  created_at              :datetime         not null
#  updated_at              :datetime         not null
#  reply_to_post_number    :integer          (o post_number ao qual a postagem é uma resposta)
#  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 (o número de vezes que a postagem foi lida)
#  post_type               :integer          default(1), not null (:regular=>1, :moderator_action=>2, :small_action=>3, :whisper=>4)
#  last_editor_id          :integer          (o ID do usuário que editou a postagem pela última vez)
#  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 da tabela: categories
#
#  id                                        :integer          not null, primary key
#  name                                      :string(50)       not null
#  topic_id                                  :integer          (o ID do tópico usado para a descrição da categoria)
#  topic_count                               :integer          default(0), not null
#  created_at                                :datetime         not null
#  updated_at                                :datetime         not null
#  user_id                                   :integer          not null (o ID do usuário que criou o tópico)
#  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 da tabela: 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             (descrição do grupo)
#  allow_membership_requests          :boolean          default(FALSE), not null
#  full_name                          :string
#  visibility_level                   :integer          default(0), not null (quem pode ver o grupo :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#  messageable_level                  :integer          default(0) (quem pode enviar mensagens ao grupo :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#  mentionable_level                  :integer          default(0) (quem pode mencionar o grupo :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#  members_visibility_level           :integer          default(0), not null (quem vê os membros do grupo :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#
# Nome da tabela: group_users
#
#  id                 :integer          not null, primary key
#  group_id           :integer          not null
#  user_id            :integer          not null
#  created_at         :datetime         not null
#
# Nome da tabela: 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 (o usuário que receberá crédito pela ação)
#  target_topic_id :integer
#  target_post_id  :integer
#  target_user_id  :integer          (por exemplo, o ID do usuário cuja postagem foi curtida)
#  acting_user_id  :integer          (o usuário que realizou a ação, por exemplo, um usuário da equipe pode realizar uma ação em nome de um usuário regular)
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#
# Nome da tabela: topic_views
#
#  topic_id   :integer          not null
#  viewed_at  :date             not null
#  user_id    :integer         (será definido se o tópico foi visualizado por um usuário logado)
#  ip_address :inet            (será definido se o tópico foi visualizado por um usuário anônimo)
#
# Nome da tabela: 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) (será definido como TRUE se o usuário visitou por um dispositivo móvel)
#  time_read  :integer          default(0), not null (o valor retornado é o número de segundos da visita)

Aqui está um link para uma sessão de chat onde eu testei: ChatGPT

Se você quiser tentar expandir essa lista, a maneira mais fácil é copiar o esquema do final do modelo que você está interessado, diretamente do código do Discourse: discourse/app/models at main · discourse/discourse · GitHub.

3 curtidas