news 2026/2/3 16:00:18

旅游规划小助手:基于位置信息的个性化行程推荐实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
旅游规划小助手:基于位置信息的个性化行程推荐实现

旅游规划小助手:基于位置信息的个性化行程推荐实现

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 大模型驱动的行程生成流程

当用户提出请求:“我在上海外滩,想玩半天,喜欢文艺类景点,请推荐路线。”系统执行以下步骤:

  1. 语义理解:gpt-oss-20b识别出关键信息:

    • 当前位置:外滩
    • 时间约束:半天(约4小时)
    • 兴趣偏好:文艺类(美术馆、书店、历史建筑)
  2. 工具调用决策

    { "function_call": { "name": "get_nearby_attractions", "arguments": { "latitude": 31.2336, "longitude": 121.4947, "radius": 5000, "keywords": "美术馆 博物馆 书店" } } }
  3. 接收API返回结果,模型继续推理:

    • 过滤出评分高于4.0的景点
    • 计算相邻景点间的步行时间(调用get_route_duration
    • 排除闭馆时间冲突的场所
    • 生成合理顺序的游览路线
  4. 输出结构化行程表


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问题:

  1. 将所有候选景点按兴趣得分降序排列
  2. 从当前位置出发,依次选择下一个可达且剩余时间内可完成参观的最高分景点
  3. 若后续无法返回起点或超时,则终止添加

注意:对于复杂城市路网,建议引入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 最佳实践建议

  1. 优先使用MoE模型的小激活参数特性,平衡性能与资源消耗;
  2. 严格限制工具调用范围,防止模型滥用API导致费用激增;
  3. 设置缓存机制,对高频查询(如热门景点信息)进行本地缓存;
  4. 加强输入验证,防范恶意指令注入风险。

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/25 18:12:36

cv_unet_image-matting支持图片格式大全:JPG/PNG/WebP兼容性测试

cv_unet_image-matting支持图片格式大全:JPG/PNG/WebP兼容性测试 1. 引言 随着AI图像处理技术的快速发展,基于U-Net架构的图像抠图工具在人像分割、背景替换等场景中展现出强大能力。cv_unet_image-matting 是一款由开发者“科哥”二次开发构建的WebUI…

作者头像 李华
网站建设 2026/1/30 13:51:41

西门子PLC STL编程常见的错误(6):在FC的使用当中常见的错误

1.ENO 的误解 对于初学者来说,容易在EN0的使用上出错误,由于不清楚EN0来龙去脉,经常认为只要调用FC是无条件的,那么EN0也是永远导通的,实则不然。下图中的例子将说明这个问题。程序原目的:进行模拟量转换,…

作者头像 李华
网站建设 2026/1/31 11:36:17

Speech Seaco Paraformer更新日志解读,v1.0有哪些新功能

Speech Seaco Paraformer更新日志解读,v1.0有哪些新功能 1. 引言:Seaco Paraformer v1.0 发布背景 随着语音识别技术在会议记录、智能客服、教育转录等场景的广泛应用,对高精度、低延迟中文语音识别模型的需求日益增长。基于阿里云 FunASR …

作者头像 李华
网站建设 2026/1/28 8:46:20

避免慢查询:es客户端DSL编写核心要点

如何写出高性能的 Elasticsearch 查询?从一次慢查询排查说起最近,团队收到告警:线上日志系统的搜索接口响应时间飙升至 3 秒以上,部分请求甚至超时熔断。经过排查,罪魁祸首是一条看似“正常”的 DSL 查询语句——它用了…

作者头像 李华
网站建设 2026/1/31 11:06:15

通义千问2.5-7B-Instruct代码解释:复杂算法理解的辅助工具

通义千问2.5-7B-Instruct代码解释:复杂算法理解的辅助工具 1. 引言 1.1 技术背景与应用场景 在当前大模型快速发展的背景下,开发者和研究人员面临日益复杂的算法实现与代码理解任务。尤其是在处理高性能计算、分布式系统或深度学习框架底层逻辑时&…

作者头像 李华