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 タスク設定スキル

ユーザーのタスク説明に基づき、最適化問題用の評価スクリプトと初期ソリューションからなるセットアップのひな形を作成します。どちらも、LLM と進化的アルゴリズムを組み合わせてコード最適化を行うフレームワークである ShinkaEvolve で使用されます。

使用するタイミング

ユーザーが次のような場合に、このスキルを呼び出します。

  • LLM 主導のコード進化(Shinka/ShinkaEvolve)でコードを最適化したい
  • 作業ディレクトリに evaluate.py と initial.<ext> が存在しない

ユーザー入力

  • タスクの説明と成功基準
  • initial.<ext> の対象言語(省略時は Python)
  • スクリプトの最適化対象部分
  • 評価指標とスコアの方向
  • 評価実行回数/シード数
  • 必要なアセットやデータファイル
  • 依存関係や制約(実行時間、メモリ)

ワークフロー

  1. ユーザー入力がすべてそろっているか確認し、推測できない場合はユーザーに追加質問します。
  2. 作業ディレクトリを調べます。選択された言語と拡張子を特定します。許可なく既存の evaluate.py や initial.<ext> を上書きしないでください。
  3. 明確な進化対象領域(EVOLVE-BLOCK マーカー、または言語に相当するコメント)と安定した I/O 契約を備えた initial.<ext> を作成します。
  4. evaluate.py を作成します。
    • Python の initial.py:experiment_fn_name、get_experiment_kwargs、aggregate_metrics_fn、num_runs、および任意の validate_fn を指定して run_shinka_eval を呼び出します。
    • 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
    • 評価器が例外なく実行されることを確認します。
    • 少なくとも次の項目を含む metrics dict が生成されることを確認します(aggregate_fn または metrics.json のいずれかから生成)。
      • combined_score(数値)
      • public(dict)
      • private(dict)
      • extra_data(dict)
      • text_feedback(文字列。空でも可)
    • correct(bool)フィールドと error(文字列)フィールドを含む correct.json が存在することを確認します。
  7. ユーザー自身で進化を実行するか、shinka-run スキルを使用するかを尋ねます。
    • ユーザーが手動で進化を実行する場合は、言語と init_program_path が一致する run_evo.py と shinka.yaml 設定ファイルを追加します。
    • エージェントで最適化を行うために shinka-run スキルを使用するか、ユーザーに尋ねます。

ShinkaEvolve とは?

SakanaAI が開発したフレームワークです。LLM と進化的アルゴリズムを組み合わせてプログラムの変異を提案し、それを評価してアーカイブします。目的は、性能を最適化し、新たな科学的知見を発見することです。

リポジトリとドキュメント:https://github.com/SakanaAI/ShinkaEvolve
論文:https://arxiv.org/abs/2212.04180

進化の流れ
  1. アーカイブ/個体群から親を選択します
  2. LLM がパッチ(差分、全面書き換え、または交叉)を提案します
  3. 候補を評価します → combined_score
  4. 有効であれば、島のアーカイブに追加します(スコアが高いほど良好)
  5. 定期的に、上位のソリューションを島間で移行します
  6. N 世代にわたって繰り返します
生成するコアファイル
ファイル目的
initial.<ext>選択した言語で作成する開始ソリューション。LLM が変更する進化対象領域を含みます
evaluate.py候補を採点し、選択の指針となる指標と正確性の出力を生成します
run_evo.py(任意)進化ループを開始します
shinka.yaml(任意)設定:世代数、島数、LLM モデル、パッチ形式など

クイックインストール(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 は複数の候補プログラム言語をサポートしています。1 つ選び、拡張子、設定、評価器の整合性を保ってください。

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 の値が大きいほど、パフォーマンスが優れていることを示します。

コメント