multi-agent README

The project's README from github.com/phoenix-zhou/multi-agent. As one markdown file: README.md.

🤖 基于 A2A 协议的旅行智能助手

一个采用 Agent2Agent (A2A) 协议 + MCP (Model Context Protocol) 构建的多智能体旅行助手系统。系统通过总控中心进行意图识别与路由,由多个专业 Agent 协作完成天气查询、票务查询、票务预定、景点推荐等服务,支持 CLI 与 Streamlit Web 两种交互方式。

✨ 功能特性

🏗️ 系统架构

┌─────────────────────────────────────────────────────────────┐
│                    总控中心 (Orchestrator)                    │
│        app.py (Streamlit Web)  /  main.py (CLI)             │
│    - 意图识别 (Intent Agent, LLM)                            │
│    - 查询改写 (Query Rewriting)                              │
│    - 结果总结 (Summarization, LLM)                          │
└──────────────┬──────────────────────┬───────────────────────┘
               │ A2A 协议             │ A2A 协议
               ▼                      ▼
   ┌───────────────────────┐  ┌───────────────────────────┐
   │   A2A Agent 层         │  │                           │
   │  WeatherQueryAssistant│  │  TicketOrderAssistant      │
   │  (端口 5005)           │  │  (端口 5007)               │
   │  TicketQueryAssistant │  │   └─ 调用 TicketQuery...   │
   │  (端口 5006)           │  │      (Agent 间协作)        │
   └───────┬───────────┬───┘  └───────────┬───────────────┘
           │ MCP       │ MCP             │ MCP
           ▼           ▼                 ▼
   ┌─────────────┐ ┌────────────┐ ┌───────────────┐
   │ MCP Server 层│ │            │ │               │
   │WeatherTools │ │TicketTools │ │ OrderTools    │
   │ (端口 8002) │ │(端口 8001) │ │ (端口 8003)   │
   │query_weather│ │query_tickets│ │order_train/    │
   │             │ │            │ │order_flight/   │
   │             │ │            │ │order_concert   │
   └──────┬──────┘ └──────┬─────┘ └──────┬────────┘
          │               │              │
          ▼               ▼              ▼
        ┌────────────────────────────────────┐
        │           MySQL 数据库 travel_rag    │
        │  weather_data / train_tickets /    │
        │  flight_tickets / concert_tickets  │
        └────────────────────────────────────┘

处理流程

用户输入 → 意图识别(LLM) → 路由到对应 Agent
                              ├─ out_of_scope / 追问 → 直接回复
                              ├─ attraction → LLM 直接生成景点推荐
                              └─ weather/flight/train/concert/order
                                    → A2A Agent 生成 SQL (LLM)
                                    → 调用 MCP 工具查询数据库
                                    → 返回结果 → 总控中心 LLM 总结 → 用户

端口规划

服务 组件 端口
A2A Agent WeatherQueryAssistant(天气查询) 5005
A2A Agent TicketQueryAssistant(票务查询) 5006
A2A Agent TicketOrderAssistant(票务预定) 5007
MCP Server WeatherTools(天气工具) 8002
MCP Server TicketTools(票务工具) 8001
MCP Server OrderTools(预定工具) 8003
Web UI Streamlit 应用 8501(默认)

📁 目录结构

multi-agent/
├── app.py                     # Streamlit Web 入口(总控中心)
├── main.py                    # CLI 命令行入口(总控中心)
├── main_prompts.py            # 提示词模板(意图识别/结果总结/景点推荐)
├── config.py                  # 全局配置(LLM / 数据库 / 意图映射)
├── create_logger.py           # 日志配置
│
├── a2a_server/                # A2A 协议 Agent 服务层
│   ├── weather_server.py      # 天气查询 Agent(端口 5005)
│   ├── ticket_server.py       # 票务查询 Agent(端口 5006)
│   └── order_server.py        # 票务预定 Agent(端口 5007)
│
├── mcp_server/                # MCP Server 数据服务层
│   ├── mcp_weather_server.py  # 天气 MCP(端口 8002)
│   ├── mcp_ticket_server.py   # 票务 MCP(端口 8001)
│   └── mcp_order_server.py    # 预定 MCP(端口 8003)
│
├── query_data/
│   └── query_ticket.py        # 票务数据库查询服务
│
├── utils/
│   ├── format.py              # JSON 日期/Decimal 序列化工具
│   └── spider_weather.py      # 和风天气数据爬虫(定时更新天气库)
│
├── sql/
│   ├── sql_data.sql           # 建库建表 DDL
│   └── insert2.sql            # 票务示例数据
│
└── test/                      # 各服务测试脚本
    ├── test_weather_mcp_server.py
    ├── test_ticket_mcp_server.py
    ├── test_order_mcp_server.py
    ├── test_weather_agent_server.py
    ├── test_ticket_agent_server.py
    └── test_order_agent_server.py

🛠️ 技术栈

🚀 快速开始

1. 环境准备

# Python 3.9+
pip install streamlit langchain langchain-openai python-a2a mcp
pip install langchain-mcp-adapters mysql-connector-python requests schedule pytz

2. 初始化数据库

# 执行建库建表脚本
mysql -u root -p < sql/sql_data.sql

# 导入票务示例数据
mysql -u root -p travel_rag < sql/insert2.sql

如需导入真实天气数据,运行 python utils/spider_weather.py(需配置和风天气 API Key)。

3. 修改配置

编辑 config.py,配置你的 LLM 与数据库信息:

# 大模型配置
self.base_url = 'https://api.siliconflow.cn/v1'
self.api_key = 'sk-xxx'               # 替换为你的 API Key
self.model_name = 'Qwen/Qwen2.5-72B-Instruct'

# 数据库配置
self.host = 'localhost'
self.user = 'root'
self.password = '123456'
self.database = 'travel_rag'

4. 启动服务(按顺序)

# ① 启动 MCP Server(数据层)
python mcp_server/mcp_weather_server.py   # 端口 8002
python mcp_server/mcp_ticket_server.py    # 端口 8001
python mcp_server/mcp_order_server.py     # 端口 8003

# ② 启动 A2A Agent(智能体层)
python a2a_server/weather_server.py       # 端口 5005
python a2a_server/ticket_server.py        # 端口 5006
python a2a_server/order_server.py         # 端口 5007

# ③ 启动总控中心(二选一)
python main.py                            # CLI 交互版
streamlit run app.py                      # Web 聊天版

💬 使用示例

> 成都明天天气怎么样
> 帮我查一下明天成都到西安的高铁票
> 7月15号从成都到西安的机票还有吗
> 帮我订一张明天成都到西安的二等座火车票
> 去西安有什么好玩的景点推荐
> 明天天气怎么样 + 顺便看看去广州的机票    # 多意图组合

CLI 版输入 cards 可查看所有 Agent 的卡片信息(技能/描述/地址),输入 quit 退出。

🔑 核心设计说明

  1. 意图识别与查询改写(main_prompts.py):总控中心将用户输入收敛为 weather / flight / train / concert / order / attraction / out_of_scope 等固定意图;结合对话历史将残缺查询(如"那明天呢?")改写为完整明确的句子,使下游 Agent 无需关心上下文。

  2. SQL 生成 Agent(a2a_server/):下游 Agent 通过 LLM 将自然语言转换为 SQL,并将数据库 Schema 作为提示词上下文。信息不足时返回 input_required 追问用户,无关提问则拒绝回答。

  3. Agent 间协作(order_server.py):票务预定 Agent 先调用票务查询 Agent 确认余票,再将余票信息拼接后交由 MCP 预定工具执行,体现了多 Agent 协作流程。

  4. MCP 解耦:数据库访问统一封装为 MCP 工具(query_weather / query_tickets / order_train 等),Agent 通过 HTTP 流式调用,数据层与智能体层彻底解耦,便于扩展。

🧪 测试

test/ 目录下提供了各 MCP Server 与 A2A Agent 的独立测试脚本,启动对应服务后即可运行:

python test/test_weather_mcp_server.py
python test/test_weather_agent_server.py
python test/test_ticket_mcp_server.py
python test/test_ticket_agent_server.py
python test/test_order_mcp_server.py
python test/test_order_agent_server.py

📄 License

MIT

对应的博客:[]

multi-agent (phoenix-zhou/multi-agent)

Searching Database…

Что это?Это мультиагентный тревел-ассистент, использующий протокол Agent2Agent (A2A) и Model Context Protocol (MCP), чтобы специализированные агенты совместно занимались поиском погоды, запросами билетов на поезд/самолёт/концерт, бронированием билетов и рекомендациями достопримечательностей.
Это библиотека для импорта или работающая система?Это самохостинговая мультиагентная система: центральный диспетчер направляет ваш запрос специализированным A2A-агентам (погода, запрос билетов, заказ билетов), которые обращаются к MCP-серверам инструментов за данными. Вы запускаете её как набор сервисов, а не импортируете как библиотеку.
Как это запустить?Подготовьте окружение, инициализируйте базу MySQL, отредактируйте config.py с настройками LLM и базы данных, затем по порядку запустите каждого A2A-агента и MCP-сервер, прежде чем запускать CLI или веб-приложение на Streamlit.
Что нужно помимо Python, чтобы его запустить?Нужны база данных MySQL и ключ API LLM, совместимого с OpenAI, — по умолчанию проект использует Qwen2.5-72B-Instruct через SiliconFlow поверх LangChain, — плюс опционально ключ API 和风天气 (QWeather) для получения реальных прогнозов погоды на 30 дней.
В чём подвох локального запуска?Есть шесть отдельных сервисов на разных портах (три A2A-агента, три MCP-сервера плюс веб-интерфейс), которые нужно запускать в правильном порядке, а распознавание намерений ограничено фиксированным набором категорий (weather/flight/train/concert/order/attraction/outofscope).
Можно пользоваться из браузера или только из терминала?И так, и так: в комплекте CLI-клиент и веб-чат-интерфейс на Streamlit, который по умолчанию работает на порту 8501.
Что такое A2A AgentCard?Каждый агент открывает стандартную карточку A2A AgentCard с именем, описанием и навыками, чтобы другие агенты и центральный оркестратор могли находить и вызывать его по протоколу A2A.
Как система обрабатывает уточняющие вопросы вроде 'а завтра?'Она хранит историю разговора и использует LLM, чтобы переписывать неполные уточняющие запросы в законченные самостоятельные предложения перед отправкой нужному агенту, поэтому нижестоящим агентам не нужно самим отслеживать контекст.
Как на самом деле работает бронирование билетов между агентами?Агент бронирования сначала вызывает агента запроса билетов, чтобы подтвердить наличие мест, затем передаёт этот результат MCP-инструменту бронирования для оформления заказа — конкретный пример взаимодействия агентов друг с другом.
Можно заменить LLM или источник данных о погоде?Да, LLM по умолчанию — Qwen2.5-72B-Instruct через SiliconFlow, но подойдёт любой OpenAI-совместимый эндпоинт, а данные о погоде можно обновить, запустив входящий скрапер spiderweather.py со своим ключом API QWeather.
Size
0.1 MB
Stars
490
Updated
CommitAug 11
Age
2mo
Commits · 90 Days