完整代码,访问Github仓库:https://github.com/xgx2025/SimpleAgent

项目简介:让AI为你定制专属旅行计划

项目背景

随着旅游行业的数字化发展,用户对个性化行程规划的需求日益增长。传统旅行规划工具往往存在信息分散、操作复杂、缺乏个性化等问题,而AI驱动的智能规划工具能够整合多源数据,根据用户需求快速生成定制化方案。本项目基于LazyLLM框架和高德地图API,打造了一款集行程规划、POI搜索、天气查询、地图导航于一体的智能旅游助手,解决用户从"想去哪"到"怎么去"的全流程需求。

项目目标

  1. 实现智能化交互:通过Agent对话能力,自动收集用户旅行关键信息(目的地、日期、预算等)
  2. 整合多维度数据:集成POI搜索、天气查询、路线规划、地图导航等核心功能
  3. 生成可视化输出:自动生成响应式网页格式的行程方案
  4. 提供实用工具链:支持一键导航、私人行程地图生成等高频旅行需求

核心功能

功能模块 具体能力 技术支撑
智能交互 自动询问缺失信息、理解用户需求 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,需先完成以下操作:

  1. 注册高德开放平台账号(https://lbs.amap.com/
  2. 创建应用并申请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 Schemeamapuri://是高德地图的自定义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会自动询问缺失的关键信息,例如:

  1. “请问您的旅行目的地是哪个城市或景点?”
  2. “请问您的旅行日期是哪天?计划旅行几天?”
  3. “请问您的预算范围是多少?(例如:5000元/人)”
  4. “请问您有哪些兴趣偏好?(文化、美食、自然、购物等)”

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. 网页效果展示

不同大模型生成的网页效果不一样!

Logo

更多推荐