mcpField
S
shinka-setup

shinka-setup

github.com/sakanaai开发1.5k239 次安装3 周前更新
代码仓库

关于 shinka-setup

这项技能为 ShinkaEvolve 优化任务搭建评估脚本和初始程序,帮助定义候选程序接口及评分输出,并支持多种语言;还可选配进化运行器。

主要功能

  1. 01生成初始程序与评估器
  2. 02支持多种候选程序语言
  3. 03验证评估输出
  4. 04可选配置进化运行器

适用场景

  1. 01准备代码优化任务
  2. 02定义候选程序输入输出约定
  3. 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)
  • 要优化脚本中的哪些部分
  • 评估指标及分数方向
  • 评估运行次数/随机种子
  • 所需资源或数据文件
  • 依赖或约束(运行时间、内存)

工作流

  1. 检查用户是否提供了所有输入;如果无法推断缺失信息,则向用户追问。
  2. 检查工作目录。检测所选语言及扩展名。未经用户同意,不要覆盖已有的 evaluate.py 或 initial.<ext>。
  3. 编写 initial.<ext>,其中包含清晰的演化区域(EVOLVE-BLOCK 标记或对应语言的注释)以及稳定的 I/O 约定。
  4. 编写 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。
  5. 确保候选程序的输出格式符合评估器的预期(Python 模块评估使用元组/字典,非 Python 则使用文件/CLI 约定)。
  6. 交付前验证 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(字符串)字段。
  7. 询问用户是想自行运行进化,还是使用 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

进化流程
  1. 从档案/种群中选择一个或多个父代
  2. 大模型提出补丁(差异、完整重写或交叉)
  3. 评估候选方案 → combined_score
  4. 如果有效,则加入岛屿档案(分数越高越好)
  5. 定期在岛屿之间迁移顶尖方案
  6. 重复进行 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.languageinitial.<ext>
pythoninitial.py
juliainitial.jl
fortraninitial.f90
cppinitial.cpp
cudainitial.cu
rustinitial.rs
swiftinitial.swift
json / json5initial.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