Пчелы летают возле ульев в лучах закатного солнца.

Оптимизация роя с помощью агентного ИИ с использованием искусственной колонизации пчел (ABC)

Содержание

Агенты Gemini Bee для адаптивной кластеризации

Делиться

Изображение предоставлено Pixabay, общественное достояние.

Оглавление

📄Записная книжка Python
🍯Введение
🔍Пример хода поиска агента ABC
⏳Жизненный цикл агента в роевой оптимизации
🐝Три роли пчелиного агента
🪻Набор данных Iris
❄ Кластеризация – Нет меток? Не проблема!
🏋️Модель пригодности для кластеризации
🤔Матрица ошибок как диагностический инструмент
🏃Запуск цикла Agentic AI
📊Отчет о результатах
💬Разработка подсказок для агентов-близнецов
⚠️Проблемы Gemini Agentic AI
⚔️Конкурентная среда в сфере агентного ИИ до 2026 года
✨Заключение и дальнейшая работа

📄Записная книжка Python

Изучите мой интерактивный блокнот в Google Colab — и не стесняйтесь обращаться ко мне в LinkedIn с любыми вопросами или отзывами.

🍯 Введение

Учитывая невероятные инновации в области агентного ИИ, мне захотелось поучаствовать в проекте, который интегрирует подсказки LLM в рабочий процесс анализа данных. Алгоритм искусственной пчелиной колонии (ABC) вдохновлен поведением медоносных пчел при сборе нектара и замечательно работает в природе. Он принадлежит к семейству алгоритмов роевого интеллекта , разработанных для децентрализованных процессов принятия решений, в которых «пчелиные агенты» автономно преследуют свои индивидуальные цели, коллективно улучшая качество общего решения («медоносной ловушки»).

Этот популярный метод широко применяется во многих областях, в частности: планирование, маршрутизация, оптимизация энергопотребления, распределение ресурсов и обнаружение аномалий . Исследователи часто комбинируют алгоритм ABC с нейронными сетями в гибридном подходе, например, используя ABC для настройки гиперпараметров или оптимизации весов модели. Алгоритм особенно актуален, когда данных мало или когда задача носит комбинаторный характер – когда пространство решений растет экспоненциально (или даже факториально) с увеличением числа признаков.

В этом проекте я использовал подход, имитирующий алгоритм роевой оптимизации для адаптивного поиска по сетке . Креативный момент заключается в том, что я применил новые инструменты Google Agentic AI для реализации пчелиных агентов. В алгоритме ABC существует три типа автономных пчелиных агентов, и я определил их роли с помощью текстовых подсказок, созданных на основе новейших модулей Gemini LLM.

Каждый цикл поиска пищи ( итерация алгоритма ) протекает следующим образом:

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

🔍Пример хода поиска агента ABC

deacb282d16cdcdd357191044d81dc95

⏳Жизненный цикл агента в роевой оптимизации

Алгоритм ABC был впервые предложен Дервишем Карабогой в 2005 году. В моей модернизированной метаэвристической адаптации я сосредоточился на цели повышения эффективности кластеризации для неконтролируемого набора данных.

Ниже представлены реализованные мной классы на Python:

  1. WebResearcher : Отвечает за исследование и обобщение алгоритмов кластеризации scikit-learn и их ключевых гиперпараметров. Собранная информация имеет решающее значение для генерации точных и эффективных подсказок для пчелиных агентов, и этот класс реализован как агент на основе LLM.
  2. ScoutBeeAgent : Генерирует разнообразные исходные варианты кластеризации для набора данных Iris, используя сводные данные о параметрах, предоставленные WebResearcher.
  3. EmployedBeeAgent : Уточняет существующие варианты решений, исследуя локальные области параметров и используя данные WebResearcher для внесения обоснованных корректировок.
  4. OnlookerBeeAgent : Оценивает сгенерированные и уточненные кандидаты, выбирая наиболее перспективные для дальнейшей итерации.
  5. Runner : Координирует общий цикл оптимизации ABC, организуя и координируя поток агентов Gemini AI. Он управляет последовательностью действий между различными агентами-пчелами и отслеживает общий прогресс. В то время как Runner обеспечивает структуру и контроль, каждый агент-пчела работает полностью распределенным и автономным образом, независимо выполняя свои специализированные задачи без централизованного управления.
  6. FitnessModel : Оценивает качество каждого варианта решения с использованием скорректированного индекса Рэнда (ARI) с целью минимизации значения 1 – ARI для достижения лучших результатов кластеризации.
  7. Программа Reporter : визуализирует сходимость наилучших значений ARI на протяжении итераций и сравнивает наиболее эффективные решения с базовыми моделями кластеризации.

🐝Три роли пчелиного агента

Агенты определяют значения параметров и диапазоны с помощью подсказок на естественном языке, предоставляемых генеративной модели ИИ Gemini. Все три агента наследуют от базового класса BeeAgent, который обрабатывает общую настройку и отслеживание кандидатов. Часть каждой подсказки формируется на основе WebResearcher, который обобщает алгоритмы кластеризации scikit-learn и их ключевые гиперпараметры для обеспечения точности и релевантности. Вот как работает каждый агент:

  • 🐝 ScoutBeeAgent (Генерация начальных параметров): Создает подсказки, позволяющие LLM проявить некоторую креативность в рамках заданных ограничений. Параметр allowed_algorithms определяет, какие модели следует рассматривать из популярных алгоритмов кластеризации в scikit-learn. Модель Gemini интерпретирует эти инструкции и генерирует разнообразные варианты решений, обеспечивая отсутствие дубликатов и сбалансированное распределение по алгоритмам.
  • 🐝 EmployedBeeAgent (Уточнение параметров): Генерирует подсказки с инструкциями по уточнению, направляя LLM на корректировку параметров примерно на ±10–20%, оставаясь в допустимых диапазонах и избегая создания неподдерживаемых параметров. Он берет текущие решения и применяет эти правила для создания слегка измененных (уточненных) вариантов в локальной окрестности существующего пространства параметров.
  • 🐝 OnlookerBeeAgent (Оценка и отбор): генерирует подсказки, оценивающие кандидатов, сгенерированных и уточненных другими агентами. Используя показатель пригодности, основанный на скорректированном индексе Рэнда (ARI), он выбирает k наиболее перспективных решений, поддерживает разнообразие алгоритма и избегает дубликатов. Это усиливает ориентацию колонии на наиболее сильных кандидатов.

По сути, код на Python определяет цель задачи, параметры, ограничения и возвращаемые значения в виде текста в подсказках. Затем генеративная модель ИИ (Gemini) «читает» и «понимает» эти инструкции, чтобы получить или изменить фактические числовые и категориальные значения параметров для алгоритмов кластеризации. Различные модели LLM могут по-разному реагировать на незначительные изменения во входном тексте, поэтому важно поэкспериментировать с формулировкой подсказок для трех классов агентов. Для дальнейшего уточнения формулировки вы всегда можете обратиться к предпочитаемой вами модели LLM.

🪻Набор данных Iris

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

Набор данных Iris (лицензия: CC0 1.0) содержит 150 размеченных образцов, каждый из которых принадлежит к одному из 3 классов ирисов : Iris Setosa, Iris Versicolor, Iris Virginica. Каждому образцу цветка соответствует 4 числовых признака : длина чашелистика, ширина чашелистика, длина лепестка, ширина лепестка.

12e7302f34498fda97cc520cc2c984e4
4e8dfa1f0e93b8b84ae3a4601b3d87d6
5e732442668f7f0002c709ae88f194c5

Как показано на графиках попарных взаимосвязей и графиках важности признаков на основе взаимной информации, длина и ширина лепестков являются наиболее информативными признаками при сравнении с целевыми метками набора данных Iris.

Взаимная информация (MI) вычисляется для каждого признака отдельно относительно меток, тогда как скорректированный индекс Рэнда (ARI) , используемый в этом проекте для оценки пригодности, измеряет соответствие между двумя разделами (предполагаемые метки кластеров и истинные метки). Следует отметить, что даже если применяется отбор признаков, поскольку ирисы разноцветные и ирисы виргинские имеют схожие длину и ширину лепестков, их кластеры перекрываются в пространстве признаков. В результате ARI может быть высоким, но не может достичь идеального значения 1,0.

❄ Кластеризация – Нет меток? Не проблема!

Алгоритмы кластеризации являются краеугольным камнем обучения без учителя , поэтому я решил сосредоточиться на цели слепого определения классов цветов, основываясь исключительно на их характеристиках. Другими словами, модель не обучалась на метках цветов; эти метки использовались только для проверки показателей производительности. Традиционные алгоритмы кластеризации, такие как KMeans или DBSCAN, часто испытывают проблемы с чувствительностью к параметрам и изменчивостью набора данных. Поэтому метаэвристический алгоритм, такой как ABC, который уравновешивает исследование и использование , представляется многообещающим.

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

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

836e0010ab68f07866472e065bd90ed5

В классическом наборе данных Iris два наиболее похожих вида — versicolor и virginica — часто представляют собой проблему для алгоритмов кластеризации. Многие методы ошибочно объединяют их в один кластер, рассматривая их как одну непрерывную плотную область. В отличие от них, более обособленный вид setosa неизменно определяется как отдельный кластер.

Таблица, сравнивающая несколько популярных алгоритмов кластеризации, доступных в библиотеке scikit-learn :

Алгоритм Краткое содержание Ключевые гиперпараметры Эффективность Точность
KMeans Метод основан на центроидах, разделяет данные на k сферических кластеров; простой и быстрый. n_clusters, init, n_init, max_iter, random_state, tol Быстро работает со средними и большими наборами данных; хорошо масштабируется; выигрывает от многократных перезапусков. Высокая эффективность для хорошо разделенных выпуклых кластеров; низкая эффективность для невыпуклых кластеров или кластеров с различной плотностью.
DBSCAN Метод, основанный на плотности, находит кластеры произвольной формы и помечает шум без необходимости использования k. eps, min_samples, metric, leaf_size Умеренная производительность; медленнее в многомерном пространстве; эффективна при использовании пространственного индексирования. Отлично подходит для неровных форм и шума; чувствителен к электростатическому заряду и различиям в плотности.
Агломеративный (иерархический) Строит дендрограмму путем итеративного слияния кластеров; фиксированное значение k отсутствует до момента отсечения. n_clusters, affinity, linkage, distance_threshold Более медленный (часто O(n²)); ресурсоемкий с точки зрения памяти при больших n. Эффективное структурное исследование; выбор связей влияет на результаты; обработка несферических кластеров.
Модели гауссовых смесей (GMM) Вероятностная смесь гауссовых распределений с использованием EM-метода (оптимизация ожидания); мягкие присвоения. n_components, covariance_type, tol, max_iter, n_init, random_state Умеренный уровень сложности; метод EM может быть дорогостоящим при полной ковариации. Высокий уровень значимости при близких к гауссовым распределениях данных; гибкая форма; риск переобучения без ограничений.
Спектральная кластеризация Графовый метод; перед кластеризацией (часто KMeans) данные встраиваются с помощью собственных векторов. n_clusters, assign_labels, n_neighbors, random_state, affinity Медленно работает при больших n из-за разложения на собственные значения; лучше всего подходит для небольших и средних наборов данных. Отлично подходит для многообразных/сложных структур; качество зависит от построения графа и его сходства.
MeanShift Поиск моды с помощью плотности ядра; нет необходимости предварительно определять k. bandwidth, cluster_all, max_iter, n_jobs Медленный, дорогой, с множеством функций/возможностей. Подходит для обнаружения кластерных режимов; производительность в значительной степени зависит от выбора полосы пропускания.

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

Алгоритм K-средних — один из наиболее широко используемых алгоритмов кластеризации, ценимый за свою простоту и эффективность. Ввиду его распространенности, я опишу его здесь более подробно как показательный пример того, как обычно выполняется кластеризация. Его популярность обусловлена простотой и эффективностью, хотя у него есть и ограничения. Ключевым недостатком является то, что количество кластеров k должно быть задано заранее.

Как работает алгоритм K-средних

  1. Инициализация центроидов:
    Выберите k начальных центроидов либо случайным образом, либо с помощью более эффективных стратегий, таких как K-Means++, которые распределяют их для улучшения качества кластеризации.
  2. Присвоить точки кластерам:
    Представьте каждую точку данных в виде n-мерного вектора, где каждая компонента соответствует одному признаку. Присвойте точкам местоположение ближайшего центроида, используя метрику расстояния (обычно евклидову). В многомерных пространствах этот шаг усложняется «проклятием размерности», из-за которого расстояния теряют свою дискриминационную способность.
  3. Обновите центроиды и повторите:
    Пересчитайте каждый центроид как среднее значение всех точек в его кластере, затем переназначьте точки ближайшему центроиду. Повторяйте до тех пор, пока назначения не стабилизируются — это и есть сходимость.

Практические соображения

  • Проклятие размерности : в очень больших размерностях метрики расстояния становятся менее эффективными, что снижает надежность кластеризации.
  • Снижение размерности : Для упрощения пространства признаков и улучшения результатов перед алгоритмом K-средних часто применяются такие методы, как PCA или t-SNE .
  • Выбор K : Такие методы, как метод «локтя» , оценка силуэта или метаэвристические алгоритмы (например, оптимизация ABC), помогают оценить оптимальное количество кластеров.

🏋️Модель пригодности для кластеризации

Модель FitnessModel оценивает варианты кластеризации на наборе данных. Цель хорошего алгоритма кластеризации — создать кластеры, которые в идеале точно соответствуют истинным классам, но обычно это не идеальное совпадение. ARI (скорректированный индекс Рэнда) используется для измерения сходства между двумя кластеризациями (предполагаемой и истинной) — это широко используемая метрика для оценки эффективности кластеризации, поскольку она корректирует случайное совпадение, работает с различными алгоритмами кластеризации и предоставляет четкую шкалу от −1 до +1, которую легко интерпретировать.

Диапазон ARI Значение Типичный частный случай
+1.0 Идеальное соглашение Предсказанная кластеризация точно соответствует истинным меткам.
≈ 0,0 Случайная кластеризация (уровень вероятности) – Распределение точек происходит случайным образом. Все точки принудительно объединяются в один кластер (если только истинные значения также не относятся к одному кластеру).
< 0.0 Хуже, чем случайность – Систематическое несоответствие (кластеры постоянно не совпадают или перевернуты) – Каждая точка представляет собой отдельный кластер, когда истинные значения отличаются.
Низкое/отрицательное значение (близкое к −1) Сильное несогласие Крайний дисбаланс или неправильная маркировка кластеров.

Показатель пригодности равен 1 – ARI, поэтому чем ниже значение пригодности, тем лучше. Это позволяет алгоритму ABC напрямую оптимизировать качество кластеризации. Ниже показан пример запуска начальных итераций алгоритма ABC с агентами Gemini, который я разработал, включая предварительный просмотр необработанных текстов ответов LLM. Обратите внимание, как модель GMM ( Gaussian Mixture Models) неуклонно улучшается по мере выбора новых кандидатов на каждой итерации различными агентами-пчелами. Для просмотра логов других итераций обратитесь к блокноту Google Colab.

Запуск алгоритма ABC с использованием модели пригодности для набора данных: Iris. Признаки: 4, Классы: 3. Базовые модели (ARI): {'DBSCAN': 0.6309344087637648, 'KMeans': 0.6201351808870379, 'Agglomerative': 0.6153229932145449, 'GMM': 0.5164585360868599, 'Spectral': 0.6451422031981431, 'MeanShift': 0.5681159420289855}. Runner: Инициализация агента Scout для получения начальных решений… Scout: Генерация начальных решений-кандидатов… Scout: Отправка запроса модели Gemini… n_candidates=12 Scout: Получен ответ от модели Gemini. Scout: Исходный текст ответа: «`json[{«model»:»KMeans»,»params»:{«n_clusters»:3,»init»:»k-means++»,»n_init»:10,»random_state»:42}},{«model»:»KMeans»,»params»:{«n_clusters»:4,»init»:»random»,»n_init»:10,»random_state»:42}},{«model»:»KMeans»,»params»:{«n_clusters»:5,»init»:»k-mean… Scout: Сгенерированы начальные кандидаты. Runner: Агент Scout вернул 12 начальных решений. Runner: Начало итерации 1/8… Runner: Агенты завершили действия для итерации 1. — Подробности итерации 1 — Кандидат GMM 1 (Источник: Scout-10010): Лучший предыдущий ARI=0.820, Текущий ARI=0.820, Параметры: {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 100, 'random_state': 42} Кандидат KMeans 2 (Источник: Scout-10000): Лучший предыдущий ARI=0.620, Текущий ARI=0.620, Параметры: {'n_clusters': 3, 'init': 'k-means++', 'n_init': 10, 'random_state': 42} Кандидат DBSCAN 3 (Источник: Scout-10004): Лучший предыдущий ARI=0.550, Текущий ARI=0.550, Параметры: {'eps': 0.7, 'min_samples': 4} Кандидат GMM 4 (Источник: Scout-10009): Лучший предыдущий ARI = 0,820, Текущий ARI = 0,516, Параметры: {'n_components': 3, 'covariance_type': 'full', 'max_iter': 100, 'random_state': 42} Кандидат KMeans 5 (Источник: Scout-10001): Лучший предыдущий ARI = 0,620, Текущий ARI = 0,462, Параметры: {'n_clusters': 4, 'init': 'random', 'n_init': 10, 'random_state': 42} Кандидат DBSCAN 6 (Источник: Scout-10003): Лучший предыдущий ARI = 0,550, Текущий ARI = 0,442, Параметры: {'eps': 0,5, 'min_samples': 5} Кандидат KMeans 7 (Источник: Scout-10002): Лучший предыдущий ARI=0.620, Текущий ARI=0.435, Параметры: {'n_clusters': 5, 'init': 'k-means++', 'n_init': 5, 'random_state': 42} Кандидат DBSCAN 8 (Источник: Scout-10005): Лучший предыдущий ARI=0.550, Текущий ARI=0.234, Параметры: {'eps': 0.4, 'min_samples': 6} *** Лучший глобальный результат на данный момент: ARI=0.820, Кандидат={'model': 'GMM', 'params': {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 100, 'random_state': 42}, 'origin_agent': 'Scout-10010', 'current_ari_for_display': 0.8202989638185834} —————————— Runner: Начало итерации 2/8… Scout Генерация начальных решений-кандидатов… Scout: Отправка запроса модели Gemini… n_candidates=12 Employed Уточнение текущих решений… Employed: Отправка запроса модели Gemini… n_variants=12 Onlooker Оценка кандидатов и выбор перспективных… Onlooker: Отправка запроса модели Gemini… top_k=5 Scout: Получен ответ от модели Gemini. Scout: Текст ответа: «`json[{«model»:»KMeans»,»params»:{«n_clusters»:3,»init»:»k-means++»,»n_init»:10,»random_state»:42}},{«model»:»KMeans»,»params»:{«n_clusters»:4,»init»:»random»,»n_init»:10,»random_state»:42}},{«model»:»KMeans»,»params»:{«n_clusters»:5,»init»:»k-mean… Scout: Сгенерированы начальные кандидаты. Employed: Получен ответ от модели Gemini. Используемый: Исходный текст ответа: «`json[{«model»:»GMM»,»params»:{«n_components»:5,»covariance_type»:»tied»,»max_iter»:100,»random_state»:42}},{«model»:»GMM»,»params»:{«n_components»:3,»covariance_type»:»full»,»max_iter»:100,»random_state»:42}},{«model»:»KMeans»,»params»:{«n_cluster… Используемый: Решения уточнены. Наблюдатель: Получен ответ от модели Gemini. Наблюдатель: Исходный текст ответа: «`json[{«model»:»GMM»,»params»:{«n_components»:4,»covariance_type»:»tied»,»max_iter»:100,»random_state»:42}},{«model»:»KMeans»,»params»:{«n_clusters»:3,»init»:»k-means++»,»n_init»:10,»random_state»:42}},{«model»:»DBSCAN»,»params»:{«eps»:0.7,»min_sam… Наблюдатель: Выбраны перспективные кандидаты. Участник: Агенты выполнили действия для итерации 2. — Подробности итерации 2 — Кандидат GMM 1 (Источник: Scout-10022): Лучший предыдущий ARI=0.820, Текущий ARI=0.820, Параметры: {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 100, 'random_state': 42} Кандидат GMM 2 (Источник: Scout-10010): Лучший предыдущий ARI=0.820, Текущий ARI=0.820, Параметры: {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 100, 'random_state': 42} Кандидат GMM 3 (Источник: Onlooker-30000): Лучший предыдущий ARI=0.820, Текущий ARI=0.820, Параметры: {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 100, 'random_state': 42} Кандидат GMM 4 (Источник: Employed-20007): Лучший предыдущий ARI=0.820, Текущий ARI=0.820, Параметры: {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 80, 'random_state': 42} Кандидат GMM 5 (Источник: Employed-20006): Лучший предыдущий ARI=0.820, Текущий ARI=0.820, Параметры: {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 120, 'random_state': 42} Кандидат GMM 6 (Источник: Employed-20000): Лучший предыдущий ARI=0.820, Текущий ARI=0.693, Параметры: {'n_components': 5, 'covariance_type': 'tied', 'max_iter': 100, 'random_state': 42} Кандидат KMeans 7 (Источник: Scout-10012): Лучший предыдущий ARI=0.620, Текущий ARI=0.620, Параметры: {'n_clusters': 3, 'init': 'k-means++', 'n_init': 10, 'random_state': 42} Кандидат KMeans 8 (Источник: Scout-10000): Лучший предыдущий ARI=0.620, Текущий ARI=0.620, Параметры: {'n_clusters': 3, 'init': 'k-means++', 'n_init': 10, 'random_state': 42} *** Лучший глобальный результат на данный момент: ARI=0.820, Кандидат={'model': 'GMM', 'params': {'n_components': 4, 'covariance_type': 'tied', 'max_iter': 100, 'random_state': 42}, 'origin_agent': 'Scout-10010', 'current_ari_for_display': 0.8202989638185834}

2e68af0b508d8988faf8215bb871bea4

🤔Матрица ошибок как диагностический инструмент

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

В наборе данных Iris библиотека scikit-learn кодирует виды в фиксированном порядке:

0 = Сетоза, 1 = Версиколор, 2 = Вирджиния .

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

[[ 0 6 44 0]
[ 2 0 0 48]
[49 0 0 1 ]
[ 0 0 0 0 ]]

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

Построчная интерпретация (идентификаторы строк и столбцов начинаются с 0)

  • Строка 0: [ 0 6 44 0]
    Класс Setosa → Его образцы попадают только в столбцы 1 и 2, не пересекаясь с Versicolor или Virginica. Эти два столбца следовало бы рассматривать как единый кластер, соответствующий классу Setosa.
  • Строка 1: [ 2 0 0 48]
    Класс Versicolor → Разделение между столбцами 0 и 3 показывает, что алгоритм не смог четко выделить класс Versicolor.
  • Строка 2: [49 0 0 1]
    Класс Virginica → Также разделен между столбцами 0 и 3, перекрываясь с Versicolor, а не образуя отдельный кластер.
  • Строка 3: [ 0 0 0 0]
    Дополнительный ошибочный кластер → Здесь нет истинных образцов, что отражает тот факт, что алгоритм создал 4 кластера для набора данных, содержащего всего 3 класса.

📌Матрица ошибок показывает, что Setosa является отдельным видом (его кластеры не перекрываются с другими видами), в то время как Versicolor и Virginica не разделены четко — оба вида распределены по одним и тем же двум кластерам (столбцы 0 и 3). Это перекрытие подчеркивает сложность алгоритма в их различении. Матрица ошибок делает эти ошибки классификации видимыми таким образом, как это не может сделать один показатель ARI.

🏃Запуск цикла Agentic AI

Бегун организует итерации:

  1. Пчелы-разведчицы предлагают разнообразные решения.
  2. Рабочие пчёлы их перерабатывают.
  3. Пчелы-наблюдатели выбирают наиболее перспективные экземпляры.
  4. Список решений обновлен.
  5. Наилучший ARI для каждой итерации отслеживается.

В классе Runner и во всем алгоритме искусственной пчелиной колонии (ABC) кандидат обозначает конкретную модель кластеризации вместе с заданными параметрами. В приведенном ниже примере из пула решений возвращаются два кандидата.

Процесс отбора кандидатов осуществляется с помощью класса Python concurrent.futures.ThreadPoolExecutor , который обеспечивает параллельное выполнение. В результате объекты ScoutAgent , EmployedBeeAgent и OnlookerBeeAgent выполняются асинхронно в отдельных потоках на каждой итерации алгоритма.

Метод runner.run() возвращает два объекта:

solution_pool: Это список наиболее перспективных кандидатов размером pool_size (каждый из которых представляет собой словарь, содержащий модель и ее параметры), найденных на всех итерациях. Этот список отсортирован по показателю пригодности (ARI), поэтому самый первый элемент, solution_pool[0], будет представлять собой наиболее подходящую модель и ее конкретные параметры, обнаруженные алгоритмом ABC.

best_history: Это список, отслеживающий только лучшие показатели скорректированного индекса рэнда.

Например:

solution_pool = [ { «model»: «KMeans», «params»: {«n_clusters»: 3, «init»: «k-means++»}, «origin_agent»: «Employed», «current_ari_for_display»: 0.742 }, { «model»: «AgglomerativeClustering», «params»: {«n_clusters»: 3, «linkage»: «ward»}, «origin_agent»: «Onlooker», «current_ari_for_display»: 0.715 } ] best_history = [ {«ari»: 0.642, «model»: «KMeans», «params»: {«n_clusters»: 3, «init»: «random»}}, {«ari»: 0.742, «model»: «KMeans», «params»: {«n_clusters»: 3, «init»: «k-means++»}} ]

Настройка пула решений с помощью ThreadPoolExecutor

ThreadPoolExecutor(): Инициализирует пул рабочих потоков, которые могут выполнять задачи одновременно.

ex.submit(…): Отправляет метод действия каждого агента в пул потоков как отдельную задачу.

from concurrent.futures import ThreadPoolExecutor import copy # … внутри Runner.run() … for it in range(iterations): print(f»Runner: Starting iteration {it+1}/{iterations}…») if it == 0: results = [] else: # Используйте потоки вместо процессов с ThreadPoolExecutor(), как в примере: futures = [ ex.submit(self.scout.act), ex.submit(self.employed.act, solution_pool), ex.submit(self.onlooker.act, solution_pool) ] results = [f.result() for f in futures] print(f»Runner: Agents completed actions for iteration {it+1}.») # … остальная часть цикла без изменений …

Метод `act` каждого агента отправляется в пул потоков, что позволяет им выполняться параллельно. Вызов `f.result()` гарантирует, что исполнитель дождется завершения всех задач, прежде чем двигаться дальше.

Данная конструкция позволяет достичь двух целей:

  1. Параллельное выполнение в рамках итерации — агенты действуют одновременно, имитируя поведение настоящей пчелиной колонии.
  2. Управление последовательной итерацией — Бегун продвигается вперед только после того, как все агенты завершат свою работу, что обеспечивает упорядоченность и детерминированность всего цикла.

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

Настройка пула решений с помощью ProcessPoolExecutor

Хотя ThreadPoolExecutor обеспечивает параллелизм за счет потоков, его можно легко заменить на ProcessPoolExecutor для достижения истинного параллельного выполнения на ЦП .

С помощью ProcessPoolExecutor каждый агент работает в отдельном процессе , что обходит блокировку глобального интерпретатора ( GIL ) Python. GIL — это мьютекс (блокировка взаимного исключения), который гарантирует, что только один поток выполняет байт-код Python одновременно, даже в многоядерных системах. Использование процессов вместо потоков позволяет в полной мере использовать ресурсы нескольких ядер ЦП для ресурсоемких вычислительных задач, обеспечивая подлинный параллелизм и улучшенную производительность.

from concurrent.futures import ProcessPoolExecutor import copy # … внутри Runner.run() … for it in range(iterations): print(f»Runner: Starting iteration {it+1}/{iterations}…») if it == 0: results = [] else: # Используйте процессы вместо потоков с ProcessPoolExecutor() как ex: futures = [ ex.submit(self.scout.act), ex.submit(self.employed.act, solution_pool), ex.submit(self.onlooker.act, solution_pool) ] results = [f.result() for f in futures] print(f»Runner: Agents completed actions for iteration {it+1}.») # … остальная часть цикла без изменений …

Основные различия между ProcessPoolExecutor и ThreadPoolExecutor

  • ProcessPoolExecutor запускает отдельные процессы Python , а не потоки.
  • Каждый агент работает независимо на отдельном ядре центрального процессора.
  • Это позволяет избежать GIL (Global Inclusion Interaction), поэтому задачи, сильно зависящие от ЦП (такие как кластеризация, оценка пригодности, численная оптимизация), действительно выполняются параллельно. Задача, сильно зависящая от ЦП, — это любое вычисление, где ограничивающим фактором является скорость процессора, а не ожидание ввода/вывода (I/O).
  • Поскольку процессы работают в отдельных областях памяти, они не могут напрямую обмениваться объектами. Вместо этого все, что передается между ними, должно быть сериализовано (записано в сериализованный формат, например, pickle). Простые объекты Python, такие как словари, списки, строки и числа, можно сериализовать, поэтому можно безопасно обмениваться словарями-кандидатами.

📌 Главный вывод:

✅ Используйте ProcessPoolExecutor, если ваши агенты выполняют ресурсоемкие вычисления (матричные операции, кластеризация, обучение машинного обучения).

❌ Используйте ThreadPoolExecutor, если ваши агенты в основном работают с операциями ввода-вывода (ожидание данных, сети, диска).

Почему некоторые из значений параметров-кандидатов повторяются в разных итерациях?

Повторение значений параметров-кандидатов на разных итерациях является естественным следствием работы алгоритма искусственной пчелиной колонии и взаимодействия агентов:

Исследование агента ScoutBee : Задача агента ScoutBeeAgent — генерировать новые и разнообразные варианты решений. Хотя он стремится к разнообразию, при ограниченном пространстве параметров или если генеративная модель обнаруживает, что определенные комбинации параметров неизменно эффективны, он может предлагать похожие решения в разных итерациях.

Использование возможностей агента EmployedBeeAgent: EmployedBeeAgent совершенствует существующие перспективные решения. Если решение уже очень хорошее или близко к оптимальной конфигурации, исследование «локального окружения» (например, корректировка параметров на ±10-20%) может привести к тем же или очень похожим значениям параметров, особенно после округления или если корректировки параметров незначительны.

Выбор агента OnlookerBee: OnlookerBeeAgent выбирает k наиболее перспективных решений из большего набора кандидатов (который включает в себя недавно найденные, уточненные с помощью работающих алгоритмов и ранее перспективные решения). Если алгоритм сходится или если несколько различных решений дают очень похожие высокие оценки пригодности, OnlookerBeeAgent может неоднократно выбирать наборы параметров, которые фактически идентичны от одной итерации к другой.

Управление пулом решений: Программа Runner поддерживает пул решений фиксированного размера. Она сортирует этот пул по пригодности и сохраняет лучшие решения. Если лучшие решения остаются неизменными или если новые хорошие решения идентичны предыдущим, эти наборы параметров сохраняются и, следовательно, «повторяются» в деталях итерации.

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

📊Отчет о результатах

Сравнительный анализ стандартных алгоритмов кластеризации

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

  • KMeans
  • DBSCAN
  • Агломеративная кластеризация
  • Модели гауссовых смесей (GMM)
  • Спектральная кластеризация
  • MeanShift

Как показано в блокноте Google Colab, агенты ABC обнаружили наборы параметров, которые значительно улучшили скорректированный индекс Рэнда (ARI), уменьшив количество ошибок классификации между близкородственными классами Versicolor и Virginica.

Результаты работы репортера

Класс Reporter отвечает за генерацию окончательных результатов оценки после выполнения оптимизации с помощью алгоритма искусственной пчелиной колонии (ABC). Он выполняет три основные функции:

  1. Таблица сравнения
    • Сравнивает скорректированный индекс Рэнда (ARI) каждого предлагаемого решения с базовыми моделями кластеризации.
    • Сообщает об улучшении (candidate_ari – baseline_ari).
  2. Отображение матрицы ошибок
    • Выводит матрицу ошибок лучшего варианта решения, демонстрирующую эффективность на уровне классов и количество ошибок классификации.
  3. Визуализация сходимости
  • Отображает динамику изменения наилучшего значения ARI на протяжении итераций.
  • Добавляет к графику названия моделей и параметры для каждой итерации.

💬Разработка подсказок для агентов-близнецов

Для обеспечения структурированного подхода я решил разработать для каждого агента подсказку, используя следующий шаблон:

Цель задачи: Чего должен достичь агент.

Параметры : Входные данные, такие как название набора данных, количество кандидатов на определенный тип агента, разрешенные алгоритмы и словарь входных гиперпараметров, возвращаемый WebResearcher через его запрос LLM.

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

Возвращаемые значения: JSON-список возможных решений.

Для обеспечения детерминированного поведения LLM я использовал следующий generation_config. В частности, обратите внимание, что указание температуры, равной нулю, не оставляет модели места для творчества между запросами и просто повторяет предыдущий ответ.

generation_config={ «temperature»: 0.0, «top_p»: 1.0, «top_k»: 1, «max_output_tokens»: 4096 } res = genai_model.generate_content(prompt, generation_config=generation_config)

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

⚠️ Проблемы с Gemini Agentic AI

Типы моделей искусственного интеллекта Gemini

  • Lite (Flash‑Lite): Приоритет — скорость и экономичность. Идеально подходит для выполнения больших объемов задач, таких как перевод или классификация.
  • Flash: Хорошо подходит для производственных задач, требующих масштабируемости и умеренной логики.
  • Pro: Флагманский уровень – лучше всего подходит для сложных логических рассуждений, понимания мультимодальных данных (текст, изображения, аудио, видео) и задач, связанных с агентным ИИ.

Почему одних только подсказок недостаточно в облегченных моделях?

Я столкнулся с распространенным ограничением моделей «Lite»:
Модели с низким уровнем детализации (LLM) не всегда надежно выполняют инструкции типа «всегда включайте эти параметры» только потому, что вы указали их в запросе. На сегодняшний день модели часто возвращаются к значениям по умолчанию или минимальным наборам, если после генерации не обеспечивается соблюдение структуры. Почему явный запрос все равно не сработал:

  • Инструкции на естественном языке представляют собой слабые ограничения. Даже фраза «всегда включайте именно эти параметры» интерпретируется вероятностно.
  • Отсутствует принудительное соблюдение схемы. При разборе JSON необходимо проверять наличие обязательных ключей.
  • Дедупликация устраняет дубликаты, а не пробелы. Она исключает идентичные варианты, но не восстанавливает отсутствующие параметры.

📌 Главный вывод: Одних подсказок недостаточно для обеспечения соответствия требованиям. Для того чтобы выходные данные постоянно содержали необходимые параметры, необходимы подсказки и контроль схемы .

Оперативное решение вопросов соответствия требованиям и разработка схем.

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

  • Пример инструкции: «Возвращаемые значения: выводите ТОЛЬКО словарь в формате JSON. Длина возвращаемой строки не должна превышать 1024 символа».
  • Наблюдаемый результат: len(res_text) = 1036 – количество ответов превысило лимит.
  • Отсутствующие поля: Обязательные поля иногда не отображались, даже если были четко указаны. Предоставление конкретных примеров результатов улучшило соблюдение требований.
  • Практическое решение: объединить запросы с обеспечением соблюдения схемы (например, проверка обязательных ключей, проверка длины) и нормализацией после генерации для гарантирования структуры.

Ошибки пустых кандидатов в API Gemini

Иногда я получал такой ответ:

>> ScoutAgent: Ошибка при вызове API (попытка 1/3): Недопустимая операция: Быстрый доступ response.text требует, чтобы ответ содержал допустимую часть, но она не была возвращена. finish_reason кандидата равен 2.

Это сообщение об ошибке означает, что модель фактически не вернула никакого полезного контента в своем ответе, поэтому, когда мой код попытался получить доступ к response.text, не было допустимой «Части» для чтения. Ключевая подсказка — finish_reason = 2 , что в API Google соответствует СТОП или состоянию отсутствия сгенерированного контента (модель завершила работу, не создав текст).

Почему это происходит:

  • Пустой кандидат: вызов API прошел успешно, но модель не выдала никакого результата.
  • FinishReason = 2: Указывает, что генерация остановилась до получения корректной детали.
  • Быстрая ошибка доступа: Поскольку response.text ожидает как минимум одну допустимую текстовую часть, он выдает ошибку, если таковых нет.

Как с этим справиться:

  • Перед обращением к response.text проверьте finish_reason. Читайте текст только в том случае, если кандидат содержит допустимую часть.
  • Добавьте резервную логику: если текст не возвращается, запишите причину завершения и повторите попытку или обработайте проблему корректно.
  • Проверка соответствия схеме: Перед анализом проверьте наличие обязательных полей в ответе.

📌 Главный вывод: это не ошибка сети — модель сигнализирует о том, что процесс остановился, не сгенерировав текст. Полный список значений FinishReason и рекомендации по их интерпретации можно найти в документации Google: Generate Content API – FinishReason.

Периодические ошибки подключения к API.

В отдельных случаях вызов API Gemini завершался с ошибкой:

  • Ошибка: ConnectionError: ('Соединение прервано.', RemoteDisconnected('Удаленный сервер закрыл соединение без ответа'))

📌 Главный вывод: Это сетевая ошибка, возникшая без изменений в коде, что указывает на временные проблемы с сетью или сервисом. Добавьте повторные попытки с экспоненциальной задержкой, таймаутами и надежным логированием для сбора контекста (размер запроса, ограничения скорости, причина завершения) и обеспечения корректного восстановления.

Вопросы безопасности агентов

Ещё один важный момент, особенно если вы используете агенты в корпоративных целях: безопасность имеет первостепенное значение!

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

📌 Главный вывод: Примените принцип наименьших привилегий.

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

⚔️Конкурентная среда в сфере агентного ИИ до 2026 года

Поставщики моделей

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

Поставщик Основной фокус Сильные стороны Примечания
API Google Gemini Мультимодальный сервис LLM (текст, изображение, код и т. д.) Высококачественные результаты генеративной обработки; интеграция с Google Cloud; мощные мультимодальные возможности. Gemini 3 — это, в первую очередь, API-интерфейс для работы с моделями, специально разработанный для поддержки оркестрации рабочих процессов агентов.
API OpenAI GPT Генерация текста и кода Широко распространен; развитая экосистема; возможности тонкой настройки. Ограниченная поддержка мультимодальных сетей по сравнению с Gemini.
Антропический Клод Тексты магистратуры по направлению «Безопасность» Надежные функции выравнивания и безопасности; обработка длительного контекста. Меньшая возможность мультимодального использования
Mistral AI Открытые и корпоративные модели Гибкое развертывание; разработка на основе сообщества; возможность индивидуальной настройки. Требуется настройка инфраструктуры.
Мета ЛЛаМА Модели исследований с открытым весом Открытый исходный код; мощная исследовательская база; возможность индивидуальной настройки. Требуется инфраструктура и операционная поддержка для производства.
Когере Корпоративная обработка естественного языка и эмбеддинги Функции для корпоративных пользователей; встраивание; параметры конфиденциальности. Более узкая область применения, чем у обычных программ магистратуры в области права.

Фреймворки оркестрации агентов

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

Рамки Основной фокус Сильные стороны Примечания
LangGraph оркестровка на основе графов Моделирует рабочие процессы как узлы/ребра; обладает большим объемом памяти; обеспечивает взаимодействие нескольких агентов. Требуется настройка разработчиком; только для оркестровки.
LangChain оркестрация агентов/рабочих процессов Развитая экосистема; интеграция инструментов; обработка памяти/состояния. Может привести к увеличению использования токенов и повышению их сложности.
CrewAI Организация работы экипажа на основе ролей Специализация ролей; модели сотрудничества; подходит для командной работы. Зависит от внешних LLM.
OpenAI Swarm Легковесная многоагентная оркестрация Простая передача информации; эргономичные процедуры. Подходит для проведения экспериментов.
AutoGen (Microsoft) Многоагентная структура Ориентация на исследования и производство; возможность расширения. Система всё ещё находится в стадии разработки; требует наличия экосистемы Microsoft.
AutoGPT Прототип автономного агента Быстрое прототипирование; разработка, ориентированная на сообщество. Различная готовность к производству

✨Заключение и дальнейшая работа

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

Дальнейшая работа

  • Применение метаэвристики ABC к более крупным и разнообразным наборам данных.
  • Расширение возможностей агента WebResearcher для автоматического создания наборов данных из источников, специфичных для конкретной предметной области (например, Королевские ботанические сады Кью – POWO), вдохновленное новаторской работой сэра Рональда Фишера в области статистической ботаники.
  • Проведение экспериментов с расширенным пулом рабочих потоков и корректировка количества кандидатов для каждого типа пчелиных агентов.
  • Исследование полуконтролируемой кластеризации, в которой небольшой размеченный набор данных дополняет более крупный неразмеченный набор.
  • Сравнение результатов, полученных с помощью API Gemini от Google, с результатами, полученными с помощью API других поставщиков.

Источник: towardsdatascience.com

✅ Найденные теги: ABC, Агентный ИИ, Искусственная Колонизация, новости, Оптимизация, Пчелы

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

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

галерея

Женщина с чашкой чая сидит на диване, наслаждаясь утренним солнцем в гостиной.
Правительство Великобритании поддерживает развитие медицинских технологий в рамках новой программы доступа к медицинским технологиям для Национальной службы здравоохранения (NHS) — Сеть медицинских устройств.
ideipro logotyp
Руководители обсуждают, как ИИ меняет структуру рабочей силы в здравоохранении, часть 2 | MobiHealthNews
Искусственный интеллект в медицинской визуализации, ожидание процесса.
ideipro logotyp
Без шуток: НАСА планирует запуск миссии Artemis II на Луну 1 апреля.
Изображение улыбающегося мужчины на фоне художественного рисунка.
ideipro logotyp
Image Not Found
Женщина с чашкой чая сидит на диване, наслаждаясь утренним солнцем в гостиной.

Ваш утренний кофе однажды может помочь в борьбе с раком.

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

Мар 6, 2026
Правительство Великобритании поддерживает развитие медицинских технологий в рамках новой программы доступа к медицинским технологиям для Национальной службы здравоохранения (NHS) — Сеть медицинских устройств.

Правительство Великобритании поддерживает развитие медицинских технологий в рамках новой программы доступа к медицинским технологиям для Национальной службы здравоохранения (NHS) — Сеть медицинских устройств.

Британский орган по надзору за здравоохранением NICE теперь будет проводить анализ соотношения затрат и выгод медицинских устройств, диагностических средств и цифровых инструментов здравоохранения. Изображение предоставлено: lunopark через ShutterStock.com. Правительство Великобритании поставило перед собой цель улучшить доступ к…

Мар 6, 2026
ideipro logotyp

Анализ масштабных сокращений в биотехнологических компаниях в 2026 году: Alltrna сокращает 19 рабочих мест; Theravance уменьшает численность персонала вдвое.

Добро пожаловать в пятый ежегодный отчет Fierce Biotech о сокращениях штата, ресурс, разработанный для того, чтобы следить за постоянным потоком сокращений в отрасли. В 2025 году количество увольнений в отрасли продолжало расти из года в год, что…

Мар 6, 2026
Руководители обсуждают, как ИИ меняет структуру рабочей силы в здравоохранении, часть 2 | MobiHealthNews

Руководители обсуждают, как ИИ меняет структуру рабочей силы в здравоохранении, часть 2 | MobiHealthNews

Лидеры утверждают, что ИИ изменит структуру рабочих мест, не заменив при этом человеческий фактор в сфере ухода. ИИ Фото: Pekic/Getty Images Руководители медицинских учреждений заявили MobiHealthNews, что искусственный интеллект готов трансформировать здравоохранение, автоматизируя административные задачи и освобождая…

Мар 6, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых