EnvSimBench:面向 LLM 环境模拟能力的评估与提升基准
如果我们的工作对你有帮助,欢迎在 GitHub 上点 ⭐ 支持,我们将不胜感激。
---
## 📑 目录
- [👀 概述](#-概述)
- [✨ 主要贡献](#-主要贡献)
- [📦 数据与模型](#-数据与模型)
- [📊 主要结果](#-主要结果)
- [📁 项目结构](#-项目结构)
- [🚀 快速开始](#-快速开始)
- [🧪 运行评估](#-运行评估)
- [🏋️ 训练你自己的模拟器](#-训练你自己的模拟器)
- [📚 引用](#-引用)
- [📞 联系方式](#-联系方式)
---
## 👀 概述
可扩展的 AI agent 训练依赖于能够忠实模拟动作后果的交互式环境。**人工搭建的环境**构建成本高、可扩展性差、场景多样性受限,难以支撑大规模训练。一个有前景的替代方案是用 **LLM 模拟器**取代可执行环境——但这一范式建立在一个尚未被充分检验的核心假设之上:
> *LLM 真的能够准确地模拟环境反馈吗?*
实际上,LLM 模拟器普遍存在 **幻觉**、**逻辑不一致** 与 **状态静默漂移** 等问题,这些失败会污染 agent 的奖励信号,并抵消该范式本应带来的成本优势。
**EnvSimBench** 是首个专门用于 *评估"模拟器本身"* 而非 agent 的基准。它带来:
- 对 **环境模拟能力(EnvSim Ability)** 的首个形式化定义,使其成为可量化研究目标。
- 一种 **约束驱动的 MDP 建模**:将状态估计与状态转移推理解耦,实现完全程序化、无 LLM 评判的客观评估。
- 一个专门训练的 **4B 模拟器模型**,在 Config Match 指标上超越所有前沿大模型,同时将合成成本降低 90% 以上。

EnvSimBench 总览:轨迹收集 → 三轴分层 → 前沿 LLM 评估 + 专用小模型训练。
---
## ✨ 主要贡献
1. **形式化定义。** 我们首次将 **环境模拟能力** 形式化为可量化的研究目标,建模为一个完全可观测的状态预测任务:`(s_t, a_t, code(a_t)) → (ô_t, ŝ′_t)`。
2. **基准构建。** 我们构建了 **EnvSimBench**:包含 **167 个多样化环境** 中的 400 条样本,全部带有可程序化校验的标签,并沿 **三个维度(动作结果 / 状态变更复杂度 / 输入参数基数)** 进行细粒度难度分层。
3. **诊断发现。** 对 7 个前沿 LLM 的系统评估揭示出普遍的 **状态变更悬崖(state-change cliff)**:当状态保持不变时所有模型几乎完美,但只要需要同时更新 `|Δ| ≥ 3` 个状态字段就会灾难性下滑。
4. **优化方法。** 我们设计了 **约束驱动的模拟流水线**,配合专用 4B 模型,**降低幻觉**、**提升合成产出 6.8%**、**模拟成本下降 90% 以上**。

POMDP(左)vs. 约束驱动的 MDP(右)。显式提供 s_t 与 code(a_t) 可从根源消除幻觉、强制逻辑一致性,并通过结构设计避免状态漂移。
---
## 📦 数据与模型
我们在 Hugging Face 公开了 EnvSimBench 的数据以及训练得到的模拟器模型(SFT + RL):
| 数据 | 说明 | 链接 |
| --- | --- | --- |
| Benchmark Metadata | 167 个环境上的 400 条评估样本 | [🤗 HuggingFace](https://huggingface.co/datasets/Louie-CookieApril/EnvSimBench/tree/main/Benchmark) |
| SFT Data | 用于训练模拟器的监督微调数据 | [🤗 HuggingFace](https://huggingface.co/datasets/Louie-CookieApril/EnvSimBench/tree/main/SFT%20Data) |
| Process Data | 构建过程中产生的轨迹 / 中间数据 | [🤗 HuggingFace](https://huggingface.co/datasets/Louie-CookieApril/EnvSimBench/tree/main/Process%20Data) |
| 模型 | 说明 | 链接 |
| --- | --- | --- |
| EnvSimBench-Model | 4B 模拟器(SFT + RL),在 Config Match 上超越所有前沿 LLM | [🤗 HuggingFace](https://huggingface.co/Louie-CookieApril/EnvSimBench-Model) |
### 基准样本组成
| 分组 | 子分组 | 样本数 | 约束 |
| --- | --- | --- | --- |
| Failure | `O` 返回错误,`\|Δ\| = 0` | 20 | — |
| No-Change | `\|Δ\| = 0`,动作执行成功 | 80 | 每种参数基数 40 条 |
| Simple | `\|Δ\| ∈ {1, 2}` | 50 | 每个 `\|Δ\|` 取值 25 条 |
| Medium | `\|Δ\| ∈ {3, …, 6}` | 200 | 每个 `\|Δ\|` 取值 50 条 |
| Difficult | `\|Δ\| ∈ {7, …, 12}` | 50 | 跨 `\|Δ\|` 分布 |
每条样本均可基于确定性外部执行器**独立校验**——整个评估流水线 **不使用任何 LLM 评判**。
---
## 📊 主要结果
### 前沿 LLM 普遍存在「状态变更悬崖」
| 模型 | Fail+No-Chg CM | State-Change CM | 总体 CM |
| --- | :---: | :---: | :---: |
| DeepSeek-V3.2 | 100% | 10.0% | 32.5% |
| Qwen3.5-397B-A17B | 100% | 23.0% | 42.3% |
| GPT-5.4 | 100% | 22.7% | 42.0% |
| Gemini-3.1-Pro-Preview | 100% | 22.7% | 42.0% |
| Claude-Sonnet-4.6 | 99% | 17.3% | 37.8% |
| MiniMax-M2.7 | 99% | 22.7% | 41.8% |
| GLM-5 | 100% | 21.3% | 41.0% |
| **本文 (Full-Balance2, 4B)** | **100%** | **—** | **45.3%** |
- 所有前沿模型在「状态保持不变」的样本上 CM ≥ 99%,但在需要更新状态的样本上明显坍塌。
- 当 `|Δ| ≥ 5` 时,所有前沿模型的 CM 几乎归零。
- 我们的 **4B 专用模拟器在 Config Match 上超越所有前沿 LLM**,参数规模约为前者的 1/59。

Config Match 与 |Δ| 的关系:前沿 LLM(细线)在 |Δ| ≥ 3 时急剧下降;本文的 Full-Balance2(粗线)在可部署区间领先最高 +10pp。
### 下游合成产出验证
将我们的 4B 模拟器替换 EnvScaler 合成流水线中的大模型集成后:
- 通过 0.85 质量阈值的环境数从 191 提升到 204,**合成产出 +6.8%**
- **模拟成本下降 90% 以上**
- 在成本与质量两个维度上达到帕累托最优
---
## 📁 项目结构
```
EnvSimBench/
├── Benchmark/ # 400 条评估样本及执行器标签
├── Construction/ # 轨迹收集与三轴分层流水线
├── Evaluation/ # 前沿 LLM 评估脚本(FM / CM 指标)
├── EnvScaler/ # 下游合成流水线集成 / SFT 数据准备
├── Figs/ # 论文 / README 中使用的图
└── requirements.txt
```
> 💡 各子目录均附有详细的 `README.md` 说明。
---
## 🚀 快速开始
### 1. 克隆仓库
```bash
git clone https://github.com/cookieApril/EnvSimBench
cd EnvSimBench
```
### 2. 安装依赖
```bash
pip install -r requirements.txt
```
> 训练流程依赖 **[LLaMA-Factory](https://github.com/hiyouga/LLaMA-Factory)**。请按其官方指引安装 `llamafactory-cli` 与配套的 `vllm` 运行时。
### 3. 配置 LLM 推理服务
#### 方式 A —— 使用云端 API
```bash
# .env
OPENAI_API_KEY=your-api-key
OPENAI_BASE_URL=https://api.openai.com/v1
```
#### 方式 B —— 使用 LLaMA-Factory + vLLM 自建 EnvSimBench-Model 服务
```bash
DISABLE_VERSION_CHECK=1 llamafactory-cli api \
--model_name_or_path saves/qwen3-4b-Base-noreasoning-selectedByTaskid-Change-balance2 \
--template qwen \
--infer_backend vllm \
--vllm_maxlen 16384 \
--vllm_gpu_util 0.9 \
--vllm_enforce_eager \
--no_enable_thinking
```
服务暴露 OpenAI 兼容的 `/v1/chat/completions` 接口。如果要从其他机器访问,请把 `OPENAI_BASE_URL` 指向 GPU 节点的 IP(在 GPU 节点上执行 `ip a`,取 `bond0` 中的地址):
```bash
export OPENAI_API_KEY="dummy"
export OPENAI_BASE_URL="http://:8013/v1"
export PORT=8013
```
简单连通性测试:
```bash
python -c "
import requests
resp = requests.post(
f'{__import__(\"os\").environ[\"OPENAI_BASE_URL\"]}/chat/completions',
json={
'model': 'models/Qwen/Qwen3-4B-Base',
'messages': [{'role': 'user', 'content': '你好,请介绍一下你自己。'}],
'max_tokens': 100,
},
)
print(resp.json()['choices'][0]['message']['content'])
"
```
### 4. 下载基准数据
```bash
huggingface-cli download Louie-CookieApril/EnvSimBench \
--repo-type dataset --local-dir ./data
```
---
## 🧪 运行评估
使用 `Evaluation/` 下的脚本,在约束驱动的 MDP 框架下评估任意模型:
```bash
cd Evaluation
python evaluate.py \
--input ./eval/9.choice_final_combined-167env.json \
--model qwen3_4B \
--max_samples 400 \
--max_workers 3
```
参数说明:
| 参数 | 说明 |
| --- | --- |
| `--input` | 基准 JSON 路径(如 `9.choice_final_combined-167env.json`,400 样本 / 167 环境)。 |
| `--model` | 模型标识——可以是托管 API 名称(如 `gpt-4o`、`deepseek-v3.2`),也可以是映射到本地服务的 key(如 `qwen3_4B`)。 |
| `--max_samples` | 最多评估的样本数(跑全集请填 `400`)。 |
| `--max_workers` | 推理并发请求数。 |
每条 prompt 实例化 `(s_t, a_t, code(a_t))`,并使用两个**纯程序化的二值指标**打分:
- **Feedback Match (FM)**:预测观测 `ô_t` 与真值 `o_t` 是否完全一致。
- **Config Match (CM)**:将预测的 Δ 操作应用到 `s_t` 后是否完全得到 `s′_t`。CM 不受输出格式约定影响,是跨模型对比时的主要推理指标。
按维度(Failure / No-Change / Simple / Medium / Difficult,以及每个 `|Δ|` 取值)的细分结果会写入与输入 JSON 同目录下。
---
## 🏋️ 训练你自己的模拟器
我们公开了 SFT 数据以及训练 4B 模型所用的 **Balance2** 数据组合。训练基于 **LLaMA-Factory**,采用全参数 SFT + DeepSpeed ZeRO-3,硬件为 2× A800 (80 GB)。
### 1. 拉取 SFT 数据
```bash
huggingface-cli download Louie-CookieApril/EnvSimBench \
--repo-type dataset --local-dir ./data
```
并在 LLaMA-Factory 的 `data/dataset_info.json` 中以 `13.SFT-data-noreasoning-selectedByTaskid-Change-balance2` 为 key 注册数据集。
### 2. 全参数 SFT
```bash
# NCCL / 多卡环境变量
export NCCL_P2P_DISABLE=1
export NCCL_IB_DISABLE=1 # 没有 IB 网卡建议关掉
export CUDA_VISIBLE_DEVICES=0,1
FORCE_TORCHRUN=1 NPROC_PER_NODE=2 DISABLE_VERSION_CHECK=1 llamafactory-cli train \
--model_name_or_path models/Qwen/Qwen3-4B-Base \
--template qwen \
--dataset 13.SFT-data-noreasoning-selectedByTaskid-Change-balance2 \
--dataset_dir data \
--finetuning_type full \
--output_dir saves/qwen3-4b-Base-noreasoning-selectedByTaskid-Change-balance2 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16 \
--learning_rate 2e-5 \
--num_train_epochs 3 \
--bf16 \
--overwrite_output_dir \
--ddp_find_unused_parameters false \
--cutoff_len 8192 \
--do_train \
--save_strategy steps \
--save_steps 200 \
--save_total_limit 3 \
--ddp_timeout 18000 \
--flash_attn fa2 \
--gradient_checkpointing true \
--lr_scheduler_type cosine \
--warmup_ratio 0.05 \
--logging_steps 10 \
--deepspeed ds_z3_config.json
```
### 3. 部署训练好的 checkpoint
```bash
DISABLE_VERSION_CHECK=1 llamafactory-cli api \
--model_name_or_path saves/qwen3-4b-Base-noreasoning-selectedByTaskid-Change-balance2 \
--template qwen \
--infer_backend vllm \
--vllm_maxlen 16384 \
--vllm_gpu_util 0.9 \
--vllm_enforce_eager \
--no_enable_thinking
```
### 4. 评估
```bash
cd Evaluation
python evaluate.py \
--input ./eval/9.choice_final_combined-167env.json \
--model qwen3_4B \
--max_samples 400 \
--max_workers 3
```
> **数据组合比数据规模更重要。** 按源环境中 `|Δ|` 的真实分布构造(1K Failure + 1K No-Change + 2K Simple-Change + 2.23K Complex-Change ≈ 6.23K)显著优于在 5K 数据规模下的简单堆量。
---
## 📚 引用
如果我们的工作对你有帮助,欢迎引用,我们将不胜感激。
```bibtex
@article{liu2025envsimbench,
title = {EnvSimBench: A Benchmark for Evaluating and Improving LLM-Based Environment Simulation},
author = {Liu, Yi and Hui, TingFeng and Zhang, Wei and Sun, Li and Su, Ningxin and Wang, Jian and Su, Sen},
journal = {arXiv preprint},
year = {2025}
}
```
---
## 📞 联系方式
如有任何问题、建议或合作意向,欢迎联系我们:
- **Yi Liu** — [louie@bupt.edu.cn](mailto:louie@bupt.edu.cn)
- 也可在本仓库提 Issue。