Mit ChatGPT 3.5 erhalte ich unerwartete Ergebnisse, wenn ich das vollständige Schema angebe. Zum Beispiel versucht es ständig, den Autor des Themas in der Tabelle topic_users zu finden.
Ich erhalte erfolgreiche Ergebnisse, indem ich die Informationen im Prompt auf die Tabellen und Spalten beschränke, die für das Schreiben der Abfrage erforderlich sind. Außerdem füge ich zusätzliche Informationen darüber hinzu, wie die Spalten verwendet werden. Zum Beispiel:
# Tabellename: 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 (der Benutzer, dem die Aktion angerechnet werden soll)
# target_topic_id :integer
# acting_user_id :integer (der Benutzer, der die Aktion ausgeführt hat, z. B. kann ein Staff-Benutzer eine Aktion im Namen eines regulären Benutzers ausführen)
# created_at :datetime not null
Eine andere Möglichkeit, dies mit dem Data Explorer-Plugin zum Laufen zu bringen, besteht darin, dass Benutzer ein dynamisch generiertes Formular ausfüllen, das die gesuchten Daten und die darauf anzuwendenden Bedingungen auflistet. Der Prompt könnte dann programmgesteuert von Discourse generiert und an das LLM gesendet werden, um die Abfrage zu schreiben.
Edit: @jordan-violet, dies könnte ein nützlicher Ausgangspunkt sein. Hier ist ein annotiertes Teilschema, das bei mir funktioniert. Es funktioniert gut, solange ich meine Abfragen so beschränke, dass sie mit dem bereitgestellten Schema beantwortet werden können. Ich habe dem Schema weitere Details hinzugefügt, um Aspekte zu klären, die ChatGPT scheinbar verwirren. Der offensichtliche Nachteil dieses Ansatzes ist, dass ein vollständig annotiertes Schema das Token-Limit von ChatGPT 3.5 überschreiten wird. Ich habe einige Informationen im Schema aufgenommen, die weggelassen werden könnten, um die Anzahl der verwendeten Tokens zu reduzieren.
Zusammenfassung
# == Schema Information
#
# Tabellename: 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
#
# Tabellename: users
#
# id :integer not null, primary key
# username :string(60) not null
# created_at :datetime not null
# updated_at :datetime not null
# name :string (der echte Name des Benutzers)
# 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
#
# Tabellename: 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 (die ID des Benutzers, der das Thema erstellt hat)
# last_post_user_id :integer not null (die ID des Benutzers, der den letzten Beitrag im Thema erstellt hat)
# 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 (kann auf entweder „regular“ oder „private_message“ gesetzt werden)
# slug :string
# deleted_by_id :integer (die ID des Benutzers, der das Thema gelöscht hat)
# participant_count :integer default(1)
# word_count :integer
# excerpt :string
# highest_staff_post_number :integer default(0), not null
#
# Tabellename: posts
#
# id :integer not null, primary key
# user_id :integer (die ID des Benutzers, der den Beitrag erstellt hat)
# topic_id :integer not null
# post_number :integer not null (gibt die Reihenfolge des Beitrags in seinem Thema an)
# raw :text not null (der Inhalt des Beitrags)
# created_at :datetime not null
# updated_at :datetime not null
# reply_to_post_number :integer (die post_number, auf die der Beitrag antwortet)
# 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 (die Anzahl der Male, die der Beitrag gelesen wurde)
# post_type :integer default(1), not null (:regular=>1, :moderator_action=>2, :small_action=>3, :whisper=>4)
# last_editor_id :integer (die ID des Benutzers, der den Beitrag zuletzt bearbeitet hat)
# 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
#
# Tabellename: categories
#
# id :integer not null, primary key
# name :string(50) not null
# topic_id :integer (die ID des Themas, das für die Beschreibung der Kategorie verwendet wird)
# topic_count :integer default(0), not null
# created_at :datetime not null
# updated_at :datetime not null
# user_id :integer not null (die ID des Benutzers, der das Thema erstellt hat)
# 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)
#
# Tabellename: 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 (die Beschreibung der Gruppe)
# allow_membership_requests :boolean default(FALSE), not null
# full_name :string
# visibility_level :integer default(0), not null (wer die Gruppe sehen kann :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
# messageable_level :integer default(0) (wer der Gruppe eine Nachricht senden kann :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
# mentionable_level :integer default(0) (wer die Gruppe erwähnen kann :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
# members_visibility_level :integer default(0), not null (wer die Mitglieder der Gruppe sehen kann :public=>0, :logged_on_users=>1, :members=>2, :staff=>3, :owners=>4)
#
# Tabellename: group_users
#
# id :integer not null, primary key
# group_id :integer not null
# user_id :integer not null
# created_at :datetime not null
#
# Tabellename: 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 (der Benutzer, dem die Aktion angerechnet werden soll)
# target_topic_id :integer
# target_post_id :integer
# target_user_id :integer (z. B. die ID des Benutzers, dessen Beitrag geliked wurde)
# acting_user_id :integer (der Benutzer, der die Aktion ausgeführt hat, z. B. kann ein Staff-Benutzer eine Aktion im Namen eines regulären Benutzers ausführen)
# created_at :datetime not null
# updated_at :datetime not null
#
# Tabellename: topic_views
#
# topic_id :integer not null
# viewed_at :date not null
# user_id :integer (wird gesetzt, wenn das Thema von einem angemeldeten Benutzer angesehen wurde)
# ip_address :inet (wird gesetzt, wenn das Thema von einem anonymen Benutzer angesehen wurde)
#
# Tabellename: 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) (wird auf TRUE gesetzt, wenn der Benutzer ein mobiles Gerät verwendet hat)
# time_read :integer default(0), not null (der zurückgegebene Wert ist die Anzahl der Sekunden des Besuchs)
Hier ist ein Link zu einer Chat-Sitzung, in der ich es ausprobiert habe: ChatGPT
Wenn Sie versuchen möchten, diese Liste zu erweitern, ist der einfachste Weg, das Schema von unten des Modells zu kopieren, an dem Sie interessiert sind, direkt aus dem Discourse-Code: discourse/app/models at main · discourse/discourse · GitHub.