【腾讯位置服务开发者征文大赛】从零构建AI智能行程助手:MCP协议+大模型+地图服务实战
当AI学会“看地图”,出行规划只需一句话
一、前言:当AI遇到地图,出行体验正在被重新定义
想象这样一个场景:你对手机说“帮我规划一个周末北京一日游,要轻松一点的路线,中午想吃烤鸭”,AI自动生成行程、在地图上标注景点、规划路线、推荐餐厅,最后还能一键分享给同行好友。
这不再是科幻电影里的桥段。
2026年3月,腾讯地图V11.0大版本上线,首次推出面向“多人出行”场景的AI一站式行程管理功能。与此同时,腾讯位置服务联合CSDN发起了以“AI赋能,重塑地图智能新体验”为主题的开发者征文大赛,鼓励开发者将大模型能力与地图服务深度融合。
本文将从零开始,手把手带你构建一个AI智能行程助手——用自然语言驱动地图服务,让AI成为你的专属旅行规划师。
技术栈预览:
-
前端:HTML5 + 腾讯地图JavaScript API GL
-
AI能力:Claude API / 任意大模型(支持工具调用/Tool Calling)
-
地图服务:腾讯位置服务WebServiceAPI + MCP Server
-
核心亮点:自然语言→意图识别→工具调用→地图可视化
二、技术选型:为什么选择腾讯位置服务?
在开始编码之前,先聊聊技术选型的考量。
2.1 腾讯位置服务MCP Server:AI与地图的“翻译官”
MCP(Model Context Protocol)是当前AI应用开发中的热门协议,它解决了大模型与外部工具之间的“语言不通”问题。腾讯位置服务官方推出了基于MCP协议的MCP Server,开发者无需在本地部署服务,简单配置即可让大模型调用地图能力。
MCP Server中集成了以下核心工具:
| 工具名称 | 功能说明 | 使用场景 |
|---|---|---|
| placeSuggestion | 关键词输入提示 | 搜索地点名称 |
| placeSearchNearby | 周边地点搜索 | 查找附近餐厅/景点 |
| directionWalking/Bicycling/Driving | 步行/骑行/驾车路线规划 | 规划出行路线 |
| geocoder | 地址解析(地址→坐标) | 将文字地址转为经纬度 |
| reverseGeocoder | 逆地址解析(坐标→地址) | 将坐标转为具体地址 |
| weather | 天气查询 | 查询目的地天气 |
MCP的核心价值:大模型不需要知道如何调用HTTP API、如何解析JSON、如何处理错误——这些都由MCP Server封装好了。AI只需理解用户的自然语言意图,选择对应的工具,传入参数即可。
2.2 为什么不用纯前端方案?
如果只做纯前端的地图展示,直接调用JavaScript API就够了。但我们的目标是让AI理解用户意图并自动调用地图能力,这需要:
-
大模型的理解能力:解析用户自然语言,提取关键信息(地点、时间、偏好)
-
工具调用能力:根据意图选择合适的API并构造参数
-
结果整合能力:将地图数据与用户需求结合,生成可读性强的回复
因此,本文方案的核心是:大模型作为“大脑”,地图服务作为“手脚”。
三、核心实现:AI智能行程助手三步走
3.1 第一步:申请腾讯位置服务Key
在开始编码前,需要完成以下准备工作:
-
访问腾讯位置服务官网注册账号
-
进入控制台 → 应用管理 → 我的应用 → 创建应用
-
添加Key,务必勾选WebServiceAPI权限(这是调用MCP和WebAPI的基础)
-
如果是小程序开发,还需要在小程序后台配置request合法域名:
https://apis.map.qq.com(参考)
注意:MCP Server依赖WebServiceAPI,如果Key未开启对应权限,调用会失败。
3.2 第二步:接入MCP Server实现AI工具调用
这是整个项目的核心——让大模型能够“调用”地图服务。
MCP Server连接配置:
腾讯位置服务MCP Server已在腾讯云托管,采用SSE方式连接,无需本地部署。配置步骤如下:
javascript
// MCP Server连接配置示例(以Claude Desktop为例)
{
"mcpServers": {
"tencent-lbs": {
"url": "https://mcp.tencent.com/lbs/sse",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
配置完成后,大模型会自动识别MCP Server中提供的工具。当用户输入自然语言查询时,大模型会:
-
分析用户意图(是搜索周边?规划路线?查天气?)
-
选择对应的MCP工具
-
从用户输入中提取参数(地点、坐标、关键词等)
-
调用工具并获取结果
-
将结果整理成自然语言回复
以“搜索附近咖啡馆”为例:
用户输入:“附近有哪些适合办公的咖啡馆?”
大模型内部处理流程:
-
意图识别 → 周边搜索(placeSearchNearby)
-
参数提取 → keyword=“咖啡馆”,boundary=当前位置
-
调用MCP工具 → 返回POI列表
-
结果整合 → “为您找到以下3家咖啡馆:星巴克(距离200m,有插座)、Costa(距离350m,环境安静)...”
3.3 第三步:前端地图可视化
当AI返回POI数据或路线规划结果后,我们需要在地图上将其可视化展示。
初始化地图:
javascript
// 引入腾讯地图JavaScript API GL
// 在HTML中引入脚本
<script charset="utf-8" src="https://map.qq.com/api/gljs?v=1.exp&key=YOUR_KEY"></script>
// 初始化地图
const map = new TMap.Map(document.getElementById('container'), {
center: new TMap.LatLng(39.908823, 116.397470), // 北京天安门
zoom: 12
});
在地图上标注POI点:
javascript
// 添加标记点
const marker = new TMap.MultiMarker({
map: map,
geometries: [{
id: '1',
styleId: 'poi',
position: new TMap.LatLng(39.908823, 116.397470),
properties: {
title: '天安门广场'
}
}]
});
// 添加信息窗口
const infoWindow = new TMap.InfoWindow({
map: map,
position: new TMap.LatLng(39.908823, 116.397470),
content: '<div><strong>天安门广场</strong><br>开放时间:全天</div>'
}).open();
绘制路线:
javascript
// 路线规划结果可视化
const polyline = new TMap.MultiPolyline({
map: map,
geometries: [{
id: 'route',
styleId: 'route',
paths: routePoints, // 从路线规划API获取的坐标点数组
properties: {
distance: '5.2km',
duration: '20分钟'
}
}],
styles: {
'route': new TMap.PolylineStyle({
color: '#3777FF',
width: 6,
borderWidth: 2,
borderColor: '#FFFFFF'
})
}
});
四、完整Demo:一句话生成周末旅行计划
4.1 Demo场景描述
用户输入:“帮我规划一个杭州周末两日游,第一天想去西湖和灵隐寺,第二天想去西溪湿地,住宿在湖滨银泰附近,要轻松一点的节奏。”
AI处理流程:
Step 1 - 解析用户需求:
-
目的地:杭州
-
天数:2天
-
景点:西湖、灵隐寺(第一天)、西溪湿地(第二天)
-
住宿区域:湖滨银泰
-
节奏偏好:轻松(意味着每日景点不超过3个,预留充足休息时间)
Step 2 - 调用地图服务:
-
使用
placeSuggestion获取各景点的精确坐标 -
使用
directionWalking/Driving计算景点间的距离和耗时 -
使用
placeSearchNearby查找湖滨银泰附近的酒店推荐 -
使用
weather查询杭州周末天气
Step 3 - 生成行程并可视化:
-
按时间线组织行程
-
在地图上标注所有景点和酒店位置
-
绘制每日路线
-
生成可分享的行程卡片
4.2 Demo效果展示(截图示意)
注:以下为Demo运行效果的文字描述,实际运行截图请见文末链接。
界面一:对话输入界面
用户输入自然语言查询,AI实时解析意图并调用地图服务。
界面二:地图可视化界面
-
红色标记点为景点
-
蓝色标记点为酒店
-
彩色线条为每日行程路线(第一天用蓝色,第二天用绿色)
-
信息窗口展示景点简介、开放时间、建议游玩时长
界面三:行程总结卡片
-
每日行程安排(时间、地点、活动)
-
交通建议(步行/打车/公交)
-
美食推荐(周边餐厅)
-
天气提示(穿衣建议)
五、关键技术点解析
5.1 意图识别与参数提取
这是整个方案中最核心的技术难点。用户输入是千变万化的自然语言,如何从中准确提取结构化参数?
方案一:大模型原生能力
使用支持Function Calling/Tool Calling的大模型(如Claude 3.5、GPT-4o),定义好工具的参数schema,让模型自动完成参数提取。
javascript
// 定义周边搜索工具的参数schema
{
"name": "searchNearby",
"description": "搜索指定位置周边的POI",
"parameters": {
"type": "object",
"properties": {
"keyword": { "type": "string", "description": "搜索关键词,如咖啡馆、餐厅" },
"location": { "type": "string", "description": "中心点坐标,格式:lat,lng" },
"radius": { "type": "number", "description": "搜索半径,单位米,默认1000" }
},
"required": ["keyword"]
}
}
方案二:提示词工程
如果使用的模型不支持Function Calling,可以通过精心设计的提示词引导模型输出JSON格式的参数。
5.2 多人出行场景的汇合点推荐
这是腾讯地图V11.0重点优化的场景。实现思路:
-
获取所有参与者的出发位置
-
计算每两个人之间的中点
-
在中点附近搜索合适的汇合地点(咖啡馆、地铁站、商场等)
-
综合评估各候选点的可达性、便利性、环境评分
python
# 汇合点推荐算法伪代码
def recommend_meeting_point(locations):
# locations: 所有参与者的位置坐标列表
center = calculate_geometric_center(locations)
# 搜索中心点周边的POI
pois = search_pois_nearby(center, types=["cafe", "subway", "mall"])
# 计算每个POI到各出发点的总距离
for poi in pois:
total_distance = sum(distance(poi, loc) for loc in locations)
poi["total_distance"] = total_distance
# 按总距离排序,返回最优结果
return sorted(pois, key=lambda x: x["total_distance"])[0]
5.3 性能优化:路线规划缓存
在实际应用中,同一个起点和终点的路线规划结果短时间内不会变化。可以建立缓存机制:
-
Key:
起点坐标|终点坐标|出行方式 -
Value:路线规划结果(距离、耗时、路线点串)
-
TTL:1小时(考虑实时路况变化)
六、项目源码与运行指南
6.1 环境要求
-
Node.js 16+ (用于本地开发服务器)
-
现代浏览器(Chrome/Firefox/Safari最新版)
-
腾讯位置服务Key(需开启WebServiceAPI权限)
6.2 快速启动
bash
# 克隆项目 git clone https://github.com/yourname/ai-travel-planner.git # 安装依赖 npm install # 配置环境变量 # 创建.env文件,填入以下内容 echo "TENCENT_MAP_KEY=你的Key" >> .env echo "AI_API_KEY=你的大模型API Key" >> .env # 启动开发服务器 npm run dev
6.3 核心代码结构
text
ai-travel-planner/ ├── src/ │ ├── index.html # 主页面 │ ├── app.js # 主逻辑:AI对话+地图交互 │ ├── map-service.js # 腾讯地图服务封装 │ ├── mcp-client.js # MCP协议客户端 │ └── styles.css # 样式 ├── demo-screenshots/ # Demo截图 └── README.md # 项目说明
6.4 演示视频
暂无,后续将会上架微信公众号。请关注:第404号实验室或扫描下文二维码
七、踩坑经验与优化方向
7.1 踩过的坑
坑1:坐标格式不统一
腾讯位置服务API有的返回lat,lng字符串,有的返回{lat, lng}对象。建议统一封装转换函数。
坑2:MCP调用超时
某些大模型响应较慢,建议设置合理的超时时间(推荐30秒),并在前端展示“AI正在思考”的加载状态。
坑3:POI搜索结果过多
不加限制可能返回几十个结果,前端渲染压力大。建议:
-
限制返回数量(默认10个)
-
实现聚类展示(距离较近的POI合并为一个标记点)
7.2 后续优化方向
-
多人实时协同:支持多人同时编辑行程,实时同步位置和计划
-
个性化推荐:根据用户历史偏好(常去的餐厅类型、喜欢的景点风格)优化推荐算法
-
离线能力:缓存常用地图数据,弱网环境下仍可查看
-
语音交互:接入语音识别,实现完全免手持的对话式规划
八、总结
本文从零开始,完整实现了一个AI智能行程助手,核心流程如下:
text
用户自然语言输入
↓
大模型意图识别(MCP工具选择)
↓
调用腾讯位置服务API(POI搜索/路线规划/天气查询)
↓
结果整合与自然语言生成
↓
地图可视化展示(标记点/路线/信息窗口)
技术要点回顾:
-
MCP协议让大模型与地图服务的对接变得前所未有的简单
-
腾讯位置服务提供了从基础地图到高级路线规划的完整能力矩阵
-
AI+地图的想象空间远不止行程规划——商业选址、物流优化、应急调度等都是可探索的方向
参赛感受:
这次腾讯位置服务开发者征文大赛提供了一个难得的实战机会。从选题到开发再到文档撰写,整个过程让我对“AI+地图”这个方向有了更深的理解。正如活动主题所说,地图正在从单纯的“工具”进化为能思考、会对话的“大脑”。
下一步计划:
-
将项目完善为微信小程序版本(利用腾讯位置服务小程序SDK)
-
接入更多MCP工具(天气、交通、酒店预订等)
-
探索多人出行场景的更多玩法
如果你也对AI+地图感兴趣,欢迎一起交流讨论!
项目GitHub地址:评论区见
Demo演示视频:微信关注:第404号实验室
📌 参赛信息
-
本文参与【腾讯位置服务开发者征文大赛——AI赋能 重塑地图智能新体验】
-
活动时间:2026年3月30日 – 2026年5月20日
-
报名方式:点击[腾讯位置服务开发者征文大赛报名表]填写信息
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)