旅游规划小助手:基于位置信息的个性化行程推荐实现
1. 引言
随着移动互联网和智能设备的普及,用户对个性化服务的需求日益增长。在旅游领域,传统的行程规划方式往往依赖于通用攻略或人工定制,难以满足个体差异化的兴趣偏好与实时动态需求。如何利用大模型能力结合用户的位置信息,提供智能化、个性化的行程推荐,成为提升用户体验的关键突破口。
2025年8月,OpenAI正式发布了其首个开源大语言模型系列——gpt-oss,包含gpt-oss-20b和gpt-oss-120b两个版本。其中,gpt-oss-20b凭借其3.6B激活参数量与128K上下文窗口,在保持高性能推理的同时显著降低了部署门槛,特别适合本地化、轻量化应用场景。本文将基于该模型,结合vLLM加速推理与Open-WebUI交互界面,构建一个“旅游规划小助手”系统,实现实时、精准的个性化行程推荐。
本项目依托Compshare平台提供的4090D双卡vGPU环境(单卡显存48GB),使用预置镜像gpt-oss-20b-WEBUI进行快速部署,充分发挥开源模型在私有化场景下的灵活性与可控性优势。
2. 系统架构设计
2.1 整体架构概览
本系统采用模块化设计,整体分为四个核心组件:
- 前端交互层:通过Open-WebUI提供图形化对话界面,支持用户输入起点、目的地、时间预算、兴趣标签等条件。
- 大模型推理层:运行gpt-oss-20b模型,负责理解用户意图、生成自然语言响应,并调用外部工具函数获取结构化数据。
- 位置服务接口层:集成高德地图API或Google Maps API,用于获取景点坐标、交通耗时、开放时间等真实地理信息。
- 业务逻辑处理层:解析模型输出,执行路径优化算法,生成最终可展示的行程安排。
graph TD A[用户输入] --> B(Open-WebUI) B --> C[gpt-oss-20b 模型] C --> D{是否需要调用工具?} D -- 是 --> E[调用地图API] E --> F[返回结构化数据] F --> C D -- 否 --> G[生成行程建议] G --> H[格式化输出] H --> I[前端展示]2.2 核心技术选型依据
| 技术组件 | 选型理由 |
|---|---|
| gpt-oss-20b | 开源可控、性能接近商业模型、支持长上下文(128K)、适合本地部署 |
| vLLM | 提供PagedAttention机制,显著提升吞吐量,降低延迟 |
| Open-WebUI | 轻量级Web界面,支持多模态交互,易于集成 |
| 高德地图API | 国内覆盖全面,提供POI搜索、路线规划、步行导航等完整功能 |
| FastAPI | 构建轻量API服务,连接大模型与外部系统 |
3. 关键功能实现
3.1 环境准备与模型部署
首先在Compshare平台上完成镜像部署:
# 登录并启动 gpt-oss-20b-WEBUI 镜像 # 自动加载 vLLM + Ollama + Open-WebUI 组合环境 # 查看模型状态 ollama list # 确认模型已加载 ollama run gpt-oss:20b "你好,请简要介绍自己。"提示:若需自定义系统行为,可通过
.modelfile修改系统提示词(SYSTEM prompt)以限定角色为“旅游规划专家”。
3.2 工具调用机制设计
为了让大模型具备获取真实世界数据的能力,我们定义了一个标准函数调用接口,使其能主动请求外部服务。
定义工具函数 schema
functions = [ { "name": "get_nearby_attractions", "description": "根据经纬度和半径查找附近的景点", "parameters": { "type": "object", "properties": { "latitude": {"type": "number", "description": "纬度"}, "longitude": {"type": "number", "description": "经度"}, "radius": {"type": "integer", "description": "搜索半径(米)", "default": 3000}, "keywords": {"type": "string", "description": "关键词过滤,如博物馆、公园"} }, "required": ["latitude", "longitude"] } }, { "name": "get_route_duration", "description": "获取两点之间的交通时间和距离", "parameters": { "type": "object", "properties": { "origin_lat": {"type": "number"}, "origin_lon": {"type": "number"}, "dest_lat": {"type": "number"}, "dest_lon": {"type": "number"}, "mode": {"type": "string", "enum": ["driving", "walking", "transit"], "default": "walking"} }, "required": ["origin_lat", "origin_lon", "dest_lat", "dest_lon"] } } ]实现后端服务(FastAPI)
from fastapi import FastAPI import requests from pydantic import BaseModel app = FastAPI() AMAP_KEY = "your_amap_api_key" class AttractionRequest(BaseModel): latitude: float longitude: float radius: int = 3000 keywords: str = "" @app.post("/api/get_nearby_attractions") def get_nearby_attractions(req: AttractionRequest): url = "https://restapi.amap.com/v3/place/around" params = { "key": AMAP_KEY, "location": f"{req.longitude},{req.latitude}", "radius": req.radius, "keywords": req.keywords, "output": "json" } resp = requests.get(url, params=params).json() return { "attractions": [ { "name": item["name"], "address": item["address"], "distance": item["distance"], "rating": item.get("biz_ext", {}).get("rating", "无评分") } for item in resp["pois"][:10] ] }3.3 大模型驱动的行程生成流程
当用户提出请求:“我在上海外滩,想玩半天,喜欢文艺类景点,请推荐路线。”系统执行以下步骤:
语义理解:gpt-oss-20b识别出关键信息:
- 当前位置:外滩
- 时间约束:半天(约4小时)
- 兴趣偏好:文艺类(美术馆、书店、历史建筑)
工具调用决策:
{ "function_call": { "name": "get_nearby_attractions", "arguments": { "latitude": 31.2336, "longitude": 121.4947, "radius": 5000, "keywords": "美术馆 博物馆 书店" } } }接收API返回结果,模型继续推理:
- 过滤出评分高于4.0的景点
- 计算相邻景点间的步行时间(调用
get_route_duration) - 排除闭馆时间冲突的场所
- 生成合理顺序的游览路线
输出结构化行程表
4. 行程优化策略
4.1 基于兴趣权重的排序算法
引入用户兴趣标签作为加权因子,提升推荐相关性。
def calculate_interest_score(attraction, user_preferences): keywords = { "art": ["美术馆", "画廊", "艺术"], "history": ["博物馆", "故居", "遗址"], "literature": ["书店", "图书馆", "文创"] } score = 0 for pref in user_preferences: if any(kw in attraction['name'] or kw in attraction['address'] for kw in keywords.get(pref, [])): score += 1.0 return score * 0.5 + float(attraction.get('rating', 3.0)) # 综合评分4.2 时间约束下的路径规划
采用贪心算法解决TSP-like问题:
- 将所有候选景点按兴趣得分降序排列
- 从当前位置出发,依次选择下一个可达且剩余时间内可完成参观的最高分景点
- 若后续无法返回起点或超时,则终止添加
注意:对于复杂城市路网,建议引入A*或Dijkstra算法进行精确路径估算。
4.3 动态调整机制
支持用户中途变更计划,例如:
- “我现在想去咖啡馆休息”
- “这个景点关门了,换一个”
系统可通过重新调用工具+上下文记忆机制,实时调整后续行程,体现强交互性。
5. 用户体验增强设计
5.1 多轮对话管理
利用gpt-oss-20b的128K上下文能力,完整保留对话历史,实现长期记忆:
- 记住用户的饮食禁忌(如素食)
- 跟踪已推荐过的景点避免重复
- 支持回溯修改某一天的安排
5.2 输出格式美化
通过Markdown模板统一输出样式:
### 🗺️ 推荐行程:上海文艺半日游(外滩出发) | 时间段 | 景点 | 地址 | 参观建议 | |-------|------|------|----------| | 10:00-11:00 | 上海当代艺术博物馆 | 黄浦区花园港路200号 | 免费入场,当前展览《城市之光》值得一看 | | 11:15-12:30 | 季风书园(芮欧百货店) | 静安区南京西路1601号 | 文艺氛围浓厚,适合拍照休息 | | 13:00-14:30 | 上海博物馆 | 人民大道201号 | 需提前预约,青铜器展厅必看 | 🚶♂️ 总步行距离:2.8km|⏱️ 总耗时:约4小时5.3 移动端适配建议
- 提供二维码导出功能,扫码即可保存行程
- 支持语音输入与播报
- 与地图App深度集成(跳转导航)
6. 总结
6.1 技术价值总结
本文基于gpt-oss-20b开源大模型,结合vLLM推理加速与Open-WebUI交互框架,成功实现了“旅游规划小助手”的原型系统。该方案具备以下核心优势:
- 高度智能化:模型能够理解复杂语义并主动调用工具,实现闭环决策;
- 个性化推荐:融合用户兴趣、位置、时间等多维因素,生成定制化行程;
- 低部署成本:仅需单张4090级别显卡即可运行,适合中小企业或个人开发者;
- 可扩展性强:支持接入更多第三方服务(天气、票务、餐饮等)。
6.2 最佳实践建议
- 优先使用MoE模型的小激活参数特性,平衡性能与资源消耗;
- 严格限制工具调用范围,防止模型滥用API导致费用激增;
- 设置缓存机制,对高频查询(如热门景点信息)进行本地缓存;
- 加强输入验证,防范恶意指令注入风险。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。