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

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

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

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

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

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

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

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

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

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

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

Большая языковая модель (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, tryFormats = c("%Y-%m-%d")),
         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()

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

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

Продвинутое использование - R и LLM

На данном этапе развития индустрии можно выделить две слабые стороны LLM ботов:

  1. Относительно небольшой контекст - не получится залить в чат большой текстовый документ, например книгу, выпуск журнала или государственные акты, и получить вразумительные ответы. Даже если загрузка большого файла сама по себе возможна, то качество взаимодействия LLM с информацией будет теряться по мере увеличения контекстного окна. На данный момент многие провайдеры предлагают возможности по формированию личной библиотеки в средах (AI Studio), к которой будет обращаться LLM, но все эти решения являются платными и даже дорогостоящими;

  2. Чат бот не умеет делать ничего, кроме заложенных в него инструментов: вэб поиск, написание кода, загрузка документов. При этом было бы крайне желательно предоставить боту инструменты, специфичные личным потребностям пользователя, например, возможность брать данные из конкретного источника, возможность строить конкретные графики или даже дополнять существующие базы данных и т.д. Такие решения на уровне провайдеров начали появляться в 2025 году, и позволяют создавать дополнительные функции (программы), написанные на том или ином языке программирования. Решения также стоят много деняг (с позиции энтузиаста).

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

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

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

Методика подключения

В целом, любое обращение к языковой модели из вне оформляется в виде HTTP запроса через API провайдера, в запросе указывается ключ доступа, параметры модели, сообщение от пользователя и требуемые параметры ответа. Запросы и ответы формируются в виде JSON файлов. Так, в сыром варианте можно взаимодействовать с моделями, например, через пакет httr2. Однако, сейчас уже существуют обертки для указанных методов - пакеты и наборы функций, упрощающие составление запросов и получение ответов, в том числе с учетом специфических кейсов. Такими пакетами являются ellmer, tidyllm и другие.

Таким образом для подключения к языковым моделям необходимо получить API ключ - ваш личный пароль для подключения. Многие провайдеры предоставляют бесплатные тарифы с лимитами токенов, но требуют подключение платежного метода в любом случае. Есть провайдеры, которые ничего не требуют ) Сегодня будем пользоваться Mistral API, предоставляющей доступ к французским мультиязыковым моделям, с очень большими бесплатными лимитами, в плоть до полного отсутствия лимитов для устаревших моделей. Стоит отметить, что API есть и у Яндекса, но все платно.

Для пробы можно использовать ключ автора, который будет удален через несколько недель. На момент рендера этой презентации, работает без ВЫПЫНА, но раньше нет, поэтому возможно что нужно подключать.

Первое подключение

Для начала попробуем отправить первое сообщение и получить ответ от модели, для этого воспользуемся пакетом tidyllm, одним из нескольких эквивалентных по функционалу пакетов для создания моста между LLM и R. Функция Sys.setenv регистрирует ваш ключ в глобальной среде, чтобы все прочие функции использовали его по умолчанию. Отправка сообщения происходит через функцию llm_message, результат которой нужно направить в функцию инициализации чата mistral_chat.

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

library(tidyllm)

Sys.setenv("MISTRAL_API_KEY" = "1vhZsUjj629Uo5sInjXvkgmzzwG97dG7")

massage <- llm_message(
  "Привет,представься и поприветсвуй читателей, кратко :0)"
  ) |>
  mistral_chat(.model = "mistral-large-latest") |> tidyllm::get_reply()

cat(massage)
Привет! 😊 Я — нейросеть, твой виртуальный помощник. Рад(а) приветствовать тебя в этом чате! Чем могу помочь? 🚀

Готово, далее посмотрим на вводные кейсы использования.

Извлечение информации из текстов

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

С точки зрения нашей сегодняшней задачи - применение языковой модели вполне оправданно - до бума ЛЛМ задача извлечения сущностей также решалась с помощью моделей машинного обучения, натренированных ловить в тексте типичные паттерны. Если сравнивать с предыдущим опытом автора, ЛЛМ справляются с задачей сильно лучше классических моделей.

Для начала загрузим текст статьи с портала журнала ЭКО. Выберем случайную статью и выгрузим ее во временный файл.

url = "https://ecotrends.ru/index.php/eco/article/download/4764/3872/6111"

temp_pdf <- tempfile(fileext = ".pdf")

download.file(url, destfile = temp_pdf, mode = "wb")

Далее разобьем статью на чанки - кусочки, которые будем скармливать языковой модели, сделаем это произвольным образом, без учета структуры текста. Используем пакет , ragnar созданный для работы с методами RAG.

library(ragnar)
library(stringr)

text <- read_as_markdown(temp_pdf) |> str_remove_all("\n")

chunks <- text |> markdown_chunk(target_size = 600L,
                        target_overlap = 0.1)

Для этого примера будем использовать пакет ellmer, в tidyllm можно сделать то же самое.

Сделаем структурированный запрос языковой модели. Для этого создадим форму ответа через функции type_arrayи type_object, формирующие структуру запроса. В функции type_object зададим промпт и ожидаемый формат ответов с описанием: type_string - текстовая строка, такой формат подходит для нашей задачи, и type_enum - факторная строка, для разделения по типам. Языковая модель примет эту форму и заполнит материалами из прочитанного текста. На выходе инструментарий ellmer оформит ответ модели в виде привычного датасета.

Следующий шаг - сделаем функцию, создающую чат с моделью chat_mistral и отправляющую в него наш запрос chat_structured. Нам нужна функция, так как мы хотим применять ее для разных кусков текста по очереди. При этом в начале функции зададим задержку Sys.sleep, чтобы не превысить лимит по количеству обращений в минуту.

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

library(ellmer)
library(purrr)
library(DT)

Sys.setenv("MISTRAL_API_KEY" = "1vhZsUjj629Uo5sInjXvkgmzzwG97dG7")

summary <- type_array(
  type_object(
    "Извлеки из текста названия организаций и объединений и имена людей,
    названия не всегда начинаются с заглавной буквы, и не все что начинается с заглавной является названием.",
    entities = type_string("Имя человека или название организации"),
    type = type_enum(
      values = c("Человек", "Организация"),
      "Тип названия - для человека или для организации"
    )
  )
)

extraction <- function (subsample) {
  Sys.sleep(1)
  
  chat <- ellmer::chat_mistral(model = "mistral-medium-latest",
                               system_prompt = "Ты помошник, созданый для извлечения из текста имен людей и
                               названий организаций и объединений, ничего не упускай")
  
  chat$chat_structured(subsample, type = summary)
}

entities <- map_df(chunks$text, extraction, .progress = TRUE)

# Для пробы и экономии времени можно применить функцию к одному чанку, например третьему
# map_df(chunks$text[3], extraction)

DT::datatable(entities, width = "100%")

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

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

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

Подключение инструментов

Следующая проблема - языковые модели не умеют ничего полезного. Мы попробуем подключить к модели дополнительный функционал. Это можно сделать с помощью создания функций и их регистрацию в объекте чата с языковой моделью. При этом языковая модель сможет даже подставлять некоторые значения в наши функции.

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

library(ellmer)

chat_01 <- ellmer::chat_mistral(model = "mistral-large-latest",
                                system_prompt = "Ты помошник, ничего не выдумывай, отвечай кратко и по делу,
                                если чего-то не можешь то ответь прямо")

chat_01$chat("Перейди по ссылке, что в ней? https://ecotrends.ru/index.php/eco/article/view/4951")
Я не могу переходить по ссылкам. Однако, судя по URL, это статья на сайте 
**ecotrends.ru** (журнал "Экологические тренды"), вероятно, научная или 
аналитическая публикация по экологии с идентификатором **4951**.

Если нужно узнать точное содержание — откройте ссылку самостоятельно.

Теперь попробуем подключить функцию просмотра вэб страницы. Создадим новый чат, сделаем функцию переводящую содержание страницы в текст ragnar_read_document, который будем отправлять модели.

Далее, оформим функцию как инструмент для модели tool, здесь важно описать назначение функции, от формулировки зависит решение модели о реализации инструмента - модель сопоставляет похожесть запроса пользователя с описанием функции. И зарегистрируем инструмент для нашего чата register_tool.

library(ellmer)
library(ragnar)

chat_02 <- ellmer::chat_mistral(model = "mistral-large-latest")

url_surch <- function(url) {
  page <- ragnar::ragnar_read_document(url)
  ContentToolResult(page, extra = list(display = list(markdown = page, title = "Web page")))
}
  
url_surch_tool <- tool(
  fun = url_surch,
  description = "Загружает страницу по ссылке",
  arguments = list(url = type_string("Ссылка"))
)

chat_02 $register_tool(url_surch_tool)

#Можно открыть диалоговое окно с моделью прямо в сессии
#live_browser(chat_02)

chat_02$chat("Перейди по ссылке, что в ней? https://ecotrends.ru/index.php/eco/article/view/4951")
На странице представлена **научная статья** из журнала **«ЭКО»** (Том 56, № 2, 
2026), посвящённая анализу рисков, связанных с развитием индустрии 
**искусственного интеллекта (ИИ)**. Вот основные тезисы и структура статьи:

---

### **Название статьи**
**"Дилемма индустрии искусственного интеллекта: между технологическим прорывом 
и угрозами стабильности"**
Авторы: **Л.В. Матраева, Е.С. Васютина** (Российский технологический 
университет).

---

### **Ключевые темы и идеи**
1. **Анализ рисков ИИ**
   Статья систематизирует риски, которые сопровождают развитие ИИ, и выделяет 
**четыре ключевые группы угроз** для макроэкономических и социальных систем:
   - **Трансформация рынка труда** (автоматизация, исчезновение профессий, 
неравенство).
   - **Системные искажения эффективности** (ошибки алгоритмов, зависимость от 
данных, монополизация технологий).
   - **Угрозы достоверности данных** (манипуляции, фальсификации, кибератаки).
   - **Скрытые социальные последствия** (этические проблемы, потеря контроля 
над технологиями, усиление неравенства).

2. **Модель ответственного ИИ**
   Авторы предлагают **концепцию ответственного ИИ**, которая может стать 
основой для:
   - Разработки **нормативно-правовой базы** регулирования ИИ.
   - Создания **механизмов надзора** за использованием технологий.
   - Минимизации рисков и обеспечения устойчивого развития.

3. **Цифровое регулирование и этика**
   В статье подчёркивается необходимость **баланса между инновациями и 
безопасностью**, а также важность **международного сотрудничества** в области 
регулирования ИИ.

---

### **Ключевые выводы**
- ИИ способен принести **огромные экономические и социальные выгоды**, но его 
развитие сопровождается **серьёзными рисками**, которые требуют внимания со 
стороны государства, бизнеса и общества.
- **Регулирование ИИ** должно быть **гибким и адаптивным**, чтобы успевать за 
темпами технологического прогресса.
- **Этические аспекты** (прозрачность, подотчётность, справедливость) должны 
стать неотъемлемой частью разработки и внедрения ИИ-систем.

---

### **Практическая значимость**
Статья будет полезна:
- **Политикам и регуляторам** для разработки стратегий управления рисками ИИ.
- **Бизнесу** для понимания потенциальных угроз и возможностей технологий.
- **Исследователям и студентам** в области экономики, социологии и технологий.

---

### **Как получить доступ к статье**
- Статья доступна **по подписке** или за **платный доступ** (200 рублей за 
PDF).
- Ссылка на статью: 
[https://ecotrends.ru/index.php/eco/article/view/4951](https://ecotrends.ru/index.php/eco/article/view/4951).

---
Если вас интересуют конкретные разделы статьи (например, методология, выводы 
или библиография), могу помочь с их детальным анализом!

Далее, сделаем инструмент, загружающий информацию о погоде и загрязнении воздуха в Красноярске, поместим в инструмент функцию загружающую данные с сайта КНЦ СО РАН за последние сутки. При этом, настроим вывод инструмента - для пользователя и для языковой модели ContentToolResult. Модель получит таблицу с данными в текстовом формате df_schema, а пользователь сможет видеть таблицу с данными datatable. Для того, чтобы увидеть результат для пользователя запустим сессию общения с моделью live_browser.

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

library(ellmer)
library(httr)
library(data.table)
library(DT)

chat_03 <- ellmer::chat_mistral(model = "mistral-medium-latest")

krsk_air <- function() {
  api_request <- GET(
    "http://air.krasn.ru/api/2.0/data",
    query = list(
      time_begin = Sys.Date() - 1,
      time_end = Sys.Date(),
      time_interval = "day"
    ),
    accept_json()
  )
  
  api_content <- content(api_request, type = "application/json")
  
  data <- data.table::rbindlist(api_content$data, fill = TRUE)
  
  ContentToolResult(value = df_schema(data), extra = list(display = list(html = datatable(data), title = "Данные о загрязнении")))
}

krsk_air_tool <- tool(
  fun = krsk_air,
  description = "Загружает данные о загрязнении воздуха в Красноярске")

chat_03 $register_tool(krsk_air_tool)

#live_browser(chat_03)

chat_03$chat("Как сейчас с загрязнением воздуха в Красноярске? Ответь кратко, но содержательно")
В Красноярске на данный момент уровень загрязнения воздуха варьируется от 
низкого до умеренного. Индекс качества воздуха (AQI) находится в диапазоне от 
3.6 до 121. Уровень PM2.5 колеблется от 3.5 до 42.6 мкг/м³, а уровень PM10 — от
4.1 до 53.3 мкг/м³. Температура воздуха варьируется от -42.5 до 21 градуса 
Цельсия.

Может показаться, что модель сбилась при описании температуры, но это проблемма сенсоров КНЦ на момент рендера презентации - проверено.

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

Дополнение

Вообще я бы хотел доделать этот файлик, дополнив интересными примерами и описать более широкие возможности, и по прозрачнее объяснить все последовательно.

Вообще все это позволяет делать следующие вещи:

  • Анализ текстов и извлечение информации

  • Классификация текстов

  • Автоматизированная отправка однотипных запросов

  • Создание помощников, специфичных задаче

  • Включение помощников в обучающие материалы, специфичных контексту

  • Семантический анализ - через загрузку эмбидингов

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

    В общем, сегодня просто введение, потом покруче будет