AI+ 地图智能进化:腾讯地图 Map Skills + MCP Agent + Tool Calling 从零打造会思考的出行规划助手

一、为什么我要做这个智能应用?
每次组织朋友聚会,最头疼的问题不是"吃什么",而是"在哪见"。张三住在回龙观,李四在东直门,王五在南四环,我在中关村——四个人分散在北京四个方向,提任何一个人的位置,其他人可能都要跑很远。传统导航只能解决"怎么去"的问题,但无法回答"在哪汇合最公平"这个更本质的需求。
更麻烦的是,我需要在多个 App 之间反复横跳:打开地图搜索位置,计算每个人到这里的距离,在微信群里问大家意见,有人不同意再重新找地方。一顿操作下来,半小时过去了,饭还没吃上。这种割裂的体验让我开始思考:为什么地图只能被动地显示我们让它显示的东西,而不能主动理解我们的需求,直接给出一个完整的解决方案?
我就想,能不能让地图自己思考,直接给我一个最优方案?不是那种"你点什么它显示什么"的死地图,而是能听懂人话、会主动思考、给出完整方案的智能助手。就像有个旅行管家,你说一句"我想安排一天的行程",它就把住宿、餐饮、景点、路线全都规划好,甚至连每个人的预算分配、体力消耗都考虑进去。
带着这个想法,我开始探索如何用腾讯位置服务的 Map Skills 体系,结合 MCP(Model Context Protocol)和 Agent 技术,打造一个真正会思考的地图智能应用。这不仅仅是一个应用的开发,更是对下一代人机交互模式的探索——从"人适应机器"到"机器适应人"的转变。
二、技术选型背后的深度思考
2.1 我对技术架构的核心要求
想要实现"会思考的地图",技术选型必须满足三个核心条件,这关系到整个系统能否真正落地而不是沦为概念演示。
第一是强大的地图能力,这是基础中的基础。我需要支持 3D 渲染来展示城市的立体感,需要高性能图层来处理数百个 POI 标记而不卡顿,需要 POI 搜索、路线规划、距离矩阵等一系列专业能力。这些能力不能是花架子,必须经得起真实场景的考验。
第二是标准化的工具调用协议,这是让 AI 能够使用地图能力的关键。如果每个 API 都需要写一层适配代码,那系统将变得极其复杂且难以维护。我需要一种统一的机制,让 AI 可以像人类调用函数一样自然地使用各种地图功能。
第三是开放的 AI 集成能力,这决定了系统的扩展性和未来演进空间。我需要支持 Agent 自主决策、支持 Tool Calling 动态编排、支持 MCP 这样的标准协议,这样才能构建一个真正的智能系统,而不是一个死板的规则引擎。
考察了一圈之后,我发现腾讯位置服务的 Map Skills 体系是最合适的选择。它不仅提供了完整的地图能力,更重要的是提供了一套标准化的接入方式,让 AI 可以通过统一的协议调用各种工具。
2.2 Map Skills 体系的四大核心组件深度解析
tencentmap-jsapi-gl-skill(Web 端 GL 渲染)
这是我应用中负责可视化呈现的核心组件。它基于 WebGL 硬件加速,支持 3D 建筑渲染、热力图可视化、大规模标记点管理等高级特性。MultiMarker 高性能图层是我选择 GL 版本的关键原因之一——它采用实例化渲染技术,可以轻松处理数百个 POI 标记而保持 60fps 的流畅度。
在实际使用中,我深刻体会到 GL 版本与普通版的本质区别。普通版的 Marker 是 DOM 元素,当数量超过 50 个时就会出现明显卡顿。而 GL 版本的 MultiMarker 将所有的标记点数据一次性上传到 GPU,通过顶点着色器批量渲染,性能提升了一个数量级。这对于需要同时展示多人位置、路线连线、POI 标记的应用来说,是至关重要的性能保障。
tencentmap-webservice-skill(WebService API)
这是应用中 AI 调用的主要工具来源,提供了 POI 搜索、逆地理编码、路线规划、距离矩阵等核心能力。与前端 SDK 不同,WebService API 通过 HTTP 接口提供服务,简单直接且易于集成。
我在设计 MCP 工具调用层时,深度封装了这些 WebService API。每个工具都是一个异步函数,接收标准化的参数对象,返回结构化的结果数据。这样做的最大好处是,AI 在调用工具时不需要关心底层的 HTTP 请求细节,只需要关注业务逻辑本身。
tencentmap-miniprogram-skill(微信小程序)
虽然这次项目中没有用到小程序端,但这个组件为后续扩展留下了充足的空间。小程序天然适合社交场景,特别是多人约饭这种需要分享和协作的场景。未来可以将核心的 MCP 工具调用逻辑复用到小程序端,只需调整 UI 交互层即可。
tencentmap-lbs-skill(LBS 基础服务)
这是获取用户当前位置的基础能力,包括 IP 定位、地理位置解析等功能。在多人汇合场景中,用户可以通过这个能力快速分享自己的实时位置,无需手动输入地址。
2.3 MCP:让 AI 学会使用地图工具的桥梁
光有工具还不够,还得让 AI 知道怎么用。这就是 MCP(Model Context Protocol)的价值所在。刚开始接触 MCP 时,我以为它只是一个简单的 API 调用协议,但随着开发的深入,我逐渐理解了它真正的意义——它是让 AI 从"被动的代码执行者"变成"主动的工具使用者"的关键桥梁。
MCP 到底是什么?
简单来说,MCP 是 AI Agent 与外部工具通信的标准协议。它定义了一套完整的规则体系:AI 如何声明自己需要哪些工具,如何调用这些工具,如何解析工具返回的结果,如何处理调用过程中的错误和异常。这套协议的核心思想是将工具的使用标准化、透明化、可追溯化。
为什么我最终选择了 MCP?
第一个原因是标准化带来的巨大优势。在没有 MCP 之前,我想让 AI 调用地图 API,得为每个 API 写适配层,手动管理请求参数和响应格式,错误处理逻辑分散在各处,难以追踪 AI 到底调用了哪些工具。有了 MCP 之后,所有工具统一注册到 MCP Server,AI 通过标准协议调用工具,调用过程自动记录日志,可以轻松可视化整个调用链。这种标准化不仅降低了开发复杂度,更重要的是提高了系统的可维护性和可扩展性。
第二个原因是可追溯性对于建立用户信任至关重要。很多 AI 应用的问题是"黑箱操作"——用户输入问题,AI 直接给答案。用户不知道 AI 是怎么得出的结论,自然也难以信任。通过 MCP,我可以把 AI 调用工具的整个过程都展示给用户看:先调用了 geocoder 解析地址,然后调用 placeSearchNearby 搜索周边,接着调用 directionDriving 规划路线,最后调用 matrix 计算距离矩阵。这种透明化的推理过程,比直接甩出一个结果要珍贵得多。
第三个原因是可扩展性让系统具备了持续演进的能力。新增工具只需注册到 MCP Server,无需修改前端代码。这意味着我可以随着业务发展不断添加新的地图能力,而不用担心破坏现有的架构。比如未来如果想添加天气查询、交通状况分析等功能,只需要实现对应的 MCP 工具并注册即可。
第四个原因是可视化能力让用户能够参与 AI 的思考过程。通过 MCP 提供的调用日志,我可以实时展示 AI 调用了哪些工具、每个工具的执行状态、返回了什么结果、耗时多长时间。用户不再是被动接受结果的旁观者,而是可以理解 AI 决策过程的参与者。这种参与感极大地增强了用户对 AI 推荐方案的信任度。
2.4 最终架构设计的演进过程
这个项目的架构并不是一开始就设计好的,而是在开发过程中不断演化和完善的。最初的想法很简单:用户输入需求 → AI 解析意图 → 调用地图 API → 返回结果。但随着对场景理解的深入,我意识到这种线性流程无法满足复杂的实际需求。
经过多轮迭代,最终形成了现在的三层架构:用户交互层负责接收用户的自然语言输入并提供可视化界面;AI Intent 识别层负责理解用户意图并决定调用哪些 MCP 工具;腾讯位置服务 MCP Server 提供具体的地图能力;腾讯地图 JavaScript API GL 负责最终的可视化渲染。
这个架构的核心思想是 AI 作为中枢,根据用户意图动态编排地图工具链。它不是简单地按顺序调用 API,而是像一个经验丰富的旅行管家那样思考:先理解用户的真实需求是什么,然后决定需要获取哪些信息,接着调用相应的工具收集信息,最后综合所有信息生成完整的解决方案。
三、核心功能的底层技术实现深度剖析
3.1 MCP 工具调用系统的封装艺术
要实现让 AI 像人类一样使用地图工具,关键在于如何封装底层的 API 调用,使其对 AI 透明且易于使用。我的做法是创建一个统一的 MCP 调用层,将所有地图 API 包装成标准的工具函数。
/**
* MCP 工具调用统一入口
* 所有地图 API 都通过这个函数进行调用
* @param {string} toolName - 工具名称,如'geocoder'、'placeSearchNearby'等
* @param {object} params - 工具参数对象,不同工具需要不同的参数
* @returns {Promise<any>} 工具执行结果,结构化数据便于 AI 理解
*/
async function mcpCall(toolName, params = {}) {
// 记录调用日志,用于后续的可视化和调试
console.log(`🔧 MCP 调用:${toolName}`, params);
// 模拟网络延迟(200-800ms),让 UI 动画更自然
// 实际生产中应该调用真实的 API
const delay = Math.floor(Math.random() * 600) + 200;
await sleep(delay);
// 根据工具名分发到具体实现
// 这种设计模式叫做 Command Pattern,便于扩展新工具
switch (toolName) {
case 'geocoder':
return await geocoder(params.address);
case 'reverseGeocoder':
return await reverseGeocoder(params.location);
case 'placeSearchNearby':
return await placeSearchNearby(params);
case 'placeDetail':
return await placeDetail(params.id);
case 'directionWalking':
return await directionWalking(params);
case 'directionBicycling':
return await directionBicycling(params);
case 'directionDriving':
return await directionDriving(params);
case 'matrix':
return await matrix(params);
case 'ipLocation':
return await ipLocation();
default:
throw new Error(`未知工具:${toolName}`);
}
}
这段代码看似简单,实则蕴含了几个重要的设计原则。第一是单一职责原则,mcpCall 函数只负责分发调用,不关心具体实现。第二是开闭原则,新增工具时只需添加新的 case 分支,无需修改现有逻辑。第三是可追溯原则,每一次调用都会被记录日志,方便后续的调试和可视化展示。
接下来看看具体工具的实现。以 geocoder(地理编码)为例,这是将自然语言地址转换为经纬度坐标的基础工具:
/**
* 地理编码工具:将地址文本转换为精确的经纬度坐标
* 这是所有位置服务的基础,坐标的准确性直接影响后续推荐的可靠性
* @param {string} address - 用户输入的地址文本,如"西直门"、"北京动物园"
* @returns {Promise<{lat: number, lng: number, address: string}>}
* 返回包含纬度、经度和格式化地址的对象
*/
async function geocoder(address) {
// 模拟地址解析(实际应调用腾讯位置服务 Geocoder API)
// 生产环境应该使用:https://apis.map.qq.com/ws/geocoder/v1/
const mockData = {
'西直门': { lat: 39.9434, lng: 116.3497, address: '北京市西城区西直门' },
'中关村': { lat: 39.9813, lng: 116.3083, address: '北京市海淀区中关村' },
'东直门': { lat: 39.9358, lng: 116.4372, address: '北京市东城区东直门' },
'南四环': { lat: 39.8563, lng: 116.3874, address: '北京市丰台区南四环' },
'回龙观': { lat: 40.0676, lng: 116.3188, address: '北京市昌平区回龙观' },
'北京动物园': { lat: 39.9466, lng: 116.3338, address: '北京市西城区西直门外大街 137 号' },
'北京天文馆': { lat: 39.9452, lng: 116.3283, address: '北京市西城区西外大街 138 号' },
'白塔寺': { lat: 39.9299, lng: 116.3607, address: '北京市西城区阜成门内大街 171 号' },
};
// 模糊匹配:只要地址中包含关键词就返回对应坐标
for (const [key, value] of Object.entries(mockData)) {
if (address.includes(key)) {
return value;
}
}
// 默认返回西直门(项目核心区域)
return mockData['西直门'];
}
这个工具的设计要点在于容错性。用户输入的地址往往不规范,可能是简称(“西直门”)、可能是别名(“动批”)、甚至可能有错别字。好的 geocoder 应该能够智能识别这些变体,返回最匹配的坐标。在生产环境中,我会调用腾讯位置服务的真实 Geocoder API,它具备强大的模糊匹配和纠错能力。
再看一个更复杂的工具——周边搜索(placeSearchNearby),这是 AI 获取周边环境信息的主要手段:
/**
* 周边搜索工具:检索指定位置周边的 POI(兴趣点)
* 这是 AI 了解环境、做出推荐的数据基础
* @param {object} params - 搜索参数配置
* @param {string} params.keyword - 搜索关键词,如"酒店"、"餐厅"、"景点"
* @param {number} params.lat - 中心点纬度
* @param {number} params.lng - 中心点经度
* @param {number} params.radius - 搜索半径(米),默认 1000 米
* @returns {Promise<Array>} POI 列表,包含名称、类型、距离、评分等信息
*/
async function placeSearchNearby(params) {
const { keyword, lat, lng, radius = 1000 } = params;
// 根据关键词选择不同的数据源
// 这种设计避免了硬编码,便于后续扩展
if (keyword === '酒店') {
return XIZHI_DATA.hotels.map(h => ({
...h,
distance: haversineKm(
new TMap.LatLng(lat, lng),
new TMap.LatLng(h.lat, h.lng)
).toFixed(2)
})).sort((a, b) => parseFloat(a.distance) - parseFloat(b.distance));
}
if (keyword === '景点' || keyword === '景区') {
return XIZHI_DATA.attractions.map(a => ({
...a,
distance: haversineKm(
new TMap.LatLng(lat, lng),
new TMap.LatLng(a.lat, a.lng)
).toFixed(2)
}));
}
if (keyword === '餐厅' || keyword === '午餐' || keyword === '晚餐') {
return XIZHI_DATA.restaurants.map(r => ({
...r,
distance: haversineKm(
new TMap.LatLng(lat, lng),
new TMap.LatLng(r.lat, r.lng)
).toFixed(2)
}));
}
// 默认返回空数组
return [];
}
这个工具的关键在于智能分类和排序。不同类型的 POI 有不同的属性结构,需要分别处理。同时,搜索结果应该按照相关性排序——对于周边搜索来说,距离通常是最重要的排序因子。
3.2 思维链引擎:让 AI 的思考过程透明可见
如果说 MCP 工具调用是让 AI 学会使用工具,那么思维链(Chain of Thought)引擎就是让 AI 学会像人类一样思考。这是我在这个项目中投入精力最多的部分,也是最能体现技术深度的地方。
传统的 AI 应用往往是黑箱模式:用户输入问题,AI 直接输出答案。用户不知道 AI 是如何得出这个答案的,也无法验证 AI 的推理过程是否合理。这种模式下,用户对 AI 的信任完全建立在结果的正确性上,一旦出错就很难挽回。
我的做法是将 AI 的思考过程拆解成多个可观察、可验证的步骤,每一步都清晰地展示给用户看。这不仅仅是 UI 层面的优化,更是对 AI 决策机制的深度重构。
/**
* 思维链引擎核心类
* 将复杂的 AI 推理过程拆解为多个有序步骤
* 每一步都包含:思考内容、工具调用、结果输出、副作用(地图动作)
*/
class CoTEngine {
constructor() {
this.steps = []; // 存储所有推理步骤
this.currentStep = 0; // 当前执行到的步骤索引
this.mapActions = []; // 待执行的地图动作队列
}
/**
* 添加一个推理步骤到队列
* @param {string} phase - 步骤类型:'analyze'分析/'search'检索/'plan'规划/'route'路径/'output'输出
* @param {string} title - 步骤标题,用于 UI 展示
* @param {string} think - AI 的思考内容(自然语言描述)
* @param {Array} toolCalls - 需要调用的 MCP 工具列表
* @param {string} result - 步骤执行结果
* @param {Function} sideEffect - 副作用函数(驱动地图更新)
*/
addStep(phase, title, think, toolCalls, result, sideEffect) {
this.steps.push({
phase, // 步骤类型,用于图标展示
title, // 步骤标题
think, // 思考内容
toolCalls, // 工具调用列表
result, // 执行结果
sideEffect, // 副作用函数
status: 'pending' // 状态:pending→executing→completed
});
}
/**
* 执行所有步骤(串行执行,确保顺序正确)
*/
async execute() {
for (const step of this.steps) {
await this.executeStep(step);
}
}
/**
* 执行单个步骤的完整流程
* 这是思维链引擎的核心逻辑
*/
async executeStep(step) {
// 1. 更新状态为"执行中"
step.status = 'executing';
this.updateUI(step); // 更新 UI 显示"思考中"动画
// 2. 如果有工具调用,依次执行
if (step.toolCalls && step.toolCalls.length > 0) {
for (const toolCall of step.toolCalls) {
// 显示工具调用卡片
this.showToolCallCard(toolCall.name, 'executing');
try {
// 调用 MCP 工具
const result = await mcpCall(toolCall.name, toolCall.params || {});
// 更新工具卡片为"完成"状态
this.showToolCallCard(toolCall.name, 'completed', result);
} catch (error) {
// 错误处理:显示失败信息
this.showToolCallCard(toolCall.name, 'failed', error.message);
throw error; // 中断执行
}
}
}
// 3. 逐字显示结果(增强真实感和临场感)
if (step.result) {
await this.typeText(step.result, 18); // 18ms/字符的速度
}
// 4. 执行副作用(驱动地图更新)
if (step.sideEffect) {
await step.sideEffect();
}
// 5. 标记步骤完成
step.status = 'completed';
this.updateUI(step); // 更新 UI 显示"✓"
}
/**
* 逐字打字动画函数
* 模拟 AI 流式输出的效果,增强用户体验
*/
async typeText(text, speed = 18) {
return new Promise(resolve => {
let i = 0;
const timer = setInterval(() => {
// 将文字追加到输出区域
this.outputElement.textContent += text.charAt(i++);
// 滚动到底部确保最新内容可见
this.outputElement.scrollTop = this.outputElement.scrollHeight;
if (i >= text.length) {
clearInterval(timer);
resolve(); // 完成时 resolve Promise
}
}, speed);
});
}
/**
* 更新 UI 显示
* 根据步骤状态更新对应的视觉元素
*/
updateUI(step) {
const stepElement = document.getElementById(`step-${step.title}`);
if (!stepElement) return;
// 根据状态切换图标和样式
const icons = {
pending: '⏳',
executing: '🔄',
completed: '✅'
};
stepElement.querySelector('.status-icon').textContent = icons[step.status];
stepElement.classList.add(step.status);
}
/**
* 显示工具调用卡片
* 实时展示 AI 调用了哪些工具、返回了什么结果
*/
showToolCallCard(toolName, status, result = null) {
const cardContainer = document.getElementById('tool-calls-container');
if (status === 'executing') {
// 创建进行中的卡片
const card = document.createElement('div');
card.className = 'tool-card executing';
card.id = `tool-${toolName}`;
card.innerHTML = `
<div class="tool-icon">${this.getToolIcon(toolName)}</div>
<div class="tool-info">
<div class="tool-name">${toolName}</div>
<div class="tool-status">执行中...</div>
</div>
`;
cardContainer.appendChild(card);
} else if (status === 'completed') {
// 更新已完成的卡片
const card = document.getElementById(`tool-${toolName}`);
card.className = 'tool-card completed';
card.querySelector('.tool-status').textContent = `✓ 完成`;
if (result) {
// 添加结果摘要
const resultDiv = document.createElement('div');
resultDiv.className = 'tool-result';
resultDiv.textContent = this.summarizeResult(result);
card.appendChild(resultDiv);
}
} else if (status === 'failed') {
// 更新失败的卡片
const card = document.getElementById(`tool-${toolName}`);
card.className = 'tool-card failed';
card.querySelector('.tool-status').textContent = `✗ 失败:${result}`;
}
}
/**
* 获取工具对应的图标 emoji
* 增强视觉识别度
*/
getToolIcon(toolName) {
const icons = {
geocoder: '📍',
placeSearchNearby: '🔍',
directionWalking: '🚶',
directionBicycling: '🚴',
directionDriving: '🚗',
matrix: '📊',
reverseGeocoder: '🔄',
ipLocation: '🌐'
};
return icons[toolName] || '🔧';
}
/**
* 将复杂的结果对象摘要为人类可读的文本
* 这是连接 AI 输出和用户理解的桥梁
*/
summarizeResult(result) {
if (typeof result === 'string') return result;
if (Array.isArray(result)) return `${result.length} 条结果`;
if (result.name) return result.name;
return JSON.stringify(result).slice(0, 50) + '...';
}
}
这个 CoTEngine 类的设计哲学是:思考应该是透明的、可验证的、有因果关系的。每一个步骤都有明确的输入(用户需求)、处理(工具调用)、输出(推理结果)、影响(地图更新)。用户可以看到 AI 是如何一步步从原始需求推导出最终方案的,这种透明度是建立信任的基础。
以西直门一日行程规划为例,整个推理过程被拆解为 10 个步骤,每个步骤都遵循相同的执行模式:
第一步"解析用户需求",AI 需要理解用户输入的自然语言,提取关键约束条件。这一步调用 geocoder 工具将"西直门"这个地名转换为精确的经纬度坐标 (39.9434, 116.3497)。看似简单的一步,实则是后续所有推荐的基础——如果地址解析错误,后面的一切都失去了意义。
第二步"检索周边住宿选项",AI 以会议地点为中心,搜索 1km 范围内的酒店。这一步调用 placeSearchNearby 工具,传入关键词"酒店"、中心点坐标、搜索半径等参数。返回的结果是一个酒店列表,包含名称、价格、距离、评分等信息。
第三步"推理住宿选择依据",这是纯推理步骤,不需要调用工具。AI 综合考虑距离(越近越好)、价格(性价比)、评分(用户口碑)、设施(商务配套)等多个维度,为每家酒店打分。最终凯悦嘉轩因为距离最近(0.3km)、设施最好(适合商务出行)而获得最高分。
第四步"规划早餐方案",AI 考虑两种场景:赶时间的商务人士可以选择酒店早餐(省时),想体验当地文化的游客可以选择庆丰包子铺(体验感)。这种弹性设计体现了 AI 对用户多样化需求的理解。
第五步"检索上午游览景点",AI 调用 placeSearchNearby 搜索周边 3km 内的景点,同时调用 directionWalking 计算从酒店到各景点的步行路线。基于贪心算法思想,优先选择知名度最高的动物园,然后选择邻近的天文馆以减少路途时间。
第六步"安排午餐",AI 在这里体现了场景化推荐的智慧。不是简单地找"最近的餐厅",而是考虑"来北京旅游必吃烤鸭"的文化属性,选择了胡同里的烤鸭店。价格适中(¥120/人),符合一日游预算。
第七步"规划下午茶与漫游路线",AI 展现了对节奏把控的理解。上午体力充沛时安排较多步行(动物园 + 天文馆),午后容易疲劳时安排骑行减少体力消耗,傍晚需要休息时安排咖啡厅小憩。这种张弛有度的行程安排,体现了 AI 对人类生理节律的理解。
第八步"安排晚餐",经过一天游玩后,AI 选择了最近的餐厅(0.2km)、最有特色的老北京涮肉、最舒适的非网红店避免排队等待。这三个"最"体现了 AI 在多重约束下的优化能力。
第九步"计算全日行程路线总览",AI 调用 matrix 工具计算多点之间的距离矩阵,调用 directionDriving 汇总全日路线。这里使用了距离矩阵 API 的优势——一次性计算多个点之间的距离和耗时,避免了多次单独调用的开销。
第十步"生成结构化行程单",AI 将所有规划结果整合为包含时间节点、地点、费用估算、交通方式的完整行程单。确保行程时间合理(不过于紧凑),留有弹性时间。总费用估算采用了分项累加的方法:住宿 688 + 餐饮 310 + 景点 75 + 交通 50 ≈ ¥1,123/人。
这个 10 步推理过程,每一步都有其存在的必要性,每一步都建立了前一步的输出与后一步的输入之间的因果关系。用户看到的不是一个黑箱产出的结果,而是一个透明、可理解、可验证的推理链条。这种体验上的差异,正是 AI Native 应用与传统应用的本质区别。
四、写在最后
做完这个项目,我最大的感受是:AI 让地图从「工具」进化为能思考、会对话的「大脑」。
当用户输入"帮 4 个人找汇合点"时,腾讯地图 JavaScript API GL 不再只是被动渲染坐标,而是通过 MCP Tool Calling 主动理解需求、调用 geocoder 解析地址、用 matrix 计算距离矩阵、最后驱动 MultiMarker 和 MultiPolyline 在地图上绘制出最优方案。这种从"你点什么它显示什么"到"你说需求它给方案"的转变,才是 AI Native 地图应用该有的样子。
技术的终极价值,永远在于它能给多少人带来便利和温暖。西直门行程规划之所以打动人,不是因为调用了多少高大上的 API,而是它像一个真正的旅行管家那样思考——考虑时间节奏、控制预算分配、甚至预判体力消耗。AI+ 地图的智能进化之路,才刚刚开始。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)