Discourse AI + Data Explorer?

Расширяя эту идею, возможность взаимодействия пользователей с приложениями на естественном языке — это практически моя мечта в области ИИ. С помощью Discourse и плагина Data Explorer стало бы возможным получать результаты по запросам вроде «верни список пользователей, выразивших интерес к модерации». Или ещё лучше: «отправь приглашение группе community_moderation всем пользователям, выразившим интерес к модерации».

Вернёмся к тому, что возможно уже сейчас:

При тестировании с ChatGPT 3.0 и 3.5 я получал хорошие результаты, когда просил его вернуть запрос PostgreSQL и включал в промпт структуру таблиц, которые меня интересовали. Например:

Сводка

Я: Верни запрос PostgreSQL, который выводит все имена пользователей из группы “community_moderators” для следующей структуры базы данных:

# == Schema Information
#
# Table name: groups
#
#  id                                 :integer          not null, primary key
#  name                               :string           not null

# == Schema Information
#
# Table name: group_users
#
#  id                 :integer          not null, primary key
#  group_id           :integer          not null

# == Schema Information
#
# Table name: users
#
#  id                        :integer          not null, primary key
#  username                  :string(60)       not null

ChatGPT 3.5: Конечно, вот запрос PostgreSQL, который выводит все имена пользователей из группы “community_moderators” на основе указанной структуры базы данных:

SELECT u.username
FROM users u
JOIN group_users gu ON u.id = gu.user_id
JOIN groups g ON gu.group_id = g.id
WHERE g.name = 'community_moderators';

Этот запрос извлекает имена пользователей из таблицы users, присоединяя её к таблице group_users по ID пользователя, а затем присоединяя таблицу groups по ID группы. Результаты фильтруются так, чтобы включать только имена пользователей, состоящих в группе “community_moderators”.

Я: Вот структура таблиц topics и posts приложения:

# == Schema Information
#
# Table name: topics
#
#  id                        :integer          not null, primary key
#  title                     :string           not null

# == Schema Information
#
# Table name: posts
#
#  id                      :integer          not null, primary key
#  user_id                 :integer
#  topic_id                :integer          not null
#  post_number             :integer          not null
#  raw                     :text             not null

Верни запрос, который выводит все ID тем, ID постов и имена пользователей для всех постов, созданных участниками группы “community_moderators”, которые дают некоторое указание на интерес автора к тому, как модерировать поляризующие дискуссии.

ChatGPT 3.5: Для этого необходимо соединить таблицы posts, topics, users и group_users на основе предоставленной схемы. Вот запрос PostgreSQL, который извлекает запрошенную информацию:

SELECT t.id AS topic_id, p.id AS post_id, u.username
FROM posts p
JOIN topics t ON p.topic_id = t.id
JOIN users u ON p.user_id = u.id
JOIN group_users gu ON u.id = gu.user_id
JOIN groups g ON gu.group_id = g.id
WHERE g.name = 'community_moderators'
  AND (p.raw ILIKE '%moderate%' OR p.raw ILIKE '%polarizing%' OR p.raw ILIKE '%discussion%');

Этот запрос извлекает topic_id, post_id и username для всех постов, созданных участниками группы “community_moderators”, которые содержат определённые ключевые слова, указывающие на интерес к модерации поляризующих дискуссий. Оператор ILIKE используется для регистронезависимого поиска по шаблону в столбце raw таблицы posts.

Обратите внимание, что этот запрос предполагает, что предоставленные вами ключевые слова отражают желаемые посты. Возможно, вам потребуется скорректировать или расширить набор ключевых слов в зависимости от ваших конкретных критериев.

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

ChatGPT 3.5: Для этого можно использовать следующий запрос PostgreSQL, который возвращает количество постов, созданных в каждом недельном периоде с сентября 2022 года, авторами которых являются участники группы “community_moderators” и которые указывают на интерес к тому, как модерировать поляризующие дискуссии:

SELECT
    DATE_TRUNC('week', p.created_at) AS week_start,
    COUNT(p.id) AS post_count
FROM
    posts p
JOIN
    users u ON p.user_id = u.id
JOIN
    group_users gu ON u.id = gu.user_id
JOIN
    groups g ON gu.group_id = g.id
WHERE
    g.name = 'community_moderators'
    AND (p.raw ILIKE '%moderate%'
         OR p.raw ILIKE '%polarizing%'
         OR p.raw ILIKE '%political%'
         OR p.raw ILIKE '%contentious%'
         OR p.raw ILIKE '%debate%'
         OR p.raw ILIKE '%controversial%'
         OR p.raw ILIKE '%discussion%')
    AND p.created_at >= '2022-09-01' -- Начальная дата: сентябрь 2022
GROUP BY
    week_start
ORDER BY
    week_start;

Этот запрос вычисляет количество постов, созданных участниками группы “community_moderators”, которые содержат указанные ключевые слова, в каждом недельном периоде с сентября 2022 года. Результаты группируются по неделям и сортируются в хронологическом порядке. Убедитесь, что вы скорректировали названия столбцов и связи таблиц в соответствии с вашей реальной схемой базы данных.


Результаты кажутся мне хорошими и соответствуют типам запросов, на написание которых у меня раньше уходило немало времени. Я предполагаю, что можно обучить модель на структуре базы данных Discourse, чтобы детали о структуре можно было исключать из промптов.

4 лайка