Подготовка к изменению климата с помощью помощника ИИ

Помощник ИИ в подготовке к изменению климата новый этап в борьбе с изменениями окружающей среды

Упрощение сложных данных через разговор

Изображение, созданное с использованием ChatGPT и Dall-E-3 от OpenAI

TL;DR

В этой статье мы рассмотрим, как создать разговорного агента искусственного интеллекта, используя данные о изменении климата из отличного API “Probable Futures” и нового API “OpenAI Assistants”. Разговорный агент способен отвечать на вопросы о том, как изменения климата могут повлиять на определенное местоположение, а также выполнять базовый анализ данных. Искусственные помощники могут быть очень полезными для подобных задач, предоставляя многообещающий канал для представления сложных данных неспециалистам.

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

API помощников Open AI

Агенты искусственного интеллекта, основанные на больших языковых моделях, таких как GPT-4, становятся способом взаимодействия людей с документами и данными через разговор. Эти агенты интерпретируют то, что человек спрашивает, вызывают API и базы данных, получают данные, генерируют и запускают код для выполнения анализа, а затем представляют результаты пользователю. Превосходные фреймворки, такие как “langchain” и “autogen”, являются пионерами в этой области, предоставляя шаблоны для легкой реализации агентов. Недавно OpenAI присоединилась к этому направлению с выпуском “GPTs” в качестве способа создания агентов без кода, что я изучил в форме в этой статье. Они разработаны очень хорошо и предоставляют возможность для гораздо более широкой аудитории, однако они имеют несколько ограничений. Они требуют API с спецификацией openapi.json, что означает, что на данный момент они не поддерживают такие стандарты, как graphql. Они также не поддерживают возможность регистрации функций, что ожидаемо для решения без кода, но это может ограничить их возможности.

Вот где появляется другой недавно запущенный OpenAI продукт – API помощников.

API помощников (бета-версия) — это программный способ настройки OpenAI помощников, который поддерживает функции, веб-браузинг и извлечение знаний из загруженных документов. Функции — важное отличие по сравнению с GPTs, так как они позволяют более сложное взаимодействие с внешними источниками данных. Функции — это то, когда большие языковые модели (LLM), такие как GPT-4, осознают, что некоторый ввод пользователя должен привести к вызову функции. LLM сгенерирует ответ в формате JSON с точными параметрами, необходимыми для вызова функции, который затем может быть использован для выполнения локально. Чтобы узнать подробнее о том, как они работают с OpenAI, см. здесь.

Комплексное API для изменения климата — Probable Futures

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

К счастью, ребята из “Probable Futures” проделали отличную работу!

Probable Futures предоставляет широкий спектр ресурсов, связанных с прогнозированием изменения климата

Probable Futures – это “Бесплатная инициатива по климатической грамотности, которая обеспечивает доступ к практическим инструментам, историям и ресурсам онлайн всем и везде”, и они предоставляют серию карт и данных на основе методики CORDEX-CORE, стандартизации для вывода климатических моделей из региональных климатических моделей REMO2015 и REGCM4. [Примечание: я не связан с Probable Futures]

Важно отметить, что они предоставляют GraphQL API для доступа к этим данным, которые я могу использовать после запроса API-ключа.

Основываясь на документации, я создал функции, которые сохранены в файле assistant_tools.py

pf_api_url = "https://graphql.probablefutures.org"pf_token_audience = "https://graphql.probablefutures.com"pf_token_url = "https://probablefutures.us.auth0.com/oauth/token"def get_pf_token():    client_id = os.getenv("CLIENT_ID")    client_secret = os.getenv("CLIENT_SECRET")    response = requests.post(        pf_token_url,        json={            "client_id": client_id,            "client_secret": client_secret,            "audience": pf_token_audience,            "grant_type": "client_credentials",        },    )    access_token = response.json()["access_token"]    return access_tokendef get_pf_data(address, country, warming_scenario="1.5"):    variables = {}    location = f"""        country: "{country}"        address: "{address}"    """    query = (        """        mutation {            getDatasetStatistics(input: { """        + location        + """ \                    warmingScenario: \"""" + warming_scenario + """\"                 }) {                datasetStatisticsResponses{                    datasetId                    midValue                    name                    unit                    warmingScenario                    latitude                    longitude                    info                }            }        }    """    )    print(query)    access_token = get_pf_token()    url = pf_api_url + "/graphql"    headers = {"Authorization": "Bearer " + access_token}    response = requests.post(        url, json={"query": query, "variables": variables}, headers=headers    )    return str(response.json())

Я намеренно исключил datasetId для получения всех показателей, чтобы искусственный интеллект имел широкий спектр информации для работы.

API надежен в том, что он принимает города и города, а также полные адреса. Например …

get_pf_data(address="New Delhi", country="India", warming_scenario="1.5")

Возвращает JSON-запись с информацией о изменении климата для данного местоположения …

{'data': {'getDatasetStatistics': {'datasetStatisticsResponses': [{'datasetId': 40601, 'midValue': '17.0', 'name': 'Изменение количества выпадения осадков в год', 'unit': 'мм', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40616, 'midValue': '14.0', 'name': 'Изменение влажности за 90 дней', 'unit': 'мм', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40607, 'midValue': '19.0', 'name': 'Изменение дней с жарой без осадков', 'unit': 'дни', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40614, 'midValue': '0.0', 'name': 'Изменение количества снегопадов', 'unit': 'дни', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40612, 'midValue': '2.0', 'name': 'Изменение частоты встречаемости "раз в 100 лет" штормов', 'unit': 'больше, чем в ... раз', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40101, 'midValue': '28.0', 'name': 'Средняя температура', 'unit': '°C', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40901, 'midValue':

Создание помощника OpenAI

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

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

    get_pf_data_schema = {        "name": "get_pf_data",        "parameters": {            "type": "object",            "properties": {                "address": {                    "type": "string",                    "description": ("Адрес местоположения для получения данных"),                },                "country": {                    "type": "string",                    "description": ("Страна местоположения для получения данных"),                },                "warming_scenario": {                    "type": "string",                    "enum": ["1.0", "1.5", "2.0", "2.5", "3.0"],                    "description": ("Сценарий глобального потепления для получения данных. По умолчанию 1.5"),                }            },            "required": ["address", "country"],        },        "description": """            Это API-запрос к API потенциальных будущих событий для получения прогнозируемых показателей изменения климата для местоположения        """,    }

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

tools = [    {        "type": "function",        "function": get_pf_data_schema,    }    {"type": "code_interpreter"},]

Заметьте, что я оставил code_interpretor, давая помощнику возможность запускать необходимый для анализа данных код.

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

instructions = """     "Привет, помощник по изменению климата. Вы помогаете людям понять, как изменения климата повлияют на их дома"    "Вы будете использовать данные о возможных будущих событиях для прогнозирования показателей изменения климата для местоположения"    "Вы будете кратко резюмировать возвращенные данные"    "Вы также предоставите ссылки на местные ресурсы и веб-сайты, чтобы помочь пользователю подготовиться к прогнозируемому изменению климата"    "Если у вас недостаточно информации об адресе, запросите ее"    "По умолчанию вы используете сценарий глобального потепления 1.5, если не указано, но спрашивайте, хочет ли пользователь попробовать другие сценарии после представления результатов"    "Группируйте результаты по категориям"    "Всегда добавляйте ссылку на веб-сайт потенциальных будущих событий для местоположения с использованием URL и заменой LATITUDE и LONGITUDE значениями местоположения: https://probablefutures.org/maps/?selected_map=days_above_32c&map_version=latest&volume=heat&warming_scenario=1.5&map_projection=mercator#9.2/LATITUDE/LONGITUDE"    "ГЕНЕРИРУЙТЕ ВЫВОД, КОТОРЫЙ ЯСЕН И ЛЕГКО ПОНЯТЕН НЕТЕХНИЧЕСКОМУ ПОЛЬЗОВАТЕЛЮ""""

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

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

Хорошо, теперь у нас есть все инструменты и инструкции, давайте создадим помощника...

import osfrom openai import AsyncOpenAIimport asynciofrom dotenv import load_dotenvimport sysload_dotenv()api_key = os.environ.get("OPENAI_API_KEY")assistant_id = os.environ.get("ASSISTANT_ID")model = os.environ.get("MODEL")client = AsyncOpenAI(api_key=api_key)name = "Climate Change Assistant"try:    my_assistant = await client.beta.assistants.retrieve(assistant_id)    print("Обновляем существующего помощника...")    assistant = await client.beta.assistants.update(        assistant_id,        name=name,        instructions=instructions,        tools=tools,        model=model,    )except:    print("Создаем помощника...")    assistant = await client.beta.assistants.create(        name=name,        instructions=instructions,        tools=tools,        model=model,    )    print(assistant)    print("Теперь сохраните DI в вашем файле .env")

Предполагается, что мы определили ключи и идентификатор нашего агента в файле .env. Вы заметите, что код сначала проверяет, существует ли агент, используя ASSISTANT_ID из файла .env и обновляет его, если это так, в противном случае создается совершенно новый агент, и сгенерированный идентификатор необходимо скопировать в файл .env. Без этого я создавал ОЧЕНЬ много помощников!

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

Для этого анализа я решил использовать новую модель GPT-4-Turbo, установив значение model на "gpt-4--1106-preview".

Создание пользовательского интерфейса

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

import assistant_tools as at

Chainlit очень краток, и пользовательский интерфейс легко настраивается, код для приложения можно найти здесь.

Использование нашего агента искусственного интеллекта Climate Change Assistant

Собирая все вместе - см. код здесь - мы запускаем агента с помощью простой команды chainlit run app.py ...

Давайте спросим о местоположении...

Отмечу, что я намеренно написал неправильно "Mombasa".

Затем агент начинает работать, вызывая API и обрабатывая JSON-ответ (это занимает около 20 секунд) ...

Исходя из наших инструкций, он заканчивает с ...

Но это правильно?

Давайте вызовем API и просмотрим вывод ...

get_pf_data(address="Mombassa", country="Kenya", warming_scenario="1.5")

Который запрашивает API с ...

mutation {    getDatasetStatistics(input: {             country: "Kenya"            address: "Mombassa"            warmingScenario: "1.5"         }) {        datasetStatisticsResponses{            datasetId            midValue            name            unit            warmingScenario            latitude            longitude            info        }    }}

Это дает следующее (обрезано для отображения только нескольких) ...

{  "data": {    "getDatasetStatistics": {      "datasetStatisticsResponses": [        {          "datasetId": 40601,          "midValue": "30.0",          "name": "Change in total annual precipitation",          "unit": "mm",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40616,          "midValue": "70.0",          "name": "Change in wettest 90 days",          "unit": "mm",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40607,          "midValue": "21.0",          "name": "Change in dry hot days",          "unit": "days",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40614,          "midValue": "0.0",          "name": "Change in snowy days",          "unit": "days",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40612,          "midValue": "1.0",          "name": "Change in frequency of \u201c1-in-100-year\u201d storm",          "unit": "x as frequent",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        .... и т.д.      ]    }  }}

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

Улучшение пользования путем инструкций

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

Одно из руководств гласило, что всегда генерировать ссылку на карту на веб-сайте «Вероятных будущих», которая при нажатии перейдет в нужное место …

Агент всегда генерирует URL-адрес, чтобы пользователь мог перейти на правильную карту визуализации для своего запроса на веб-сайте

Другое руководство требовало, чтобы агент всегда предлагал пользователю попробовать другие сценарии потепления. По умолчанию агент создает результаты для прогнозированного глобального повышения температуры на 1,5°C, но мы позволяем пользователю исследовать другие — и в некоторой степени депрессивные — сценарии.

Задачи анализа

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

Сначала я спросил, как изменится климат в Лондоне и Нью-Йорке, и агент предоставил резюме. Затем я спросил …

В результате агент использовал интерпретатор кода, чтобы сгенерировать и запустить Python-код для создания графика …

ИИ-агент способен выполнять базовые задачи анализа данных, используя данные о климатическом изменении, полученные из API

Неплохо!

Выводы и будущая работа

С использованием API «Вероятные будущие» и помощника OpenAI мы смогли создать беседующий интерфейс, демонстрирующий, как люди могут задавать вопросы о климатических изменениях и получать советы по подготовке. Агент мог делать запросы к API, а также выполнять базовый анализ данных. Это предлагает еще одну возможность для осознания климата, которая может быть более привлекательной для некоторых неспециалистов.

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

Однако есть некоторые проблемы, такие как небольшая скорость выполнения (запросы занимали около 20–30 секунд для завершения). Кроме того, стоимость токенов моделирования модели LLM не была проанализирована в этой статье и может быть запретительной.

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

Ссылки

Эта статья основана на данных и другом контенте, предоставленном «Вероятными будущими», проектом Южного побережья фонда сообщества, и некоторые из этих данных могли быть предоставлены «Вудвеллским центром исследования климата, Инк.» или экспериментом «Координированный региональный климатический эксперимент» (CORDEX)

Код для этого анализа можно найти здесь.

Здесь вы можете найти больше моих статей.