在使用 ChatCPT 3.5 时,如果我提供完整的架构,会得到意想不到的结果。例如,它总是试图在 topic_users 表中查找主题作者。
我通过将提示中的信息限制为编写查询所需的表和列,并添加一些关于列用途的额外信息,从而获得了成功的结果。例如:
# 表名:user_actions
#
# id :integer 不为空,主键
# action_type :integer 不为空 (: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 不为空 (应被记入该操作的用户)
# target_topic_id :integer
# acting_user_id :integer (执行该操作的用户,例如,管理员用户可以为普通用户执行操作)
# created_at :datetime 不为空
另一种让数据探索插件(Data Explorer plugin)正常工作的方法是,让用户填写一个动态生成的表单,列出他们想要查询的数据以及希望应用于数据的条件。Discourse 可以程序化地生成提示,然后将其发送给 LLM 以生成查询。
编辑:@jordan-violet,这可能是一个有用的起点。这里是一个经过注释的部分架构,目前对我有效。只要我限制查询范围,使其能够通过提供的架构回答,效果就很好。我在架构中添加了更多细节,以澄清那些似乎会让 ChatGPT 困惑的内容。这种方法的一个明显缺点是,完全注释的架构会超出 ChatGPT 3.5 的令牌限制。我在架构中包含了一些可以省略的信息,以减少使用的令牌数量。
摘要
# == 架构信息
#
# 表名:application_requests
#
# id :integer 不为空,主键
# date :date 不为空
# req_type :integer 不为空 ("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 默认值(0),不为空
#
# 表名:users
#
# id :integer 不为空,主键
# username :string(60) 不为空
# created_at :datetime 不为空
# updated_at :datetime 不为空
# name :string (用户的真实姓名)
# last_posted_at :datetime
# active :boolean 默认值(FALSE),不为空
# username_lower :string(60) 不为空
# last_seen_at :datetime
# admin :boolean 默认值(FALSE),不为空
# trust_level :integer 不为空
# approved :boolean 默认值(FALSE),不为空
# 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 默认值(FALSE)
# title :string
# locale :string(10)
# primary_group_id :integer
# registration_ip_address :inet
# staged :boolean 默认值(FALSE),不为空
# first_seen_at :datetime
# silenced_till :datetime
#
# 表名:topics
#
# id :integer 不为空,主键
# title :string 不为空
# last_posted_at :datetime
# created_at :datetime 不为空
# updated_at :datetime 不为空
# views :integer 默认值(0),不为空
# posts_count :integer 默认值(0),不为空
# user_id :integer (创建该主题的用户 ID)
# last_post_user_id :integer 不为空 (在主题中创建最后一篇帖子的用户 ID)
# reply_count :integer 默认值(0),不为空
# deleted_at :datetime
# highest_post_number :integer 默认值(0),不为空
# like_count :integer 默认值(0),不为空
# category_id :integer
# visible :boolean 默认值(TRUE),不为空
# moderator_posts_count :integer 默认值(0),不为空
# closed :boolean 默认值(FALSE),不为空
# archived :boolean 默认值(FALSE),不为空
# bumped_at :datetime 不为空
# archetype :string 默认值("regular"),不为空 (可设置为 "regular" 或 "private_message")
# slug :string
# deleted_by_id :integer (删除该主题的用户 ID)
# participant_count :integer 默认值(1)
# word_count :integer
# excerpt :string
# highest_staff_post_number :integer 默认值(0),不为空
#
# 表名:posts
#
# id :integer 不为空,主键
# user_id :integer (创建该帖子的用户 ID)
# topic_id :integer 不为空
# post_number :integer 不为空 (表示帖子在其主题中的顺序)
# raw :text 不为空 (帖子的内容)
# created_at :datetime 不为空
# updated_at :datetime 不为空
# reply_to_post_number :integer (该帖子回复的帖子编号)
# reply_count :integer 默认值(0),不为空
# deleted_at :datetime
# like_count :integer 默认值(0),不为空
# bookmark_count :integer 默认值(0),不为空
# reads :integer 默认值(0),不为空 (帖子被阅读的次数)
# post_type :integer 默认值(1),不为空 (:regular=1, :moderator_action=2, :small_action=3, :whisper=4)
# last_editor_id :integer (最后编辑该帖子的用户 ID)
# hidden :boolean 默认值(FALSE),不为空
# 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 默认值(FALSE),不为空
#
# 表名:categories
#
# id :integer 不为空,主键
# name :string(50) 不为空
# topic_id :integer (用于类别描述的主题 ID)
# topic_count :integer 默认值(0),不为空
# created_at :datetime 不为空
# updated_at :datetime 不为空
# user_id :integer 不为空 (创建该主题的用户 ID)
# topics_year :integer 默认值(0)
# topics_month :integer 默认值(0)
# topics_week :integer 默认值(0)
# slug :string 不为空
# description :text
# text_color :string(6) 默认值("FFFFFF"),不为空
# read_restricted :boolean 默认值(FALSE),不为空
# auto_close_hours :float
# post_count :integer 默认值(0),不为空
# latest_post_id :integer
# latest_topic_id :integer
# position :integer
# parent_category_id :integer
# posts_year :integer 默认值(0)
# posts_month :integer 默认值(0)
# posts_week :integer 默认值(0)
# topics_day :integer 默认值(0)
# posts_day :integer 默认值(0)
#
# 表名:groups
#
# id :integer 不为空,主键
# name :string 不为空
# created_at :datetime 不为空
# automatic :boolean 默认值(FALSE),不为空
# user_count :integer 默认值(0),不为空
# title :string
# bio_raw :text (群组描述)
# allow_membership_requests :boolean 默认值(FALSE),不为空
# full_name :string
# visibility_level :integer 默认值(0),不为空 (谁可以看到该群组 :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
# messageable_level :integer 默认值(0) (谁可以向该群组发送消息 :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
# mentionable_level :integer 默认值(0) (谁可以提及该群组 :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
# members_visibility_level :integer 默认值(0),不为空 (谁可以看到该群组成员 :public=0, :logged_on_users=1, :members=2, :staff=3, :owners=4)
#
# 表名:group_users
#
# id :integer 不为空,主键
# group_id :integer 不为空
# user_id :integer 不为空
# created_at :datetime 不为空
#
# 表名:user_actions
#
# id :integer 不为空,主键
# action_type :integer 不为空 (: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 不为空 (应被记入该操作的用户)
# target_topic_id :integer
# target_post_id :integer
# target_user_id :integer (例如,被点赞的帖子的用户 ID)
# acting_user_id :integer (执行该操作的用户,例如,管理员用户可以为普通用户执行操作)
# created_at :datetime 不为空
# updated_at :datetime 不为空
#
# 表名:topic_views
#
# topic_id :integer 不为空
# viewed_at :date 不为空
# user_id :integer (如果主题被已登录用户查看,则会被设置)
# ip_address :inet (如果主题被匿名用户查看,则会被设置)
#
# 表名:user_visits
#
# id :integer 不为空,主键
# user_id :integer 不为空
# visited_at :date 不为空
# posts_read :integer 默认值(0)
# mobile :boolean 默认值(FALSE) (如果用户通过移动设备访问,则会被设置为 TRUE)
# time_read :integer 默认值(0),不为空 (返回的值是访问的秒数)
以下是我尝试过的聊天会话链接:ChatGPT
如果你想扩展这个列表,最简单的方法是直接从 Discourse 代码中复制你感兴趣的模型底部的架构:https://github.com/discourse/discourse/tree/main/app/models。