Prepararsi al cambiamento climatico con un assistente AI

Affrontare il cambiamento climatico con l'aiuto di un assistente IA

Semplificare i dati complicati attraverso la conversazione

Immagine generata utilizzando ChatGPT e Dall-E-3 di OpenAI

TL;DR

In questo articolo, esploriamo come creare un agente di intelligenza artificiale conversazionale utilizzando i dati sul cambiamento climatico dell’eccellente API Probable Futures e la nuova API degli Assistenti di OpenAI. L’agente di intelligenza artificiale è in grado di rispondere alle domande su come il clima potrebbe influenzare una determinata località e di effettuare anche analisi di base dei dati. Gli assistenti di intelligenza artificiale possono essere ben adatti a compiti come questo, offrendo un canale promettente per presentare dati complessi agli utenti non tecnici.

Recentemente stavo chiacchierando con un vicino riguardo a come il cambiamento climatico potrebbe influenzarci e come preparare al meglio le case per eventi meteorologici estremi. Esistono alcuni siti web incredibili che forniscono informazioni in forma di mappa su questo argomento, ma mi chiedevo se talvolta le persone potessero semplicemente voler fare domande come “Come il cambiamento climatico influenzerà la mia casa?” e “Cosa posso fare al riguardo?” e ottenere un riassunto conciso con consigli su come prepararsi. Così ho deciso di esplorare alcuni degli strumenti di intelligenza artificiale resi disponibili nelle ultime settimane.

API degli Assistenti di Open AI

Gli agenti di intelligenza artificiale alimentati da grandi modelli di linguaggio come GPT-4 stanno emergendo come un modo per le persone di interagire con documenti e dati tramite conversazione. Questi agenti interpretano ciò che la persona sta chiedendo, chiamano API e database per ottenere dati, generano ed eseguono codice per effettuare analisi, prima di presentare i risultati all’utente. Brillanti framework come langchain e autogen stanno aprendo la strada, fornendo modelli per implementare facilmente agenti. Di recente, OpenAI si è unita alla festa con il loro lancio di GPTs come un modo senza codice per creare agenti, che ho esplorato in questo articolo. Questi sono progettati molto bene e aprono la strada a un pubblico molto più vasto, ma hanno alcune limitazioni. Richiedono un’API con una specifica openapi.json, il che significa che attualmente non supportano standard come graphql. Non supportano nemmeno la registrazione di funzioni, il che è da aspettarsi per una soluzione senza codice ma può limitarne le funzionalità.

Ecco il recente lancio di OpenAI — Assistants API.

Assistants API (in versione beta) è un modo programmabile per configurare gli Assistenti di OpenAI che supporta funzioni, navigazione web e ricerca di conoscenza dai documenti caricati. Le funzioni sono una grande differenza rispetto ai GPTs, poiché consentono un’interazione più complessa con fonti di dati esterne. Le funzioni sono il punto in cui i Modelli di Linguaggio di Grandi Dimensioni (LLMs) come GPT-4 sono consapevoli che l’input dell’utente deve comportare una chiamata a una funzione di codice. L’LLM genererà una risposta in formato JSON con i parametri esatti necessari per chiamare la funzione, che potrà quindi essere utilizzata per l’esecuzione locale. Per vedere come funzionano in dettaglio con OpenAI, leggere qui.

Un’API completa per il cambiamento climatico — Probable Futures

Per poter creare un agente di intelligenza artificiale per aiutare nella preparazione al cambiamento climatico, abbiamo bisogno di una buona fonte di dati sul cambiamento climatico e di un’API per estrarre tali informazioni. Una risorsa del genere deve adottare un approccio rigoroso per combinare le previsioni dei Modelli di Circolazione Generale (GCM).

Fortunatamente, la gente di Probable Futures ha fatto un lavoro straordinario!

Probable Futures fornisce una serie di risorse legate alle previsioni sul cambiamento climatico

Futuri Probabili è “Un’iniziativa non profit di alfabetizzazione sul clima che mette a disposizione online strumenti pratici, storie e risorse per tutti, ovunque.”, e forniscono una serie di mappe e dati basati sul framework CORDEX-CORE, una standardizzazione per l’output del modello climatico dai modelli climatici regionali REMO2015 e REGCM4. [ Nota laterale: non sono affiliato a Futuri Probabili ]

In modo importante, forniscono un GraphQL API per accedere a questi dati ai quali potrei accedere dopo aver richiesto una chiave API.

In base a la documentazione ho creato delle funzioni che ho salvato in un file 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())

Ho intenzionalmente escluso datasetId al fine di recuperare tutti gli indicatori in modo che l’agente di IA abbia una vasta gamma di informazioni con cui lavorare.

L’API è robusta nel senso che accetta città così come indirizzi completi. Ad esempio …

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

Restituisce un record JSON con informazioni sul cambiamento climatico per la località …

{'data': {'getDatasetStatistics': {'datasetStatisticsResponses': [{'datasetId': 40601, 'midValue': '17.0', 'name': 'Variazione nella precipitazione annuale totale', 'unit': 'mm', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40616, 'midValue': '14.0', 'name': 'Variazione nei 90 giorni più piovosi', 'unit': 'mm', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40607, 'midValue': '19.0', 'name': 'Variazione nei giorni caldi e secchi', 'unit': 'giorni', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40614, 'midValue': '0.0', 'name': 'Variazione nei giorni di neve', 'unit': 'giorni', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40612, 'midValue': '2.0', 'name': 'Variazione nella frequenza delle tempeste "1 su 100 anni"', 'unit': 'x più frequente', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40101, 'midValue': '28.0', 'name': 'Temperatura media', 'unit': '°C', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40901, 'midValue': '4.0', 'name': 'Zone climatiche', 'unit': 'classe', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {'climateZoneName': 'Clime semi-aride (o steppe) calde'}}, {'datasetId': 40613, 'midValue': '49.0', 'name': 'Variazione nella precipitazione delle tempeste "1 su 100 anni"', 'unit': 'mm', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40701, '

Creazione di un Assistente OpenAI

Successivamente, è necessario costruire l'assistente AI utilizzando l'API beta. Ci sono alcune buone risorse nella documentazione e anche il molto utile OpenAI Cookbook. Tuttavia, essendo così nuovo e in fase beta, non c'è ancora molta informazione in giro, quindi a volte è stato un po' di prova ed errore.

Prima di tutto, è necessario configurare gli strumenti che l'assistente può utilizzare, come ad esempio la funzione per ottenere dati sul cambiamento climatico. Seguendo la documentazione ...

get_pf_data_schema = {    "name": "get_pf_data",    "parameters": {        "type": "object",        "properties": {            "address": {                "type": "string",                "description": ("L'indirizzo del luogo per ottenere i dati"),            },            "country": {                "type": "string",                "description": ("Il paese del luogo per ottenere i dati"),            },            "warming_scenario": {                "type": "string",                "enum": ["1.0", "1.5", "2.0", "2.5", "3.0"],                "description": ("Lo scenario di riscaldamento per ottenere i dati. Il valore predefinito è 1.5"),            }        },        "required": ["address", "country"],    },    "description": """        Questa è la chiamata API alla probabile API futures per ottenere indicatori previsti di cambiamento climatico per un luogo    """,}

<p.noterai ...

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

<p.noterai all'assistente="" che="" code_interpreter,="" codice="" dando="" dati.

Successivamente, è necessario specificare un insieme di istruzioni per l'utente (un prompt di sistema). Queste sono assolutamente fondamentali per adattare le prestazioni dell'assistente al nostro compito. Sulla base di alcune rapide sperimentazioni, ho ottenuto questo insieme ...

istruzioni = """    "Ciao, Climate Change Assistant. Aiuti le persone a capire come il cambiamento climatico influenzerà le loro case"    "Utilizzerai i dati di Probable Futures per prevedere gli indicatori di cambiamento climatico per un luogo"    "Risumerai perfettamente i dati restituiti"    "Fornirai anche collegamenti a risorse locali e siti web per aiutare l'utente a prepararsi per il cambiamento climatico previsto"    "Se non hai informazioni sufficienti sull'indirizzo, richiedilo"    "Se non specificato, usi lo scenario di riscaldamento di 1.5 come valore predefinito, ma chiedi all'utente se vuole provare altri dopo aver presentato i risultati"    "Raggruppa i risultati in categorie"    "Collegati sempre al sito web di probabili futuri per la posizione utilizzando l'URL e sostituendo LATITUDINE e LONGITUDINE con i valori di ubicazione: https://probablefutures.org/maps/?selected_map=days_above_32c&map_version=latest&volume=heat&warming_scenario=1.5&map_projection=mercator#9.2/LATITUDINE/LONGITUDINE"    "GENERARE OUTPUT CHIARI E FACILI DA COMPRENDERE PER UN UTENTE NON TECNICO""""

Puoi vedere che ho aggiunto istruzioni affinché l'assistente fornisca risorse come siti web per aiutare gli utenti a prepararsi per il cambiamento climatico. Questo è un po' "Aperto", per un assistente di produzione vorremmo probabilmente una curatela più rigorosa.

Una cosa meravigliosa che è ora possibile è anche istruire riguardo al tono generale, nel caso sopra richiedendo che l'output sia chiaro per un utente non tecnico. Ovviamente, tutto questo richiede una progettazione del prompt sistematica, ma è interessante notare come ora 'Programmiamo' in parte attraverso la persuasione. 😊

Ora che abbiamo gli strumenti e le istruzioni, creiamo l'assistente ...

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("Aggiornamento dell'assistente esistente ...")    assistant = await client.beta.assistants.update(        assistant_id,        name=name,        instructions=instructions,        tools=tools,        model=model,    )except:    print("Creazione assistente ...")    assistant = await client.beta.assistants.create(        name=name,        instructions=instructions,        tools=tools,        model=model,    )    print(assistant)    print("Ora salva l'ID nell'file .env")

Il precedente assume che abbiamo definito le chiavi e l'ID dell'agente in un file .env. Noterete che il codice controlla prima se l'agente esiste utilizzando l'ID dell'agente nel file .env e lo aggiorna se necessario, altrimenti crea un nuovo agente e l'ID generato deve essere copiato nel file .env. Senza questo, stavo creando un SACCO di assistenti!

Una volta creato l'assistente, diventa visibile sull' Interfaccia Utente di OpenAI dove può essere testato nel Playground. Poiché la maggior parte dello sviluppo e del debug correlato alle chiamate alle funzioni richiede di chiamare effettivamente del codice, non ho trovato il playground molto utile per questa analisi, ma è ben progettato e potrebbe essere utile in altri lavori.

Per questa analisi, ho deciso di utilizzare il nuovo modello GPT-4-Turbo impostando model su "gpt-4–1106-preview".

Creazione di un'interfaccia utente

Vogliamo essere in grado di creare un chatbot completo, quindi ho iniziato con questo esempio del cookbook di chainlit, adattandolo leggermente per separare il codice dell'agente in un file dedicato e per accedere tramite ...

import assistant_tools as at

Chainlit è molto conciso e l'interfaccia utente è facile da configurare, puoi trovare il codice dell'applicazione qui.

Prova del nostro assistente AI per i cambiamenti climatici

Mettendo tutto insieme - vedi il codice qui - avviamo l'agente con un semplice chainlit run app.py ...

Facciamo una domanda su una posizione...

Nota che ho intenzionalmente sbagliato la scrittura di Mombasa.

A questo punto, l'agente inizia il suo lavoro, chiama l'API e elabora la risposta JSON (ci sono voluti circa 20 secondi)...

In base alle nostre istruzioni, termina con...

Ma è corretto?

Chiamiamo l'API e rivediamo l'output...

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

Che interroga l'API con...

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

Questo restituisce il seguente (tratto per mostrare solo alcuni valori)...

{  "data": {    "getDatasetStatistics": {      "datasetStatisticsResponses": [        {          "datasetId": 40601,          "midValue": "30.0",          "name": "Cambiamento nella precipitazione annuale totale",          "unit": "mm",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40616,          "midValue": "70.0",          "name": "Cambiamento nei 90 giorni più umidi",          "unit": "mm",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40607,          "midValue": "21.0",          "name": "Cambiamento nei giorni caldi e secchi",          "unit": "giorni",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40614,          "midValue": "0.0",          "name": "Cambiamento nei giorni di neve",          "unit": "giorni",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40612,          "midValue": "1.0",          "name": "Cambiamento nella frequenza delle tempeste \"1 su 100 anni\"",          "unit": "x più frequente",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        .... ecc        }      ]    }  }}

Controllando, sembra che l'agente li abbia catturati perfettamente e abbia presentato all'utente un riassunto accurato.

Migliorare l'usabilità attraverso l'istruzione

L'agente di intelligenza artificiale può essere migliorato attraverso alcune istruzioni su come presentare le informazioni.

Una delle istruzioni era quella di generare sempre un link alla visualizzazione della mappa sul sito di Probable Futures, che, quando cliccato, porta alla posizione corretta...

L'agente genera sempre un URL per portare l'utente alla corretta visualizzazione della <a href=mappa per la loro richiesta sul sito di Probable Futures" src="https://ai.miximages.com/miro.medium.com/v2/resize:fit:640/format:webp/1*sm_ZXjj8EfcqabvTRdme1g.png"/>

Un'altra istruzione chiedeva all'agente di suggerire sempre all'utente di provare altri scenari di riscaldamento. Di default, l'agente produce risultati per un aumento globale della temperatura previsto del 1,5°C, ma permettiamo all'utente di esplorare altri scenari, piuttosto deprimenti.

Compiti di analisi

Dato che abbiamo fornito all'agente di intelligenza artificiale la capacità di interpretare il codice, dovrebbe essere in grado di eseguire codice Python per effettuare analisi dati di base. Proviamo a farlo.

Prima ho chiesto come il cambiamento climatico influenzerebbe Londra e New York, a cui l'agente ha fornito dei riassunti. Poi ho chiesto...

Ciò ha portato l'Agente a utilizzare l'interprete di codice per generare ed eseguire del codice Python per creare un grafico...

L'agente di intelligenza artificiale è in grado di svolgere compiti di analisi dati di base utilizzando i dati sul cambiamento climatico estratti dall'API

Niente male!

Conclusioni e Lavori Futuri

Utilizzando l'API di Probable Futures e un assistente di OpenAI siamo stati in grado di creare un'interfaccia conversazionale che mostra come le persone potrebbero porre domande sul cambiamento climatico e ottenere consigli su come prepararsi. L'agente è stato in grado di effettuare chiamate API e di svolgere alcune analisi dati di base. Questo offre un altro canale di sensibilizzazione sul cambiamento climatico, che potrebbe essere più attraente per alcuni utenti non tecnici.

Avremmo potuto sviluppare un chatbot per determinare l'intento/entità e il codice per gestire l'API, ma questo richiederebbe più lavoro e dovrebbe essere rivisto per eventuali modifiche all'API e per l'aggiunta di nuove API. Inoltre, un agente di Linguaggio Modello di Grandi Dimensioni fa un buon lavoro nell'interpretare l'input dell'utente e nella sintesi con uno sviluppo molto limitato, portando le cose a un altro livello nella capacità di eseguire il codice e svolgere analisi dati di base. Il nostro particolare caso d'uso sembra particolarmente adatto a un agente di intelligenza artificiale perché il compito è limitato nel suo ambito.

Ci sono comunque alcune sfide, la tecnica è un po' lenta (le query hanno impiegato circa 20-30 secondi per completarsi). Inoltre, i costi dei token LLM non sono stati analizzati per questo articolo e potrebbero essere proibitivi.

Detto questo, l'API degli assistenti di OpenAI è ancora in versione beta. Inoltre, l'agente non è stato ottimizzato in alcun modo e quindi con ulteriori lavori, le funzioni aggiuntive per compiti comuni, le prestazioni e i costi potrebbero essere ottimizzati per questa nuova e entusiasmante tecnica.

Riferimenti

Questo articolo si basa su dati e altri contenuti resi disponibili da Probable Futures, un progetto di SouthCoast Community Foundation e alcuni di questi dati possono essere stati forniti a Probable Futures da Woodwell Climate Research Center, Inc. o dal Coordinated Regional Climate Downscaling Experiment (CORDEX)

Il codice per questa analisi può essere trovato qui.

Puoi trovare altri miei articoli qui.