【AI大模型应用】用 AI 打造你的专属旅行计划:多智能体旅行规划工具(实战篇)

前言

在如今快速变化的 AI 世界里,能把各种信息整合成个性化、实用的旅行计划,简直是无价之宝!马上开启小孩们的暑假模式,旅行变热了。不管是随性的周末小逃亡,还是精心设计的长假期,旅行者们都越来越想要一个智能系统,能实时从网上抓取数据,转化成详细的行程安排、活动推荐和旅行小贴士。

图片

这篇博客要介绍一个用 LangGraph 和 LLaMA 3.x 模型驱动的 Multi-Agent Travel Itinerary Planner。这个系统集结了一支“智能团队”,每个智能体各司其职:

  • Generate Itinerary Agent —— 根据你的喜好,打造逐日的旅行计划
  • Recommend Activities Agent —— 推荐当地独特的体验活动
  • Fetch Useful Links Agent —— 通过 Google Serper API 抓取相关旅行指南
  • Weather Forecaster Agent —— 提供旅行期间的天气预报
  • Packing List Generator Agent —— 定制个性化的打包清单
  • Food & Culture Recommender Agent —— 分享当地美食和文化礼仪
  • Chat Agent —— 以对话方式解答你的后续问题

系统用 Streamlit 打造了一个超友好的界面,展示如何将现代 LLM(大型语言模型)和多智能体工作流结合,带来无缝的旅行规划体验。

跟着这篇博客,你可以一步步学会如何搭建这个项目——从环境配置到多智能体协作,还能了解如何根据自己的旅行需求定制这个系统。

项目运行前提条件

以下是为运行这个基于 Streamlit 的旅行规划工具(使用 LangGraph 和 LLaMA 3.2)准备的清晰且结构化的前提条件:

  1. Python 3.10+

确保你的系统已安装 Python 3.10 或更高版本。可以用以下命令检查版本:

python --version
  1. 安装所需的 Python 库

    项目依赖多个 Python 库,通过以下命令安装所有依赖:

    pip install -r requirements.txt
    

    一些关键库包括:

    • streamlit —— 用于交互式网页界面
    • langgraph —— 构建多智能体工作流
    • langchain-community —— 集成 Ollama 和外部工具
    • python-dotenv —— 安全管理环境变量
    • fpdf —— 生成可下载的 PDF 行程
    • serper-wrapper —— 通过 Google Serper API 抓取网页结果
  2. Ollama + LLaMA 3.x 模型

    这个规划工具的核心依赖 LLaMA 3.x,通过 Ollama 运行。请确保:

    这样你的智能体就能利用强大的本地 LLM 功能。

    • • 从 ollama.com 安装 Ollama

    • • 在本地启动 Ollama 服务器

    • • 下载并运行 LLaMA 3.x 模型:

      ollama run llama3
      
  3. API 密钥
    Fetch Useful Links Agent 使用 Serper.dev API 来获取实时的旅行贴士和指南。设置方法:

    • • 在 Serper.dev 注册

    • • 生成你的 API 密钥

    • • 在项目根目录创建

      .env
      

      文件,添加:

      SERPER_API_KEY=你的_api_密钥
      
  4. 项目结构(模块化代码)

智能体被拆分成独立模块,项目目录结构可能如下:

.
├── travel_agent.py
├── agents/
│   ├── generate_itinerary.py
│   ├── recommend_activities.py
│   ├── fetch_useful_links.py
│   ├── weather_forecaster.py
│   ├── packing_list_generator.py
│   ├── food_culture_recommender.py
│   └── chat_agent.py
├── utils_export.py
├── .env
├── requirements.txt
└── README.md

代码逐步解析

1. 导入依赖和环境设置

项目开始时会导入必要的 Python 库并加载环境变量,包括核心库如 jsondotenvtempfile,以及 LangChain 的组件,比如 ChatOllama 用于连接本地 LLaMA 3.2 模型。.env 文件存储敏感配置,比如 API 密钥。

import streamlit as st
import json
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END
from langchain_core.messages import HumanMessage
from langchain_community.chat_models import ChatOllama
from langchain_community.utilities import GoogleSerperAPIWrapper
from dotenv import load_dotenv
import os

# 加载环境变量
load_dotenv()

# 初始化 LLM
llm = ChatOllama(model="llama3.2", base_url="http://localhost:11434")

# 初始化 Google 搜索工具
search = GoogleSerperAPIWrapper()

2. 导入智能体

环境设置好后,我们会导入各个模块化的智能体,每个智能体负责旅行规划的一个特定部分。这种设计让每个智能体专注于单一职责(比如生成行程、推荐活动或预报天气),系统更易扩展和调试。

from agents import generate_itinerary, recommend_activities, fetch_useful_links, weather_forecaster, packing_list_generator, food_culture_recommender, chat_agent
2.1 🗺️ 行程生成智能体

这个智能体根据用户偏好(目的地、预算、旅行月份、时长、旅行类型)生成逐日的旅行行程。

from langchain_core.messages import HumanMessage
from langchain_community.chat_models import ChatOllama
import json 

def generate_itinerary(state):
    llm = ChatOllama(model="llama3.2", base_url="http://localhost:11434")
    prompt = f"""
    根据以下偏好,创建详细的行程:
    {json.dumps(state['preferences'], indent=2)}

    包含每天的安排、餐饮选择和休息时间。
    """
    try:
        result = llm.invoke([HumanMessage(content=prompt)]).content
        return {"itinerary": result.strip()}
    except Exception as e:
        return {"itinerary": "", "warning": str(e)}

它将结构化的偏好转化为可读、可执行的多日计划,借助本地运行的 LLaMA 3.x 模型。

2.2 🎯 活动推荐智能体

这个智能体根据用户偏好和已生成的行程,推荐当地独特的、具有文化特色的活动。

from langchain_core.messages import HumanMessage
from langchain_community.chat_models import ChatOllama
import json 

def recommend_activities(state):
    llm = ChatOllama(model="llama3.2", base_url="http://localhost:11434")
    prompt = f"""
    根据以下偏好和行程,推荐独特的本地活动:
    偏好:{json.dumps(state['preferences'], indent=2)}
    行程:{state['itinerary']}

    尽可能为每天提供项目符号列表形式的建议。
    """
    try:
        result = llm.invoke([HumanMessage(content=prompt)]).content
        return {"activity_suggestions": result.strip()}
    except Exception as e:
        return {"activity_suggestions": "", "warning": str(e)}

2.3 🔗 有用链接智能体

这个智能体通过 Serper API 获取最新的博客、旅行建议和指南,提升用户对内容的信任度。

from langchain_community.utilities import GoogleSerperAPIWrapper

deffetch_useful_links(state):
    search = GoogleSerperAPIWrapper()
    destination = state['preferences'].get('destination', '')
    month = state['preferences'].get('month', '')
    query = f"{destination} {month} 的旅行贴士和指南"
    try:
        search_results = search.results(query)
        organic_results = search_results.get("organic", [])
        links = [
            {"title": result.get("title", "无标题"), "link": result.get("link", "")}
            for result in organic_results[:5]
        ]
        return {"useful_links": links}
    except Exception as e:
        return {"useful_links": [], "warning": f"获取链接失败:{str(e)}"}

它会抓取前 5 个相关结果,以可点击的标题形式返回,方便用户进一步阅读。

2.4 🌦️ 天气预报智能体

这个智能体为选定的目的地和旅行月份提供天气预报,并给出自然语言总结和实用建议,比如带伞或防晒霜。

from langchain_core.messages import HumanMessage
from langchain_community.chat_models import ChatOllama

def weather_forecaster(state):
    llm = ChatOllama(model="llama3.2", base_url="http://localhost:11434")
    prompt = f"""
    根据目的地和月份,提供详细的天气预报,包括温度、降水情况和旅行者的建议:
    目的地:{state['preferences'].get('destination', '')}
    月份:{state['preferences'].get('month', '')}
    """
    try:
        result = llm.invoke([HumanMessage(content=prompt)]).content
        return {"weather_forecast": result.strip()}
    except Exception as e:
        return {"weather_forecast": "", "warning": str(e)}

它确保旅行者为实际天气做好准备。

2.5 🧳 打包清单智能体

根据目的地、旅行时长、天气和旅行类型,这个智能体生成一份全面的打包清单,考虑季节和具体场景。

from langchain_core.messages import HumanMessage
from langchain_community.chat_models import ChatOllama

def packing_list_generator(state):
    llm = ChatOllama(model="llama3.2", base_url="http://localhost:11434")
    prompt = f"""
    为 {state['preferences'].get('destination', '')}{state['preferences'].get('holiday_type', '常规')} 假期生成一份全面的打包清单,旅行时间为 {state['preferences'].get('month', '')},时长 {state['preferences'].get('duration', 0)} 天。
    根据预计天气和旅行类型包含必需品。
    """
    try:
        result = llm.invoke([HumanMessage(content=prompt)]).content
        return {"packing_list": result.strip()}
    except Exception as e:
        return {"packing_list": "", "warning": str(e)}

2.6 🍲 美食与文化推荐智能体

这个智能体融合美食探索和文化沉浸,推荐必尝的当地菜肴、餐厅,并提供礼仪建议,帮助旅行者避免失礼并享受当地热情。

from langchain_core.messages import HumanMessage
from langchain_community.chat_models import ChatOllama

def food_culture_recommender(state):
    llm = ChatOllama(model="llama3.2", base_url="http://localhost:11434")
    prompt = f"