TL;DR
VayuChat — система для анализа данных о качестве воздуха, которая показывает подход к работе с табличными данными через LLM: вместо подачи сырых таблиц описываешь схему данных (столбцы, типы, единицы), и LLM генерирует Python-код для анализа.
LLM галлюцинирует, когда работает с сырыми данными напрямую — выдумывает цифры, путает значения, даёт уверенные, но неверные ответы. Причина: модель пытается "вспомнить" значения из таблицы, но работает с вероятностями, а не с точным поиском. Если попросишь "сколько было продаж в мае?" — получишь правдоподобное, но выдуманное число.
Подход разделяет задачу: LLM получает только описание структуры данных и пишет код, который считает реальные значения. Код выполняется отдельно на реальных данных. LLM отвечает за логику (как считать), данные — за факты (что считать). Два шага: (1) генерация кода по схеме, (2) выполнение на данных.
Схема метода
ШАГ 1: Описание схемы данных в system prompt → LLM генерирует Python-код
ШАГ 2: Код выполняется на реальных данных → результат (число/график/таблица)
Оба шага в одном чате (ChatGPT Advanced Data Analysis / Claude)
Пример применения
Задача: Анализ продаж интернет-магазина — у тебя CSV с заказами (дата, город, сумма, категория товара). Хочешь понять какие категории растут в разных регионах.
Промпт:
У меня CSV с колонками:
- order_date (дата заказа, формат YYYY-MM-DD)
- city (город доставки)
- amount (сумма заказа, рубли)
- category (категория: электроника, одежда, продукты, дом)
Датафрейм уже загружен как df.
Напиши Python-код, который:
1. Найдёт топ-3 категории по росту в Москве и Питере за последние 3 месяца
2. Построит график сравнения
Только код, без объяснений.
Результат: Модель выдаст код с группировкой по городу и категории, расчётом процента роста, фильтрацией топ-3 и построением графика. После выполнения кода увидишь конкретные цифры и визуализацию — никаких выдуманных значений.
Почему это работает
LLM плохо работает с точными фактами — это не база данных, а генератор текста. Когда просишь "сколько было продаж в мае?" — модель генерирует правдоподобное число, но не может точно "посмотреть" в таблицу. Это не поиск, а генерация на основе паттернов.
LLM отлично пишет код — логика, циклы, фильтры, группировки. Это паттерны текста, которые модель видела миллионы раз в обучающих данных. Синтаксис Python, операции pandas, построение графиков — всё это текстовые структуры, с которыми LLM работает идеально.
Метод использует сильную сторону (code generation) для обхода слабости (работа с фактами). LLM не считает сам — пишет инструкцию КАК считать, а выполнение на реальных данных даёт точный результат. Разделение ответственности: модель — за алгоритм, Python — за вычисления.
Рычаги управления: - "Только код, без объяснений" → убери эту фразу, чтобы видеть рассуждения LLM перед кодом — полезно для проверки логики - Детализация схемы данных → чем точнее описал столбцы (формат, единицы, возможные значения), тем точнее код - Примеры операций → добавь "используй .groupby() для группировки, seaborn для графиков" — уточняет стиль кода, который хочешь получить
Шаблон промпта
У меня данные в формате {формат: CSV/Excel/JSON}.
Структура данных:
- {столбец_1}: {описание, тип, единицы измерения}
- {столбец_2}: {описание, тип, единицы измерения}
[... остальные столбцы]
Данные уже загружены как {имя_переменной: df / data / table}.
Задача: {что нужно посчитать/проанализировать/визуализировать}
Напиши Python-код для решения. Только код, без объяснений.
Подставляй:
- {формат} — CSV, Excel, JSON
- {столбец_N} — название столбца, что означает, тип данных (число/текст/дата), единицы (рубли, штуки, метры)
- {имя_переменной} — обычно df (dataframe)
- {задача} — что конкретно нужно: расчёт, сравнение, график, статистика
🚀 Быстрый старт — вставь в чат ChatGPT (Advanced Data Analysis) или Claude:
Вот шаблон для анализа данных через code generation. Адаптируй под мои данные.
Спроси: какие у меня столбцы, что нужно посчитать.
[вставить шаблон выше]
LLM спросит структуру твоих данных и что анализировать — потому что без схемы данных не может написать рабочий код. Она возьмёт паттерн из шаблона и адаптирует под твою задачу.
Ограничения
⚠️ Требует подписку и данные: Работает только с ChatGPT Advanced Data Analysis (Plus/Pro) или Claude с загрузкой файлов. Нужны реальные табличные данные в структурированном виде.
⚠️ Только для количественного анализа: Метод для работы с фактами и цифрами. Для творческих задач (написать текст, придумать идею) подход не подходит — там галлюцинации не проблема, а возможность.
⚠️ Не для real-time данных: Если данные обновляются в реальном времени (API, базы данных) — нужна инфраструктура, простой чат не подойдёт.
Как исследовали
Команда из IIT Gandhinagar создала VayuChat — веб-платформу для анализа данных о качестве воздуха в Индии. Интегрировали три датасета: непрерывные измерения загрязнения воздуха с 500+ станций (2017-2024), демография штатов, финансирование программ борьбы с загрязнением. Платформа работает через Groq Cloud API и Gemini API с несколькими моделями (GPT-OSS 20B/120B, Qwen3-32B, Llama, DeepSeek-R1, Gemini).
Ключевая находка архитектуры: вместо подачи сырых таблиц в промпт, система описывает только схему данных в system prompt ("есть столбцы X, Y, Z с такими-то единицами"), и LLM генерирует Python-код. Код выполняется в изолированной среде (sandboxed) на реальных датафреймах. Результат — либо визуализация (графики), либо табличный ответ, либо числовой факт. Почему это работает: LLM не видит конкретных значений, поэтому не может их "вспомнить неправильно" — только описывает логику вычислений.
Проверили подход на реальной аналитике: расследовали кризис загрязнения воздуха в Дели (декабрь 2024) через цепочку вопросов — от "какие дни самые грязные?" до "корреляция между скоростью ветра и PM2.5?". Каждый вопрос генерировал код → код выполнялся → результат точный, без галлюцинаций. Нашли сильную обратную корреляцию: падение скорости ветра всего на 0.6 м/с поднимало уровень PM2.5 с "очень плохо" до "опасно" за несколько часов.
Инсайт: последовательные вопросы (sequential questioning) углубляют анализ естественным образом. Первый вопрос выявляет проблему, следующие — причины, паттерны, исторический контекст. Это не просто серия запросов — это исследовательский workflow через диалог, где каждый ответ формирует контекст для следующего вопроса.
Адаптации и экстраполяции
🔧 Техника: Убрать "только код" → видеть логику рассуждений
Если изменить промпт:
Объясни сначала какую логику будешь использовать, потом напиши код.
LLM покажет план: "Сначала отфильтрую данные за нужный период, потом сгруппирую по категории, посчитаю процент роста..." — полезно для проверки что LLM правильно понял задачу перед выполнением кода.
🔧 Техника: Примеры операций → контроль стиля кода
Если добавить:
Используй pandas методы: .groupby() для группировки, .resample() для временных рядов, seaborn для графиков.
LLM напишет код в конкретном стиле с нужными библиотеками — избегает экзотических подходов, которые могут не работать в твоём окружении.
🔧 Техника: Sequential questioning для любого исследования
Применяй принцип цепочки вопросов не только для данных, но для любого глубокого анализа:
Вместо одного сложного запроса: ❌ "Проанализируй мою бизнес-идею со всех сторон: аудитория, конкуренты, монетизация, риски"
Последовательные вопросы: ✅ 1. "Кто целевая аудитория этой идеи?" 2. [получил ответ] "Какие проблемы этой аудитории я решаю?" 3. [получил ответ] "Кто уже решает эти проблемы? Какие есть конкуренты?" 4. [получил ответ] "Чем я отличаюсь от этих конкурентов?" 5. [получил ответ] "Какие риски в этой нише?"
Каждый ответ углубляет контекст для следующего вопроса. LLM держит историю диалога и строит более точные ответы на основе предыдущих шагов. Это создаёт нарратив исследования, а не разрозненные факты.
Ресурсы
VayuChat: An LLM-Powered Conversational Interface for Air Quality Data Analytics
Публичная демо: https://huggingface.co/spaces/SustainabilityLabIITGN/VayuChat
Видео: https://www.youtube.com/watch?v=d6rklL05cs4
Авторы: Vedant Acharya, Abhay Pisharodi, Rishabh Mondal, Mohammad Rafiuddin, Nipun Batra
Indian Institute of Technology Gandhinagar, Council on Energy, Environment and Water
