Расширяя эту идею, возможность взаимодействия пользователей с приложениями на естественном языке — это практически моя мечта в области ИИ. С помощью 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, чтобы детали о структуре можно было исключать из промптов.