地图感知 AI 助手是一种对话界面,它利用结构化地图上下文(视口、选中地点、筛选条件和已获准位置)理解问题,并同时返回有依据的答案和地图操作。助手可以放置标记、框选结果、突出显示区域、请求路线或聚焦所选要素。应分离四项责任:宿主管理状态和权限,可信系统管理事实,空间工具执行地理计算,AI 层理解意图并提出受支持的操作。
下文介绍共享状态、操作词汇、渲染器适配器、Kaleidr Chat 连接、事实依据和常见错误。产品信息请参阅 Kaleidr Spatial AI。有关 SDK 架构,请参阅什么是 AI 地图 SDK?;有关渲染器挂载,请参阅 Mapbox、Google Maps 和 MapLibre 上的 AI 聊天;有关凭据和私有记录,请参阅地图 API 身份验证和用于 AI 地图工作流的私有位置数据。
助手要点
- 共享状态,而非像素: 传递边界、选择 ID、筛选条件和结果 ID;不要让模型把地图当作图片读取。
- 视口是上下文: 可见边界用于影响排序,除非用户要求“搜索此区域”。
- 仅使用语义操作: 输出
show_places或fit_places,绝不输出渲染器 JavaScript。- 标记来源: 用户平移和助手镜头移动不得再次触发模型。
- 以事实为依据: 营业时间、身份、几何和旅行时间来自权威系统。

地图感知 AI 助手有何不同?
地图旁的纯文本助手可能知道巴黎位于法国。地图感知产品还知道用户在地图中的操作:中心点、可见边界、缩放、选中要素、筛选条件、当前路线、先前结果、已获准位置,以及宿主应用状态。如果没有这份契约,“这些地点中哪个离酒店最近?”就有歧义。“这些”指当前结果集,“酒店”指选中的酒店或会话起点,“最近”指距离或旅行时间运算。有用的输出应包含答案、选中地点、地图聚焦和理由。
传统地图搜索从类别、半径和当前营业等结构化控件开始。当请求混合了难以用固定筛选表达的条件时,对话会很有帮助,例如“这附近适合与客户会面、安静且晚上 7 点后仍营业的咖啡馆”。AI 层可以理解类别、区域、偏好、时间和用途。地点身份、营业时间、几何、旅行时间、路线和资格仍应由确定性系统负责。让模型解读请求,但不要将其作为地理事实的唯一来源。
| 能力 | 地图旁的文本助手 | 地图感知 AI 助手 |
|---|---|---|
| 理解自然语言 | 是 | 是 |
| 知道可见地图区域 | 不一定 | 提供后可以 |
| 知道选中地点 | 不一定 | 是 |
| 使用当前筛选条件 | 通常不使用 | 可以 |
| 应用地图操作 | 通常有限 | 是 |
| 共享宿主状态 | 较弱 | 明确 |
团队应如何设计共享地图状态?
生产循环包括:用户问题、宿主上下文快照、意图理解、授权检索、空间计算、有依据的答案、经过验证的地图操作和渲染器更新。首先建立明确的状态契约,不要期待模型推断屏幕内容。只包含当前任务所需内容:选中要素 ID、当前结果 ID、相关筛选条件、必要时的可见边界、路线上下文、已获准起点,以及状态版本。设定优先级:选中地点优先于过期结果列表,用户指定的目的地优先于默认起点。
不要把视口当作隐藏的硬性筛选条件。可见边界可以排序或影响结果,但不应悄悄排除镜头外的一切。跨对话轮次保持稳定的地点 ID,使“第二家咖啡馆”在平移后仍指向同一记录。将地点身份与生成说明分离:宿主保存 place_id 和来源字段;语言模型可以解释地点为何合适,但不能编造新标识符。
双向状态强于单向聊天。用户的平移、缩放、选择和筛选会更新宿主状态存储,并标记为用户事件。显示地点、框选结果、打开地点或显示路线等助手操作则经过验证和渲染器适配器,并标记为助手事件。仅在下一轮需要时向模型返回新快照。循环保护机制应防止助手生成的镜头变化自动发起另一次模型请求。

如何让地图操作独立于渲染器?
设计一组小型操作词汇:显示地点、框选地点、打开地点、突出要素、显示路线和清除结果。用架构验证每项操作,检查对象权限,然后在渲染器适配器中将语义卡片转化为 Mapbox、Google Maps 或 MapLibre 调用。不要允许模型输出任意 JavaScript。OWASP 2025 年提示注入指南指出,检索或对话内容可能试图改变工具行为;即使模型遭到操纵,也不能让它运行未经批准的地图代码或检索未授权对象。
将临时 AI 结果图层与持久宿主数据分开,使对话可以清除而不会删除用户保存的地点。对于无结果和歧义状态,应返回明确的空集合并提出后续问题,而不是编造标记。排序应能根据授权字段解释。保留用户控制权:助手可以建议镜头移动,但用户之后的平移应优先。流式输出令牌以降低对话延迟,并在地点解析完成后再移动镜头,避免地图随不完整答案跳动。

Kaleidr Chat 如何连接到现有地图?
Kaleidr 当前的 Chat 文档称,SDK 可以连接到实时 Mapbox、MapLibre、Google Maps 或 Leaflet 地图,绘制已解析地点,并随着对话解析位置来调整镜头(Chat attach)。宿主继续渲染地图;Chat 添加对话式空间层。现有指南包括 Mapbox、Google Maps 和 MapLibre。浏览器使用带 ai 作用域的可发布密钥,并将其交换为与来源绑定的短期会话(Auth & Scopes)。无头模式省略 map 选项,适合测试或纯聊天界面。加载当前 kaleidr.js,然后在实时地图对象存在后挂载。
// myMap must already be a live supported map instance
const chatHandle = Kaleidr.mount("#map-chat", {
product: "chat",
publishableKey: "kld_pk_live_REPLACE_ME",
map: myMap,
enabled: true
});
私有业务数据仍应置于宿主授权和最小化检索之后(Endpoints)。用户位置应由用户选择启用。不要向浏览器或分析系统发送不必要的精确坐标或对话日志。缓存稳定的公开事实,而不是权限决定。衡量用户是否完成位置任务(选择地点、打开路线、将房产加入候选),而不是只统计聊天轮次。上线前测试共享状态竞态、地理歧义和恶意操作载荷。

团队应避免哪些错误?
| 错误 | 风险 | 更好的方法 |
|---|---|---|
| 把文本助手放在不感知状态的地图旁 | “这里”和“这个”含义不明 | 共享结构化地图状态 |
| 将视口用作隐性筛选 | 遗漏有效的附近结果 | 除非用户要求,否则把边界作为上下文 |
| 让模型输出渲染器 JavaScript | 注入和供应商锁定 | 语义操作 + 适配器 |
| 每次镜头移动都触发模型 | 反馈循环和成本 | 来源标签和循环保护 |
| 在文字中编造地点 ID | 重复或虚假记录 | 使用可信数据的稳定 ID |
| 第一个令牌出现时就移动镜头 | 地图抖动 | 等待地点解析完成 |
| 混合 AI 图层与用户保存数据 | 意外删除 | 分离临时结果图层 |
| 将服务器密钥发送到浏览器 | 凭据被盗 | 可发布密钥 + ai 作用域 |
| 跳过无结果状态 | 编造标记 | 空集合 + 后续问题 |
| 只衡量聊天量 | 虚荣指标 | 衡量地图任务完成情况 |
最终结论
当对话和实时地图共享一份明确的状态及操作契约时,地图感知 AI 助手才能正常工作。宿主管理权限和渲染器调用;可信数据系统管理身份及运营事实;空间引擎管理距离、路线和几何;语言模型在这些边界内理解意图、协调排序并解释结果。Kaleidr Chat 目前可将该对话层连接到宿主已经渲染的地图,并使用可发布浏览器密钥以及 Mapbox、Google Maps 和 MapLibre 指南。首先设计状态契约;聊天面板是最后的界面,而不是架构本身。
为现有地图添加 AI 聊天
将 Kaleidr Chat 连接到实时 Mapbox、Google Maps、MapLibre 或 Leaflet 地图,并让宿主继续作为正式渲染器。阅读 Kaleidr Chat 文档,了解挂载选项、无头测试和当前密钥作用域。
常见问题
什么是地图感知 AI 助手?
它是接收交互式地图结构化上下文(如选中地点、可见区域、筛选条件或起点)并返回有依据结果及受支持地图操作的对话界面。
它与纯文本助手有何不同?
纯文本助手主要交换文字。地图感知助手与地图共享状态,并协调地理检索、空间计算、标记、镜头移动、路线和选择。
AI 应该把地图当作图片读取吗?
对于应用状态,通常不应该。请提供边界、选中要素 ID、筛选条件和结果 ID。视觉理解可用于其他工作流,但应用状态应保持明确。
当前地图视口应该始终限制搜索结果吗?
不应该。可见视口可以是上下文而非硬性筛选。只有用户或产品明确调用“搜索此区域”时,才将其视为边界。
助手应该了解哪些地图状态?
通常只需当前任务所需状态:选中要素、当前结果 ID、相关筛选条件、必要时的可见边界、路线上下文和用户批准的起点。
AI 应如何控制地图?
优先使用 show_places、fit_places、open_place 或 show_route 等小型结构化操作词汇,验证后由宿主转换为渲染器调用。
模型应该输出 Mapbox 或 Google Maps JavaScript 吗?
不应作为主要控制机制。语义操作更安全,也不依赖特定渲染器。
地图感知 AI 助手能使用私有业务数据吗?
可以,但宿主必须验证用户身份,执行租户、对象和字段权限,并仅检索任务所需的授权记录。
Kaleidr Chat 能连接到现有地图吗?
可以。当前文档称 Chat 可连接到实时 Mapbox、MapLibre、Google Maps 或 Leaflet 地图,并绘制地点和调整镜头。
Kaleidr Chat 会替换我的地图渲染器吗?
不会。宿主应用继续渲染地图;Kaleidr Chat 添加对话式空间层。
Kaleidr Chat 在浏览器中使用什么密钥?
带 ai 作用域的可发布浏览器密钥。SDK 将其交换为与来源绑定的短期会话。
没有地图时,地图感知 AI 能工作吗?
对话层可以。当前 Chat 文档支持省略 map 选项的无头模式,适合测试或纯聊天界面。
应如何衡量地图感知 AI 助手?
衡量用户是否完成有用的位置任务:选择或保存地点、打开路线、将房产加入候选、选择门店、完成预订或其他应用特定结果。
参考资料
- Kaleidr. AI Maps You Can Talk To — Spatial AI. 访问日期:2026年8月20日。 https://kaleidr.com/ai
- Kaleidr. Attach Kaleidr AI to a Google Map. Kaleidr Developer Docs. 访问日期:2026年8月20日。 https://docs.kaleidr.com/guides/attach-ai-to-google-maps
- Kaleidr. Attach Kaleidr AI to a Mapbox Map. Kaleidr Developer Docs. 访问日期:2026年8月20日。 https://docs.kaleidr.com/guides/attach-ai-to-mapbox
- Kaleidr. Attach Kaleidr AI to a MapLibre Map. Kaleidr Developer Docs. 访问日期:2026年8月20日。 https://docs.kaleidr.com/guides/attach-ai-to-maplibre
- Kaleidr. Auth & Scopes. Kaleidr Developer Docs. 访问日期:2026年8月20日。 https://docs.kaleidr.com/platform-api/auth-and-scopes
- Kaleidr. Chat — Attach AI to Your Map. Kaleidr Developer Docs. 访问日期:2026年8月20日。 https://docs.kaleidr.com/sdk/chat-attach
- Kaleidr. Endpoints. Kaleidr Developer Docs. 访问日期:2026年8月20日。 https://docs.kaleidr.com/platform-api/endpoints
- Kaleidr. kaleidr.js — the Loader. Kaleidr Developer Docs. 访问日期:2026年8月20日。 https://docs.kaleidr.com/sdk/kaleidr-js
- Google. Load the Maps JavaScript API. Google Maps Platform documentation. 访问日期:2026年8月20日。 https://developers.google.com/maps/documentation/javascript/load-maps-js-api
- Mapbox. Get started with Mapbox GL JS using a CDN. Mapbox GL JS documentation. 访问日期:2026年8月20日。 https://docs.mapbox.com/mapbox-gl-js/guides/get-started/use-with-cdn/
- MapLibre. Display a map. MapLibre GL JS documentation. 访问日期:2026年8月20日。 https://maplibre.org/maplibre-gl-js/docs/examples/display-a-map/
- OWASP Gen AI Security Project. LLM01:2025 Prompt Injection. 访问日期:2026年8月20日。 https://genai.owasp.org/llmrisk/llm01-prompt-injection/
@misc{kaleidr_chat_attach_2026,
title = {Chat -- Attach AI to Your Map},
author = {{Kaleidr}},
note = {Kaleidr Developer Docs; accessed 20 August 2026},
url = {https://docs.kaleidr.com/sdk/chat-attach}
}
@misc{kaleidr_spatial_ai_2026,
title = {AI Maps You Can Talk To -- Spatial AI},
author = {{Kaleidr}},
note = {Accessed 20 August 2026},
url = {https://kaleidr.com/ai}
}
@misc{kaleidr_auth_scopes_2026,
title = {Auth and Scopes},
author = {{Kaleidr}},
note = {Kaleidr Developer Docs; accessed 20 August 2026},
url = {https://docs.kaleidr.com/platform-api/auth-and-scopes}
}
@misc{kaleidr_attach_mapbox_2026,
title = {Attach Kaleidr AI to a Mapbox Map},
author = {{Kaleidr}},
note = {Kaleidr Developer Docs; accessed 20 August 2026},
url = {https://docs.kaleidr.com/guides/attach-ai-to-mapbox}
}
@misc{kaleidr_attach_google_2026,
title = {Attach Kaleidr AI to a Google Map},
author = {{Kaleidr}},
note = {Kaleidr Developer Docs; accessed 20 August 2026},
url = {https://docs.kaleidr.com/guides/attach-ai-to-google-maps}
}
@misc{kaleidr_attach_maplibre_2026,
title = {Attach Kaleidr AI to a MapLibre Map},
author = {{Kaleidr}},
note = {Kaleidr Developer Docs; accessed 20 August 2026},
url = {https://docs.kaleidr.com/guides/attach-ai-to-maplibre}
}
@misc{kaleidr_endpoints_2026,
title = {Endpoints},
author = {{Kaleidr}},
note = {Kaleidr Developer Docs; accessed 20 August 2026},
url = {https://docs.kaleidr.com/platform-api/endpoints}
}
@misc{kaleidr_js_loader_2026,
title = {kaleidr.js -- the Loader},
author = {{Kaleidr}},
note = {Kaleidr Developer Docs; accessed 20 August 2026},
url = {https://docs.kaleidr.com/sdk/kaleidr-js}
}
@misc{google_maps_js_loader_2026,
title = {Load the Maps JavaScript API},
author = {{Google}},
note = {Google Maps Platform documentation; accessed 20 August 2026},
url = {https://developers.google.com/maps/documentation/javascript/load-maps-js-api}
}
@misc{mapbox_cdn_guide_2026,
title = {Get started with Mapbox GL JS using a CDN},
author = {{Mapbox}},
note = {Mapbox GL JS documentation; accessed 20 August 2026},
url = {https://docs.mapbox.com/mapbox-gl-js/guides/get-started/use-with-cdn/}
}
@misc{maplibre_display_map_2026,
title = {Display a map},
author = {{MapLibre}},
note = {MapLibre GL JS documentation; accessed 20 August 2026},
url = {https://maplibre.org/maplibre-gl-js/docs/examples/display-a-map/}
}
@misc{owasp_llm01_prompt_injection_2025,
title = {LLM01:2025 Prompt Injection},
author = {{OWASP Gen AI Security Project}},
note = {Accessed 20 August 2026},
url = {https://genai.owasp.org/llmrisk/llm01-prompt-injection/}
}