| # Eval Service 集成到 ShinkaEvolve |
|
|
| ## ✅ 集成完成 |
|
|
| Eval Service 已成功集成到 ShinkaEvolve,支持异步评估模式。 |
|
|
| ## 🎯 修改内容(最小化) |
|
|
| ### 1. 数据结构扩展 |
|
|
| ```python |
| # EvolutionConfig - 新增 3 个字段 |
| class EvolutionConfig: |
| eval_service_url: Optional[str] = None # 已存在 |
| use_eval_service: bool = False # 新增:是否使用 eval service 做评估 |
| evaluator_module: Optional[str] = None # 新增:evaluator 模块路径 |
| evaluator_function: str = "main" # 新增:evaluator 函数名 |
| |
| # RunningJob - 新增 1 个字段 |
| class RunningJob: |
| use_eval_service: bool = False # 新增:标记是否使用 eval service |
| ``` |
|
|
| ### 2. 核心方法修改 |
|
|
| **`_submit_new_job()`** - 选择提交方式: |
| ```python |
| if self.eval_service_url and self.evo_config.use_eval_service: |
| job_id = self._submit_to_eval_service(exec_fname, results_dir, current_gen) |
| else: |
| job_id = self.scheduler.submit_async(exec_fname, results_dir) |
| ``` |
| |
| **`_check_completed_jobs()`** - 选择检查方式: |
| ```python |
| if job.use_eval_service: |
| is_complete = self._check_eval_service_status(job.job_id) |
| else: |
| is_running = self.scheduler.check_job_status(job) |
| ``` |
|
|
| **`_process_completed_job()`** - 选择结果获取方式: |
| ```python |
| if job.use_eval_service: |
| results = self._get_eval_service_results(job.job_id, job.results_dir) |
| else: |
| results = self.scheduler.get_job_results(job.job_id, job.results_dir) |
| ``` |
| |
| ### 3. 新增辅助方法(3个) |
| |
| - `_submit_to_eval_service()` - 提交评估到 eval service |
| - `_check_eval_service_status()` - 检查 eval service 任务状态 |
| - `_get_eval_service_results()` - 获取 eval service 结果 |
| |
| **总计**: ~60 行新增代码 |
| |
| ## 📊 使用方式 |
| |
| ### 方式 1:传统模式(默认) |
| |
| ```python |
| evo_config = EvolutionConfig( |
| # ... 其他配置 ... |
| eval_service_url=None, # 或者不设置 |
| ) |
| ``` |
| |
| **行为**: |
| - 使用 scheduler 执行评估(旧方式) |
| - 完全不受影响 |
| |
| ### 方式 2:通知模式(已有) |
| |
| ```python |
| evo_config = EvolutionConfig( |
| # ... 其他配置 ... |
| eval_service_url="http://localhost:8765", |
| use_eval_service=False, # 默认值 |
| ) |
| ``` |
| |
| **行为**: |
| - 使用 scheduler 执行评估 |
| - 完成后通知 eval service(触发 Agent) |
| |
| ### 方式 3:评估模式(新) |
| |
| ```python |
| evo_config = EvolutionConfig( |
| # ... 其他配置 ... |
| eval_service_url="http://localhost:8765", |
| use_eval_service=True, # 启用 eval service 评估 |
| evaluator_module="examples.circle_packing.evaluate_ori", |
| evaluator_function="main", |
| ) |
| ``` |
| |
| **行为**: |
| - 提交到 eval service 执行评估(异步) |
| - Eval service 运行 primary + auxiliary evaluators |
| - 自动集成所有 metrics |
| - 可能触发 Agent 分析 |
| |
| ## 🚀 快速开始 |
| |
| ### 1. 启动 Eval Service |
| |
| ```bash |
| python eval_agent/ev2_service_standalone.py \ |
| --results-dir /path/to/experiment \ |
| --primary-evaluator examples/circle_packing/evaluate_ori.py \ |
| --port 8765 |
| ``` |
| |
| ### 2. 运行 ShinkaEvolve |
| |
| ```bash |
| python examples/circle_packing/run_with_eval_service.py |
| ``` |
| |
| 或者修改现有脚本: |
| |
| ```python |
| from shinka.core import EvolutionRunner, EvolutionConfig |
| |
| evo_config = EvolutionConfig( |
| # ... 基础配置 ... |
| |
| # 启用 eval service 评估 |
| eval_service_url="http://localhost:8765", |
| use_eval_service=True, |
| evaluator_module="examples.circle_packing.evaluate_ori", |
| evaluator_function="main", |
| ) |
| |
| runner = EvolutionRunner(evo_config, job_config, db_config) |
| runner.run() |
| ``` |
| |
| ## 📊 数据流 |
| |
| ``` |
| ShinkaEvolve: |
| 1. 生成代码 → gen_1/main.py |
| 2. POST /api/v1/notify/generation_complete |
| (立即返回 job_id) |
| 3. 继续生成 gen_2(不等待 gen_1 完成) |
| 4. 轮询 gen_1 状态... |
| 5. gen_1 完成 → 获取 metrics → 添加到 DB |
| 6. 继续进化... |
| |
| Eval Service(后台): |
| 1. 接收请求,启动后台任务 |
| 2. 运行 primary evaluator |
| 3. 运行 auxiliary evaluators |
| 4. 保存 metrics.json |
| 5. 决定是否触发 Agent |
| ``` |
| |
| ## ✅ 优势 |
| |
| 1. **最小修改**:只修改了 ~60 行核心代码 |
| 2. **完全兼容**:旧代码不受任何影响 |
| 3. **渐进式**:可以逐步迁移到新模式 |
| 4. **并发优化**:利用现有的并发机制 |
| 5. **自动集成**:primary + auxiliary metrics 自动整合 |
| |
| ## 🧪 测试 |
| |
| ```bash |
| # 1. 启动 eval service |
| python eval_agent/ev2_service_standalone.py \ |
| --results-dir /tmp/test \ |
| --primary-evaluator examples/circle_packing/evaluate_ori.py |
| |
| # 2. 运行测试 |
| python test_eval_service_unified.py |
| |
| # 3. 运行集成示例 |
| python examples/circle_packing/run_with_eval_service.py |
| ``` |
| |
| ## 📝 配置选项 |
| |
| | 选项 | 类型 | 默认值 | 说明 | |
| |------|------|--------|------| |
| | `eval_service_url` | str | None | Eval Service URL | |
| | `use_eval_service` | bool | False | 是否使用 eval service 做评估 | |
| | `evaluator_module` | str | None | Evaluator 模块路径 | |
| | `evaluator_function` | str | "main" | Evaluator 函数名 | |
| |
| ## 🔧 代码统计 |
| |
| - **修改文件**: `shinka/core/runner.py` |
| - **新增配置**: 3 个字段 |
| - **新增方法**: 3 个辅助方法 |
| - **修改方法**: 3 个核心方法 |
| - **新增代码**: ~60 行 |
| - **linter 错误**: 0 |
| |
| ## 🎯 下一步 |
| |
| 现在可以: |
| |
| 1. ✅ 使用传统模式(不受影响) |
| 2. ✅ 使用通知模式(触发 Agent) |
| 3. ✅ 使用评估模式(完整集成) |
| |
| 选择最适合你的模式,逐步迁移! |
| |
| --- |
| |
| **实施日期**: 2026-02-03 |
| **修改者**: AI Assistant |
| **状态**: ✅ 完成并测试 |
| |