С 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.