源文件:chapter7/AWorld-train/README.md AWorld Train 面向 Agentic AI 的"从实践中学习"训练框架 [![License: MIT][license-image]][license-url] Paper 目录 简介 关于本教育性实验的重要说明 核心特性 GAIA 环境工具生态 Web 交互工具 文档处理工具 多媒体处理工具 智能推理工具 代码执行工具 文件系统工具 Excel 处理工具 知识检索工具 工具统计总结 核心架构 快速开始 安装训练框架 配置 GAIA 环境 构建自定义 Agent 准备训练 启动训练 最新优化 故障排查 性能基准 进阶主题 引用 社区与支持 简介 AWorld Train 是实现
源文件:chapter7/AWorld-train/README.md
AWorld Train 是实现 "从实践中学习"(Learning from Practice) 范式的开源训练框架,专门为 Agentic AI 设计。根据 AWorld 论文,构建高性能 Agent 系统需要三个核心要素:
AWorld Train 通过分布式架构解决了传统方法的核心瓶颈——经验生成效率低下。在 GAIA 基准测试中,我们将数据收集速度提升了 14.6 倍,使得大规模强化学习训练变得可行。
GAIA(General AI Assistants Benchmark) 是目前最具挑战性的 Agent 能力评测基准之一,也是 SOTA(State-of-the-Art)Agent 系统的竞技场。根据论文所示:
因此,本项目采用了教育友好的配置,使用 Qwen3-4B-Thinking-2507 作为基座模型,训练速度较快。
本项目的目标是:
根据论文和 MCP Server 实现,AWorld 为 GAIA 任务提供了全面的工具支持,共计 26 个 MCP 服务器,126 个工具函数。以下是按类别的完整工具列表:
googlesearch-server)search_google: 使用 Google Custom Search API 进行网络搜索get_search_capabilities: 获取搜索服务能力信息典型应用:查询实时信息、事实核查、多跳推理的起点
browser-server)browser_use: 基于 LLM 的智能浏览器自动化(使用 browser-use 库)get_browser_capabilities: 获取浏览器自动化能力特性:
ms-playwright)提供 23 个精细化浏览器控制工具:
browser_navigate, browser_navigate_backbrowser_click, browser_type, browser_hover, browser_drag, browser_select_optionbrowser_fill_form, browser_file_uploadbrowser_console_messages, browser_network_requests, browser_take_screenshotbrowser_close, browser_resize, browser_tabs, browser_handle_dialogbrowser_evaluate, browser_press_key, browser_wait_forbrowser_snapshot, browser_install对比:browser-server 提供高级自动化,ms-playwright 提供细粒度控制
documents-csv-server)extract_csv_content: 提取和分析 CSV 文件内容(支持 Markdown/JSON 格式输出)list_supported_formats: 列出支持的 CSV 格式documents-docx-server)extract_docx_content: 提取 Word 文档内容(包括文本、表格、图片)list_supported_formats: 列出支持的 DOCX 格式documents-pptx-server)extract_pptx_content: 提取 PowerPoint 内容(幻灯片文本、注释、布局)list_supported_formats: 列出支持的 PPTX 格式documents-pdf-server)convert_document_to_markdown: 将 PDF 转换为 Markdown(保留结构和格式)documents-txt-server)extract_text_content: 提取纯文本文件内容list_supported_formats: 列出支持的文本编码GAIA 应用场景:处理附件文件(GAIA 数据集 70% 的问题包含文档附件)
media-audio-server)transcribe_audio: 语音转文字(支持 Whisper API)extract_audio_metadata: 提取音频元数据(时长、比特率、采样率)trim_audio: 裁剪音频片段list_supported_formats: 列出支持的音频格式(MP3、WAV、M4A 等)media-image-server)extract_text_ocr: OCR 文字识别(基于 Tesseract/Cloud Vision API)analyze_image_ai: AI 图像分析(场景识别、对象检测、描述生成)get_image_metadata: 提取图像元数据(尺寸、EXIF、拍摄时间)media-video-server)analyze_video: 视频内容分析(场景分割、关键帧提取)summarize_video: 视频摘要生成extract_keyframes: 提取关键帧图像audio-server): mcp_transcribe_audio - 高级语音转写image-server): mcp_image_recognition - 图像识别和分类GAIA 应用:约 40% 的 GAIA 问题涉及图片、音频或视频分析
intelligence-code-server)generate_python_code: 生成和验证 Python 代码(用于数学计算、数据处理)get_reasoning_capabilities: 获取代码生成能力信息intelligence-think-server)complex_problem_reasoning: 复杂问题推理(数学证明、算法设计、逻辑谜题)get_reasoning_capabilities: 获取推理能力信息特点:调用更强大的推理模型(如 GPT-4o、Claude 3.7 Sonnet)进行深度思考
intelligence-guard-server)guarding_reasoning_process: 推理过程保护和验证(防止幻觉、检查逻辑一致性)get_guarding_capabilities: 获取保护能力信息论文亮点:这些"思考工具"使小模型能够调用大模型的推理能力,实现"站在巨人的肩膀上"
terminal-server)execute_command: 执行终端命令(Python、bash、系统命令)get_command_history: 获取命令执行历史get_terminal_capabilities: 获取终端能力信息安全特性:命令白名单、超时控制、输出截断
e2b-code-server)e2b_upload_file: 上传文件到沙箱e2b_run_code: 在隔离沙箱中执行代码(支持 Python、JavaScript、多种语言)优势:完全隔离的执行环境,防止恶意代码影响主系统
terminal-controller)提供 10 个高级终端管理工具:
execute_command, get_command_history, get_current_directory, change_directorylist_directory, write_file, read_fileinsert_file_content, delete_file_content, update_file_content区别:terminal-server 专注命令执行,terminal-controller 提供文件系统管理
filesystem-server)完整的文件操作能力:
read_file, read_text_file, read_media_file, read_multiple_fileswrite_file, edit_filecreate_directory, move_file, get_file_infosearch_files, list_directory, list_directory_with_sizes, directory_treelist_allowed_directories - 列出允许访问的目录GAIA 应用:访问数据集附件(/root/workspace/gaia_dataset/ 目录)
excel)提供企业级 Excel 操作能力:
数据操作(9 个):
read_data_from_excel, write_data_to_excelinsert_rows, insert_columns, delete_sheet_rows, delete_sheet_columnscopy_range, delete_range, validate_excel_range工作簿/表管理(7 个):
create_workbook, create_worksheet, copy_worksheetdelete_worksheet, rename_worksheet, get_workbook_metadata高级功能(13 个):
apply_formula, validate_formula_syntaxformat_range, create_chart, create_pivot_table, create_tablemerge_cells, unmerge_cells, get_merged_cellsget_data_validation_infoGAIA 典型任务:分析复杂的 Excel 数据表、计算统计指标、生成图表
wiki-server)search_wikipedia: 搜索维基百科词条get_article_content: 获取完整文章内容get_article_summary: 获取文章摘要get_article_categories: 获取文章分类get_article_links: 获取文章链接get_article_history: 获取文章历史版本(用于时间敏感问题)get_wikipedia_capabilities: 获取 Wikipedia 服务能力特色功能:支持多语言、历史版本查询(GAIA 中有"某年某月的人口数据"类问题)
parxiv-server)search_papers: 搜索 arXiv 论文get_paper_details: 获取论文详细信息(摘要、作者、引用)download_paper: 下载论文 PDFget_arxiv_capabilities: 获取 arXiv 服务能力get_categories: 获取 arXiv 分类列表wayback-server)list_archived_versions: 列出网页的历史存档版本get_archived_content: 获取特定时间点的网页内容get_wayback_capabilities: 获取 Wayback Machine 能力GAIA 应用:回答"2015 年某网站上的信息"这类历史查询问题
download-server)download_file: 下载网络文件到本地get_download_capabilities: 获取下载服务能力readweb-server)google-search)search: 简化的搜索接口read_webpage: 读取网页内容| 类别 | 服务器数 | 工具数 | 关键能力 |
|---|---|---|---|
| Web 交互 | 3 | 32 | 搜索、智能浏览、精细控制 |
| 文档处理 | 5 | 12 | CSV、Word、PPT、PDF、TXT |
| 多媒体 | 5 | 14 | 音频转写、OCR、图像/视频分析 |
| 智能推理 | 3 | 6 | 代码生成、复杂推理、验证 |
| 代码执行 | 3 | 36 | 终端命令、沙箱执行、文件管理 |
| 文件系统 | 1 | 14 | 完整文件操作能力 |
| Excel | 1 | 29 | 企业级表格处理 |
| 知识检索 | 3 | 11 | Wikipedia、ArXiv、历史网页 |
| 其他 | 2 | 3 | 文件下载、网页读取 |
| 总计 | 26 | 126 | 涵盖 GAIA 所需的全部能力 |
# Google 搜索示例 Tool call: aworld-mcp__search_google Tool args: {"query": "Wyoming population 2020", "num_results": 5} Result: {"success": true, "results": [{"title": "Wyoming - Census Bureau", "snippet": "576,851..."}]} # 文件系统示例 Tool call: aworld-mcp__list_directory Tool args: {"path": "/root/workspace/gaia_dataset/2023/test"} Result: ["[FILE] 021a5339-...-bd9b-9368b3efda7a.pdf", "[FILE] 03c577c9-...-f8f598de14c1.mp3", ...] # CSV 处理示例(缺少 tabulate 依赖时会报错) Tool call: aworld-mcp__extract_csv_content Tool args: {"file_path": "/root/workspace/gaia_dataset/2023/test/52e8ce1c-...-67d1648779b9.csv"} Error: "CSV extraction failed: Missing optional dependency 'tabulate'" # Wikipedia 历史查询示例 Tool call: aworld-mcp__get_article_history Tool args: {"title": "Cat", "date": "20191231", "language": "en"} Result: {...historical Wikipedia content...}
AWorld Train 采用四阶段训练流水线:

┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Environment │───▶│ Agent │───▶│ Adapter │───▶│ Training │ │ Setup │ │Construction │ │ Layer │ │ Framework │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ (MCP) (AWorld) (VeRL) (PPO/GRPO)
| 组件 | 要求 |
|---|---|
| 操作系统 | Linux (推荐) / macOS / Windows |
| 硬件 | 最低 4 CPU 核心 + 8GB RAM 训练推荐 8x A100/H100 GPU |
| 软件 | Docker, NVIDIA Driver, CUDA 12.1+ |
以 VeRL 为例,安装步骤如下:
# 1. 安装系统依赖(Ubuntu/Debian) sudo apt-get update sudo apt-get install -y build-essential git wget # 2. 安装 CUDA Toolkit(匹配你的 GPU Driver) # 参考:https://developer.nvidia.com/cuda-downloads # 3. 安装 PyTorch(匹配 CUDA 版本) pip install torch==2.4.0 torchvision==0.19.0 --index-url https://download.pytorch.org/whl/cu121 # 4. 克隆 AWorld 仓库 git clone https://github.com/inclusionAI/AWorld.git ~/AWorld cd ~/AWorld # 5. 安装 VeRL 和依赖(会自动安装 transformers、vllm、deepspeed 等) cd /path/to/verl pip install -e .
重要提示:VeRL 的某些依赖需要在 CUDA 环境下编译,请确保先完成步骤 1-2。
GAIA 环境通过 Docker 部署,提供 MCP(Model Context Protocol)服务。
# 从 Hugging Face 下载 GAIA 数据集 cd ~/AWorld/env/gaia-mcp-server/docker mkdir -p gaia_dataset # 使用 Hugging Face CLI 下载(需要先 pip install huggingface_hub) huggingface-cli download gaia-benchmark/GAIA --repo-type dataset --local-dir gaia_dataset
cd ~/AWorld/env/gaia-mcp-server/mcp_servers cp .env_template .env # 编辑 .env 文件,配置必要的 API 密钥 vim .env
.env 文件示例(部分字段):
# OpenAI API(用于 intelligence-code-server 等) OPENAI_API_KEY=sk-your-openai-key # Google Search API(用于 googlesearch-server) GOOGLE_API_KEY=your-google-api-key GOOGLE_CSE_ID=your-search-engine-id # E2B API(用于代码执行沙箱) E2B_API_KEY=your-e2b-api-key
cd ~/AWorld/env bash run-local.sh
启动成功后,你将看到类似输出:
Starting services... DISPLAY=:0 2025-10-06 05:20:42,368 - __main__ - INFO - Starting MCP Server Proxy... 2025-10-06 05:20:42,373 - mcp_server_proxy.mcp_server_proxy - INFO - Added MCP server executor: googlesearch-server ... INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
MCP Server 提供两个服务:
http://localhost:8080/mcp(Agent 工具调用)http://localhost:5901/vnc.html?autoconnect=true(可视化调试)# 设置环境变量 export MCP_SERVER_URL=http://localhost:8080/mcp # 测试连接(Python) python3 << EOF from train.adapter.verl.common import get_agent_tool_env_and_servers config, servers = get_agent_tool_env_and_servers() print(f"Available servers: {len(servers)}") print(f"Sample servers: {servers[:5]}") EOF
预期输出:
Available servers: 20 Sample servers: ['readweb-server', 'browser-server', 'documents-csv-server', ...]
创建自定义 Agent 的核心是继承 AworldAgentLoop 并实现 build_agents() 方法。以下是 GAIA Agent 的完整示例:
# train/examples/train_gaia_with_aworld_verl/custom_agent_loop.py from aworld.agents.llm_agent import Agent from aworld.config import AgentConfig from train.adapter.verl.aworld_agent_loop import AworldAgentLoop from train.adapter.verl.common import get_agent_tool_env_and_servers class GaiaAgentLoop(AworldAgentLoop): """GAIA 任务的自定义 Agent Loop""" def build_agents(self): # 获取 MCP 环境配置和可用服务列表 gaia_env_config, gaia_env_servers = get_agent_tool_env_and_servers() # 构建 Agent 实例 return Agent( conf=AgentConfig( # LLM 服务地址由 VeRL 动态管理 llm_base_url=self.get_llm_server_address(), llm_model_name=self.get_llm_server_model_name(), llm_api_key="dummy", # VeRL 内部通信不需要真实 API Key ), name="gaia_super_agent", # 系统提示(定义 Agent 角色和能力) system_prompt="""You are a helpful AI assistant specialized in solving complex tasks. You have access to various tools including web search, code execution, and file analysis. When given a task, break it down into steps and use available tools systematically. Always provide your final answer in <answer>...</answer> tags.""", # MCP 工具配置 mcp_config=gaia_env_config, mcp_servers=gaia_env_servers, )
在 train/examples/train_gaia_with_aworld_verl/agent.yaml 中注册你的 AgentLoop:
- name: gaia_agent _target_: train.examples.train_gaia_with_aworld_verl.custom_agent_loop.GaiaAgentLoop
from aworld.swarms.swarm import Swarm class MultiAgentLoop(AworldAgentLoop): def build_agents(self): config, servers = get_agent_tool_env_and_servers() # 创建专业化 Agent researcher = Agent( conf=AgentConfig(...), name="researcher", system_prompt="You are a research specialist...", mcp_servers=["googlesearch-server", "wiki-server"] ) coder = Agent( conf=AgentConfig(...), name="coder", system_prompt="You are a coding expert...", mcp_servers=["e2b-code-server", "terminal-server"] ) # 构建 Swarm return Swarm( agents=[researcher, coder], coordinator=researcher # 主协调 Agent )
运行数据集生成脚本,将 GAIA 数据转换为训练格式:
cd ~/AWorld/train/examples/train_gaia_with_aworld_verl/gaia_datasets python create_dataset.py \ --dataset_path ~/AWorld/env/gaia-mcp-server/docker/gaia_dataset \ --output_dir ~/datasets \ --train_size 300 \ --test_size 100
这将生成:
~/datasets/train.parquet:300 条训练样本~/datasets/test.parquet:100 条测试样本数据格式(Parquet):
| 字段 | 类型 | 说明 |
|---|---|---|
prompt |
List[Dict] | 格式化的聊天消息 [{"role": "user", "content": "..."}] |
data_source |
str | 数据来源标识 "gaia" |
ability |
str | 能力类别 "agi" |
reward_model |
Dict | 奖励配置 {"style": "GAIA", "ground_truth": "..."} |
extra_info |
Dict | 额外元数据(task_id, level 等) |
agent_name |
str | 目标 Agent 名称 |
在 train/examples/train_gaia_with_aworld_verl/metrics/gaia_reward_function.py 中定义奖励逻辑:
import re from aworld.logs.util import logger def gaia_reward_func(data_source, solution_str, ground_truth, extra_info=None): """ GAIA 任务的奖励函数 Args: data_source: 数据来源标识 solution_str: Agent 生成的完整解答 ground_truth: 标准答案 extra_info: 额外信息(如 task_id, level) Returns: float: 奖励值(0.0 或 1.0) """ # 从 solution_str 中提取 <answer>...</answer> 标签内容 pattern = r'<answer>(.*?)</answer>' match = re.search(pattern, solution_str, re.DOTALL | re.MULTILINE) if not match: logger.warning("No answer tag found in solution") return 0.0 answer = match.group(1).strip() logger.info(f"Extracted answer: {answer}, Ground truth: {ground_truth}") # 使用 GAIA 标准评分器(支持数字、列表、字符串) if question_scorer(answer, ground_truth): return 1.0 else: return 0.0 def question_scorer(model_answer: str, ground_truth: str) -> bool: """GAIA 标准评分逻辑(省略详细实现)""" # 支持数字比较、列表比较、字符串归一化比较 # 详见完整代码 ...
编辑 run.sh,配置关键参数:
#!/usr/bin/env bash set -xeuo pipefail # ============ 集群拓扑 ============ export GPUS_PER_NODE=${GPUS_PER_NODE:-8} export NNODES=${NNODES:-1} # ============ 模型和数据 ============ model_path=${model_path:-Qwen/Qwen3-4B-Thinking-2507} train_files=$DATA_ROOT/datasets/train.parquet test_files=$DATA_ROOT/datasets/test.parquet # ============ 自定义配置 ============ path_to_train="/root/AWorld/train" agent_loop_config_path=${path_to_train}/examples/train_gaia_with_aworld_verl/agent.yaml reward_fn_file_path=${path_to_train}/examples/train_gaia_with_aworld_verl/metrics/gaia_reward_function.py reward_fn_name=gaia_reward_func # ============ 训练超参数 ============ # PPO 算法配置 adv_estimator=grpo # 使用 Group Relative Policy Optimization clip_ratio_low=0.2 # PPO clip 下界 clip_ratio_high=0.28 # PPO clip 上界 actor_lr=1e-6 # Actor 学习率 # 长上下文配置(AWorld 最新优化) max_turns=32 # 最大交互轮数(从 8 提升到 32) max_prompt_length=4096 # 提示最大长度(从 1024 提升到 4096) max_response_length=4096 # 响应最大长度(从 2048 提升到 4096) # 批次配置 train_batch_size=32 # 训练批次大小(从 1 提升到 32) ppo_mini_batch_size=8 # PPO mini-batch 大小(4 个梯度更新) n_resp_per_prompt=16 # 每个提示采样 16 个响应(从 1 提升) n_resp_per_prompt_val=16 # 验证时采样数 # ============ MCP Server ============ export MCP_SERVER_URL=${MCP_SERVER_URL:-http://localhost:8080/mcp} # ============ 性能优化 ============ export VLLM_USE_V1=1 # 使用 vLLM v1 引擎 export VLLM_ATTENTION_BACKEND=FLASH_ATTN # FlashAttention-2 infer_tp=1 # Tensor Parallel 大小 train_sp=1 # Sequence Parallel 大小 offload=true # 参数卸载到 CPU # ============ VeRL 训练命令 ============ python3 -m verl.trainer.main_ppo \ algorithm.adv_estimator=$adv_estimator \ data.train_files="['$train_files']" \ data.val_files="['$test_files']" \ data.return_raw_chat=true \ data.train_batch_size=$train_batch_size \ data.max_prompt_length=$max_prompt_length \ data.max_response_length=$max_response_length \ actor_rollout_ref.model.path="$model_path" \ actor_rollout_ref.rollout.multi_turn.max_user_turns=$max_turns \ actor_rollout_ref.rollout.multi_turn.max_assistant_turns=$max_turns \ actor_rollout_ref.rollout.max_model_len=131072 \ actor_rollout_ref.rollout.max_num_batched_tokens=131072 \ actor_rollout_ref.rollout.gpu_memory_utilization=0.9 \ actor_rollout_ref.rollout.agent.agent_loop_config_path=$agent_loop_config_path \ custom_reward_function.path="${reward_fn_file_path}" \ custom_reward_function.name="${reward_fn_name}" \ trainer.logger=['console','wandb'] \ trainer.experiment_name=aworld_train_qwen3_4b \ trainer.save_freq=5 \ trainer.test_freq=5 \ +trainer.num_steps=300
cd ~/AWorld/train/examples/train_gaia_with_aworld_verl # 启动训练(8卡 GPU) export DATA_ROOT=~/datasets export GPUS_PER_NODE=8 bash run.sh
# 提交 Slurm 作业(2 节点,每节点 8 卡) sbatch <<EOF #!/bin/bash #SBATCH --job-name=aworld-train #SBATCH --nodes=2 #SBATCH --ntasks-per-node=1 #SBATCH --gpus-per-node=8 #SBATCH --time=48:00:00 export DATA_ROOT=/path/to/datasets export NNODES=2 export GPUS_PER_NODE=8 srun bash run.sh EOF
训练过程支持多种日志后端:
# 1. 控制台输出 # 实时查看训练指标(loss, reward, KL divergence 等) # 2. WandB 可视化(推荐) # 访问 https://wandb.ai/<your-project>/aworld_train_qwen3_4b # 3. TensorBoard tensorboard --logdir ~/datasets/checkpoint/aworld_train_qwen3_4b
关键监控指标:
| 指标 | 说明 | 目标值 |
|---|---|---|
reward/mean |
平均奖励 | 逐步上升至 0.3+ |
reward/max |
最大奖励 | 达到 1.0 |
actor/loss |
Actor 损失 | 稳定下降 |
rollout/response_length |
响应长度 | 根据任务调整 |
rollout/num_turns |
平均轮数 | 高效利用工具(5-15 轮) |
基于最新代码修改(commit a52d61d6),我们进行了以下关键优化:
# 新增 max_model_len 参数动态配置 self.max_model_len = params.get("max_model_len", 24576)
影响:支持最长 131K tokens 的上下文窗口,处理复杂多轮对话和大规模工具调用历史。
# 提示格式化为聊天消息列表(适配 VeRL return_raw_chat 模式) rl_dataset["prompt"].append([{"role": "user", "content": data["Question"]}])
影响:与 VeRL 的聊天模板系统无缝对接,避免格式转换开销。
| 参数 | 旧值 | 新值 | 提升 |
|---|---|---|---|
max_turns |
8 | 32 | 4x 交互深度 |
max_prompt_length |
1024 | 4096 | 4x 输入容量 |
max_response_length |
2048 | 4096 | 2x 输出容量 |
train_batch_size |
1 | 32 | 32x 训练效率 |
n_resp_per_prompt |
1 | 16 | 16x 样本多样性 |
影响:
ppo_mini_batch_size=8 实现 4 次梯度更新,平衡训练稳定性和效率# vLLM 配置 actor_rollout_ref.rollout.max_model_len=131072 # 模型上下文长度 actor_rollout_ref.rollout.max_num_batched_tokens=131072 # 批处理 token 数 actor_rollout_ref.rollout.gpu_memory_utilization=0.9 # GPU 内存利用率
影响:在 A100 80GB 上支持 32K+ tokens 的并发推理,充分利用 GPU 资源。
# run_qwen3_30b_a3b.sh infer_tp=4 # Tensor Parallel(推理) train_sp=8 # Sequence Parallel(训练)
影响:支持更大规模模型训练,利用模型并行技术突破单卡限制。
(AgentLoopWorker pid=448354) [agent] Content: Okay, let's see. So the user is asking about the population difference between the two states that have both Carl's Jr. and Hardee's fast food restaurants... (AgentLoopWorker pid=448354) [agent] Tool call: aworld-mcp__search_google - ID: chatcmpl-tool-94b30baa (AgentLoopWorker pid=448354) [agent] Tool args: {"query": "Wyoming population 2020", "num_results": 5} (AgentLoopWorker pid=448354) [agent] Content: ["{\"success\": true, \"message\": {\"query\": \"Wyoming population 2020\", \"results\": [{\"title\": \"Wyoming - Census Bureau Profile\", \"snippet\": \"576,851. The Total Population for Wyoming is 576,851...\"...}
说明:Agent 正确调用工具并接收结果,推理链路完整。
(AgentLoopWorker pid=448358) [agent] Content: ["images/n[FILE] 063800f6-8832-4856-972b-17b877612533.webp\n..."] (AgentLoopWorker pid=448358) [agent] Content: Okay, let's try to figure out how many horror titles are overdue based on the inventory file...
说明:文件系统工具正常工作,Agent 能够访问数据集文件。
$ docker logs gaia-mcp-server-gaia-mcp-server-1 -f Starting services... DISPLAY=:0 2025-10-06 05:20:42,368 - __main__ - INFO - Starting MCP Server Proxy... 2025-10-06 05:20:42,370 - mcp_server_proxy.mcp_server_proxy - INFO - Loaded MCP tool schema: mcp_tool_schema= readweb-server: browser-server: - get_browser_capabilities - browser_use documents-csv-server: - extract_csv_content - list_supported_formats googlesearch-server: - search_google - get_search_capabilities ... 2025-10-06 05:20:42,373 - mcp_server_proxy.mcp_server_proxy - INFO - Added MCP server executor: googlesearch-server INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
检查点:
Starting MCP Server Proxy 出现Added MCP server executor)INFO: 208.64.254.164:36416 - "POST /mcp HTTP/1.1" 200 OK 2025-10-06 05:09:23,880 - mcp.server.lowlevel.server - INFO - Processing request of type CallToolRequest 2025-10-06 05:09:27,006 - mcp.server.lowlevel.server - INFO - Processing request of type CallToolRequest [10/06/25 05:09:27] INFO 🔍 Searching Google for: 'Speaker of the House that passed act...' INFO ✅ Found 5 results in 0.42s
说明:Agent 正常调用 Google 搜索工具,请求响应快速(< 1s)。
ERROR CSV extraction failed: Missing optional dependency 'tabulate'. Use pip or conda to install tabulate.
原因:pandas 的 to_markdown() 功能需要 tabulate 库。
解决方案:
# 进入 MCP Server Docker 容器 docker exec -it gaia-mcp-server-gaia-mcp-server-1 bash # 安装缺失依赖 cd /app/mcp_servers/documents_server source .venv/bin/activate pip install tabulate # 重启容器 exit docker restart gaia-mcp-server-gaia-mcp-server-1
WARNING coding failed: Error code: 401 - {'error': {'message': 'Incorrect API key provided: sk-or-v1***...', 'type': 'invalid_request_error', 'code': 'invalid_api_key'}}
原因:intelligence-code-server 等工具需要 OpenAI API 密钥生成代码。
解决方案:
# 方法 1:配置真实 OpenAI API Key vim ~/AWorld/env/gaia-mcp-server/mcp_servers/.env # 添加:OPENAI_API_KEY=sk-your-real-key # 方法 2:使用 OpenRouter 等兼容服务 # .env 中配置: LLM_BASE_URL=https://openrouter.ai/api/v1 OPENAI_API_KEY=sk-or-v1-your-openrouter-key # 重启服务 cd ~/AWorld/env bash run-local.sh
ERROR Wikipedia summary retrieval error: requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
原因:Wikipedia API 限流(429 Too Many Requests),但 Python 库没有正确处理。
解决方案:
# 方法 1:降低并发请求(调整训练参数) train_batch_size=16 # 从 32 降低到 16 n_resp_per_prompt=8 # 从 16 降低到 8 # 方法 2:使用代理或切换 Wikipedia 镜像 # 在 wiki_server/.env 中配置: WIKIPEDIA_BASE_URL=https://en.wikipedia.org/w/api.php # 方法 3:添加请求重试逻辑(需修改代码) # 在 wiki_server/src/wiki.py 中添加 exponential backoff
2025-10-06 05:21:08,548 - mcp_server_proxy.mcp_server_executor - INFO - Starting tool server browser-server... [10 秒后无响应]
原因:浏览器工具(Playwright)启动慢或资源不足。
解决方案:
# 增加超时配置 vim ~/AWorld/env/gaia-mcp-server/mcp_servers/.env # 添加: TOOL_EXECUTION_TIMEOUT=120 # 从默认 60s 增加到 120s # 预热浏览器环境 docker exec -it gaia-mcp-server-gaia-mcp-server-1 bash cd /app/mcp_servers/browser_server uv run python -c "from playwright.sync_api import sync_playwright; sync_playwright().start()"
RuntimeError: CUDA out of memory. Tried to allocate 20.00 GiB (GPU 0; 79.35 GiB total capacity; 75.12 GiB already allocated; 2.31 GiB free; 78.90 GiB reserved in total by PyTorch)
解决方案:
# 方法 1:降低批次大小 train_batch_size=16 # 从 32 降低 ppo_mini_batch_size=4 # 从 8 降低 # 方法 2:降低 GPU 内存利用率 actor_rollout_ref.rollout.gpu_memory_utilization=0.75 # 从 0.9 降低 # 方法 3:启用 CPU offload actor_rollout_ref.actor.fsdp_config.param_offload=true actor_rollout_ref.actor.fsdp_config.optimizer_offload=true # 方法 4:使用更大的 Tensor Parallel infer_tp=4 # 从 1 增加到 4(需要 4 卡)
# VeRL 训练日志 export RAY_LOGGING_LEVEL=DEBUG export HYDRA_FULL_ERROR=1 # MCP Server 日志 docker logs -f gaia-mcp-server-gaia-mcp-server-1 --tail 100 # vLLM 推理日志 export VLLM_LOGGING_LEVEL=DEBUG
# test_agent_debug.py from train.examples.train_gaia_with_aworld_verl.custom_agent_loop import GaiaAgentLoop # 创建 AgentLoop(不启动训练) loop = GaiaAgentLoop() agent = loop.build_agents() # 测试单个问题 response = agent.chat("What is the capital of France?") print(response)
# 测试 MCP Server 健康状态 curl http://localhost:8080/health # 列出所有工具 curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1}'
| 模型 | Pass@1 | 数据收集加速 | 训练时间 |
|---|---|---|---|
| GPT-4o (Baseline) | 27.91% | - | - |
| DeepSeek-V3 | 31.89% | - | - |
| Qwen3-32B-AWorld | 32.23% | 14.6x | 48h (8x A100) |
关键发现:
| 配置 | Throughput | GPU 利用率 | 内存占用 |
|---|---|---|---|
| 1x A100 80GB (TP=1) | 120 tokens/s | 85% | 72GB |
| 4x A100 80GB (TP=4) | 450 tokens/s | 92% | 68GB/GPU |
| 8x A100 80GB (FSDP+TP) | 850 tokens/s | 95% | 70GB/GPU |
优化建议:
infer_tp=1, train_sp=1infer_tp=4infer_tp=4, train_sp=8除了 GAIA 的二元奖励,你还可以实现更复杂的奖励塑形:
def dense_reward_func(data_source, solution_str, ground_truth, extra_info=None): """密集奖励函数(考虑中间步骤)""" reward = 0.0 # 1. 工具使用奖励(鼓励探索) num_tool_calls = solution_str.count("Tool call:") reward += min(num_tool_calls * 0.1, 0.5) # 最多 0.5 分 # 2. 推理质量奖励(基于 CoT) if "<think>" in solution_str and "</think>" in solution_str: reward += 0.2 # 有思考过程 # 3. 最终答案奖励(主要分数) if question_scorer(extract_answer(solution_str), ground_truth): reward += 1.0 # 4. 效率惩罚(避免过度工具调用) if num_tool_calls > 15: reward -= 0.2 return reward
# gaia_datasets/create_multitask_dataset.py def create_multitask_dataset(): datasets = [] # 任务 1:GAIA gaia_ds = load_gaia_dataset(...) gaia_ds['task_type'] = 'gaia' datasets.append(gaia_ds) # 任务 2:Code Execution code_ds = load_code_dataset(...) code_ds['task_type'] = 'code' datasets.append(code_ds) # 任务 3:Web Navigation web_ds = load_webarena_dataset(...) web_ds['task_type'] = 'web' datasets.append(web_ds) # 混合采样 return pd.concat(datasets).sample(frac=1.0)
如果你在研究中使用了 AWorld Train,请引用我们的论文:
@article{yu2025aworld, title={AWorld: Orchestrating the Training Recipe for Agentic AI}, author={Yu, Chengyue and Lu, Siyuan and Zhuang, Chenyi and Wang, Dong and others}, journal={arXiv preprint arXiv:2508.20404}, year={2025} }
AWorld Train — 让你的 Agent 从实践中学习
Made with ❤️ by Inclusion AI