Press "Enter" to skip to content

利用人工智能助手为气候变化做准备

通过对话简化复杂数据

使用OpenAI的ChatGPT和Dall-E-3生成的图像

TL;DR

在这篇文章中,我们探讨如何使用来自优秀的Probable Futures API和新的OpenAI Assistants API的气候变化数据创建对话式AI代理。该AI代理能够回答关于气候如何影响指定位置以及进行基本数据分析的问题。AI助手非常适合这样的任务,为非技术用户呈现复杂数据提供有希望的渠道。

最近,我与邻居聊天时讨论了气候变化可能如何影响我们以及如何最好地为极端天气事件做准备的问题。有一些令人惊讶的网站提供以地图形式呈现的相关信息,但我想知道有时候人们可能只是想问一些问题,比如“我的家将受气候变化的影响吗?”和“我能做些什么?”,然后得到一个简洁的摘要和准备建议。因此,我决定探索一些最近几周提供的AI工具。

Open AI的助手API

由像GPT-4这样的大型语言模型驱动的AI代理正在成为人们通过对话与文档和数据交互的方式。这些代理解释用户的提问,调用API和数据库获取数据,生成和运行代码进行分析,然后将结果呈现给用户。像langchain和autogen这样的出色框架正在引领潮流,为实现代理提供了易于实施的模式。最近,OpenAI也加入了这一行列,推出了作为创建代理的无代码方式的GPTs,我在这篇文章中进行了探索。这些工具设计非常出色,为更广泛的用户群体开辟了道路,但它们仍然有一些限制。它们需要具有openapi.json规范的API,这意味着它们目前不支持graphql等标准。它们还不支持注册函数的能力,这在无代码解决方案中是可以预料的,但它们的功能有一定的限制。

接下来是OpenAI最近推出的助手API

助手API(测试版)是一种以编程方式配置OpenAI助手的方法,支持函数、Web浏览和从上传的文档中提取知识。与GPTs相比,函数是一个很大的区别,因为它们能够更复杂地与外部数据源进行交互。函数是大语言模型(LLM)如GPT-4意识到某些用户输入应该调用代码函数的地方。LLM将以JSON格式生成包含调用函数所需确切参数的响应,然后可以用于本地执行。有关它们与OpenAI的详细工作原理,请参见此处。

全面的气候变化API—Probable Futures

为了能够创建一个帮助应对气候变化的AI代理,我们需要一个良好的气候变化数据来源和一个提取信息的API。任何这样的资源都必须采用严谨的方法来合并广义环流模型(GCM)预测。

幸运的是,Probable Futures的团队做得很出色!

可预测的未来为与气候变化预测相关的资源提供一系列资源

可预测的未来是“一个非营利性的气候素养计划,为每个人在网上提供实用工具、故事和资源。”,他们提供了一系列基于CORDEX-CORE框架的地图和数据,这是来自REMO2015和REGCM4区域气候模型的气候模型输出的标准化。【侧记:我与可预测的未来无关】

重要的是,他们为访问这些数据提供了一个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,以便获取所有的指标,让AI代理有更广泛的信息可供使用。

该API具有强大的功能,可以接受城镇和城市以及完整地址。例如…

get_pf_data(address="新德里", country="印度", warming_scenario="1.5")

返回一个带有该位置气候变化信息的JSON记录…

{'data': {'getDatasetStatistics': {'datasetStatisticsResponses': [{'datasetId': 40601, 'midValue': '17.0', 'name': '变化的总年降水量', 'unit': 'mm', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40616, 'midValue': '14.0', 'name': '变化的最湿润的90天', 'unit': 'mm', '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': '“一百年一遇”暴雨频率的变化', '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': '4.0', 'name': '气候区域', 'unit': '分类', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {'climateZoneName': '干旱半干旱 (或草原) 炎热'}}, {'datasetId': 40613, 'midValue': '49.0', 'name': '降水“一百年一遇”暴雨的变化', 'unit': 'mm', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 

创建一个OpenAI助手

接下来,我们需要使用beta API构建AI助手。在文档中有一些很好的资源,还有非常有用的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 = "气候变化助手"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("现在在你的.env文件中保存DI")

上述假设我们已经在.env文件中定义了密钥和我们的代理ID。你会注意到代码首先检查代理是否存在,使用.env文件中的ASSISTANT_ID,如果存在则进行更新,否则创建一个全新的代理,生成的ID必须复制到.env文件中。没有这一步,我会创建很多助手!

一旦创建了助手,它就会出现在OpenAI用户界面上,可以在Playground中进行测试。由于大多数的开发和调试与函数调用相关,实际调用代码,所以我没有发现Playground对于这个分析特别有用,但它的设计很好,可能在其他工作中有用。

对于这个分析,我决定使用新的GPT-4-Turbo模型,将model设置为"gpt-4-1106-preview"。

创建用户界面

我们希望能够创建一个完整的聊天机器人,所以我从这个chainlit cookbook example开始,稍微调整一下,将代理代码分离到一个专用文件中,并通过...

import assistant_tools as at

Chainlit非常简洁,用户界面容易设置,你可以在这里找到应用的代码。

试用我们的气候变化助手AI代理

把所有这些放在一起- 参见代码

让我们问一个地点...

利用人工智能助手为气候变化做准备 四海 第3张

请注意,上面我故意拼错了蒙巴萨。

然后代理开始工作,调用API并处理JSON响应(大约花了20秒)...

利用人工智能助手为气候变化做准备 四海 第4张

根据我们的指令,最后完成...

利用人工智能助手为气候变化做准备 四海 第5张

但它是正确的吗?

让我们调用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": {}        },        ....等等        }      ]    }  }}

经过抽查,这个代理程序似乎完美地捕捉并向用户展示了准确的摘要。

通过指导提高可用性

通过一些关于信息展示的指导,可以改进AI代理程序。

其中一个指导是始终生成一个指向Probable Futures网站上地图可视化的链接,当用户点击时跳转到正确的位置...

该代理程序始终生成一个URL,将用户带到Probable Futures网站上的正确地图可视化,用于他们的查询

另一个指导要求代理程序始终提示用户尝试其他变暖情景。默认情况下,代理程序生成预测的全球温度增加1.5摄氏度的结果,但我们允许用户探索其他一些令人沮丧的情景。

分析任务

由于我们给予AI代理程序代码解释技巧,它应该能够执行Python代码进行基本的数据分析。我们来试试吧。

首先,我询问气候变化如何影响伦敦和纽约,代理程序提供了摘要。然后我提问...

利用人工智能助手为气候变化做准备 四海 第7张

结果,代理程序使用代码解释器生成并运行Python代码创建了一个图表...

AI代理程序能够使用从API提取的气候变化数据进行基本的数据分析任务

做得不错!

结论和未来工作

使用Probable Futures的API和OpenAI助手,我们能够创建一个对话界面,展示人们可能如何询问关于气候变化并获得准备方面建议的方法。该代理程序能够进行API调用,以及进行一些基本的数据分析。这提供了另一种气候意识的渠道,可能更吸引非技术用户。

当然,我们可以开发一个聊天机器人来确定意图/实体并编写处理API的代码,但这需要更多工作,并且需要在API发生变化或添加新API时进行重新审查。此外,大型语言模型代理程序能够很好地解释用户输入和摘要内容,且几乎没有开发工作,并且能够运行代码并进行基本的数据分析,从而将任务提升到另一个层次。我们的特定用例似乎特别适合于AI代理程序,因为任务的范围是有限的。

然而,也存在一些挑战,该技术速度较慢(查询需要大约20-30秒才能完成)。此外,本文并未对LLM令牌成本进行分析,可能会有一定的限制。

话虽如此,OpenAI助手API处于测试版。而且代理程序没有进行任何调整,因此通过进一步的工作,可以进一步优化常见任务的额外功能、性能和成本,带来更多可能性。

参考

本文基于Probable Futures提供的数据和其他内容,Probable Futures是SouthCoast Community Foundation的项目,某些数据可能由Woodwell Climate Research Center, Inc.或The Coordinated Regional climate Downscaling Experiment (CORDEX)提供给Probable Futures。

此分析的代码可以在此处找到。

您可以在此处找到更多我的文章。

Leave a Reply

Your email address will not be published. Required fields are marked *