Как собрать ИИ-агента для аналитики данных

Скармливать большой CSV-файл или таблицу Excel напрямую в контекстное окно языковой модели - худший способ анализа данных из всех возможных.

Как собрать ИИ-агента для аналитики данных

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

Правильный инженерный подход к аналитике называется Code-as-Action.

Модель вообще не должна читать всю таблицу глазами. Она изучает только структуру колонок и типы данных, после чего сама пишет исполняемый скрипт на Python с библиотекой Pandas, запускает его в локальной песочнице и отдает точный ответ на базе расчетов интерпретатора.

Разбираем архитектуру такого аналитического агента и пишем рабочий код с автоматическим построением графиков.

В чем сила подхода Code-as-Action

Когда аналитик получает новую таблицу на сто мегабайт, он не читает каждую строку подряд.

Сначала специалист смотрит на первые пять строк через метод head(), проверяет типы колонок через info() и запускает математические агрегации через группировки и фильтры.

Кстати, если вы хотите протестировать все самые свежие модели уровня Claude Sonnet 5, GPT-5.6 или Gemini 3 в одном удобном месте и сравнить их ответы без костылей с иностранными картами - на платформе SYNTX.AI это можно сделать за пару кликов.

По промокоду NEIROSKUF дадут 15% скидку на все тарифы.

Агент работает по точно такой же логике.

Вместо того чтобы отправлять в модель миллионы символов сырого текста, мы передаем ей компактный срез мета-данных таблицы объемом меньше тысячи токенов.

Модель понимает, какие поля есть в файле, формулирует математический алгоритм решения задачи на Pandas, а вычисления выполняет процессор вашего сервера на чистом C-коде за десять миллисекунд.

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

Архитектура аналитического контура

Процесс обработки любого пользовательского вопроса к данным состоит из четырех последовательных шагов.

Как собрать ИИ-агента для аналитики данных

Если сгенерированный скрипт падает с ошибкой (например, дата в колонке записана строкой в нестандартном формате), рантайм не прерывает работу.

Текст ошибки возвращается модели, она на лету дописывает преобразование типов через pd.to_datetime() и повторяет запуск до успешного получения результата.

Полный рабочий код агента-аналитика на Python

Соберем автономного аналитика в виде законченного скрипта.

Агент принимает путь к любому CSV-файлу и текстовый вопрос на естественном языке, сам проводит расчеты, сохраняет график в PNG-файл и формирует краткую управленческую выжимку.

Для написания кода и анализа результатов используем скоростную модель DeepSeek V4 Flash или Gemini 3.7 Flash через OpenRouter.

import json import os import re import subprocess import sys import pandas as pd from openai import OpenAI client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key=os.getenv("OPENROUTER_API_KEY") ) MODEL_NAME = "deepseek/deepseek-v4-flash" # --- 1. ИЗВЛЕЧЕНИЕ МЕТА-ДАННЫХ ТАБЛИЦЫ --- def get_table_schema_context(csv_path: str) -> str: # Загружаем только первые 5 строк для экономии памяти df = pd.read_csv(csv_path, nrows=5) buffer = [] buffer.append(f"Имя файла - {os.path.basename(csv_path)}") buffer.append(f"Список колонок и типы данных\n{df.dtypes.to_string()}") buffer.append(f"Пример первых трех строк\n{df.head(3).to_string()}") return "\n\n".join(buffer) # --- 2. БЕЗОПАСНЫЙ ЗАПУСК СГЕНЕРИРОВАННОГО СКРИПТА --- def execute_generated_python_code(code_str: str) -> tuple[bool, str]: # Записываем код во временный скрипт temp_script = "_temp_analyst_run.py" with open(temp_script, "w", encoding="utf-8") as f: f.write(code_str) try: # Запускаем в отдельном процессе с жестким таймаутом res = subprocess.run( [sys.executable, temp_script], capture_output=True, text=True, timeout=20 ) if res.returncode == 0: output = res.stdout.strip() if res.stdout else "[Скрипт выполнен успешно без вывода в консоль]" return True, output else: return False, f"ОШИБКА ВЫПОЛНЕНИЯ СКРИПТА\n{res.stderr.strip()}" except subprocess.TimeoutExpired: return False, "ОШИБКА - Превышен лимит времени выполнения кода (20 секунд)." except Exception as e: return False, f"СИСТЕМНЫЙ СБОЙ - {str(e)}" finally: if os.path.exists(temp_script): os.remove(temp_script)
# --- 3. ГЛАВНЫЙ ЦИКЛ САМОВОССТАНОВЛЕНИЯ АГЕНТА --- def run_data_analyst_agent(csv_path: str, user_query: str, max_retries: int = 3) -> str: schema_info = get_table_schema_context(csv_path) system_prompt = ( "Ты ведущий Data Scientist и аналитик данных на Python. " "Твоя задача - написать законченный исполняемый скрипт на Python с библиотеками pandas и matplotlib " "для точного ответа на вопрос пользователя по переданной таблице. " "Правила написания кода\n" "1. Таблица находится по пути '" + csv_path.replace("\\", "/") + "'. Скрипт обязан загружать ее через pd.read_csv.\n" "2. Всегда обрабатывай пропуски и проводи явное приведение типов (даты, числа).\n" "3. Если вопрос требует визуализации, строй красивый график через matplotlib и сохраняй его в файл 'output_chart.png' без вызова plt.show().\n" "4. Все итоговые числовые ответы выводи в консоль через print().\n" "5. Отдавай только чистый блок кода на Python внутри тройных кавычек без лишнего текста.\n" "6. Запрещено использовать любые знаки двоеточия в комментариях." ) messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": f"СТРУКТУРА ТАБЛИЦЫ\n{schema_info}\n\nВОПРОС КЛИЕНТА\n{user_query}"} ] for attempt in range(max_retries): # 1. Модель генерирует код response = client.chat.completions.create( model=MODEL_NAME, messages=messages, temperature=0.1 ) raw_answer = response.choices[0].message.content.strip() # Извлекаем чистый Python код code_match = re.search(r"```python\s*(.*?)\s*```", raw_answer, re.DOTALL) if code_match: script_code = code_match.group(1) else: script_code = raw_answer.replace("```", "").strip() # 2. Исполняем код success, execution_log = execute_generated_python_code(script_code) if success: # 3. Модель формулирует финальный бизнес-вывод на основе точных цифр summary_prompt = ( "Ты аналитик для руководства. На основе вопроса пользователя и точного вывода скрипта " "сформулируй краткий, понятный ответ с ключевыми цифрами и выводами. " "Если был сгенерирован график, упомяни, что файл 'output_chart.png' сохранен. " "Пиши емко, строго по фактам, без оценочных штампов и без единого знака двоеточия." ) final_res = client.chat.completions.create( model=MODEL_NAME, messages=[ {"role": "system", "content": summary_prompt}, {"role": "user", "content": f"ВОПРОС\n{user_query}\n\nВЫВОД СКРИПТА\n{execution_log}"} ], temperature=0.2 ) return final_res.choices[0].message.content.strip() else: # Если код упал - возвращаем ошибку в диалог для самоисправления messages.append({"role": "assistant", "content": raw_answer}) messages.append({"role": "user", "content": f"Скрипт упал с ошибкой. Исправь код и попробуй снова.\n{execution_log}"}) return "Не удалось выполнить расчет после нескольких попыток исправления кода."

Пример решения реальной задачи на таблице продаж

Представим реальную ситуацию. У вас есть файл с транзакциями интернет-магазина на сто тысяч строк с колонками order_id, created_at, category, revenue, city.

Пользователь задает вопрос: "Покажи динамику выручки по месяцам для категории электроники и назови месяц с максимальными продажами".

Что происходит внутри агента:

На первом шаге агент читает структуру файла, видит, что created_at имеет строковый тип object, а revenue - числовой float64.

На втором шаге модель пишет компактный скрипт на двадцать строк. В коде применяется фильтр по категории, парсинг дат через pd.to_datetime, группировка по месячным периодам df.resample('M') и отрисовка линейного графика с сохранением в PNG.

Скрипт отрабатывает за пятьдесят миллисекунд в локальном процессе Python.

На третьем шаге модель получает точный массив вычисленных чисел и отдает готовый ответ:

"Максимальная выручка в категории электроники зафиксирована в ноябре и составила 14 850 000 рублей. В декабре наблюдается спад продаж на восемнадцать процентов относительно пика. График помесячной динамики сохранен в файл output_chart.png."

Никаких приблизительных оценок и галлюцинаций. Каждая цифра получена из прямого расчета над исходным массивом данных.

Почему этот подход меняет корпоративную аналитику

Концепция Code-as-Action превращает языковую модель из ненадежного математика в профессионального программиста-исследователя.

Компания получает систему, которая способна за секунды отвечать на сложные ad-hoc вопросы к любым базам данных и таблицам без необходимости привлекать штатных дата-сайентистов под каждую рутинную выгрузку.

Как собрать ИИ-агента для аналитики данных
7
1