Забудьте о ручном коде: почему голосовой помощник ggbot2 вас жестоко разочарует
Крутая идея — нейросеть, которая пишет код для визуализации данных по голосовой команде. Но на практике всё оказалось не так радужно.
Основные идеи
Мнение автора
ggbot2 — это интересный взгляд в будущее, где код пишется голосом. Но сегодня это инструмент не для всех. Он поможет опытному R-разработчику сэкономить время на рутинном синтаксисе, но новичка только запутает ошибками. Рассматривайте его как ассистента, а не как самостоятельного программиста.
Вводить запросы в чат-бота текстом — это удобно, но живая речь часто кажется более естественной. Некоторые эксперты считают, что с генеративным ИИ нужно именно разговаривать, а не переписываться. Это помогает избавиться от привычки использовать нейросети как навороченные поисковики. «Если вы еще не пробовали общаться с ИИ голосом, чтобы понять всю прелесть такого подхода, — вам стоит это сделать», — советуют специалисты. По их мнению, наше стремление «очеловечивать» технологии — это будущее, со всеми его плюсами и минусами.
И вот чат-боты, которые умеют не только слушать, но и отвечать, добрались до языка R и его экосистемы Tidyverse.
Один из таких ботов появился на недавней конференции по науке о данных: ggbot2, с которым можно разговаривать, чтобы создавать визуализации данных в ggplot2. По словам главного научного сотрудника Posit Хедли Уикхема, который и представил новинку, голос — это очень быстрый и естественный способ взаимодействия. «Моя цель всегда заключалась в том, чтобы код не мешал, а вы могли как можно быстрее выражать свои идеи и взаимодействовать с данными», — заявил он.
Вы просто говорите ggbot2, что хотите получить, а он генерирует диаграммы и код на языке R для ggplot2 прямо из ваших данных.
Спустя примерно неделю после конференции компания Posit выпустила пакет ggbot2 для R, который каждый может опробовать на своем компьютере. Он работает на основе пакета shinyrealtime, который интегрирует Realtime API от OpenAI с приложениями Shiny, написанными на R или Python. Приложения shinyrealtime тоже могут генерировать код для визуализации данных на любом из этих языков.
Все приложения, которые используют ggbot2 и shinyrealtime, обращаются к Realtime API от OpenAI для голосового общения. Как говорят разработчики, этот API отлично подходит для подобных задач, потому что он спроектирован для низкой задержки, элегантно обрабатывает прерывания со стороны пользователя и поддерживает вызов инструментов. Поэтому для работы с ggbot2 или shinyrealtime вам понадобится ключ API от OpenAI.
Настройка ggbot2
Вы можете установить ggbot2 из GitHub с помощью специальной команды и загрузить его в свою среду. После этого можно запустить приложение ggbot2 Shiny, чтобы использовать его с собственным набором данных.
Важно отметить, что приложение должно открываться в полноценном браузере, вроде Chrome или Firefox, а не в окне просмотра вашей среды разработки. Только так у него будет доступ к микрофону компьютера.
Для простого теста я загрузил один из своих наборов данных — изменения численности населения по разным регионам за 2000, 2010 и 2020 годы:
dist_pops <-
rio::import("https://raw.githubusercontent.com/smach/SampleData/refs/heads/main/us_division_population_changes.csv")
library(ggbot2)
ggbot(dist_pops)
Было довольно круто просто произнести запрос вроде «Я бы хотел визуализировать изменение численности населения по регионам между 2010 и 2020 годами. Есть идеи?» и увидеть, как появляются и сгенерированный код, и столбчатая диаграмма. Более того, я мог голосом вносить правки: «Отсортируй столбцы от большего к меньшему» или «Сделай текст на оси X немного крупнее».
Это был довольно простой запрос. Но для более сложных задач может потребоваться терпение и знание кода. Например, когда я впервые попросил ggbot2 создать карту на основе данных по всем штатам, то получил ошибку: «Пакет с названием ‘ggthemes’ не найден». Пользователи R знают, что это значит: пакет нужно сначала загрузить (а если его нет в системе, то установить), но человек, который не пишет код, тут же зайдет в тупик. Несколько раз я получал и другую ошибку: «Не удалось найти функцию ‘%>%’».
«Эту штуку нельзя просто дать кому угодно», — признался Уикхем во время демонстрации. «Я использую свои знания о хороших практиках визуализации. Я знаю, на что способен ggplot2». Он добавил, что инструмент иногда «слетает с катушек и начинает использовать странные функции ggplot2», и тогда ему приходится прямо говорить: «Эй, я хочу использовать вот этот geom». Инструмент определенно выигрывает от моего опыта как дата-сайентиста и инженера, но я больше не так сильно ограничен своей памятью о синтаксисе ggplot2.
Сам Уикхем создал ggplot2. Если уж ему нужна помощь, чтобы вспомнить все функции пакета, то справедливо будет сказать, что большинству из нас она тоже не помешает. Чтобы построить карту, я импортировал данные с помощью следующего кода:
state_pops <-
rio::import("https://raw.githubusercontent.com/smach/SampleData/refs/heads/main/states.csv")
library(ggbot2)
ggbot(state_pops)
Когда приложение загрузилось, я попросил ggbot2 «Создать карту процентного изменения населения с 2010 по 2020 год», а затем добавил: «Убери фоновую сетку и все оси».

Интересно, что ggbot2 решил отобразить только 48 смежных штатов, хотя в наборе данных также были Аляска, Гавайи и Пуэрто-Рико. Мне не удалось добиться от него, чтобы он включил Аляску и Гавайи в виде врезок, хотя, справедливости ради, это и не специализированное приложение для картографии.
Приложение ggbot2 показывает примерную стоимость сессии с языковой моделью, и это полезная функция. Я легко могу представить, как можно быстро накрутить приличный счет, если слишком долго с ним играть, тем более что результаты обычно отличаются при каждом новом запросе. Realtime API от OpenAI сейчас стоит 4 доллара (около 310 руб.) за миллион входных токенов и 16 долларов (около 1.3 тыс. руб.) за миллион выходных. Для сравнения, GPT-5 стоит 1.25 доллара (около 100 руб.) за входные и 10 долларов (около 780 руб.) за выходные токены. OpenAI недавно анонсировала предварительную версию модели GTP-40 mini Realtime, которая стоит дешевле, но я не нашел способа указать эту новую модель при тестировании ggbot2.
Настройка shinyrealtime
Репозиторий shinyrealtime на GitHub содержит демонстрационные приложения как для R, так и для Python, хотя я пробовал только версию для R. Одно из преимуществ shinyrealtime заключается в том, что приложение на R может по запросу генерировать код для визуализации и на Python.
Для начала нужно установить пакет R. В сети можно встретить инструкции, которые советуют другой путь установки, но он не работает.
В репозитории есть базовое демо-приложение для простого чата и более сфокусированное на визуализации данных.
В отличие от автономного приложения ggbot2, демо-версия для визуализации данных в репозитории shinyrealtime требует нескольких дополнительных файлов. Мне также пришлось скачать файлы prompt-r.md и shutter.mp3. Возможно, проще просто клонировать весь репозиторий целиком.
Если вы хотите, чтобы приложение на R генерировало код на Python локально, вам нужно будет вручную установить пакет reticulate R в вашей системе. Этого должно быть достаточно, чтобы установить все остальные необходимые библиотеки Python. Либо вы можете пройтись по коду приложения и закомментировать весь код, который связан с Python, если вам не нужна эта функциональность.
Когда я попросил ggbot2 «Создать интересную визуализацию данных из набора economics на Python», он вернул вот этот график:

И вот такой код на Python:
import matplotlib.pyplot as plt
import pandas as pd
# Load the economics dataset into a pandas DataFrame
economics = r.economics
# Create the plot
fig, ax1 = plt.subplots(figsize=(10, 6))
# Plot pce on the left y-axis
ax1.plot(economics['date'], economics['pce'], color='blue', label='PCE')
ax1.set_ylabel('PCE', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')
# Create a second y-axis for unemployment
ax2 = ax1.twinx()
ax2.plot(economics['date'], economics['unemploy'], color='red', label='Unemployment')
ax2.set_ylabel('Unemployment', color='red')
ax2.tick_params(axis='y', labelcolor='red')
# Set the x-axis label
ax1.set_xlabel('Date')
# Set the title
plt.title('PCE and Unemployment Over Time')
# Show the plot
plt.show()
Стоит отметить, что этот код на Python не будет работать за пределами приложения R как есть, потому что он ожидает получить фрейм данных R с экономическими показателями. Однако это легко исправить, если данные находятся в CSV-файле. Нужно просто импортировать их с помощью economics = pd.read_csv("economics.csv").
Чтобы использовать свои собственные данные вместо встроенных в демо-версию, вам потребуется немного изменить код приложения. Я сделал это, загрузив свои наборы данных в начале скрипта, а затем изменил первую строку в следующем блоке кода, чтобы он обращался к моим данным вместо стандартных.
for (dataset in c("mpg", "diamonds", "economics", "iris", "mtcars")) {
df <- eval(parse(text = dataset))
if (is.data.frame(df)) {
samples <- c(
samples,
paste0(
"## ",
dataset,
"\n\n",
capture.output(write.csv(head(df), "")),
collapse = "\n"
)
)
}
}
После этих шагов ваше приложение должно быть готово к работе. Нажмите кнопку «Run» в файле app.R, если вы находитесь в RStudio или Positron, или выполните команду shiny::runApp("app.R") в консоли R. Опять же, вам нужно убедиться, что приложение открыто в полноценном браузере, а не в окне просмотра IDE.
На недавней конференции сам Уикхем признался, что на shinyrealtime они «в общей сложности потратили часов шесть». С тех пор в проект вложили больше времени, но он все еще находится на ранней стадии.
Тем не менее, эти приложения дают пользователям R возможность заглянуть в будущее, где генеративный ИИ и Shiny объединятся. Появятся веб-приложения, которые понимают голосовые команды и отвечают вам.
И хотя до этого будущего еще далеко, первый шаг уже сделан. Главное — не ждать от него слишком многого прямо сейчас.












