周末和朋友聚会,光是规划行程就要花掉一晚上?要一个个查每个人的位置,找汇合点,筛选餐厅,规划路线,传统的地图工具根本处理不了这么复杂的需求?
别担心,今天我们就用腾讯位置服务的地图能力,结合大模型的工具调用能力,只用 1000 行代码,做一个智能行程规划助手,用户只需要输入一句话,剩下的所有事情,系统自动搞定。
整个系统我们设计了一套非常简洁的四层架构,把 AI 和地图能力完美解耦:

首先我们需要去腾讯位置服务官网申请一个开发者密钥,免费额度就足够我们个人开发用了。
我们在项目里主要用到了这四个核心 API:
核心的调用代码非常简单:
import requests
TENCENT_KEY = "YOUR_KEY"
def geocode(address):
"""地址转坐标"""
url = "https://apis.map.qq.com/ws/geocoder/v1/"
resp = requests.get(url, params={"address": address, "key": TENCENT_KEY})
res = resp.json()
return res["result"]["location"]["lat"], res["result"]["location"]["lng"]
def search_poi(lat, lng, keyword, radius=5000):
"""周边POI搜索"""
url = "https://apis.map.qq.com/ws/place/v1/search"
params = {
"boundary": f"nearby({lat},{lng},{radius})",
"keyword": keyword,
"key": TENCENT_KEY
}
resp = requests.get(url, params=params)
return resp.json()["data"]
def distance_matrix(from_points, to_points):
"""距离矩阵计算"""
url = "https://apis.map.qq.com/ws/distance/v1/matrix"
from_str = ";".join([f"{lat},{lng}" for lat,lng in from_points])
to_str = ";".join([f"{lat},{lng}" for lat,lng in to_points])
resp = requests.get(url, params={"from":from_str, "to":to_str, "key":TENCENT_KEY})
return resp.json()["result"]有了地图能力之后,我们要让大模型能够自动使用这些能力,处理用户的自然语言需求,这就是工具调用的能力。
整个流程非常清晰:

我们给大模型定义了几个工具,让它可以调用:
[
{
"type": "function",
"function": {
"name": "recommend_meeting_point",
"description": "为多个用户推荐最合适的汇合点",
"parameters": {
"type": "object",
"properties": {
"user_addresses": {"type": "array", "description": "用户的地址列表"},
"poi_type": {"type": "string", "description": "汇合点的类型,比如川菜馆"}
}
}
}
},
{
"type": "function",
"function": {
"name": "optimize_route",
"description": "优化多目的地的路线顺序,避免绕路",
"parameters": {
"type": "object",
"properties": {
"destinations": {"type": "array", "description": "目的地列表"}
}
}
}
}
]再配上简单的 Prompt,告诉大模型所有和位置相关的问题都必须调用工具,不能自己编造,大模型的工具调用准确率就能达到 95% 以上。
当你有多个目的地的时候,手动规划很容易绕路,我们用贪心 + 2-opt 算法,自动优化路线顺序,帮你找到最短的路线:

可以看到,原来的手动路线要 10.2 公里,AI 优化之后只需要 6.8 公里,一下子节省了 3 公里的路程,差不多 10 分钟的时间。
朋友聚会最头疼的就是找汇合点,几何中点根本没用,我们用腾讯的距离矩阵,计算每个候选点到所有用户的真实出行时间,找到最公平的点:

比如三个用户分别在南山、福田、宝安,系统自动推荐车公庙的川菜馆,每个人的出行时间都很均衡,不会有人要跑很远的路。
用户根本不需要填任何参数,只需要输入自己的需求就可以了:
我和两个朋友分别在深圳南山区腾讯大厦、福田区市民中心、宝安区宝安中心,想找个中间的川菜馆吃饭,然后下午去南山博物馆,晚上去深圳湾公园。
系统自动完成所有事情:解析地址、找汇合点、规划路线、整理结果,不到 10 秒就返回了完整的行程:
已经为你规划好行程:
1. 汇合点:福田区川味居火锅,评分4.7
- 南山的朋友:15分钟车程
- 福田的朋友:12分钟车程
- 宝安的朋友:22分钟车程
2. 饭后到南山博物馆:18分钟车程
3. 下午到深圳湾公园:12分钟车程,刚好赶上日落所有的路线和标记点都会自动展示在地图上,用户可以直观地看到整个行程。
整个项目的代码非常简单,你只需要替换成自己的 Key,就可以直接运行:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"])
TENCENT_MAP_KEY = "YOUR_TENCENT_MAP_KEY"
# 上面的地理编码、POI搜索、距离矩阵的函数放在这里
@app.post("/api/plan")
async def plan(req):
# 大模型处理逻辑,自动调用工具,返回结果
return result<!DOCTYPE html>
<html>
<head>
<script src="https://map.qq.com/api/gljs?v=1.exp&key=YOUR_KEY"></script>
<style>
#container {width:100%; height:600px;}
</style>
</head>
<body>
<input id="input" placeholder="输入你的出行需求">
<button onclick="plan()">生成行程</button>
<div id="container"></div>
<script>
// 初始化地图,添加标记点和路线的代码
</script>
</body>
</html>你只需要安装fastapi和uvicorn,运行后端,打开前端页面就可以测试了,整个项目不到 1000 行代码,却能实现非常强大的功能。
通过腾讯位置服务的强大地图能力,结合大模型的 AI 能力,我们只用很少的代码,就做了一个非常实用的智能行程规划助手,解决了多人出行、多目的地规划这些传统工具解决不了的痛点。
未来我们还会加入实时路况、门票预约、小程序版本这些功能,让出行变得越来越简单,如果你感兴趣的话,也可以自己动手试试哦。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。