Skip to content

Commit 8671091

Browse files
claudepezy
authored andcommitted
docs: add Android Bench architecture design analysis
Move to correct location: docs/learns/evaluation/ Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 17f2d6b commit 8671091

1 file changed

Lines changed: 363 additions & 0 deletions

File tree

Lines changed: 363 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,363 @@
1+
# Android Bench 架构设计分析
2+
3+
## 概述
4+
5+
Android Bench 是一个用于在 Android 开发任务上对大语言模型 (LLM) 进行基准测试的框架。它评估 AI 模型理解移动代码库、生成准确补丁和解决 Android 特有工程问题的能力。
6+
7+
**项目地址**: https://github.com/android-bench/android-bench
8+
9+
## 核心设计理念
10+
11+
### 1. 任务驱动的基准测试
12+
- **真实问题**: 基于真实的 GitHub Issue 构建测试任务
13+
- **可重现环境**: 每次测试使用固定的代码库版本和 Docker 执行环境
14+
- **可靠的测试套件**: 测试必须在基础提交上失败,在应用修复补丁后通过
15+
16+
### 2. 两阶段评估流程
17+
- **推理阶段 (Inference)**: Agent 读取问题描述,生成代码补丁
18+
- **评估阶段 (Verifier)**: 应用补丁并运行测试来评分解决方案
19+
20+
### 3. 隔离的执行环境
21+
- **Docker 沙箱**: 所有评估在隔离的 Docker 容器中运行
22+
- **镜像缓存**: 基于数据集配置构建任务特定的 Docker 镜像
23+
- **可重现性**: 固定的依赖版本和环境配置
24+
25+
### 4. 模块化架构
26+
- **CLI 层**: 命令行工具
27+
- **通用层**: 配置、加载器、日志等基础设施
28+
- ** Harness 层**: 推理和评估引擎
29+
- **数据集层**: 任务定义和测试数据
30+
31+
## 系统架构
32+
33+
```
34+
+---------------------------------------------------------------------+
35+
| CLI Layer (cli/) |
36+
+---------------------------------------------------------------------+
37+
| benchmark run_task agent verifier dataset results |
38+
+---------------------------------------------------------------------+
39+
|
40+
v
41+
+---------------------------------------------------------------------+
42+
| Common Layer (common/) |
43+
+---------------------------------------------------------------------+
44+
| config.py loader.py logger.py run_config.py ui.py |
45+
| storage/ models/ |
46+
+---------------------------------------------------------------------+
47+
|
48+
+---------------+---------------+
49+
v v
50+
+-------------------------+ +-------------------------+
51+
| Inference (harness/) | | Evaluation (harness/)|
52+
+-------------------------+ +-------------------------+
53+
| androidbench.py | | harness.py |
54+
| androidbench_runner.py| | benchmark_worker.py |
55+
| androidbench.yaml | | main.py |
56+
+-------------------------+ +-------------------------+
57+
| |
58+
v v
59+
+-------------------------+ +-------------------------+
60+
| MiniSWE-Agent | | Docker Container |
61+
| (LLM Interface) | | - Android SDK |
62+
| LiteLLM | | - Gradle |
63+
| | | - Test Suite |
64+
+-------------------------+ +-------------------------+
65+
```
66+
67+
## 核心组件
68+
69+
### 1. CLI 层
70+
71+
**目录**: `cli/`
72+
73+
| 命令 | 功能 |
74+
|------|------|
75+
| `benchmark` | 端到端运行整个流水线 (推理 + 评估) |
76+
| `run_task` | 运行单个任务的完整流水线 |
77+
| `agent` | 仅运行推理阶段 |
78+
| `verifier` | 仅运行评估阶段 |
79+
| `dataset` | 浏览和检查数据集任务 |
80+
| `results` | 可视化结果 |
81+
82+
### 2. Common 层
83+
84+
**目录**: `common/`
85+
86+
#### 配置管理 (`config.py`, `run_config.py`)
87+
```python
88+
# BaseConfig 定义全局配置
89+
class BaseConfig:
90+
model: str # 使用的模型
91+
dataset_dir: Path # 数据集目录
92+
output_dir: Path # 输出目录
93+
docker_image: str # Docker 镜像名称
94+
max_workers: int # 并行工作数
95+
skip_existing: bool # 跳过已存在的任务
96+
```
97+
98+
#### 任务加载 (`loader.py`)
99+
```python
100+
def load_all_tasks(dataset_dir: Path) -> List[Task]:
101+
"""加载所有任务定义"""
102+
103+
def load_task(task_id: str) -> Task:
104+
"""加载单个任务"""
105+
106+
def get_tasks_by_category(category: str) -> List[Task]:
107+
"""按类别筛选任务"""
108+
```
109+
110+
#### 存储层 (`storage/`)
111+
- 管理任务结果和运行历史的持久化
112+
113+
### 3. Harness 层 - 推理 (Inference)
114+
115+
**目录**: `harness/inference/`
116+
117+
#### 核心文件
118+
- `androidbench.py` - 主推理引擎,并行执行多个任务
119+
- `androidbench_runner.py` - 单任务运行器
120+
- `androidbench.yaml` - Agent 配置
121+
122+
#### 推理流程
123+
```python
124+
async def run_inference(task: Task, model: str) -> Patch:
125+
# 1. 加载任务定义
126+
issue_description = task.description
127+
128+
# 2. 准备提示词
129+
prompt = build_prompt(task)
130+
131+
# 3. 调用 LLM
132+
response = await llm.complete(prompt)
133+
134+
# 4. 解析补丁
135+
patch = parse_patch(response)
136+
137+
# 5. 保存补丁
138+
save_patch(task.id, patch)
139+
140+
return patch
141+
```
142+
143+
#### LLM 集成
144+
- 基于 **mini-swe-agent** 构建
145+
- 使用 **LiteLLM** 支持多种模型 (OpenAI, Gemini, Anthropic 等)
146+
- 模型名称格式: `provider/model-name` (如 `gemini/gemini-2.5-flash`)
147+
148+
### 4. Harness 层 - 评估 (Evaluation)
149+
150+
**目录**: `harness/evaluation/`
151+
152+
#### 核心文件
153+
- `harness.py` - 评估核心逻辑
154+
- `benchmark_worker.py` - 单任务评估工作器
155+
- `main.py` - 评估命令行入口
156+
157+
#### 评估流程
158+
```python
159+
async def evaluate(patch: Patch, task: Task) -> Score:
160+
# 1. 构建 Docker 镜像
161+
image = build_task_image(task)
162+
163+
# 2. 在容器中运行
164+
container = await run_container(image, task)
165+
166+
# 3. 应用补丁
167+
await container.apply_patch(patch)
168+
169+
# 4. 运行测试
170+
test_results = await container.run_tests(task.commands)
171+
172+
# 5. 评分
173+
score = calculate_score(test_results, task.acceptance_criteria)
174+
175+
return score
176+
```
177+
178+
#### 验收标准
179+
```yaml
180+
acceptance_criteria:
181+
fail_to_pass: # 基础提交上失败,应用补丁后通过
182+
- testAnalyticsDebugUnitTest#Test intentsAreParsedCorrectly
183+
pass_to_pass: # 基础提交和应用补丁后都应通过
184+
- testAnalyticsDebugUnitTest#Test should_start_trusted_app
185+
```
186+
187+
### 5. 数据集层
188+
189+
**目录**: `dataset/tasks/{task_id}/`
190+
191+
#### 任务结构
192+
```
193+
task_id/
194+
├── task.yaml # 任务定义
195+
├── golden.patch # 黄金修复 (Oracle 解决方案)
196+
├── test.patch # 测试文件补丁
197+
└── Dockerfile # 任务特定的 Docker 配置
198+
```
199+
200+
#### task.yaml 规范
201+
```yaml
202+
instance_id: "AlphaWallet__alpha-wallet-android-pr_3329"
203+
repository:
204+
name: alpha-wallet-android
205+
owner: AlphaWallet
206+
url: https://github.com/AlphaWallet/alpha-wallet-android
207+
before_commit:
208+
sha: eea8b6402b6fa53fa0ed93cf87d2d58e30958fa6
209+
after_commit:
210+
sha: 5c8712695f4195e6b28dd643e5fd114b96ffaef0
211+
commands:
212+
build: ["./gradlew assembleDebug"]
213+
unit_test: ["./gradlew ... testDebugUnitTest"]
214+
android_test: ["./gradlew ... connectedDebugAndroidTest"]
215+
test_files:
216+
- app/src/test/java/com/alphawallet/app/IntentTest.java
217+
acceptance_criteria:
218+
fail_to_pass:
219+
- testAnalyticsDebugUnitTest#Test intentsAreParsedCorrectly
220+
pass_to_pass:
221+
- testAnalyticsDebugUnitTest#Test should_start_trusted_app
222+
```
223+
224+
## 执行流程
225+
226+
### 完整流水线
227+
```
228+
1. 用户执行: run_task --model gemini/gemini-2.5-flash --task <TASK_ID>
229+
|
230+
v
231+
2. CLI 解析参数,加载配置
232+
|
233+
v
234+
3. 推理阶段 (Inference):
235+
+-- 加载任务定义
236+
+-- 克隆代码库 (指定版本)
237+
+-- 构建提示词 (问题描述 + 上下文)
238+
+-- 调用 LLM 生成补丁
239+
+-- 保存补丁到输出目录
240+
|
241+
v
242+
4. 评估阶段 (Evaluation):
243+
+-- 构建/加载 Docker 镜像
244+
+-- 在容器中克隆代码库
245+
+-- 应用生成的补丁
246+
+-- 运行测试命令
247+
+-- 收集测试结果
248+
+-- 根据验收标准评分
249+
|
250+
v
251+
5. 输出结果:
252+
+-- scores.json - 评分详情
253+
+-- logs/ - 执行日志
254+
+-- patches/ - 生成的补丁
255+
```
256+
257+
### Docker 镜像策略
258+
259+
| 镜像类型 | 说明 | 构建时机 |
260+
|----------|------|----------|
261+
| Base Image | Android SDK + Gradle | 首次 setup |
262+
| Repo Image | 基础代码库 | 按需构建 |
263+
| Task Image | 任务特定环境 | 首次运行任务 |
264+
265+
```bash
266+
# 镜像构建命令
267+
uv run build_images --build --arch linux/amd64
268+
```
269+
270+
## 技术栈
271+
272+
| 组件 | 技术 | 用途 |
273+
|------|------|------|
274+
| 包管理 | uv | Python 依赖管理 |
275+
| Agent 框架 | mini-swe-agent | LLM Agent 执行 |
276+
| 模型抽象 | LiteLLM | 多模型支持 |
277+
| 容器化 | Docker | 隔离执行环境 |
278+
| 测试框架 | pytest | 单元测试 |
279+
| 构建工具 | Gradle | Android 项目构建 |
280+
| 并行执行 | concurrent.futures | 多任务并行 |
281+
282+
## 评分系统
283+
284+
### 评分维度
285+
1. **pass_to_pass**: 基础提交和应用补丁后都应通过的测试
286+
2. **fail_to_pass**: 基础提交上失败,应用补丁后通过的测试
287+
288+
### 评分逻辑
289+
```python
290+
def calculate_score(test_results, acceptance_criteria):
291+
fail_to_pass_tests = acceptance_criteria.fail_to_pass
292+
pass_to_pass_tests = acceptance_criteria.pass_to_pass
293+
294+
# 必须全部通过
295+
all_fail_to_pass_passed = all(
296+
t in test_results.passed for t in fail_to_pass_tests
297+
)
298+
all_pass_to_pass_passed = all(
299+
t in test_results.passed for t in pass_to_pass_tests
300+
)
301+
302+
if all_fail_to_pass_passed and all_pass_to_pass_passed:
303+
return Score.PASS
304+
else:
305+
return Score.FAIL
306+
```
307+
308+
### 状态码
309+
- `applied_patch_failed_tests`: 补丁应用成功但测试失败
310+
- `build_failed`: 构建失败
311+
- `test_timeout`: 测试超时
312+
- `patch_not_found`: 未找到补丁
313+
314+
## 扩展性
315+
316+
### 添加新任务
317+
1.`dataset/tasks/` 创建任务目录
318+
2. 编写 `task.yaml` 定义问题和验收标准
319+
3. 准备 `golden.patch` (Oracle 解决方案)
320+
4. 编写 `Dockerfile` 定义执行环境
321+
5. 运行 `dataset` 命令验证任务
322+
323+
### 支持新模型
324+
1. 确保模型被 LiteLLM 支持
325+
2. 导出对应的 API Key
326+
3. 使用 `provider/model-name` 格式调用
327+
328+
## 使用示例
329+
330+
```bash
331+
# 浏览数据集
332+
dataset
333+
334+
# 运行单个任务
335+
run_task --model gemini/gemini-2.5-flash --task android_snippets_1
336+
337+
# 运行基准测试
338+
benchmark --model gemini/gemini-2.5-flash --num_runs 5
339+
340+
# 仅运行推理
341+
agent -i <task_id> --model openai/gpt-4o
342+
343+
# 仅运行评估
344+
verifier --run-name <run_name>
345+
346+
# 可视化结果
347+
results --input-dir out
348+
```
349+
350+
## 限制与注意事项
351+
352+
1. **资源密集**: 基础镜像、代码库镜像和任务镜像可能需要 40GB+ 磁盘空间
353+
2. **首次启动慢**: 首次运行任务需要 5-10+ 分钟构建 Docker 镜像
354+
3. **ARM64 限制**: macOS ARM64 无法运行嵌套虚拟化,Android SDK 仅支持 x86_64
355+
4. **API 密钥**: 需要配置相应模型的 API Key
356+
357+
## 参考资料
358+
359+
- [Android Bench GitHub](https://github.com/android-bench/android-bench)
360+
- [User Guide](docs/guide.md)
361+
- [Dataset Documentation](docs/dataset.md)
362+
- [MiniSWE-Agent](https://www.mini-swe-agent.com)
363+
- [LiteLLM](https://github.com/BerriAI/litellm)

0 commit comments

Comments
 (0)