关于 shinka-setup
这项技能为 ShinkaEvolve 优化任务搭建评估脚本和初始程序,帮助定义候选程序接口及评分输出,并支持多种语言;还可选配进化运行器。
主要功能
- 01生成初始程序与评估器
- 02支持多种候选程序语言
- 03验证评估输出
- 04可选配置进化运行器
适用场景
- 01准备代码优化任务
- 02定义候选程序输入输出约定
- 03进化前检查评估指标
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sakanaai/ shinkaevolve --skill shinka-setup安装后在 Claude Code 中输入/shinka-setup确认已加载。
附带文件scripts/run_evo.pyscripts/shinka.yaml
详细介绍
Shinka 任务设置技能
根据用户的任务描述,为优化问题创建一个包含评估脚本和初始解的脚手架。这两个部分将在 ShinkaEvolve 中使用。ShinkaEvolve 是一个结合大模型与进化算法来推动代码优化的框架。
适用场景
在用户有以下需求时调用此技能:
- 想要使用大模型驱动的代码进化来优化代码(Shinka/ShinkaEvolve)
- 工作目录中不存在
evaluate.py和initial.<ext>
用户输入
- 任务描述和成功标准
initial.<ext>的目标语言(若未指定,默认为 Python)- 要优化脚本中的哪些部分
- 评估指标及分数方向
- 评估运行次数/随机种子
- 所需资源或数据文件
- 依赖或约束(运行时间、内存)
工作流
- 检查用户是否提供了所有输入;如果无法推断缺失信息,则向用户追问。
- 检查工作目录。检测所选语言及扩展名。未经用户同意,不要覆盖已有的
evaluate.py或initial.<ext>。 - 编写
initial.<ext>,其中包含清晰的演化区域(EVOLVE-BLOCK标记或对应语言的注释)以及稳定的 I/O 约定。 - 编写
evaluate.py:- 对于 Python
initial.py:调用run_shinka_eval,并提供experiment_fn_name、get_experiment_kwargs、aggregate_metrics_fn、num_runs,以及可选的validate_fn。 - 对于非 Python 的
initial.<ext>:直接运行候选程序(通常通过subprocess),并写入metrics.json和correct.json。
- 对于 Python
- 确保候选程序的输出格式符合评估器的预期(Python 模块评估使用元组/字典,非 Python 则使用文件/CLI 约定)。
- 交付前验证
evaluate.py草稿:- 运行冒烟测试:
python evaluate.py --program_path initial.<ext> --results_dir /tmp/shinka_eval_smoke
- 确认评估器运行时没有异常。
- 确认生成了指标
dict(来自aggregate_fn或metrics.json),且至少包含:combined_score(数值),public(dict),private(dict),extra_data(dict),text_feedback(字符串,可以为空)。
- 确认
correct.json存在,并包含correct(布尔值)和error(字符串)字段。
- 运行冒烟测试:
- 询问用户是想自行运行进化,还是使用
shinka-run技能:- 如果用户想手动运行进化,则添加
run_evo.py和shinka.yaml配置,并确保语言与init_program_path匹配。 - 询问用户是否想使用
shinka-run技能,通过 Agent 进行优化。
- 如果用户想手动运行进化,则添加
什么是 ShinkaEvolve?
这是 SakanaAI 开发的框架,它结合大模型与进化算法来提出程序变异方案,并对这些方案进行评估和归档。目标是优化性能并发现新颖的科学洞见。
仓库和文档:https://github.com/SakanaAI/ShinkaEvolve 论文:https://arxiv.org/abs/2212.04180
进化流程
- 从档案/种群中选择一个或多个父代
- 大模型提出补丁(差异、完整重写或交叉)
- 评估候选方案 →
combined_score - 如果有效,则加入岛屿档案(分数越高越好)
- 定期在岛屿之间迁移顶尖方案
- 重复进行 N 代
要生成的核心文件
| 文件 | 用途 |
|---|---|
initial.<ext> | 所选语言的初始解,其中包含供大模型修改的演化区域 |
evaluate.py | 对候选方案评分,并输出用于指导选择的指标和正确性结果 |
run_evo.py | (可选)启动进化循环 |
shinka.yaml | (可选)配置:进化代数、岛屿数量、大模型、补丁类型等 |
快速安装(如果尚未设置 Shinka)
在创建/运行任务之前安装一次:
# Check if shinka is available in workspace environment
python -c "import shinka"
# If not; install from PyPI
pip install shinka-evolve
# Or with uv
uv pip install shinka-evolve
语言支持(initial.<ext>)
Shinka 支持多种候选程序语言。选择一种,然后确保扩展名、配置和评估器保持一致。
evo_config.language | initial.<ext> |
|---|---|
python | initial.py |
julia | initial.jl |
fortran | initial.f90 |
cpp | initial.cpp |
cuda | initial.cu |
rust | initial.rs |
swift | initial.swift |
json / json5 | initial.json |
规则:
evaluate.py保持为评估器入口点。- Python 候选程序:优先使用
run_shinka_eval+experiment_fn_name。 - 非 Python 候选程序:通过
subprocess进行评估,并写入metrics.json+correct.json。 - 始终同时设置
evo_config.language和匹配的evo_config.init_program_path。
模板:initial.<ext>(Python 示例)
import random
# EVOLVE-BLOCK-START
def advanced_algo():
# Implement the evolving algorithm here.
return 0.0, ""
# EVOLVE-BLOCK-END
def solve_problem(params):
return advanced_algo()
def run_experiment(random_seed: int | None = None, **kwargs):
"""Main entrypoint called by evaluator."""
if random_seed is not None:
random.seed(random_seed)
score, text = solve_problem(kwargs)
return float(score), text
对于非 Python 的 initial.<ext>,保持相同思路:设置一小段可演化区域,以及供 evaluate.py 使用的确定性程序接口。
模板:evaluate.py(Python run_shinka_eval 路径)
import argparse
import numpy as np
from shinka.core import run_shinka_eval # required for results storage
def get_kwargs(run_idx: int) -> dict:
return {"random_seed": int(np.random.randint(0, 1_000_000_000))}
def aggregate_fn(results: list) -> dict:
scores = [r[0] for r in results]
texts = [r[1] for r in results if len(r) > 1]
combined_score = float(np.mean(scores))
text = texts[0] if texts else ""
return {
"combined_score": combined_score,
"public": {},
"private": {},
"extra_data": {},
"text_feedback": text,
}
def validate_fn(result):
# Return (True, None) or (False, "reason")
return True, None
def main(program_path: str, results_dir: str):
metrics, correct, err = run_shinka_eval(
program_path=program_path,
results_dir=results_dir,
experiment_fn_name="run_experiment",
num_runs=3,
get_experiment_kwargs=get_kwargs,
aggregate_metrics_fn=aggregate_fn,
validate_fn=validate_fn, # Optional
)
if not correct:
raise RuntimeError(err or "Evaluation failed")
if __name__ == "__main__":
# argparse program path & dir
parser = argparse.ArgumentParser()
parser.add_argument("--program_path", required=True)
parser.add_argument("--results_dir", required=True)
args = parser.parse_args()
main(program_path=args.program_path, results_dir=args.results_dir)
模板:evaluate.py(非 Python initial.<ext> 路径)
import argparse
import json
import os
from pathlib import Path
def main(program_path: str, results_dir: str):
os.makedirs(results_dir, exist_ok=True)
# 1) Execute candidate program_path (subprocess / runtime-specific call)
# 2) Compute task metrics + correctness
metrics = {
"combined_score": 0.0,
"public": {},
"private": {},
"extra_data": {},
"text_feedback": "",
}
correct = False
error = ""
(Path(results_dir) / "metrics.json").write_text(
json.dumps(metrics, indent=2), encoding="utf-8"
)
(Path(results_dir) / "correct.json").write_text(
json.dumps({"correct": correct, "error": error}, indent=2), encoding="utf-8"
)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--program_path", required=True)
parser.add_argument("--results_dir", required=True)
args = parser.parse_args()
main(program_path=args.program_path, results_dir=args.results_dir)
(可选)模板:run_evo.py(异步)
参见 skills/shinka-setup/scripts/run_evo.py,了解要编辑的示例。
(可选)模板:shinka.yaml
参见 skills/shinka-setup/scripts/shinka.yaml,了解要编辑的示例。
说明
- 将演化标记范围控制得尽量小;只有区域内的代码应参与演化。
- 保持评估器架构稳定(
combined_score、public、private、extra_data、text_feedback)。 - Python 模块路径:确保
experiment_fn_name与initial.py中的函数名称一致。 - 非 Python 路径:确保评估器/运行时契约与
initial.<ext>的 CLI/I/O 相匹配。 combined_score值越高,表示性能越好。
评论
支持 Markdown