Искусственный интеллект

теория и практика

В настоящее время искусственным интеллектом принято называть технические решения предназначенные для анализа и/или генерации того или иного контента. Такие решения в основном базируются на методах машинного обучения и в целом ничем не отличаются от хорошо знакомых нам статистических и эконометрических моделей: единственным отличием является объем анализируемых данных

Разновидности

Аналитический

Уже классический подход основанный на машинном обучении с учителем: у алгоритма есть конкретная задача по предсказанию конкретного свойства анализируемого объекта

Генеративный

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

Примеры - распознование тексат, банковский скоринг, игровое взаимодействие, распознование лиц

Примеры - большие языковые модели, генерация изображений, генерация музыки

Большие языковые модели

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

Wikipedia.org

Концепция

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

  2. Генерация - на основании сформированного вероятностного поля и пользовательского запроса создается текстовое сообщение, похожее на реальное, в статистическом смысле

    
                  Язык из 5 слов                             Ввод            
    
                  Кошка   Собака  Ест     Яблоко   Груша     Кошка ест ...   
    
    Токенизация   (1)     (2)     (3)     (4)      (5)       (1)   (3)    (?)
    
    Векторизация   1       0       0       0        0         1     0      ?  
                   0       1       0       0        0         0     0      ?  
    IRL все        0       0       1       0        0         0     1      ?  
    немного        0       0       0       1        0         0     0      ?  
    подругому      0       0       0       0        1         0     0      ?  
                                                              ───┬───      ▲ 
                                                                 │         │ 
                  ┌───────────────────────────┐           ┌──────┴─────┐   │ 
                  │Обучение - поиск корреляции├──────────►│Предсказание├───┘ 
                  └───────────────────────────┘           └────────────┘  
                                                                  Груша  (p = 99%)
                                                                  Яблоко (p = 20%)

Возможности и ограничения

Что умеет

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

Чего не умеет

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

Варианты применения

В целом, LLM - это достаточно мощный инструмент, лучше всего его можно применить для следующего:

  • Самообучение - позволяет разобраться в том или ином материале, посмотреть на упрощенные примеры расчетов, сгененрировать пошаговые алгоритмы и т.д.

  • Написание и редактура кода - большинство ботов отлично справляется с написанием типовых скриптов и рекомендаций для усовершенствования или изменения кода

  • Сбор информации - встроенные механизмы написания кода и компьютерного зрения позволяют достаточно быстро собирать и агрегировать данные из разных источников

Рекомендации

При работе с LLM лучше всего руководствоваться следующими правилами:

  • Конкретность - опишите запрос точно и детально, в случае высокой сложности - разбейте на логические куски

  • Дискретность - лучше начинать новый чат для каждой новой задачи или даже подзадачи, так как разносмысловой контекст часто сбивает LLM

  • Принятие - не стоит пытаться добиться от бота чего-то, что не заложено в его прямой функционал

  • Токенезация - если нужно агрегировать или собрать данные, например из PDF, лучше заранее их подготовить - вырезать нужные таблицы и т.д.

  • Создание контекста - для сложных задач следует давать боту полезные материалы или инструкции - например при написании кода можно скормить ему документацию, а при сборе данных - описать содержание источника

  • Подключение модулей - в любом боте есть дополнительный функционал, например создание библиотеки файлов, функция поиска в интеренете и т.д. Так, например, для того тобы бот переходил по ссылкам лучше включить соответсвующий модуль поиска в сети вручную

  • Любые расчеты и визуализации следует делать через написние кода - некоторые нейросети не делают этого, пытаясь “схитрить”, в таком случае лучше задать это уточнение в запросе

    Избыточные наративы:

  • Определение роли - бесполезный блок - опять же LLM ничего не понимает, в частности не понимает, что ей нужно что-то делать более или менее профессионально, а по ключивым словам можно задать только тон беседы, не более

  • Голюцинации - любой продукт ИИ (и не только))) - это галюцинация, просто одна удовлетворяет ваши ожидания, а другая нет, не стоит обольщаться на этот счет

  • Фокус внимания - подозреваю, что нельзя привлечь внимание бота к конкретным эллементам диалога - все материалы прогоняются скопом при каждом новом запросе

Казусы студенческой жизни

В этом году наблюдается огромное количество студенческих работ, написанных ИИ, к счастью в большинстве случаев распознать их не составляет большого труда, посмотрим на отличительные черты:

  • Если вам кажется, что работа написана ИИ - то она написана ИИ ))) Такие тексты обычно молоинформативны, неконкретны и в целом пусты. Тут дело не в самом ИИ, а в лени.

  • Часто студенты не убирают форматирование - у многих ботов есть свои специфические шаблоны

  • ИИ заходит в области, которые студентам не могут быть известны в принципе, но при этом пишет не вполне коректно и полно

  • Если студенты закрепляют текст задания, то в ответе могут содержаться ваши же формулировки

Кривые и косые графики - сделанные не через написние и интерпретацию кода а через генерацию изображений

Практикум

В этом блоке попробуем реализовать две типовые задачи, с которыми ИИ может справится (предположительно)

Кейс №1

Попробуем скормить боту набор из изображений с таблицами данных - простые скриншоты

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

Результат ниже для ChatGPT, также производился тест Mistral, Qwen, DeepSeek, все справились.

ChatGPT

Code
library(ggplot2)
library(dplyr)
library(tidyr)

trade_data <- data.frame(
  Port = c(
    "LIMASSOL","Unknown","PORT SAID","ALEXANDRIA","ISKENDAROUN","MERSIN",
    "DAMIETTA EGYPT","JEDDAH","MALTA","RENI","PIRAEUS","ALIAGA",
    "LATAKIEH","TRIPOLI","THESSALONIKI","EVYAP","SINGAPORE","YEISK",
    "ANTALYA","LAEM CHABANG","KOPER","ALGERIA"
  ),
  Export = c(
    191115,197873,68540,114209,64420,50085,60134,0,44244,33642,
    18656,5738,6142,8278,1276,0,2348,2248,2589,1155,753,15071
  ),
  Import = c(
    5535,5175,75721,5748,13052,18783,12253,46387,0,0,
    1885,7136,6600,2304,2789,2483,0,0,0,0,0,0
  )
)

# -----------------------------
# 2. Подготовка данных для графика
# -----------------------------

trade_long <- trade_data %>%
  pivot_longer(
    cols = c(Export, Import),
    names_to = "Type",
    values_to = "USD"
  ) %>%
  mutate(
    Port = reorder(Port, -USD, sum)
  )

# -----------------------------
# 3. Построение графика
# -----------------------------

ggplot(trade_long, aes(x = Port, y = USD, fill = Type)) +
  geom_col() +
  labs(
    title = "Total Export and Import by Port (All Months Combined)",
    x = "Partner Port",
    y = "USD"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 70, hjust = 1),
    plot.title = element_text(face = "bold")
  )

Кейс №2

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

Далее, попросим нарисовать 3 графика - Часы нму, Средня температура, Средняя скорость ветра. Для этого дополнительно скормим боту ссылку на API метеостата

Результат ниже для ChatGPT, которому потребовались незначительные коректеровки, также производился тест Mistral - справился, но не учел, что один период НМУ может начаться в одном месяце, а закончиться в другом, поэтому немного ошибся с расчетами, Qwen и DeepSeek - не справились на этапе перехода по ссылке и подсчета

ChatGPT

Code
library(httr)
library(jsonlite)
library(dplyr)
library(ggplot2)
library(lubridate)

# ==== Параметры ====
lat <- 56.0153     # Красноярск (пример)
lon <- 92.8932
start <- "2025-01-01"
end <- "2025-12-31"

# Твой RapidAPI ключ:
rapidapi_key <- "0e01de6488msh8dda6972fcf7c92p1ab045jsne6f0fe48c160"

# ==== 2) Запрос к Meteostat API ====
url <- "https://meteostat.p.rapidapi.com/point/daily"
query <- list(
  lat = lat,
  lon = lon,
  start = start,
  end = end,
  units = "metric"
)

response <- GET(url,
                add_headers(
                  "x-rapidapi-host" = "meteostat.p.rapidapi.com",
                  "x-rapidapi-key" = rapidapi_key
                ),
                query = query)

data_json <- content(response, as = "text", encoding = "UTF-8")
daily_list <- fromJSON(data_json, flatten = TRUE)

df_daily <- as.data.frame(daily_list$data)

# ==== Считаем средние по месяцам ====
df_daily <- df_daily %>%
  mutate(date = as.Date(date),
         month = month(date)) %>%
  group_by(month) %>%
  summarise(
    MeanTemp = mean(tavg, na.rm = TRUE),
    MeanWind = mean(wspd, na.rm = TRUE)
  )

# ==== Данные часов НМУ ====
df_nmu <- data.frame(
  month = 1:12,
  NMU_hours = c(48,178,16,0,43,24,0,0,0,156,29,79)
)

df_all <- left_join(df_nmu, df_daily, by = "month")


ggplot(df_all, aes(x = month, y = NMU_hours)) +
  geom_col(fill = "steelblue") +
  scale_x_continuous(breaks = 1:12, labels = 1:12) +
  labs(
    title = "Часы НМУ",
    x = "Месяц",
    y = "Часы"
  ) +
  theme_minimal()

Code
ggplot(df_all, aes(x = month, y = MeanTemp)) +
  geom_line(color = "tomato", linewidth = 1) +
  geom_point(color = "tomato") +
  scale_x_continuous(breaks = 1:12, labels = 1:12) +
  labs(
    title = "Средняя температура",
    x = "Месяц",
    y = "°C"
  ) +
  theme_minimal()

Code
ggplot(df_all, aes(x = month, y = MeanWind)) +
  geom_line(color = "forestgreen", linewidth = 1) +
  geom_point(color = "forestgreen") +
  scale_x_continuous(breaks = 1:12, labels = 1:12) +
  labs(
    title = "Средняя скорость ветра",
    x = "Месяц",
    y = "км/ч"
  ) +
  theme_minimal()

Прощальное слово

На этом все, дорогие друзья, пробуйте разные нейросети, придумывайте для них задачи, научиться что-то с ними делать можно только в ходе непосредственного взаимодействия, удачи!!!