地圖感知 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/}
}