本项目是一个基于 LangGraph 构建的**简易单智能体(Simple Single-Agent)**旅行服务对话系统。采用单智能体架构,通过一个核心 AI 助手统一处理所有旅行相关任务。
该系统模拟携程/瑞士航空公司的客户服务助手,能够处理用户的航班查询、酒店预订、租车服务和旅游推荐等需求。通过集成大语言模型(DeepSeek)和多种工具,系统可以理解用户意图,执行相应的数据库操作,并提供智能化的旅行建议。
- 单一决策中心:一个 AI 助手负责所有任务调度和决策
- 工具集合:助手可调用多种工具(航班/酒店/租车/搜索)
- 状态管理:通过 LangGraph 管理对话状态
- 循环处理:支持多轮对话和工具链式调用
- 查询用户航班信息:根据乘客ID获取机票、航班和座位信息
- 搜索航班:按出发地、目的地、时间范围搜索可用航班
- 改签机票:将机票更新到新航班(需满足3小时以上时间差)
- 取消机票:验证用户身份后取消机票
- 搜索酒店:按位置、名称搜索酒店
- 预订酒店:通过酒店ID进行预订
- 更新预订:修改入住/退房日期
- 取消预订:取消酒店预订
- 搜索租车:按位置、公司名称搜索租车服务
- 预订租车:通过租车ID进行预订
- 更新预订:修改租赁开始/结束日期
- 取消预订:取消租车服务
- 搜索推荐:按位置、名称、关键词搜索旅游推荐
- 预订项目:预订旅游活动
- 更新详情:修改旅游项目详情
- 取消预订:取消旅游活动
- 政策查询:基于向量检索的公司政策FAQ查询
- 网络搜索:通过Tavily搜索获取实时信息
- 多轮对话:支持上下文感知的连续对话
| 技术 | 用途 |
|---|---|
| LangGraph | 单智能体工作流编排 |
| LangChain | LLM应用开发框架 |
| DeepSeek | 大语言模型(支持工具调用) |
| SQLite | 本地数据库存储 |
| Pandas | 数据处理和分析 |
| NumPy | 向量计算 |
| python-dotenv | 环境变量管理 |
| Tavily | 网络搜索API |
ctrip_assistant/
├── graph_chat/ # 对话流程图核心模块
│ ├── 第一个流程图.py # 主程序入口
│ ├── assistant.py # AI助手节点实现
│ ├── state.py # 状态定义
│ ├── draw_png.py # 流程图可视化
│ └── log_utils.py # 日志工具
├── tools/ # 工具模块
│ ├── flights_tools.py # 航班相关工具
│ ├── hotels_tools.py # 酒店相关工具
│ ├── car_tools.py # 租车相关工具
│ ├── trip_tools.py # 旅游推荐工具
│ ├── retriever_vector.py # 向量检索工具
│ ├── tools_handler.py # 工具错误处理
│ ├── init_db.py # 数据库初始化
│ └── location_trans.py # 城市名称转换
├── logs/ # 日志目录
├── travel_new.sqlite # 主数据库
├── travel2.sqlite # 数据库备份
├── order_faq.md # FAQ知识库
└── requirements.txt # 依赖列表
- Python 3.9+
- Conda 或虚拟环境(推荐)
# 使用conda创建环境
conda create -n ctrip_assistant python=3.11
conda activate ctrip_assistant
# 或使用venv
python -m venv venv
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activatepip install -r requirements.txt项目使用 .env 文件管理 API 密钥:
- 复制
.env文件并填写你的密钥:
cp .env .env.local- 编辑
.env.local文件:
# DeepSeek 配置(主用)
DEEPSEEK_API_KEY=your_deepseek_api_key
DEEPSEEK_BASE_URL=https://api.deepseek.com
# Tavily 搜索配置
TAVILY_API_KEY=your_tavily_key- 确保
.env.local已添加到.gitignore,不要提交到代码仓库。
cd d:\ai大模型应用开发\马士兵资料\实战项目--代码理解\ctrip_assistant
$env:PYTHONPATH = "d:\ai大模型应用开发\马士兵资料\实战项目--代码理解\ctrip_assistant"
python graph_chat\第一个流程图.pycd d:\ai大模型应用开发\马士兵资料\实战项目--代码理解\ctrip_assistant
python -m graph_chat.第一个流程图运行后会进入交互模式:
用户:查询我的航班信息
==================================
1. 助手 : 我来为您查询航班信息...
==================================
用户:帮我预订北京的酒店
==================================
2. 助手 : 正在为您搜索北京的酒店...
==================================
用户:q
对话结束,拜拜!
项目使用 SQLite 数据库存储以下数据:
- flights: 航班信息
- tickets: 机票信息
- ticket_flights: 机票-航班关联
- boarding_passes: 登机牌信息
- hotels: 酒店信息
- car_rentals: 租车服务信息
- trip_recommendations: 旅游推荐信息
- bookings: 预订记录
数据库初始化时会自动将日期更新为当前时间,确保测试数据的有效性。
class State(TypedDict):
messages: Annotated[list[AnyMessage], add_messages]状态对象在对话过程中传递,包含消息历史。
CtripAssistant 类是核心对话节点,负责:
- 调用LLM处理用户输入
- 管理工具调用
- 处理无效响应的重试
所有工具使用 @tool 装饰器定义,包括:
- 数据库查询工具
- 预订/更新/取消操作工具
- 向量检索工具
- 网络搜索工具
┌─────────────────────────────────────────────────────────┐
│ 单智能体架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ 用户输入 ──→ ┌─────────────┐ │
│ │ START │ │
│ └──────┬──────┘ │
│ ↓ │
│ ┌─────────────┐ 工具调用结果 │
│ ┌──→ │ Assistant │ ←────────────────┐ │
│ │ │ (单智能体) │ │ │
│ │ └──────┬──────┘ │ │
│ │ ↓ 需要工具? │ │
│ │ ┌─────────────┐ │ │
│ │ │ 条件判断 │ │ │
│ │ └──────┬──────┘ │ │
│ │ ↓ 是 │ │
│ │ ┌─────────────┐ │ │
│ └────┤ Tools │ ────────────────┘ │
│ │ (工具集合) │ │
│ └─────────────┘ │
│ ↓ 否 │
│ ┌─────────────┐ │
│ │ 返回用户 │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
工作流说明:
1. 单智能体(Assistant)接收用户输入
2. 智能体决定:直接回复 或 调用工具
3. 如需工具,执行后结果返回给智能体
4. 智能体基于工具结果继续处理或回复
5. 支持多轮工具调用循环
- 在
tools/目录下创建新的工具文件 - 使用
@tool装饰器定义工具函数 - 在
assistant.py中导入并添加到part_1_tools列表
编辑 assistant.py 中的 primary_assistant_prompt 变量。
修改 tools/init_db.py 中的数据库操作逻辑。
本项目采用单智能体架构,适合以下场景:
- ✅ 任务类型相对集中(旅行服务)
- ✅ 工具调用逻辑清晰
- ✅ 对话流程可控
- ✅ 开发和维护简单
多智能体架构适合更复杂的场景:
- 多个独立业务领域需要专门处理
- 需要智能体之间的协作和委托
- 任务需要分解给不同专业智能体
- API密钥安全:使用
.env文件管理敏感信息,不要提交到仓库 - 数据库路径:工具模块中使用相对路径
../travel_new.sqlite - 时区处理:航班时间使用
Etc/GMT-3时区 - 改签限制:只能改签到起飞时间3小时以后的航班
- 单智能体局限:所有决策由一个智能体处理,复杂场景可能需要多智能体架构
本项目仅供学习参考使用。