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 タスク設定スキル
ユーザーのタスク説明に基づき、最適化問題用の評価スクリプトと初期ソリューションからなるセットアップのひな形を作成します。どちらも、LLM と進化的アルゴリズムを組み合わせてコード最適化を行うフレームワークである ShinkaEvolve で使用されます。
使用するタイミング
ユーザーが次のような場合に、このスキルを呼び出します。
- LLM 主導のコード進化(Shinka/ShinkaEvolve)でコードを最適化したい
- 作業ディレクトリに
evaluate.pyとinitial.<ext>が存在しない
ユーザー入力
- タスクの説明と成功基準
initial.<ext>の対象言語(省略時は Python)- スクリプトの最適化対象部分
- 評価指標とスコアの方向
- 評価実行回数/シード数
- 必要なアセットやデータファイル
- 依存関係や制約(実行時間、メモリ)
ワークフロー
- ユーザー入力がすべてそろっているか確認し、推測できない場合はユーザーに追加質問します。
- 作業ディレクトリを調べます。選択された言語と拡張子を特定します。許可なく既存の
evaluate.pyやinitial.<ext>を上書きしないでください。 - 明確な進化対象領域(
EVOLVE-BLOCKマーカー、または言語に相当するコメント)と安定した I/O 契約を備えたinitial.<ext>を作成します。 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を書き込みます。
- Python の
- 候補の出力スキーマが評価器の想定と一致することを確認します(Python モジュール評価ではタプル/辞書、Python 以外ではファイル/CLI 契約)。
- 引き渡す前に、作成した
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が存在することを確認します。
- スモークテストを実行します。
- ユーザー自身で進化を実行するか、
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
進化の流れ
- アーカイブ/個体群から親を選択します
- LLM がパッチ(差分、全面書き換え、または交叉)を提案します
- 候補を評価します →
combined_score - 有効であれば、島のアーカイブに追加します(スコアが高いほど良好)
- 定期的に、上位のソリューションを島間で移行します
- 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.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の値が大きいほど、パフォーマンスが優れていることを示します。