公司新闻

地理空间生成型 AI 与 Amazon Bedrock 和 Amazon Location Serv

地理空间生成型 AI 与 Amazon Bedrock 和 Amazon Location Serv

使用Amazon Bedrock和Amazon Location服务的地理空间生成AI

由Jeff DeMuth和Swagata Prateek于2023年11月22日发表在Amazon Bedrock、Amazon Location、生成AI中。 中级 (200) 永久链接 评论

主要要点

地理空间工作流程:通常包括数据加载、转换和生成视觉化结果如地图、文本或图表。生成AI:能够通过自动化任务提高工作流程效率,利用Amazon Bedrock的基础模型来实现。示例代码:展示如何使用生成AI代理来执行地理空间任务,如生成Airbnb上市价格的热图。设计考量:探讨了开发此解决方案过程中的设计考量。

目前,地理空间工作流程通常由数据加载、转换以及生产视觉洞察如地图、文本或图表组成。利用生成AI可以通过自主代理自动化这些任务。在本篇文章中,我们将讨论如何使用来自Amazon Bedrock的基础模型来驱动代理完成地理空间任务。这些代理能够执行多种任务,并利用Amazon Location Service提供的地理编码等位置服务回答问题。我们还将分享如何使用代理桥接Amazon Bedrock与Amazon Location的示例代码。此外,我们还会讨论建设这个系统的设计考量。

Amazon Bedrock是一个全自动化的服务,提供简易的API来获取文本、图像和嵌入的基础模型。Amazon Location则提供地图、地点和路由的API,数据来自可靠的第三方,如Esri、HERE、Grab和OpenStreetMap。如果您需要对基础设施有完全的控制权,可以使用Amazon SageMaker JumpStart,它提供了部署基础模型的能力并可以访问数百个模型。

解决方案概述

在大型语言模型LLMs的领域中,代理是一种能够自主推理并在LLM的帮助下完成任务的实体。这使得LLMs能够超越文本生成,进行对话和完成特定领域的任务。为了指导这种行为,我们使用了推理模式。根据研究论文大型语言模型是零shot推理者,LLMs在高层次的推理方面表现出色,尽管有知识截断的限制。

我们选择了Claude 2作为我们的Amazon Bedrock基础模型,目的是创建一个能处理地理空间任务的代理。其基本概念很简单:像地理空间数据科学家一样思考。任务是编写Python代码以读取数据、转换它,然后在有趣的地图中可视化。我们为此采用了名为计划和解决的提示模式。

使用计划和解决策略能够进行多步推理并制定高层次的计划作为第一步。这非常适合我们的加载、转换和可视化工作流程,也是我们代理将使用的高层次计划。这些子任务将分别发送给Claude 2解决。

我们设计了一个生成纽约的Airbnb上市价格热图的示例任务。为了计划完成这个任务的路径,代理需要理解数据集。代理需要知道数据集中的列和这些列中数据的类型。我们将从数据集中生成摘要,以便代理计划用户给出的任务在本案例中的热图生成。

前提条件

部署演示有几个前提条件。您需要访问一个AWS帐户,并拥有访问密钥或AWS身份与访问管理IAM角色,并具备使用Amazon Bedrock和Amazon Location的权限。您需要使用Amazon Location控制台创建一个地图、一个地点索引和一个Amazon Location API密钥。另外,您还需要访问安装了Docker的本地或虚拟环境。在我们的演示中,我们使用运行Amazon Linux并安装了Docker的Amazon Elastic Compute CloudAmazon EC2实例。

读取和总结数据

为了给代理提供上下文,我们提示Claude 2编写Python代码来读取数据并提供与我们的任务相关的摘要。以下是我们包含的一些提示,完整列表可在项目的promptspy文件中查找。

python你的角色:你是一个地理空间数据分析器,旨在分析任意地理空间数据集的数据架构。你的任务:你被提供了一组文件URL。你需要生成一个满足以下要求的Python函数: 使用geopandas读取每个文件。每个文件可以是CSV、形状文件或GeoJSON格式。 使用内置函数resolvedfileurl= getdatafileurl(fileurl sessionid)来获取可下载的URL。

根据这些提示,Claude 2生成了以下Python代码:

pythonimport geopandas as gpdimport pandas as pdimport numpy as np

def analyzegeospatialdata(fileurls) dataframes = [] for fileurl in fileurls resolvedfileurl = getdatafileurl(fileurl a5b188fe91f74f9292fec4030721a427 local) if fileurlendswith(csv) df = pdreadcsv(resolvedfileurl) elif fileurlendswith(shp) df = gpdreadfile(resolvedfileurl) elif fileurlendswith(parquet) df = pdreadparquet(resolvedfileurl) elif fileurlendswith(geojson) df = gpdreadfile(resolvedfileurl) else raise ValueError(不支持的文件格式)

    df = dfsample(n=3 randomstate=42)    dataframesappend({        fileurl fileurl         resolvedfileurl resolvedfileurl        dataframe df        columnnames list(dfcolumns)    })return dataframes

fileurls = [agent//airbnblistingspricecsv]dataframes = analyzegeospatialdata(fileurls)

agent//前缀告诉我们的CLI该文件存储在会话存储文件夹内。在运行CLI时,将创建一个geospatialagentsessionstorage文件夹以存储本地数据。代理现在识别上传的Airbnb数据以及其列名。接下来,让我们询问Claude以获取一些提示,使用这些列生成热图。我们将传递以下提示。

python你的角色:你是一个地理空间数据分析器,旨在分析任意地理空间数据集的数据架构。你的任务:你提供了一个包含一些行数据的表。你的任务是生成一个摘要,描述表中的数据,并遵循以下要求: 第一句话应该是基于用户行为的数据摘要。 如果表中没有几何栏位,第二句话应该注明可以用于生成geopandas几何列的列名。

Claude 2的回应是一个提示:

plaintext摘要:该表包含上市ID、名称、房东ID、房东名称、可以用于生成几何列的地点详细信息如邻里、纬度和经度。价格列包含上市价格,该价格可用于生成上市价格的热图。

计划解决方案

现在我们可以请求Claude 2起草一个高层次的计划。我们可以使用一个名为NetworkX的Python图形库来绘制解决我们问题的步骤。

和我们的最后提示类似,我们向Claude 2传递了一些要求:

python你的角色:你是地理空间数据科学家和专家Python开发者。你的任务:一系列连续的步骤。你的回应需要满足这些要求: 创建一个NetworkX图。 不允许有不相连的组件。 首先执行数据加载。 使用geopandas处理空间数据。

地理空间生成型 AI 与 Amazon Bedrock 和 Amazon Location Serv

根据这些提示,Claude 2生成了以下Python代码:

pythonimport networkx as nxG = nxDiGraph()

加载数据

Gaddnode(airbnbdataurl nodetype=data datapath=agent//airbnblistingspricecsv description=Airbnb上市价格数据的URL)Gaddnode(loaddata nodetype=operation operationtype=load description=加载Airbnb上市价格数据)Gaddedge(airbnbdataurl loaddata)Gaddnode(airbnbdf nodetype=data description=包含Airbnb上市价格的Pandas DataFrame)Gaddedge(loaddata airbnbdf)

转换数据

Gaddnode(addgeometry nodetype=operation operationtype=transform description=使用纬度和经度创建几何列)Gaddedge(airbnbdf addgeometry)Gaddnode(airbnbgdf nodetype=data description=添加几何列的GeoDataFrame)Gaddedge(addgeometry airbnbgdf)

可视化数据

Gaddnode(plotheatmap nodetype=operation operationtype=visualization description=生成上市价格的热图)Gaddedge(airbnbgdf plotheatmap)Gaddnode(priceheatmap nodetype=data description=显示Airbnb上市价格的热图)Gaddedge(plotheatmap priceheatmap)

在这个NetworkX图中,Claude 2将过程分为三个主要部分:

加载数据:从给定的URL将Airbnb上市价格导入到Pandas DataFrame中转换数据:基于纬度和经度坐标创建几何列可视化数据:生成热图以显示Airbnb上市的价格

这种方法允许对手头的地理空间任务进行清晰明确的实施。我们可以使用GraphViz可视化以下工作流程。

实施计划

现在Claude 2已经为我们提供了一个计划,是时候将其付诸实践。对于每一步,我们提醒Claude 2撰写对应的代码。为了让Claude 2保持专注,我们为每个任务提供高层次的要求。让我们深入了解Claude 2为每个阶段生成的代码。

加载数据

为了将Airbnb上市价格数据加载到Pandas DataFrame中,我们创建了一个提示并传递一些参数。“加载Airbnb数据”操作任务引用了我们之前创建的图中的加载数据节点。

python你的角色:你是一个地理空间数据科学家和专家Python开发者。操作任务:你需要生成一个Python函数以 加载Airbnb数据。你的回应需要满足以下要求: 函数定义为: loaddata(airbnbdataurl=agent//airbnblistingspricecsv)。 在进行空间连接时,保留至少1个几何列。 点功能需要导入shapely库。

根据这些提示,Claude 2生成了以下Python代码:

pythonimport pandas as pddef loaddata(airbnbdataurl=agent//airbnblistingspricecsv) 加载Airbnb上市价格数据 fileurl = getdatafileurl(airbnbdataurl sessionid storagemode) airbnbdf = pdreadcsv(fileurl) return airbnbdf

转换数据

接下来,Claude 2生成代码以使用纬度和经度将geometry列添加到DataFrame中。对于此提示,我们传递了以下要求:

python你的角色:你是一个地理空间数据科学家和专家Python开发者。操作任务:你需要生成一个Python函数以 从纬度/经度添加几何列。 你的回应需要满足以下要求: 函数定义为:addgeometry(filtereddf)。 函数返回行是:return airbnbgdf。

根据这些提示,Claude 2生成了以下Python代码:

pythonimport geopandas as gpdfrom shapelygeometry import Pointdef addgeometry(airbnbdf) 从纬度和经度添加几何列 airbnbdf[geometry] = airbnbdfapply(lambda row Point(row[longitude] row[latitude]) axis=1) airbnbgdf = gpdGeoDataFrame(airbnbdf geometry=geometry)

return airbnbgdf

可视化数据

最后,Claude 2使用pydeck生成一个热图可视化,该库是一个用于空间呈现的Python库。对于此提示,我们传递了以下要求:

python你的角色:你是一个地理空间数据科学家和专家Python开发者。操作任务:你需要生成一个Python函数以 根据价格生成热图。你的回应需要满足以下要求: 函数定义为:generateheatmap(airbnbgdf)。 函数返回行是:return airbnbheatmap。

根据这些提示,Claude 2生成了以下Python代码:

速云梯下载

pythonimport pandas as pdimport geopandas as gpdimport pydeck as pdk

def plotheatmap(airbnbgdf) 绘制上市价格的热图 priceheatmap = pdkDeck( mapstyle=locationmapstyle() initialviewstate=pdkViewState( latitude=airbnbgdf[latitude]mean() longitude=airbnbgdf[longitude]mean() zoom=11 pitch=50 ) layers=[ pdkLayer( HexagonLayer data=airbnbgdf getposition=[longitude latitude] radius=100 elevationscale=4 elevationrange=[0 1000] pickable=True extruded=True ) pdkLayer( ScatterplotLayer data=airbnbgdf getposition=[longitude latitude] getcolor=[200 30 0 160] getradius=200 ) ] )

# 保存热图HTMLpriceheatmaptohtml