手把手教你用Streamlit高德API大模型构建智游八桂广西文旅智能规划平台在规划一次旅行时你是否有过这样的经历查景点要去小红书查酒店要去携程查交通要看高德地图最后在Excel里手动拼凑一份行程表发现时间根本排不开……这是大多数自由行游客的真实困境——信息碎片化。先看效果全程两分钟展示从提问到生成行程的完整流程智游八桂本文将分享我如何用Streamlit 高德地图API GLM-4大模型构建了一个名为智游八桂的广西文旅智能规划系统。从数据采集、RAG问答引擎到3D地图可视化和行程规划全程约1500行Python代码。读完本文你将收获✅ 如何用高德API采集POI数据并构建知识库✅ 如何基于RAG架构构建精准的智能问答系统✅ 如何用Streamlit快速搭建数据驱动的Web应用✅ 如何集成3D地形地图和PDF行程导出✅ 如何设计容错机制避免AI幻觉源码已开源欢迎Star⭐一、为什么做这个项目1.1 一个真实的痛点五一假期前朋友问我“我想去桂林玩三天有什么推荐”我花了整整一个晚上小红书查攻略、携程看酒店、高德量距离、大众点评找美食最后在Excel里拼出一份行程表发给他。他回了一句“能不能再帮忙看看北海”这种经历你大概率也有过——信息碎片化让一次普通的旅行规划变成了信息检索的体力活。1.2 为什么不用传统方案市面上已经有“一键游广西”这类省级平台它们解决的是“信息在哪里”的问题把数据集中到一个APP里但没有解决“信息如何被高效使用”的问题——用户依然需要自己浏览、筛选、整合。而大语言模型的出现带来了新可能用户直接问“桂林有哪些必去的景点”AI就能给出精准推荐。但纯大模型有幻觉问题——它会一本正经地编造不存在的景区。怎么解决RAG检索增强生成让模型基于可信知识库回答从源头杜绝编造。1.3 我要做什么一个覆盖广西14个城市的文旅智能系统核心功能 用户用自然语言问景点/酒店系统精准回答️ 3D地图可视化展示所有POI分布 根据城市、天数、风格一键生成行程 景区口碑自动分析1.4 项目成果预览指标数据覆盖城市广西14个地级市景区POI750 条酒店POI500 条代码量约1500行 Python开发周期2-3周功能模块6大核心功能二、技术选型2.1 整体技术栈模块技术选型理由Web框架Streamlit纯Python无需前端知识快速开发数据采集高德地图APIPOI数据全面覆盖广西全境大模型GLM-4-Flash中文能力强推理快成本低问答架构RAG基于知识库避免幻觉可视化Plotly 高德JS API交互式图表 3D地形PDF生成FPDF轻量级纯Python2.2 关键技术决策为什么选RAG而不是微调微调需要大量高质量的标注数据景区-问题对成本高、周期长。RAG只需构建结构化知识库即可快速上线且知识更新灵活——景区信息变化时更新库即可无需重新训练模型。为什么选Streamlit传统Web开发需要前后端分离React/Vue Flask/Django代码量通常在5000行以上。Streamlit约1500行即可构建完整的交互式应用开发周期从数月缩短到2-3周。对于个人开发者和毕业设计来说效率优势非常明显。为什么选GLM-4-Flash智谱AI的GLM-4-Flash在中文理解和生成方面表现优异推理速度快且提供OpenAI兼容接口接入成本低。对于旅游问答这种需要流畅中文对话的场景GLM系列相比GPT系列在中文表达上更自然。三、系统架构设计3.1 整体分层架构系统采用经典的三层架构自下而上分为数据层高德地图API数据采集 → 原始CSV → 数据清洗 → 结构化DataFrame → 知识库文本核心数据模型景区POI名称、地址、城市、分类、经纬度、电话、星级酒店POI与景区共享相同的地理位置和城市属性服务层RAG问答引擎检索关键词匹配 城市权重增强→ 生成GLM-4-Flash路线规划高德驾车路线API → 距离/时间计算情感分析基于正负面关键词词典的规则分类PDF生成FPDF库 → 行程单导出应用层Streamlit 6大页面数据总览 | 地图可视化 | 数据分析 | 口碑分析 | AI旅行助手 | 行程规划3.2 RAG问答核心流程检索策略的核心优化城市关键词享有5倍匹配权重确保地域相关性知识库包含景区条目 酒店条目 城市摘要条目三种粒度双层降级保障API调用失败时自动切换本地规则回答3.3 数据流设计系统的数据流分为两条路径离线路径数据采集高德API → 原始CSV → 数据清洗 → 结构化DataFrame → 知识库文本在线路径用户服务用户提问 → RAG检索 → 大模型生成 → 回答输出两条路径的解耦保证了知识库更新不影响系统运行也使得数据采集和问答服务可以独立迭代。四、核心功能展示4.1 数据总览页面顶部展示四个关键指标卡片景区总数753个、酒店总数500、覆盖城市14个、POI总数1253个。下方是两个交互式柱状图分别展示景区和酒店数量的TOP10城市排名。从图表中可以清晰看到桂林、南宁、北海三城断崖式领先这与广西旅游资源的实际分布完全吻合。4.2 AI旅行助手核心功能这是系统的灵魂模块。用户输入自然语言问题系统走完“检索→生成”全链路返回精准回答。三种问答能力实测问题类型示例问题系统表现事实型“桂林有哪些必去的景点”从知识库检索桂林景区列表生成带推荐语回答条件筛选型“推荐适合亲子游的景区”自动筛选分类含“动物园/海洋馆/游乐场”的景区综合判断型“北海适合玩几天”基于景区数量和类型给出2-3天的建议防幻觉能力展示当用户问“广西有哪些非遗文化”这种知识库外的问题时系统不会编造而是触发降级机制给出友好提示并引导用户询问已知信息。实测效果总结测试场景用户问题示例系统表现状态事实型问答“桂林有哪些必去的景点”返回漓江、象鼻山、两江四湖等5个景点附一句话推荐✅ 通过条件筛选型“推荐适合亲子游的景区”自动匹配分类含“动物园/海洋馆/游乐场”的景区✅ 通过综合判断型“北海适合玩几天”基于景区数量银滩涠洲岛老街等给出2-3天建议✅ 通过知识库外问题“广西有哪些非遗文化”触发降级机制引导用户询问已知信息✅ 通过模糊意图“你好”打招呼并介绍可提供的服务✅ 通过酒店查询“南宁有什么好的酒店”返回南宁市8家推荐酒店✅ 通过4.3 3D地形地图视觉亮点集成高德JS API的3D地形模式广西典型的喀斯特地貌峰林、丘陵得到立体呈现。标记规则红色标记→ 景区蓝色标记→ 酒店交互方式鼠标左键拖拽 → 旋转视角鼠标滚轮 → 缩放下拉选择城市 → 动态聚焦地图自动定位到该城市几何中心使用体验当你想了解桂林的整体旅游格局时只需选择“桂林”城市地图自动放大聚焦到桂林区域所有的景区和酒店分布一目了然。结合3D地形还能直观感受到桂林“山环水绕”的城市格局。4.4 智能行程规划实用功能用户只需配置三个参数点击“生成行程计划”系统自动输出每日行程安排每天上午/下午各一个景点含名称、地址、分类交通参考相邻景点间的驾车距离和预计时间调用高德路线规划API晚间活动对应城市的美食街推荐如桂林→正阳路步行街住宿推荐3家随机推荐酒店PDF导出一键下载完整行程单风格筛选逻辑旅行风格匹配的景区分类关键词经典必游景区、风景、公园、名胜、旅游自然风光自然、山水、森林、生态、峡谷文化体验博物馆、文化、历史、古迹、民俗、古镇休闲度假度假、温泉、乡村、休闲、养生行程生成示例桂林3天经典必游4.5 口碑分析趣味功能基于模拟评论数据进行情感倾向分析。采用关键词匹配方法统计评论中的正面词“好”“棒”“推荐”“震撼”“漂亮”“喜欢”“开心”“舒适”“干净”“热情”“完美”等统计评论中的负面词“差”“坑”“失望”“拥挤”“脏”“乱”“贵”“不值”“一般”“普通”“糟糕”等计算情感得分 正面词数 - 负面词数得分 ≥ 1 → 好评 | 得分 ≤ -1 → 差评 | 其他 → 中性展示形式 各景区平均情感得分柱状图 评论数量景区分布饼图 按景区/情感类型筛选查看五、核心代码实现5.1 数据采集模块def search_poi(keyword, city广西, page1, page_size20): 搜索高德POI数据 url https://restapi.amap.com/v3/place/text params { key: AMAP_KEY, keywords: keyword, city: city, citylimit: True, offset: page_size, page: page, extensions: all } resp requests.get(url, paramsparams, timeout10) data resp.json() if data[status] 1: return data[pois] return [] def collect_data(keywords, category): 收集指定类别的POI数据 all_data [] for kw in keywords: page 1 while True: pois search_poi(kw, pagepage) if not pois: break for p in pois: item { 名称: p.get(name), 地址: p.get(address), 城市: p.get(cityname).replace(市, ), 分类: p.get(type), 经度: p.get(location, ,).split(,)[0], 纬度: p.get(location, ,).split(,)[1], 电话: p.get(tel), 星级: p.get(biz_ext, {}).get(rating) } all_data.append(item) if len(pois) 20: break page 1 time.sleep(0.5) return pd.DataFrame(all_data)5.2 RAG检索与生成class TravelRAG: def search(self, query, top_k15): 城市权重增强的检索策略 # 提取关键词 stop_words [必去, 推荐, 好玩, 哪里, 什么] keywords [w for w in query.split() if w not in stop_words and len(w) 1] scored [] for item in self.knowledge_base: score 0 for kw in keywords: if kw in item: # 城市关键词权重×5 if kw in ALL_CITIES: score 5 else: score 1 if score 0: scored.append((score, item)) scored.sort(reverseTrue, keylambda x: x[0]) # 降级保障命中3条时补充城市摘要 if len(scored) 3: for city in ALL_CITIES: if city in query: for item in self.knowledge_base: if f【城市摘要】{city} in item: return [item] [it for _, it in scored[:10]] return [item for _, item in scored[:top_k]] def ask(self, query): RAG问答主流程 context_items self.search(query) context \n.join(context_items) system_prompt 你是一位专业的广西旅游规划师名叫小桂。 必须基于知识库回答不要编造不存在的信息。 user_prompt f 知识库信息 {context} 用户问题{query} try: response self.client.chat.completions.create( modelself.model, messages[ {role: system, content: system_prompt}, {role: user, content: user_prompt} ], temperature0.3, max_tokens600 ) return response.choices[0].message.content except: return get_local_answer(query) # 降级5.3 3D地图集成# 核心HTML模板 amap_html f !DOCTYPE html html head meta charsetutf-8 script srchttps://webapi.amap.com/maps?v2.0key{AMAP_KEY}/script /head body div idcontainer/div script var map new AMap.Map(container, {{ zoom: 7, center: [{center_lon}, {center_lat}], viewMode: 3D, pitch: 55, rotation: -20, mapStyle: amap://styles/light }}); // 开启地形 var terrainLayer new AMap.Terrain({{zIndex: 1, terrain: true}}); map.add(terrainLayer); // 添加景区标记 scenicPoints.forEach(function(item) {{ var marker new AMap.Marker({{ position: [item.经度, item.纬度], label: {{content: item.名称, direction: top}}, icon: new AMap.Icon({{image: mark_r.png}}) }}); marker.setMap(map); }}); /script /body /html html(amap_html, height680)六、踩坑与优化6.1 高德API的那些坑经纬度格式问题高德返回的是经度,纬度字符串需要分割转换。有些记录经纬度为空或格式异常需要容错处理。翻页限制单次最多返回20条需要循环翻页。某些关键词总条数超过1000但翻页到第5页后数据开始重复需要去重。6.2 大模型调用的降级思维AI API调用存在很多不稳定因素Key限额用完、网络超时、模型服务降级等。我的策略是大模型是锦上添花不是雪中送炭。任何时候API调用失败系统都应该能退回到本地规则回答保证基本可用性。try: answer rag_agent.ask(query) if len(answer) 20 or 暂时没有 in answer: return get_local_answer(query) # 回答质量不足降级 return answer except Exception: return get_local_answer(query) # API异常降级6.3 Streamlit性能优化数据缓存加载CSV文件用st.cache_data避免每次交互都重新读取。st.cache_data def load_data(): return pd.read_csv(guangxi_scenic_raw.csv)地图标记点数量控制一次渲染300个标记点以上会导致地图卡顿设置最大显示数量。七、未来展望7.1 短期优化方向方向具体措施预期效果知识库扩展接入餐饮、购物、交通等POI服务更完整语义检索升级关键词匹配 → 向量检索理解更精准个性化推荐引入用户画像和协同过滤推荐更贴合7.2 长期迭代方向知识库实时更新当前数据是静态的后续可接入高德实时API让景区开放时间、门票价格等信息保持动态更新。多模态能力接入图像识别用户上传景点照片即可获取介绍接入语音交互通过语音完成问答和规划。云端部署将系统迁移至云平台开发微信小程序或移动App版本降低用户使用门槛。7.3 给想复现的同学的建议先跑通数据采集高德API注册免费每天有调用限额。先用小范围比如桂林测试确认数据正常后再扩展全广西。RAG从简单开始先实现关键词匹配检索跑通流程后再优化为向量检索。不要一上来就追求完美架构。大模型API选免费或便宜的GLM-4-Flash、DeepSeek都是不错的选择。旅游问答不需要超强推理能力性价比更重要。Streamlit官方文档社区是最好老师遇到组件使用问题先去官方文档找示例比看零散的博客高效得多。八、总结本文分享了智游八桂广西文旅智能规划系统的设计与实现全过程数据层面利用高德地图API采集了广西14个城市的景区和酒店POI数据经过清洗构建了本地知识库。技术层面基于RAG架构集成了GLM-4-Flash大语言模型通过城市权重增强检索、多粒度知识库和双重降级保障实现了精准、可控的旅游问答。应用层面提供了数据总览、3D地图可视化、数据分析、口碑分析、AI旅行助手和行程规划六大功能模块。架构层面约1500行Python代码即可构建完整的交互式应用验证了轻量化技术路径在智慧旅游领域的可行性。如果觉得有帮助欢迎Star⭐支持有任何问题欢迎在评论区留言交流。