Discourse AI + Data Explorer?

С ChatCPT 3.5 я получаю неожиданные результаты, когда предоставляю полную схему. Например, модель продолжает пытаться найти автора темы в таблице topic_users.

Я получаю успешные результаты, ограничивая информацию в промпте только теми таблицами и столбцами, которые необходимы для написания запроса. Также помогает добавление дополнительной информации о том, как используются столбцы. Например:

# Имя таблицы: 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 (пользователь, которому засчитывается действие)
#  target_topic_id :integer
#  acting_user_id  :integer (пользователь, выполнивший действие, например, модератор может выполнить действие от имени обычного пользователя)
#  created_at      :datetime         not null

Другой подход к решению этой задачи с помощью плагина Data Explorer — заставить пользователей заполнять динамически генерируемую форму, в которой они указывают, какие данные им нужны и какие условия применить к этим данным. Промпт может быть сгенерирован программно системой Discourse, а затем отправлен в LLM для написания запроса.

Редактирование: @jordan-violet, это может стать полезной отправной точкой. Вот аннотированная частичная схема, которая работает у меня. Она хорошо работает, пока я ограничиваю запросы так, чтобы на них можно было ответить, используя предоставленную схему. Я добавил в схему дополнительные детали, чтобы прояснить моменты, которые, похоже, сбивают ChatGPT с толку. Очевидный недостаток этого подхода заключается в том, что полностью аннотированная схема превысит лимит токенов ChatGPT 3.5. В схему включена некоторая информация, которую можно опустить, чтобы уменьшить количество используемых токенов.

Сводка
# == Информация о схеме
#
# Имя таблицы: 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
#
# Имя таблицы: users
#
#  id                        :integer          not null, primary key
#  username                  :string(60)       not null
#  created_at                :datetime         not null
#  updated_at                :datetime         not null
#  name                      :string           (настоящее имя пользователя)
#  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
#
# Имя таблицы: 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          (id пользователя, создавшего тему)
#  last_post_user_id         :integer          not null (id пользователя, создавшего последний пост в теме)
#  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 (может быть установлено в «regular» или «private_message»)
#  slug                      :string
#  deleted_by_id             :integer          (id пользователя, удалившего тему)
#  participant_count         :integer          default(1)
#  word_count                :integer
#  excerpt                   :string
#  highest_staff_post_number :integer          default(0), not null
#
# Имя таблицы: posts
#
#  id                      :integer          not null, primary key
#  user_id                 :integer          (id пользователя, создавшего пост)
#  topic_id                :integer          not null
#  post_number             :integer          not null (указывает порядок поста в теме)
#  raw                     :text             not null (содержимое поста)
#  created_at              :datetime         not null
#  updated_at              :datetime         not null
#  reply_to_post_number    :integer          (post_number, на который отвечает пост)
#  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 (количество прочтений поста)
#  post_type               :integer          default(1), not null (:regular=>1, :moderator_action=>2, :small_action=>3, :whisper=>4)
#  last_editor_id          :integer          (id пользователя, последний отредактировавшего пост)
#  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
#
# Имя таблицы: categories
#
#  id                                        :integer          not null, primary key
#  name                                      :string(50)       not null
#  topic_id                                  :integer          (id темы, используемой для описания категории)
#  topic_count                               :integer          default(0), not null
#  created_at                                :datetime         not null
#  updated_at                                :datetime         not null
#  user_id                                   :integer          not null (id пользователя, создавшего тему)
#  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)
#
# Имя таблицы: 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             (описание группы)
#  allow_membership_requests          :boolean          default(FALSE), not null
#  full_name                          :string
#  visibility_level                   :integer          default(0), not null (кто может видеть группу: :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#  messageable_level                  :integer          default(0) (кто может писать в группу: :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#  mentionable_level                  :integer          default(0) (кто может упоминать группу: :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#  members_visibility_level           :integer          default(0), not null (кто видит участников группы: :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#
# Имя таблицы: group_users
#
#  id                 :integer          not null, primary key
#  group_id           :integer          not null
#  user_id            :integer          not null
#  created_at         :datetime         not null
#
# Имя таблицы: 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 (пользователь, которому засчитывается действие)
#  target_topic_id :integer
#  target_post_id  :integer
#  target_user_id  :integer          (например, id пользователя, чей пост был лайкнут)
#  acting_user_id  :integer          (пользователь, выполнивший действие, например, модератор может выполнить действие от имени обычного пользователя)
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#
# Имя таблицы: topic_views
#
#  topic_id   :integer          not null
#  viewed_at  :date             not null
#  user_id    :integer         (будет установлено, если тему просмотрел авторизованный пользователь)
#  ip_address :inet            (будет установлено, если тему просмотрел анонимный пользователь)
#
# Имя таблицы: 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) (будет установлено в TRUE, если пользователь зашел с мобильного устройства)
#  time_read  :integer          default(0), not null (возвращаемое значение — количество секунд визита)

Вот ссылка на сессию чата, где я это опробовал: ChatGPT

Если вы хотите расширить этот список, самый простой способ — скопировать схему из нижней части модели, которая вас интересует, напрямую из кода Discourse: discourse/app/models at main · discourse/discourse · GitHub.

3 лайка