基于LazyLLM构建智能旅游规划助手
基于LazyLLM搭建智能体
完整代码,访问Github仓库:https://github.com/xgx2025/SimpleAgent
项目简介:让AI为你定制专属旅行计划
项目背景
随着旅游行业的数字化发展,用户对个性化行程规划的需求日益增长。传统旅行规划工具往往存在信息分散、操作复杂、缺乏个性化等问题,而AI驱动的智能规划工具能够整合多源数据,根据用户需求快速生成定制化方案。本项目基于LazyLLM框架和高德地图API,打造了一款集行程规划、POI搜索、天气查询、地图导航于一体的智能旅游助手,解决用户从"想去哪"到"怎么去"的全流程需求。
项目目标
- 实现智能化交互:通过Agent对话能力,自动收集用户旅行关键信息(目的地、日期、预算等)
- 整合多维度数据:集成POI搜索、天气查询、路线规划、地图导航等核心功能
- 生成可视化输出:自动生成响应式网页格式的行程方案
- 提供实用工具链:支持一键导航、私人行程地图生成等高频旅行需求
核心功能
功能模块 | 具体能力 | 技术支撑 |
---|---|---|
智能交互 | 自动询问缺失信息、理解用户需求 | LazyLLM ReactAgent |
POI搜索 | 按关键词查询景点、餐厅、酒店等 | 高德地图POI搜索API |
行程规划 | 按日期生成详细时间表、活动安排 | 自定义Prompt+HTML生成 |
天气查询 | 获取目的地实时及未来3天天气 | 高德地图天气API |
路线规划 | 生成驾车路线、距离及时间预估 | 高德地图驾车路线API |
地图服务 | 生成私人行程地图、一键导航 | 高德地图URL Scheme |
网页展示 | 响应式行程网页、数据可视化 | Tailwind CSS+Font Awesome |
实现步骤:从环境搭建到Web部署
第一步:技术栈与环境准备
1. 核心依赖库安装
首先需要完成LazyLLM环境的部署,请看官方教程文档:https://blog.csdn.net/csdnstudent/article/details/151827710
2. 高德地图API密钥申请
项目依赖高德地图Web服务API,需先完成以下操作:
- 注册高德开放平台账号(https://lbs.amap.com/)
- 创建应用并申请Web服务API密钥(Key)
项目结构
在 D:\Code\agentLazyLLM
(这里是我的路径) 目录下,创建以下文件结构:
agentLazyLLM/
├── lazyllm-venv/ # 你的虚拟环境
├── travel_agent.py # 主程序文件
└── tools.py # 存放工具函数的文件
第二步:工具模块开发(tools.py)
工具模块是项目的核心能力支撑,负责与高德API交互并提供具体功能实现。采用模块化设计,每个工具函数对应一个具体的业务能力,通过@fc_register("tool")
装饰器注册为LazyLLM可用工具。
1. 通用API请求函数设计
首先实现send_web_api_request
函数,作为所有高德API请求的统一入口,处理请求发送、异常捕获、错误处理等通用逻辑:
def send_web_api_request(api_path: str, params: dict = None, method: str = "GET"):
"""
发送高德Web服务API请求(通用核心函数)
:param api_path: API子路径(如"/weather/weatherInfo")
:param params: 请求参数(自动补充API Key)
:param method: 请求方法(GET/POST,Web API以GET为主)
:return: 接口返回结果(成功返回数据,失败返回错误信息)
"""
if params is None:
params = {}
params["key"] = AMAP_API_KEY # 自动注入API密钥
try:
full_url = f"{AMAP_WEB_BASE_URL}{api_path}"
# 发送请求
if method.upper() == "GET":
response = requests.get(full_url, params=params, timeout=10)
else:
response = requests.post(full_url, data=params, timeout=10)
# 检查HTTP状态码(非2xx直接抛异常)
response.raise_for_status()
# 解析JSON响应
result = response.json()
# 处理业务错误(高德API status=1表示成功)
if result.get("status") != "1":
error_info = result.get("info", "未知错误")
error_code = result.get("infocode", "未知错误码")
LOG.error(f"[AMAP Web API] 业务错误 {error_code}: {error_info}")
return f"Error: 高德API错误({error_code}) - {error_info}"
return result
# 异常捕获(网络错误、JSON解析错误等)
except requests.exceptions.RequestException as e:
LOG.error(f"[AMAP Web API] 网络请求失败: {str(e)}")
return f"Error: 网络请求失败 - {str(e)}"
except json.JSONDecodeError:
LOG.error(f"[AMAP Web API] 解析响应失败: 服务器返回非JSON内容")
return f"Error: 服务器返回无效数据"
2. 核心工具函数实现
基于通用请求函数,实现5个核心工具函数,覆盖旅行规划的关键场景:
- search_poi:按关键词搜索景点、餐厅等POI信息
- plan_driving_route:生成两点间驾车路线
- get_weather:获取目的地天气信息
- generate_private_map:生成包含所有景点的私人行程地图
- navigate_to:生成一键导航链接
第三步:Agent设计与Prompt工程(travel_agent.py)
1. Agent初始化
使用LazyLLM的ReactAgent
类创建智能代理,配置LLM模型、工具列表和系统Prompt:
# 创建 ReactAgent 实例
agent = ReactAgent(
llm=OnlineChatModule(source='doubao', model='doubao-seed-1-6-thinking-250715', stream=True),
# 关联工具列表
tools=[
search_poi,
plan_driving_route,
get_weather,
generate_private_map,
navigate_to
],
prompt=prompt, # 系统Prompt(定义Agent角色和能力)
stream=True
)
2. Prompt精细化设计
Prompt是Agent能力的核心,需要明确定义:
- Agent角色:经验丰富的旅游行程规划师
- 信息收集清单:目的地、日期、预算等8个关键信息
- 行程输出规范:网页结构(标题区、概览区、时间表区等7个模块)
- 技术要求:HTML+Tailwind CSS+Font Awesome,响应式设计
- 交互能力:点击地点唤起高德导航
第四步:Web应用封装与部署
使用LazyLLM的WebModule
将Agent包装为Web应用,支持浏览器访问:
# 使用 WebModule 将 Agent 包装成一个 Web 应用
web_app = WebModule(agent, port=8847, title="智能旅游规划助手",stream=True)
# 启动服务
if __name__ == "__main__":
print("智能旅游规划助手 正在启动...")
print("请在浏览器中访问: http://localhost:8847")
web_app.start().wait()
启动后,在浏览器访问http://localhost:8847
即可使用Web版智能旅游规划助手。
核心代码解析:关键模块深度讲解
1. 工具注册与LazyLLM集成
@fc_register("tool")
def search_poi(keywords: str, city: str = "全国"):
"""
POI关键字搜索(替代MCP的maps_text_search)
:param keywords: 查询关键字(如"肯德基")
:param city: 查询城市(如"北京",默认"全国")
:return: POI列表(含名称、地址、经纬度等信息)
"""
params = {
"keywords": keywords,
"city": city,
"pageSize": 10, # 默认返回10条结果
"extensions": "all" # 返回详细信息(含经纬度、电话等)
}
return send_web_api_request("/place/text", params)
代码解析:
@fc_register("tool")
:LazyLLM工具注册装饰器,使函数成为Agent可调用的工具extensions="all"
:配置高德API返回完整POI信息(包括经纬度、联系电话、营业时间等)- 返回结果自动被Agent处理,用于行程规划中的景点推荐和信息展示
2. 私人行程地图生成(本地化实现)
@fc_register("tool")
def generate_private_map(org_name: str, line_list: list):
"""
生成私人行程地图(替代MCP的maps_schema_personal_map)
本地化实现:生成可跳转高德地图的行程链接,含所有景点标注
"""
try:
# 提取所有景点的经纬度和名称
points = []
for line in line_list:
for point in line.get("pointInfoList", []):
lon = point.get("lon")
lat = point.get("lat")
name = point.get("name", "未命名景点")
if lon and lat:
points.append(f"{name},{lon},{lat}")
if not points:
return "Error: 行程列表中无有效景点坐标"
# 构造高德地图行程链接(支持多景点标注)
points_str = "|".join(points)
map_url = (
f"amapuri://route/plan?sourceApplication=智能旅游规划助手"
f"&dname={org_name}"
f"&dlatlng={points[0].split(',')[2]},{points[0].split(',')[1]}"
f"&points={points_str}"
f"&dev=0" # 0=使用高德坐标系
)
return {
"行程名称": org_name,
"景点数量": len(points),
"高德地图打开链接": map_url,
"提示": "复制链接到浏览器或高德地图App打开"
}
except Exception as e:
LOG.error(f"[generate_private_map] 生成失败: {str(e)}")
return f"Error: 生成行程地图失败 - {str(e)}"
代码解析:
- 核心逻辑:解析行程列表中的景点坐标,生成高德地图URL Scheme
- URL Scheme:
amapuri://
是高德地图的自定义URL协议,支持直接唤起App并展示指定内容 - 多景点标注:通过
points
参数传递所有景点坐标,实现一次性展示整个行程的景点分布 - 兼容性:支持在手机浏览器点击跳转,或复制链接到高德地图App打开
3. 响应式网页生成Prompt设计
Prompt中关于网页输出的关键配置:
### 技术规范
- 使用HTML5、Font Awesome、Tailwind CSS和必要的JavaScript
- 外部资源:
- Font Awesome: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-100-M/font-awesome/6.0.0/css/all.min.css
- Tailwind CSS: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/tailwindcss/2.2.19/tailwind.min.css
- 中文字体: https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap
- 使用CSS变量管理颜色和间距
- 确保代码简洁高效,注重性能和可维护性
### 输出要求
- 提供完整的HTML文件,有CSS样式
- 代码优雅且符合最佳实践
- 设计宽度根据手机宽度自适应
- 保持文字可阅读性
- 保证信息完整性
设计思路:
- 无本地依赖:使用CDN加载所有外部资源,避免用户额外下载
- 响应式优先:基于Tailwind CSS实现手机端自适应,满足旅行场景下的移动使用需求
- 中文字体优化:引入Noto Serif SC(衬线)和Noto Sans SC(无衬线)字体,兼顾美观与可读性
- 交互友好:集成Font Awesome图标,提升视觉体验和信息识别效率
效果展示:从交互到输出全流程
1. Web应用启动界面
启动项目后,浏览器访问http://localhost:8847
,将看到以下界面:
- 顶部显示应用名称"智能旅游规划助手"
- 中间是交互对话框,支持输入旅行需求
- 底部显示Agent的思考过程(流式输出)
控制台:
浏览器:
2. 智能信息收集过程
Agent会自动询问缺失的关键信息,例如:
- “请问您的旅行目的地是哪个城市或景点?”
- “请问您的旅行日期是哪天?计划旅行几天?”
- “请问您的预算范围是多少?(例如:5000元/人)”
- “请问您有哪些兴趣偏好?(文化、美食、自然、购物等)”
3. 行程网页输出效果
当收集完所有信息后,Agent会自动生成完整的HTML行程网页,包含7个核心模块:
(1)行程标题区
- 醒目显示目的地名称(如"成都3日游")
- 旅行日期(如"2024年10月1日-10月3日")
- 旅行者信息(如"张先生一行2人")
- 天气摘要(如"实时温度18℃,未来3天以晴为主")
(2)行程概览区
- 按日期分区的行程简表
- 每个日期的主要活动图标(如🏯表示景点、🍜表示美食)
- 每日行程亮点摘要
(3)详细时间表区
- 表格形式展示时间、地点、活动描述
- 包含每个景点的停留时间(如"09:00-11:30 宽窄巷子")
- 标注门票价格(如"门票:免费")和预订提示
(4)交通信息区
- 主要交通换乘方式(如"地铁2号线:春熙路站→宽窄巷子站")
- 预计交通时间(如"约25分钟")
- 交通方式图标(如🚇表示地铁、🚌表示公交)
(5)住宿与餐饮区
- 酒店信息(地址、联系方式、入住退房时间)
- 推荐餐厅列表(特色菜、价格区间、评分)
- 附近便利设施标注(如超市、药店位置)
(6)实用信息区
- 紧急联系电话(当地旅游投诉电话、急救电话)
- 预算摘要(总预算、每日平均预算)
- 行李清单提醒(如"舒适运动鞋、防晒用品")
(7)地图导航区
- 私人行程地图链接(点击跳转高德地图)
- 每个景点的一键导航按钮(点击唤起高德导航)
4. 网页效果展示
不同大模型生成的网页效果不一样!
更多推荐
所有评论(0)