Press "Enter" to skip to content

位置的语言:评估生成AI的地理编码能力

一个应用项目,详细介绍了LLMs在地理编码方面的性能,与现代地理编码API进行比较

Photo by Sylwia Bartyzel on Unsplash

通过在手机的搜索栏中输入位置并自动在地图上显示,这种现代便利往往被人们视为理所当然。但你是否曾想过这种文本和地图之间的无缝交互和转换是如何实现的?答案就是地理编码。

全球领先的地理空间软件提供商Esri将地理编码定义为“将位置描述(例如一对坐标、地址或地名)转换为地球表面上的位置的过程。”地理编码赋予了导航应用、地图服务和地理信息科学(GIScience)平台中发现的高级功能。Esri、Google、Mapbox等各种供应商都提供地理编码API,可以接收位置描述并返回给定描述的纬度和经度值,或者坐标,使我们能够在空间上思考数据。

随着生成式人工智能和大型语言模型(LLMs)如OpenAI的GPT、Google的Bard或Meta的LLaMA的兴起,我们有很好的机会将这些技术应用于地理空间应用。这些用途广泛,从GitHub的Copilot的代码生成到Meta的Segment Anything Model(SAM)的图像分割,甚至可能用于地理编码。

本文将考察利用“开箱即用”的生成式人工智能进行地理编码的适用性。这项评估将在来自明尼苏达州的小型车辆事故数据集上进行。通过这种分析,我们将探讨标准LLMs在地理编码任务中的有效性,以及与传统方法相比,生成式人工智能在地理空间应用领域的潜在用例之一。

理解地理编码及其与人工智能的整合现代地理编码器由两个基本组件组成:参考数据集和地理编码算法。参考数据通常包含附加到地理位置的地方的显式和相对描述,这意味着不仅地址等显式描述与位置相关联,还有更不规则的地点描述也与位置相关联。然后,匹配算法可以用于在输入描述和包含在参考数据集中的描述之间找到合适的匹配项。一个简单的匹配算法示例可以是使用插值算法通过估计两个已知地址之间的位置来确定街道地址的位置。

预测性地理编码的概念,即利用人工智能和机器学习增强地理编码过程,具有悠久的历史。包括自然语言处理(NLP)和深度学习在内的各种技术已经被提出和应用,并取得了不同程度的成功。在地理编码中使用人工智能和机器学习并不是最近的发展。然而,生成式人工智能的出现为地理编码提供了一个新的前沿,就像它对许多其他领域一样。

应对挑战和探索未来机遇你可能知道,LLMs是使用从互联网、图书、期刊文章和其他各种来源获取的大量文本数据进行训练的。这通常(如果不是总是)缺乏全面的地理空间信息。LLMs中缺乏地理空间训练数据对于理解和解决地理空间挑战的潜力和适用性具有影响。在没有基础领域特定知识的情况下,我们如何期望模型在复杂问题上表现良好呢?

答案是我们根本无法。

在这个分析中,我评估了LLMs作为一个独立基准和在使用传统GIScience方法的工作流程上的适用性。结果强调了一个熟悉的观点——尽管新技术可能令人印象深刻,但在解决复杂挑战时并不总是会带来更好的性能。

案例研究:车祸的非结构化位置描述

数据收集和准备为了测试和量化LLMs的地理编码能力,从从网络上抓取的数据集中随机选择了100个明尼苏达州车祸的非结构化位置描述。通过使用Google Maps和明尼苏达交通部的交通地图应用程序(TMA)等各种映射应用程序,为所有100起事故手动创建了地面真实坐标。

下面是一些示例位置描述。

美国71号公路与明尼苏达60号公路,温多姆,科顿伍德县

ELK RIVER附近的EB Highway 10,Sherburne县

FOSTER TWP的EB I 90 / HWY 22,Faribault县

公路75号403英里处,SAINT VINCENT TWP,Kittson县

BRUNSWICK TWP的65号公路 / King Road,Kanabec县

如上例所示,描述的结构以及位置的定义有很多不同的可能性。例如,第四个描述中包含一个英里标记数,这在任何地理编码过程中都不太可能被匹配,因为这种信息通常不包含在任何参考数据中。对于这种描述的地面真实坐标的查找在很大程度上依赖于明尼苏达州交通部的线性参考系统(LRS),该系统提供了一种标准化的方法来测量州内的道路,其中英里标记起着至关重要的作用。可以通过前面提到的TMA应用程序访问这些数据。

方法论和地理编码策略在准备数据后,设置了五个单独的笔记本来测试不同的地理编码过程。它们的配置如下。

1. Google地理编码API,用于原始位置描述2. Esri地理编码API,用于原始位置描述3. Google地理编码API,用于经过OpenAI GPT 3.5标准化的位置描述4. Esri地理编码API,用于经过OpenAI GPT 3.5标准化的位置描述5. OpenAI GPT 3.5,作为地理编码器本身使用

总结一下,Google和Esri地理编码API都用于原始描述以及使用传递给OpenAI GPT 3.5模型的简短提示标准化的描述。这个标准化过程的Python代码如下所示。

def standardize_location(df, description_series):    df["ai_location_description"] = df[description_series].apply(_gpt_chat)        return df    def _gpt_chat(input_text):    prompt = """将以下位置描述标准化为可用于地理编码API的文本。回复时,只返回输出文本。"""        response = openai.ChatCompletion.create(        model="gpt-3.5-turbo",        messages=[            {"role": "system", "content": prompt},            {"role": "user", "content": input_text},        ],        temperature=0.7,        n=1,        max_tokens=150,        stop=None,    )        return response.choices[0].message.content.strip().split("\n")[-1]

使用地理编码API的四个测试案例使用以下代码向它们各自的地理编码器发出API请求,并返回所有100个描述的结果坐标。

# Esri地理编码器def geocode_esri(df, description_series):    df["xy"] = df[description_series].apply(        _single_esri_geocode    )        df["x"] = df["xy"].apply(        lambda row: row.split(",")[0].strip()    )    df["y"] = df["xy"].apply(        lambda row: row.split(",")[1].strip()    )        df["x"] = pd.to_numeric(df["x"], errors="coerce")    df["y"] = pd.to_numeric(df["y"], errors="coerce")            df = df[df["x"].notna()]    df = df[df["y"].notna()]        return df    def _single_esri_geocode(input_text):    base_url = "https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer/findAddressCandidates"    params = {        "f": "json",        "singleLine": input_text,        "maxLocations": "1",        "token": os.environ["GEOCODE_TOKEN"],    }    response = requests.get(base_url, params=params)    data = response.json()    try:        x = data["candidates"][0]["location"]["x"]        y = data["candidates"][0]["location"]["y"]        except:        x = None        y = None    return f"{x}, {y}"

# Google地理编码器def geocode_google(df, description_series):    df["xy"] = df[description_series].apply(        _single_google_geocode    )        df["x"] = df["xy"].apply(        lambda row: row.split(",")[0].strip()    )    df["y"] = df["xy"].apply(        lambda row: row.split(",")[1].strip()    )        df["x"] = pd.to_numeric(df["x"], errors="coerce")    df["y"] = pd.to_numeric(df["y"], errors="coerce")            df = df[df["x"].notna()]    df = df[df["y"].notna()]        return df    def _single_google_geocode(input_text):    base_url = "https://maps.googleapis.com/maps/api/geocode/json"    params = {        "address": input_text,        "key": os.environ["GOOGLE_MAPS_KEY"],        "bounds": "43.00,-97.50 49.5,-89.00",    }        response = requests.get(base_url, params=params)    data = response.json()    try:        x = data["results"][0]["geometry"]["location"]["lng"]        y = data["results"][0]["geometry"]["location"]["lat"]        except:        x = None        y = None    return f"{x}, {y}"

此外,还有一个最后测试的过程是使用 GPT 3.5 作为地理编码器本身,而不需要任何地理编码 API 的帮助。这个过程的代码与上面使用的标准化代码几乎相同,但是使用了不同的提示,如下所示。

地理编码以下地址。返回尽可能准确的纬度 (Y) 和经度 (X)。在响应时,只返回以下格式的输出文本: X, Y

性能指标和见解在开发了各种过程之后,每个过程都被运行,并计算了多个性能指标,包括执行时间和地理编码准确性。这些指标如下所示。

        |  地理编码过程      |  平均值  | 标准差 |  平均绝对误差   |  均方根误差  |        | ------------------- | ------ | ------ | ------ | ------ |        | 使用 GPT 3.5 的 Google | 0.1012 | 1.8537 | 0.3698 | 1.8565 |        | 使用原始数据的 Google | 0.1047 | 1.1383 | 0.2643 | 1.1431 |        | 使用 GPT 3.5 的 Esri   | 0.0116 | 0.5748 | 0.0736 | 0.5749 |        | 使用原始数据的 Esri     | 0.0001 | 0.0396 | 0.0174 | 0.0396 |        | GPT 3.5 地理编码     | 2.1261 | 80.022 | 45.416 | 80.050 |

       |  地理编码过程      | 75% ET | 90% ET | 95% ET | 运行时间 |       | ------------------- | ------ | ------ | ------ | -------- |       | 使用 GPT 3.5 的 Google | 0.0683 | 0.3593 | 3.3496 | 1 分 59.9 秒 |       | 使用原始数据的 Google | 0.0849 | 0.4171 | 3.3496 | 0 分 23.2 秒 |       | 使用 GPT 3.5 的 Esri   | 0.0364 | 0.0641 | 0.1171 | 2 分 22.7 秒 |       | 使用原始数据的 Esri     | 0.0362 | 0.0586 | 0.1171 | 0 分 51.0 秒 |       | GPT 3.5 地理编码     | 195.54 | 197.86 | 199.13 | 1 分 11.9 秒 |

这些指标在这里有更详细的解释。平均值表示平均误差(以曼哈顿距离表示,即 X 和 Y 与实际值之间的总差异,以十进制度表示)。标准差表示误差的标准差(以曼哈顿距离表示,以十进制度表示)。平均绝对误差表示平均绝对误差(以曼哈顿距离表示,以十进制度表示)。均方根误差表示均方根误差(以曼哈顿距离表示,以十进制度表示)。75%、90%、95% ET 表示给定百分比的误差阈值(以欧几里德距离表示,以十进制度表示),意味着给定百分比的记录在结果值与实际值之间的距离内。最后,运行时间只表示在 100 条记录上运行地理编码过程所需的总时间。

显然,GPT 3.5 单独执行的效果要差得多。尽管如此,如果将一些异常值排除在外(这些异常值被模型标记为位于其他大陆),那么该过程的结果在视觉上看起来并不太突兀。

还有一个有趣的发现是,LLM 标准化过程实际上降低了准确性,我个人觉得有点意外,因为我引入这个组件的整个目的是希望稍微提高地理编码过程的整体准确性。值得注意的是,这里的提示本身可能是问题的一部分,因此进一步探索“提示工程”在地理空间环境中的作用是值得的。

这个分析的最后一个主要结论是执行时间的差异,任何包含使用 GPT 3.5 的过程的执行时间都显著较慢。在这种情况下,Esri 的地理编码 API 也比 Google 的慢。然而,没有进行严格的测试,因此这些结果应该考虑到这一点。

总结思考尽管 OpenAI 的 GPT 3.5 模型的“开箱即用”地理编码能力可能不及现代地理编码器的复杂性,但测试结果强调了一个潜在的有希望的前景。结果突显了改进的巨大空间,表明在可预见的未来,大型语言模型(LLMs)的地理空间能力有很多机会可以提高,并最终对我们所知的地理编码产生影响。

有许多特定的用例,LLMs在地理编码方面可能已经足够。然而,正如这个例子所示,LLMs的能力与需要在细精度的空间分辨率下要求高精度的地理编码任务之间存在差异。因此,虽然LLMs具有潜力,但这个例子表明了对于某些应用程序来说,精确性和准确性的重要性。

总的来说,生成式人工智能是一种令人兴奋的创新,具有广泛而深远的地理和地理信息系统领域的影响和机会,包括地理编码的应用。持续的进展以惊人的速度进行,每天都在继续进行开发生成式人工智能和地理空间集成方面的进展。

参考文献:[1] 维基百科贡献者,地址地理编码(2023),维基百科[2] A. Hassan,地理空间人工智能的未来(2023),空间数据科学[3] L. Mearian,LLMs是什么,它们在生成式人工智能中如何使用?(2023),计算机世界

致谢:我要对Bryan Runck博士在编辑和审阅本文过程中提供的宝贵支持、指导和专业知识表示感谢。

Leave a Reply

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