Eval Service 集成到 ShinkaEvolve
✅ 集成完成
Eval Service 已成功集成到 ShinkaEvolve,支持异步评估模式。
🎯 修改内容(最小化)
1. 数据结构扩展
# 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() - 选择提交方式:
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() - 选择检查方式:
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() - 选择结果获取方式:
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:传统模式(默认)
evo_config = EvolutionConfig(
# ... 其他配置 ...
eval_service_url=None, # 或者不设置
)
行为:
- 使用 scheduler 执行评估(旧方式)
- 完全不受影响
方式 2:通知模式(已有)
evo_config = EvolutionConfig(
# ... 其他配置 ...
eval_service_url="http://localhost:8765",
use_eval_service=False, # 默认值
)
行为:
- 使用 scheduler 执行评估
- 完成后通知 eval service(触发 Agent)
方式 3:评估模式(新)
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
python eval_agent/ev2_service_standalone.py \
--results-dir /path/to/experiment \
--primary-evaluator examples/circle_packing/evaluate_ori.py \
--port 8765
2. 运行 ShinkaEvolve
python examples/circle_packing/run_with_eval_service.py
或者修改现有脚本:
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
✅ 优势
- 最小修改:只修改了 ~60 行核心代码
- 完全兼容:旧代码不受任何影响
- 渐进式:可以逐步迁移到新模式
- 并发优化:利用现有的并发机制
- 自动集成:primary + auxiliary metrics 自动整合
🧪 测试
# 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
🎯 下一步
现在可以:
- ✅ 使用传统模式(不受影响)
- ✅ 使用通知模式(触发 Agent)
- ✅ 使用评估模式(完整集成)
选择最适合你的模式,逐步迁移!
实施日期: 2026-02-03
修改者: AI Assistant
状态: ✅ 完成并测试