本文将分享我如何利用腾讯位置服务Map Skills体系 + 大模型Agent + Tool Calling,零代码(低代码)构建一个自然语言驱动的智能出行助手——只需说一句“帮我规划一个青岛一日游”,它就能自动完成景点推荐、路线排序、时间编排、地图可视化全流程。
AI+地图的想象力远不止“查个位置”这么简单。本文结合腾讯位置服务提供的Map Skills工具集(JSAPI GL / WebService Skill)与大模型的Tool Calling能力,设计并实现了一款对话式智能出行助手。
文章将完整拆解:如何让大模型“学会”调用地图API?如何用自然语言驱动POI检索、路径规划、多点排序?如何将AI生成的行程一键渲染到腾讯地图上?附完整代码示例与Demo演示方案。
1.1 一个真实痛点
上周末,我计划带家人去青岛玩一天。打开地图App,我需要在多个App之间反复切换:
- 小红书查“青岛一日游攻略”
- 地图App搜“栈桥”“五四广场”“海水浴场”
- 手动计算每个景点之间的距离和时间
- 再找吃饭的地方……
为什么不能让AI帮我做完这一切?
1.2 腾讯位置服务Map Skills:打通AI与地图的“最后一公里”
腾讯位置服务推出的Map Skills体系,本质上是一套面向大模型的“地图能力工具箱”——它将复杂的地图API封装成大模型易于理解和调用的“技能函数”,让AI可以像人一样“学会”使用地图。
tencentmap-webservice-skill POI检索、逆地址解析、距离计算 地点搜索、地址解析
tencentmap-jsapi-gl-skill 地图渲染、标记点、路线绘制 地图SDK、路线规划
tencentmap-lbs-skill 周边推荐、区域洞察 周边搜索、热力图
核心思路:大模型负责“理解意图+决策调度”,Map Skills负责“执行具体地图操作”。两者结合,AI就能像人一样“操作”地图了。
2.1 整体架构图
┌─────────────────────────────────────────────────────────────┐ │ 用户自然语言输入 │ │ “帮我规划一个青岛一日游,从栈桥开始, │ │ 中午想在五四广场吃烤肉,下午去海水浴场” │ └─────────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 大模型Agent(意图识别层) │ │ - 解析目的地、时间偏好、餐饮需求 │ │ - 决定调用哪些Tool(POI检索/路线规划/距离计算) │ └─────────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Tool Calling(工具调度层) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐│ │ │ POI检索Tool │ │ 距离矩阵Tool │ │ 路线规划Tool ││ │ │ (webservice) │ │ (webservice) │ │ (jsapi) ││ │ └─────────────────┘ └─────────────────┘ └─────────────────┘│ └─────────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 腾讯位置服务API(执行层) │ │ 地点搜索 → 获取景点经纬度 → 距离计算 → 最优排序 → 路线生成 │ └─────────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 前端地图渲染(腾讯地图JSAPI GL) │ │ - 标注景点位置 │ │ - 绘制最优路线 │ │ - 展示行程卡片 │ └─────────────────────────────────────────────────────────────┘
2.2 技术选型
3.1 定义Tool(工具)—— 大模型可调用的“地图能力”
以POI检索为例,我们需要定义一个大模型能理解的Tool Schema:
# 使用LangChain定义Tool from langchain.tools import tool @tool def search_poi(keyword: str, city: str, limit: int = 10) -> list: """ 搜索指定城市的地点(POI)。 适用场景:用户问“附近有什么好吃的”“栈桥在哪里”“找一家咖啡厅”等。 Args: keyword: 搜索关键词,如“烤肉店”“五四广场”“咖啡厅” city: 城市名称,如“北京市”“上海市” limit: 返回结果数量,默认10 Returns: list: 地点列表,包含名称、地址、经纬度、评分等信息 """ import requests url = "https://apis.map..com/ws/place/v1/search" params = { "keyword": keyword, "boundary": f"region({city},1)", # 城市范围内搜索 "page_size": limit, "key": "YOUR_TENCENT_MAP_KEY" } response = requests.get(url, params=params) data = response.json() results = [] for item in data.get("data", []): results.append().get("lat"), "lng": item.get("location", {}).get("lng"), "category": item.get("category"), "tel": item.get("tel", "") }) return results
定义距离计算Tool:
@tool def calculate_distance(origin_lat: float, origin_lng: float, dest_lat: float, dest_lng: float) -> dict: """ 计算两个地点之间的驾车距离和时间。 适用场景:行程规划中需要排序景点、预估通勤时间。 """ url = "https://apis.map..com/ws/distance/v1/matrix" params = { "from": f"{origin_lat},{origin_lng}", "to": f"{dest_lat},{dest_lng}", "mode": "driving", "key": "YOUR_TENCENT_MAP_KEY" } response = requests.get(url, params=params) data = response.json() if data.get("status") == 0: elem = data["rows"][0]["elements"][0] return {"distance_km": round(elem["distance"] / 1000, 1), "duration_min": round(elem["duration"] / 60)} return {"error": "计算失败"}
3.2 Agent调度逻辑:大模型如何“思考”
当用户输入“帮我规划青岛一日游,想去栈桥、五四广场、海水浴场”,大模型的内部推理流程:
用户Query → 意图识别 → 工具调用序列 Step 1: 识别出“栈桥、五四广场、海水浴场”是POI名称 → 调用 search_poi("栈桥", "青岛市") → 调用 search_poi("五四广场", "青岛市") → 调用 search_poi("海水浴场", "青岛市") Step 2: 获取三个地点的经纬度后 → 需要计算两两之间的距离,确定最优游览顺序 → 调用 calculate_distance(栈桥, 五四广场) → 调用 calculate_distance(五四广场, 海水浴场) Step 3: 根据距离矩阵,推理出最优顺序(例如:栈桥→五四广场→海水浴场) → 生成行程方案 → 调用前端渲染函数,在地图上绘制路线
3.3 完整Agent代码示例(简化版)
python
import json from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI # 注册所有工具 tools = [search_poi, calculate_distance, get_route_plan] # 初始化大模型(支持Function Calling) llm = ChatOpenAI(model="gpt-4o", temperature=0.3) # 创建Agent agent = initialize_agent( tools, llm, agent=AgentType.OPENAI_FUNCTIONS, # 使用Function Calling verbose=True, handle_parsing_errors=True ) # 用户输入 user_input = """ 我想在青岛玩一天,想去栈桥、五四广场、海水浴场,中午想在五四广场附近吃烤肉。 帮我规划一个合理的行程顺序,并告诉我每个景点之间的交通时间。 """ # Agent自动执行 response = agent.invoke({"input": user_input}) print(response["output"])
Agent输出示例:
根据计算,推荐行程顺序如下: 1. 栈桥(9:00-12:00)- 建议上午游览,人相对较少 2. 五四广场(12:30-15:30)- 从栈桥驾车约20分钟(5.2公里) 3. 午餐:韩三胖烤肉(五四店),距离五四广场约200米,步行2分钟 4. 海水浴场(16:00-18:00)- 从五四广场驾车约40分钟(15公里) 总行车时间约60分钟,行程合理,不走回头路。
AI生成行程后,我们需要调用腾讯地图JSAPI GL将结果可视化。
4.1 地图初始化 + 标注景点
// 初始化地图 const map = new TMap.Map(document.getElementById('container'), { center: { lat: 36.0751, lng: 120.4128 }, // 宁夏路 zoom: 11 }); // 添加景点标记 const points = [ { name: '栈桥', lat: 36.0617, lng: 120.3182 }, { name: '五四广场', lat: 36.0628, lng: 120.3844 }, { name: '海水浴场', lat: 36.0567, lng: 120.3429 } ]; const markers = points.map(point => { return new TMap.MultiMarker({ map: map, geometries: [{ id: point.name, position: new TMap.LatLng(point.lat, point.lng), properties: { title: point.name } }] }); });
4.2 绘制路线
// 按最优顺序绘制路线 const routePoints = [ { lat: 36.0617, lng: 120.3182 }, // 栈桥 { lat: 36.0628, lng: 120.3844 }, // 五四广场 { lat: 36.0567, lng: 120.3429 } // 海水浴场 ]; // 调用腾讯地图路线规划API fetch(`https://apis.map..com/ws/direction/v1/driving?from=${routePoints[0].lat},${routePoints[0].lng}&to=${routePoints[1].lat},${routePoints[1].lng}&key=YOUR_KEY`) .then(res => res.json()) .then(data => { const route = data.result.routes[0]; const polyline = new TMap.MultiPolyline({ map: map, geometries: [{ path: route.polyline, // 腾讯地图返回的路线点串 color: '#3777FF', width: 4 }] }); });
本次Demo以“智能出行”为切入点,同样的技术架构可以扩展到更多场景:
lbs-skill + 热力图API
外卖配送 AI计算最优配送路线,预估送达时间 距离矩阵 + 路线规划
旅游推荐 AI根据用户偏好(价格、评分、类型)推荐景点 POI检索 + 评分筛选
多人汇合 AI计算多方出发点的最优汇合位置 距离矩阵 + 中心点计算
轨迹分析 AI识别异常停留点、推荐优化路径 轨迹纠偏 + 停留点识别
6.1 Tool Calling的“意图漂移”
问题:大模型有时会错误理解工具的参数。例如用户问“栈桥附近有什么好吃的”,模型可能调用search_poi(keyword="栈桥", city="青岛市")而不是keyword="餐厅"。
解决方案:
- 在Tool的description中写清楚适用场景。
- 增加一个意图分类器前置处理(小模型做初筛)。
6.2 地图API的并发限制
问题:免费版腾讯地图API有QPS限制,高并发场景会报错。
解决方案:
- 在Agent中增加重试机制和限流等待。
- 使用缓存:相同POI检索结果缓存1小时。
6.3 长行程的Token消耗
问题:一次复杂的行程规划可能调用10+次API,产生大量上下文Token。
解决方案:
- 使用结构化输出:让模型只返回关键字段(景点ID、顺序),而不是完整描述。
- 采用ReAct Agent:每次工具调用后只保留必要信息。
通过这次实践,我深刻体会到:
AI+地图不是“1+1=2”,而是指数级进化:大模型让地图从“被动查询”变成“主动规划”,用户体验跃升。
腾讯位置服务Map Skills是AI时代的地图基础设施:它把复杂的地图能力封装成AI可调用的“函数”,大幅降低了AI+地图的应用门槛。 自然语言将成为地图交互的新范式:未来用户不再需要学习复杂的App操作,只需要“说一句话”。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/280973.html