От перфокарт до ChatGPT

История эволюции от перфокарт до ChatGPT

Взгляд моего дедушки на генеративное искусственное интеллект

Мой материнский дедушка, Скип, всегда был в моих глазах фермером. Трагическим образом моя мать умерла от лейкемии всего через месяц после моего рождения в 1988 году. Будучи первым внуком в семье, я был очень близок к Скипу. В детстве я проводил дни, сидя на подлокотнике тракторов и комбайнов во время ежегодного сбора пшеницы — и когда я стал подростком, я сам работал на ферме летней работой.

Вид сверху на комбайн John Deere во время летнего сбора пшеницы. Мой дедушка и я использовали два из них во время наших урожайных сезонов в конце 1990-х / начале 2000-х годов. Это была моя первая «работа». Фото Скотт Гудвилл на Unsplash

Однако жизнь Скипа до этого была совсем не похожа на сельское хозяйство, которое я знал. Прежде чем я появился на свет, он глубоко погрузился в академическую среду, закончив курс статистики в Техасском университете A&M, Колледж-Стейшн, к 1972 году. Вскоре после этого он занял профессорскую должность в Университете Мэриленда и окончил свою диссертацию в 1974 году. Его прорывные исследования были направлены на прогнозирование и выявление безопасности и рисков материалов в промышленных предприятиях. Для этой монументальной задачи требовалось годы усилий. Он должен был вручную собирать десятилетние отчеты о происшествиях из различных компаний, обрабатывать статистику вручную, а затем преобразовывать эти понимания в инструкции, записанные на перфокартах, для компьютерной системы университета. Захват времени на этом компьютере не был мгновенным; он требовал предварительного бронирования за несколько недель или даже месяцев вперед. Даже одна ошибка в кодировании могла означать начало с нуля, что потенциально затягивало его исследования на несколько месяцев.

В 1980-х годах он покинул эту жизнь, чтобы вернуться на родительскую ферму в Восточном Техасе и заняться предпринимательством. Но желание использовать статистические выводы проникло во все, что он делал как фермер — я просто не осознавал этого в детстве. В детском воображении Скип занимался «офисной работой», как он называл это, но на самом деле он использовал ИТ для прогнозирования и обеспечения финансирования для покрытия операционных расходов, оптимизации химии в удобрениях для увеличения урожайности, разработки стратегий по снижению неопределенности в денежных потоках через торговлю фьючерсами на Чикагской товарной бирже — все это на компьютере TRS 80, который он купил в «Radio Shack» с 16 КБ оперативной памяти, подключенным к печатающему устройству с жидкокристаллическими символами. Сельское хозяйство может быть неприбыльным бизнесом — и ставка Скипа была на то, что он сможет использовать статистику для нивелирования различий.

С течением времени ферма не выдержала испытания временем. Оказалось, что межпоколенное фермерство не очень удачно справляется с пропуском поколения — и затраты на входные материалы сегодня более непростительны, чем когда-либо раньше — экономическая эффективность становится единственным способом прибыльной конкуренции — и, поэтому, большинство небольших и средних фермеров из поколения Скипа были выкуплены и объединены, но это происходит постепенно, маленькими шагами (по крайней мере, для нас).

Конечно, я начал ценить тесную связь между статистикой и сельским хозяйством. Я до сих пор помню ежегодное посещение Департамента сельского хозяйства США, который тщательно собирал образцы урожая (на каждой ферме, включая нашу) в рамках сервиса национальной сельскохозяйственной статистики. Это, на мой взгляд, один из величайших неизвестных и продолжающихся проектов сбора данных в истории — помогающий поколениям фермеров принимать «обоснованные на данных» решения, даже до того, как это стало модным словом. Но я обнаружил еще большую признательность к тому, что делал Скип десятилетиями спустя, когда я начал свою собственную карьеру в аналитике и науке о данных — это был мой собственный второй акт после того, как я провел свои 20-е и 30-е годы, служа в армии США и путешествуя по всему миру. Часто я связываюсь с ним по телефону, чтобы он поведал мне, как они раньше проводили регрессионный анализ или симуляции или как они контролировали случайную выборку «в то время». И иногда рассказываю ему о том, как это делается сегодня, чтобы понять его восторг, когда я описываю ему такие концепции, как машинное обучение, глубокое обучение, обучение с подкреплением — для него это как научная фантастика, но ему нравится слушать об этом — даже если это уже не совсем реально для него в этот поздний период жизни.

Я дал Скипу обновления в реальном времени, когда я увидел выступление Джона Дира на CES в январе 2023 года, где они представили новое оборудование, такое как изображенный выше опрыскиватель. Это устройство использует 36 камер, компьютерное зрение и нейронные сети для обнаружения сорняков в реальном времени и минимизации использования гербицидов. Изображение автора.

Вступайте в эксперимент.

В выходные я решил показать, а не рассказывать. Я хотел, чтобы Скип самостоятельно испытал новую технологию, а не просто слушал мои рассказы о ней. А что, если мы могли бы разработать бизнес-план для запуска гипотетической новой фермы менее чем за 40 минут? Я могу это сделать, используя ChatGPT 4 с включенным расширенным анализом данных, показывая экран на его iPhone – мы будем совместно сотрудничать для создания его.

Мы кратко обсудили наши предположения:

  1. У нас есть 1000 акров земли для ведения фермерского хозяйства в восточном Техасе
  2. У нас есть 1 миллион долларов стартового капитала для покупки оборудования
  3. Нам нужно получить кредитную линию от банка на операционные расходы в первом году, чтобы начать
  4. Мы заинтересованы в выращивании пшеницы и сои (это те культуры, которыми Скип раньше занимался)

Мы начали с простого:

Задание 1: “Напишите мне план бизнеса для открытия новой фермы в восточном Техасе для выращивания пшеницы и сои”.

Скип был сразу впечатлен длинной формой результатов. Но подождите, мы только начинали…

Задание 2: “Дайте мне список оборудования, которое мне понадобится для начала”

Задание 3: “Изложите его в таблицу и упорядочьте по приоритету от наиболее неотложного до наименее неотложного”

Задание 4: “теперь создайте новый столбец для распределения бюджета. Предположим, я буду использовать комбинацию аренды и покупки, создайте дополнительный столбец для рекомендации аренды по сравнению с покупкой. Предположим, у меня есть 1 миллион долларов стартового капитала.”

(Прошло 4 минуты)

Результат:

Данные, сгенерированные GPT-4, Изображение автора.

Задание 5: “Сколько мне следует выделить на запрос кредитной линии для переменных затрат (семена, удобрения, рабочая сила и т. Д.), предположим, что у нас 1000 акров. Создайте новую таблицу.”

Результат:

Данные, сгенерированные ChatGPT 4, Изображение автора

К этому моменту я почувствовал, что Скип снова был свидетелем полета “Аполлона 11”. Он едва мог скрыть свой восторг. Но мы еще не закончили…

Задание 6: “Напишите мне Монте-Карло симуляцию, в которой я могу изменить входные данные и проверить результат на мой бюджет”

Результат:

import numpy as npimport matplotlib.pyplot as plt# Определение количества симуляцийn_simulations = 10000# Предположения с [среднее, стандартное отклонение]стоимость семян пшеницы = [20, 2]  # Стоимость на акрстоимость семян сои = [50, 5]стоимость удобрения для пшеницы = [50, 5]стоимость удобрения для сои = [40, 4]стоимость рабочей силы = [25, 3]стоимость пестицидов = [30, 3]стоимость топлива и обслуживания = [15, 2]прочие затраты = [10, 1]def симулировать_затраты_на_ферму():    семена_пшеницы = np.random.normal(стоимость семян пшеницы[0], стоимость семян пшеницы[1])    семена_сои = np.random.normal(стоимость семян сои[0], стоимость семян сои[1])    удобрение_пшеницы = np.random.normal(стоимость удобрения для пшеницы[0], стоимость удобрения для пшеницы[1])    удобрение_сои = np.random.normal(стоимость удобрения для сои[0], стоимость удобрения для сои[1])    рабочая_сила = np.random.normal(стоимость рабочей силы[0], стоимость рабочей силы[1])    пестициды = np.random.normal(стоимость пестицидов[0], стоимость пестицидов[1])    топливо_обслуживание = np.random.normal(стоимость топлива и обслуживания [0], стоимость топлива и обслуживания[1])    прочие = np.random.normal(прочие затраты[0], прочие затраты[1])        общая_стоимость = (семена_пшеницы + семена_сои + удобрение_пшеницы + удобрение_сои +                   рабочая_сила + пестициды + топливо_обслуживание + прочие) * 1000  # для 1000 акров    return общая_стоимостьresults = [симулировать_затраты_на_ферму() for _ in range(n_simulations)]# Визуализацияplt.hist(results, bins=50, edgecolor='black', alpha=0.7)plt.title('Распределение общих затрат на ферму')plt.xlabel('Общая стоимость')plt.ylabel('Частота')plt.grid(True, alpha=0.2)plt.show()

Теперь настал момент истины – запустится ли код? Мы переключились на записную книжку Jupyter для запуска кода. И вот, с первой попытки:

Данные, сгенерированные с помощью ChatGPT 4, Изображение, сгенерированное с помощью Python, Изображение от автора

На данный момент мы потратили всего 10-15 минут. У нас всё ещё есть время… Можем ли мы сделать это интерактивным?

Нам нужно создать список параметров, который позволит пользователю динамически настраивать предположения на ползунке. Опять же, мы обращаемся к ChatGPT за рекомендациями о том, какими должны быть эти параметры на основе ранее созданной модели Monte Carlo:

Данные, сгенерированные GPT 4, Изображение от автора

После того, как мы построили список параметров, мы создаем таблицу “мер”, связанную с 16 визуальными элементами-регуляторами, которые позволяют пользователю вручную выбирать свои входные данные и динамически обновлять модель Monte Carlo. Для этого мы создаем блок “Python Visual” в Power BI, перетаскиваем туда все наши показатели и затем обновляем код следующим образом:

# Следующий код для создания фрейма данных и удаления дублирующихся строк выполняется всегда и действует как вводная часть вашего скрипта: # dataset = pandas.DataFrame(fertilizer_soybean_cost_avg Value, fertilizer_soybean_cost_std Value, fertilizer_wheat_cost_avg Value, fertilizer_wheat_cost_std Value, fuel_maintenance_cost_avg Value, fuel_maintenance_cost_std Value, labor_cost_avg Value, labor_cost_std Value, miscellaneous_cost_avg Value, miscellaneous_cost_std Value, pesticide_cost_avg Value, pesticide_cost_std Value, soybean_seed_cost_avg Value, wheat_seed_cost_avg Value, wheat_seed_cost_std Value)# dataset = dataset.drop_duplicates()# Вставьте или введите свой код скрипта здесь:import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# Предполагается, что данные из Power BI передаются как 'dataset'df = dataset# Извлечение значений из таблицыwheat_seed_cost_avg = df['wheat_seed_cost_avg Value'].iloc[0]wheat_seed_cost_std = df['wheat_seed_cost_std Value'].iloc[0]soybean_seed_cost_avg = df['soybean_seed_cost_avg Value'].iloc[0]soybean_seed_cost_std = df['soybean_seed_cost_std Value'].iloc[0]fertilizer_wheat_cost_avg = df['fertilizer_wheat_cost_avg Value'].iloc[0]fertilizer_wheat_cost_std = df['fertilizer_wheat_cost_std Value'].iloc[0]fertilizer_soybean_cost_avg = df['fertilizer_soybean_cost_avg Value'].iloc[0]fertilizer_soybean_cost_std = df['fertilizer_soybean_cost_std Value'].iloc[0]labor_cost_avg = df['labor_cost_avg Value'].iloc[0]labor_cost_std = df['labor_cost_std Value'].iloc[0]pesticide_cost_avg = df['pesticide_cost_avg Value'].iloc[0]pesticide_cost_std = df['pesticide_cost_std Value'].iloc[0]fuel_maintenance_cost_avg = df['fuel_maintenance_cost_avg Value'].iloc[0]fuel_maintenance_cost_std = df['fuel_maintenance_cost_std Value'].iloc[0]miscellaneous_cost_avg = df['miscellaneous_cost_avg Value'].iloc[0]miscellaneous_cost_std = df['miscellaneous_cost_std Value'].iloc[0]# Определение количества симуляцийn_simulations = 10000# Предположения [среднее значение, стандартное отклонение]wheat_seed_cost = [wheat_seed_cost_avg, wheat_seed_cost_std]soybean_seed_cost = [soybean_seed_cost_avg, soybean_seed_cost_std]fertilizer_wheat_cost = [fertilizer_wheat_cost_avg, fertilizer_wheat_cost_std]fertilizer_soybean_cost = [fertilizer_soybean_cost_avg, fertilizer_soybean_cost_std]labor_cost = [labor_cost_avg, labor_cost_std]pesticide_cost = [pesticide_cost_avg, pesticide_cost_std]fuel_maintenance_cost = [fuel_maintenance_cost_avg, fuel_maintenance_cost_std]miscellaneous_cost = [miscellaneous_cost_avg, miscellaneous_cost_std]def simulate_farm_costs():    wheat_seed = np.random.normal(wheat_seed_cost[0], wheat_seed_cost[1])    soybean_seed = np.random.normal(soybean_seed_cost[0], soybean_seed_cost[1])    fertilizer_wheat = np.random.normal(fertilizer_wheat_cost[0], fertilizer_wheat_cost[1])    fertilizer_soybean = np.random.normal(fertilizer_soybean_cost[0], fertilizer_soybean_cost[1])    labor = np.random.normal(labor_cost[0], labor_cost[1])    pesticide = np.random.normal(pesticide_cost[0], pesticide_cost[1])    fuel_maintenance = np.random.normal(fuel_maintenance_cost[0], fuel_maintenance_cost[1])    miscellaneous = np.random.normal(miscellaneous_cost[0], miscellaneous_cost[1])    total_cost = (wheat_seed + soybean_seed + fertilizer_wheat + fertilizer_soybean +                  labor + pesticide + fuel_maintenance + miscellaneous) * 1000  # на 1000 акров    return total_costresults = [simulate_farm_costs() for _ in range(n_simulations)]# Преобразование результатов в DataFramedf_simulated_results = pd.DataFrame(results, columns=['Total Cost'])# Расчет интерквартильного размаха (IQR)Q1 = df_simulated_results['Total Cost'].quantile(0.25)Q3 = df_simulated_results['Total Cost'].quantile(0.75)# Построение гистограммыplt.figure(figsize=(10, 6))n, bins, patches = plt.hist(df_simulated_results['Total Cost'], bins=50, color='blue', edgecolor='black', alpha=0.7)plt.title('Распределение изменчивых затрат за год из симуляции')plt.xlabel('Затраты за год')plt.ylabel('Частота')plt.grid(True, which='both', linestyle='--', linewidth=0.5)# Затеняем IQRfor i in range(len(bins)):    if bins[i] > Q1 and bins[i] < Q3:        patches[i].set_facecolor('green')plt.axvline(Q1, color='red', linestyle='dashed', linewidth=1)plt.axvline(Q3, color='red', linestyle='dashed', linewidth=1)plt.tight_layout()plt.savefig('simulated_costs_histogram.png')  # Этот код сохранит график в виде изображенияplt.show()

Просто для забавы, мы попросили ChatGPT определить межквартильный размах (IQR) и выделить его другим цветом. Мы также вручную обновили названия диаграммы и ось абсцисс. Остальное – просто немного улучшение визуального оформления в Power BI, чтобы сделать его более удобным для пользователя. Вот что получилось:

Данные, сгенерированные методом Монте-Карло на основе выбранных пользователем параметров, код на Python, сгенерированный ChatGPT 4, панель управления создана в MS PowerBI, изображение автора

Теперь у нас есть динамическая модель Монте-Карло, с помощью которой можно поиграть с разными предположениями о стоимости входных данных и спрогнозировать переменные операционные расходы, необходимые для запуска нашего фермерского предприятия. Используя ChatGPT 4, мы практически не писали код, просто немного подправили его, выполнили большую часть работы на iPhone через общий экран, создали последнюю часть в PBI Desktop и поделились ею через приложение PBI на iPhone. Всего за примерно 30-40 минут работы.

Вердикт моего дедушки? “Мы сделали за 40 минут то, что ему самому заняло бы 2 года ‘в своё время'”. Да, я понимаю, что можно было бы сделать гораздо больше – и эта “модель” далека от совершенства. (Например, мы не разделяем % посевных площадей между соевыми бобами и пшеницей.) Но за 40 минут? Даже я впечатлен. И в этом заключается суть Gen AI – демократизация науки о данных, поощрение экспериментов и ускорение развития – всё внутри вашей ладони. Предоставление дедушке и его внуку возможности восстановить связь через статистику и использование технологий в новых и неожиданных способах.