SakanaAI/AI-Scientistについて調べる

1.アイデア生成プロセス(generate_ideas.py前半)
1.1 初期設定
コマンドライン引数の解析:AIモデル選択、実験タイプ設定
選択されたAIモデル(GPT-4、Claudeなど)のクライアント初期化
1.2 データ準備
既存アイデア(ideas.json)、シードアイデア(seed_ideas.json)の読み込み
実験コード(experiment.py)とタスク説明(prompt.json)の読み込み
1.3 アイデア生成ループ
i. 新アイデア生成
LLM実行: idea_first_promptを用いてAIに新アイデアを要求
- 入力:これまでのアイデア、実験コード、タスク説明
- 出力:新アイデアの提案(JSON形式)
ii. アイデア改善(最大5回)
LLM実行: idea_reflection_promptを用いてAIにアイデア改善を要求
- 入力:直前に生成されたアイデア
- 出力:改善されたアイデア(JSON形式)
- AIが「完了」を示すまで繰り返し
iii. アイデアの保存
- 最終アイデアをリストに追加
1.4 結果の永続化
全生成アイデアをideas.jsonに保存

idea_first_prompt
{task_description}
<experiment.py>
{code}
</experiment.py>
これまでに生成されたアイデアは以下の通りです:
'''
{prev_ideas_string}
'''
提供されたコードを使って実行可能な、次の影響力のある創造的な研究実験とその方向性のアイデアを考え出してください。
追加のリソースやデータセットにはアクセスできないことに注意してください。
どのアイデアも特定のトレーニングデータセットやモデルに過度に適合せず、より広い意義を持つようにしてください。
以下の形式で回答してください:
THOUGHT:
<THOUGHT>
NEW IDEA JSON:
```json
<JSON>
```
<THOUGHT>では、まずアイデアの直感と動機について簡潔に述べてください。高レベルの計画、必要な設計上の選択、実験の理想的な結果について詳しく説明してください。既存のアイデアとどのように異なるかを正当化してください。
<JSON>では、以下のフィールドを持つJSON形式で新しいアイデアを提供してください:
"Name": アイデアの短縮された記述子。小文字、スペースなし、アンダースコア可。
"Title": アイデアのタイトル。レポート作成に使用されます。
"Experiment": 実装の概要。例:どの関数を追加または修正する必要があるか、結果をどのように得るか、など。
"Interestingness": 1から10までの評価(最低から最高)。
"Feasibility": 1から10までの評価(最低から最高)。
"Novelty": 1から10までの評価(最低から最高)。
評価には慎重かつ現実的であってください。
このJSONは自動的に解析されるため、形式が正確であることを確認してください。
アイデアを繰り返し改善する機会が{num_reflections}回ありますが、すべてを使用する必要はありません。

idea_reflection_prompt
idea_reflection_prompt = """ラウンド {current_round}/{num_reflections}。
思考の中で、まず、あなたが作成したアイデアの質、新規性、実現可能性を慎重に検討してください。
アイデアを評価する上で重要だと思われる他の要因も含めてください。
アイデアが明確で簡潔であること、そしてJSONが正しい形式であることを確認してください。
物事を過度に複雑にしないでください。
次の試みでは、アイデアを洗練し、改善するよう努めてください。
明らかな問題がない限り、元のアイデアの本質を守ってください。
以前と同じ形式で回答してください:
THOUGHT:
<THOUGHT>
NEW IDEA JSON:
```json
<JSON>
```
改善の余地がない場合は、思考の後に前回のJSONをそのまま繰り返し、思考の最後(JSONの前)に「完了しました」と記載してください。
変更を加えない場合にのみ「完了しました」を含めてください。
```

2.新規性チェックプロセス(generate_ideas.py後半)
2.1 準備
実験コード(experiment.py)とタスク説明(prompt.json)の読み込み
2.2 各アイデアの新規性評価(最大10回のイテレーション)
i. 初期評価
LLM実行: novelty_promptを用いてAIに新規性評価を要求
- 入力:評価対象のアイデア、タスク説明、実験コード
- 出力:新規性の初期判断または追加情報要求
ii. 追加情報収集(必要な場合)
- AIが提案した検索クエリでSemantic Scholar APIを使用
- 関連学術論文の情報(タイトル、著者、要約など)を取得
iii. 詳細評価
LLM実行: 追加情報を含めたnovelty_promptでAIに再評価を要求
- 入力:アイデア、タスク説明、実験コード、検索結果
- 出力:最終的な新規性判断
iv. 判断の記録
- AIの最終判断(新規/非新規)をアイデアの属性として保存
2.3 結果の保存
新規性情報を含む更新されたアイデアリストをideas.jsonに保存

novelty_system_msg
あなたは、フィールドに大きく貢献する論文を発表しようとする野心的なAI博士課程の学生です。
あるアイデアがあり、それが新規性があるかどうかを確認したいと考えています。つまり、既存の文献と大きく重複していないか、すでによく探求されていないかを確認したいのです。
新規性に対して厳しい批評家となり、新しい会議やワークショップの論文として十分な貢献があるかを確認してください。
Semantic Scholar APIにアクセスでき、これを使って文献を調査し、決定に役立つ関連論文を見つけることができます。
任意の検索クエリに対して上位10件の結果が、要約と共に提示されます。
論文を決定するために{num_rounds}回のチャンスがありますが、すべてを使用する必要はありません。
どのラウンドでも、早期に終了してアイデアの新規性を決定することができます。
十分な検索の後、あなたのアイデアと大きく重複する論文が見つからなかった場合、そのアイデアには新規性があると判断してください。
あなたのアイデアと大きく重複する論文が見つかった場合、そのアイデアには新規性がないと判断してください。
{task_description}
<experiment.py>
{code}
</experiment.py>

novelty_prompt
ラウンド {current_round}/{num_rounds}。
あなたには以下のアイデアがあります:
"""
{idea}
"""
前回のクエリの結果は以下の通りです(初回は空):
"""
{last_query_results}
"""
以下の形式で回答してください:
THOUGHT:
<THOUGHT>
RESPONSE:
```json
<JSON>
```
<THOUGHT>では、まずアイデアについて簡潔に推論し、決定を下すのに役立つクエリを特定してください。
決定を下した場合は、思考に「決定済み:新規性あり。」または「決定済み:新規性なし。」を追加してください。
<JSON>では、以下のフィールドのみを含むJSON形式で回答してください:
- "Query": 文献を検索するためのオプションの検索クエリ(例:attention is all you need)。今回決定を下していない場合は、クエリを行う必要があります。
探している論文の正確な名前や著者を思い出せる場合、クエリが最も効果的に機能します。
このJSONは自動的に解析されるため、形式が正確であることを確認してください。

3. 実験の実行プロセス(perform_experiments.py)
3.1 初期設定
- 実験フォルダの設定
- 最大実行回数(MAX_RUNS = 5)の設定
- 最大イテレーション数(MAX_ITERS = 4)の設定
3.2 実験計画
LLM実行: coder_promptを用いてAIに実験計画を要求
- 入力:アイデアのタイトルと説明、ベースライン結果
- 出力:実験計画の詳細
3.3 実験ループ(最大5回)
i. 実験コードの修正
LLM実行: AIに実験コードの修正を要求
- 入力:前回の実験結果(初回はなし)
- 出力:修正された実験コード
ii. 実験の実行
- コマンド実行:
python experiment.py --out_dir=run_i
(iは実行回数) - タイムアウト設定: 7200秒(2時間)
iii. 結果の解析
- 実行成功時:結果の読み取りと次のプロンプトの準備
- 実行失敗時:エラーメッセージの記録と次のプロンプトの準備
iv. 次の実験の準備
LLM実行: AIに次の実験のプランニングを要求
- 入力:現在の実験結果
- 出力:次の実験計画または「ALL_COMPLETED」
3.4 プロット生成
i. プロットコードの修正
LLM実行: AIにplot.pyの修正を要求
- 入力:これまでの実験結果
- 出力:修正されたプロットコード
ii. プロットの生成
- コマンド実行:
python plot.py
- タイムアウト設定: 600秒(10分)
3.5 実験ノートの作成
LLM実行: AIに実験ノート(notes.txt)の作成を要求
- 入力:生成されたプロット、実験結果
- 出力:詳細な実験ノート

coder_prompt
あなたの目標は、以下のアイデアを実装することです:{title}。
提案された実験は以下の通りです:{idea}。
必要な実験を完了するために、合計で最大{max_runs}回の実行が与えられています。すべての{max_runs}回を使用する必要はありません。
まず、実行したい実験のリストを計画してください。例えば、特定のハイパーパラメータを調査する場合、各実行でテストしたい各値を計画してください。
すでにバニラベースラインの結果を提供しているため、それを再実行する必要はありません。
参考として、ベースラインの結果は以下の通りです:
{baseline_results}
各変更を完了した後、`python experiment.py --out_dir=run_i`というコマンドを実行します。ここで、iは実行番号です。そして結果を評価します。
あなたが提案する変更は、このコマンド形式を使用しなければなりません。追加のコマンドライン引数を加えないでください。
その後、リストの次の項目を実装することができます。

next_prompt(失敗時)
実行が以下のエラーで失敗しました:{stderr_output}
注意)失敗パターンの一例
next_prompt(成功時)
実行 {run_num} が完了しました。結果は以下の通りです:
{results}
この結果を踏まえて、実験計画を再考する必要があるかどうかを決定してください(多くの場合、再考の必要はありません)。
将来、他の誰かがこの内容について要約を作成するために `notes.txt` を使用します。
実験の説明と実行番号を含む、実行 {run_num} に関する要約に必要なすべての関連情報を含めてください。必要に応じて詳細に記述してください。
次に、リストの次の項目を実装してください。
その後、`python experiment.py --out_dir=run_{run_num + 1}` というコマンドを実行します。
あなたが提案する変更は、このコマンド形式を使用しなければなりません。追加のコマンドライン引数を加えないでください。
実験が終了した場合は、'ALL_COMPLETED' と回答してください。
next_prompt(完了時)
素晴らしい仕事です!最終的なレポートに最も関連性のある図を生成するために、`plot.py` を修正してください。
特に、プロットしたい各実行に対して正しい名前を「labels」辞書に記入するようにしてください。
「labels」辞書に含まれる実行のみがプロットされるので、関連するすべての実行を必ず含めるようにしてください。
図を生成するために、`python plot.py` というコマンドを実行します。
next_prompt(描画後)
各プロットが示す内容と図のファイル名を含む説明を `notes.txt` に追加してください。できるだけ詳細に記述してください。
将来、他の誰かがこの `notes.txt` を使用してこの内容についてレポートを作成します。

4. レビューの実行プロセス(perform_review.py)
4.1 初期設定
- レビュアーシステムプロンプトの設定(reviewer_system_prompt_base)
- レビューフォームの設定(neurips_form)
4.2 論文の読み込み
-
load_paper
関数を使用してPDFから論文テキストを抽出
4.3 レビュー生成
LLM実行: テンプレートに基づいてAIにレビューを要求
- 入力:論文テキスト、レビューフォーム
- 出力:レビュー(JSON形式)
4.4 レビュー改善(最大5回)
LLM実行: reviewer_reflection_promptを用いてAIにレビュー改善を要求
- 入力:直前に生成されたレビュー
- 出力:改善されたレビュー(JSON形式)
4.5 アンサンブルレビュー(オプション)
複数のレビューを生成する場合:
i. 複数レビューの生成(最大5回)
ii. メタレビューの生成
LLM実行: meta_reviewer_system_promptを用いてAIにメタレビューを要求
- 入力:生成された複数のレビュー
- 出力:統合されたメタレビュー
4.6 スコアの集計
以下の項目についてスコアを集計:
- Originality, Quality, Clarity, Significance (1-4)
- Soundness, Presentation, Contribution (1-4)
- Overall (1-10)
- Confidence (1-5)
4.7 最終決定
- Decision: Accept / Reject の決定
4.8 結果の出力
- レビュー結果をJSONとして出力
- 主要な評価項目(Overall score, Decision, Weaknesses)を表示

neurips_form
レビューフォーム
以下は、各論文のレビューフォームで尋ねられる質問の説明と、これらの質問に回答する際に考慮すべきガイドラインです。
レビューを書く際は、決定後に採択された論文と、オプトインした不採択論文のレビューとメタレビューが公開されることを念頭に置いてください。
1. 要約:論文とその貢献を簡潔に要約してください。ここは論文を批評する場所ではありません。適切に書かれた要約であれば、著者も概ね同意するはずです。
- 長所と短所:以下の各側面に触れながら、論文の長所と短所を徹底的に評価してください:
- 独創性:タスクや方法は新しいですか?既知の技術の新しい組み合わせですか?(これは価値があります!)この研究が以前の貢献とどのように異なるかが明確ですか?関連研究は適切に引用されていますか?
- 品質:提出物は技術的に健全ですか?主張は十分に裏付けられていますか(理論的分析や実験結果など)?使用された方法は適切ですか?これは完成した研究ですか、それとも進行中の研究ですか?著者は自身の研究の長所と短所の両方を評価する際に慎重かつ誠実ですか?
- 明瞭性:提出物は明確に書かれていますか?よく整理されていますか?(そうでない場合は、明瞭性を改善するための建設的な提案をしてください。)読者に十分な情報を提供していますか?(優れた論文は、専門家の読者がその結果を再現するのに十分な情報を提供していることに注意してください。)
- 重要性:結果は重要ですか?他の人(研究者や実践者)がこのアイデアを使用したり、それに基づいて構築したりする可能性が高いですか?提出物は以前の研究よりも優れた方法で困難なタスクに取り組んでいますか?実証可能な方法で最先端の技術を進歩させていますか?ユニークなデータ、既存のデータに関するユニークな結論、またはユニークな理論的または実験的アプローチを提供していますか?
2. 質問:著者への質問や提案を慎重に列挙し、説明してください。著者からの回答によってあなたの意見が変わる可能性がある点、混乱を解消できる点、または制限に対処できる点を考えてください。これは、著者との生産的な反論と議論のフェーズにとって非常に重要です。
3. 制限:著者は自身の研究の制限と潜在的な社会的悪影響について適切に対処していますか?そうでない場合は、改善のための建設的な提案を含めてください。
一般的に、著者は自身の研究の制限や潜在的な社会的悪影響について率直であることで罰せられるのではなく、むしろ評価されるべきです。重要な点が欠けていないかを考え、著者へのフィードバックとして提供することをお勧めします。
4. 倫理的懸念:この論文に倫理的な問題がある場合は、倫理審査のためにフラグを立ててください。これが適切な場合のガイダンスについては、NeurIPS倫理ガイドラインを確認してください。
5. 健全性:技術的主張の健全性、実験および研究方法論、および論文の中心的主張が証拠によって適切に裏付けられているかどうかを示すために、以下の尺度で論文に数値評価を割り当ててください。
4:優秀
3:良好
2:普通
1:不十分
6. プレゼンテーション:プレゼンテーションの質を示すために、以下の尺度で論文に数値評価を割り当ててください。これには、文章のスタイルと明瞭さ、および先行研究との関連付けを考慮に入れる必要があります。
4:優秀
3:良好
2:普通
1:不十分
7. 貢献:研究されている分野に対するこの論文の全体的な貢献の質を示すために、以下の尺度で数値評価を割り当ててください。問われている質問は重要ですか?論文はアイデアや実行に著しい独創性をもたらしていますか?結果は広範なNeurIPSコミュニティと共有する価値がありますか?
4:優秀
3:良好
2:普通
1:不十分
8. 全体評価:この提出物の「全体的な評価」を提供してください。選択肢:
10:賞品質:技術的に完璧な論文で、1つ以上のAI分野に画期的な影響を与え、非常に強力な評価、再現性、リソースを持ち、未対処の倫理的考慮事項がない。
9:非常に強い採択:技術的に完璧な論文で、少なくとも1つのAI分野に画期的な影響を与え、複数のAI分野に優れた影響を与え、完璧な評価、リソース、再現性を持ち、未対処の倫理的考慮事項がない。
8:強い採択:技術的に強力な論文で、新しいアイデアがあり、少なくとも1つのAI分野に優れた影響を与えるか、複数のAI分野に高度から優れた影響を与え、優れた評価、リソース、再現性を持ち、未対処の倫理的考慮事項がない。
7:採択:技術的に堅固な論文で、少なくとも1つのAIのサブ領域に高い影響を与えるか、複数のAI領域に中程度から高い影響を与え、良好から優れた評価、リソース、再現性を持ち、未対処の倫理的考慮事項がない。
6:弱い採択:技術的に堅固で、中程度から高い影響力のある論文で、評価、リソース、再現性、倫理的考慮事項に関して大きな懸念がない。
5:境界線上の採択:技術的に堅固な論文で、採択の理由が拒否の理由を上回る。例えば、限定的な評価。慎重に使用してください。
4:境界線上の拒否:技術的に堅固な論文で、拒否の理由(例:限定的な評価)が採択の理由(例:良好な評価)を上回る。慎重に使用してください。
3:拒否:例えば、技術的な欠陥がある論文、弱い評価、不十分な再現性、および不完全に対処された倫理的考慮事項。
2:強い拒否:例えば、大きな技術的欠陥がある論文、および/または貧弱な評価、限定的な影響、貧弱な再現性、およびほとんど対処されていない倫理的考慮事項。
1:非常に強い拒否:例えば、些細な結果や対処されていない倫理的考慮事項がある論文。
9. 信頼度:この提出物の評価に対する「信頼度スコア」を提供し、評価にどの程度の自信があるかを示してください。選択肢:
5:あなたは自分の評価に絶対的な確信を持っています。関連する研究に非常に精通しており、数学やその他の詳細を慎重にチェックしました。
4:あなたは自分の評価に自信がありますが、絶対的な確信はありません。可能性は低いですが、提出物の一部を理解していなかったり、関連する研究の一部に精通していない可能性があります。
3:あなたは自分の評価にかなり自信がありますが、提出物の一部を理解していなかったり、関連する研究の一部に精通していない可能性があります。数学やその他の詳細は慎重にチェックされていません。
2:あなたは自分の評価を擁護する用意がありますが、提出物の中心的な部分を理解していなかったり、関連する研究の一部に精通していない可能性がかなり高いです。数学やその他の詳細は慎重にチェックされていません。
1:あなたの評価は教育を受けた推測です。提出物はあなたの専門分野ではないか、提出物を理解するのが難しかったです。数学やその他の詳細は慎重にチェックされていません。
以下の形式で回答してください:
THOUGHT:
<THOUGHT>
REVIEW JSON:
```json
<JSON>
```
<THOUGHT>では、まず評価に対するあなたの直感と推論について簡潔に議論してください。
高レベルの議論、必要な選択、およびレビューの望ましい結果を詳細に説明してください。
ここで一般的なコメントをするのではなく、現在の論文に特化したものにしてください。
これをレビューのメモ取りフェーズとして扱ってください。
<JSON>では、以下のフィールドを順番に含むJSON形式でレビューを提供してください:
- "Summary": 論文の内容とその貢献の要約。
- "Strengths": 論文の長所のリスト。
- "Weaknesses": 論文の短所のリスト。
- "Originality": 1から4の評価(低、中、高、非常に高い)。
- "Quality": 1から4の評価(低、中、高、非常に高い)。
- "Clarity": 1から4の評価(低、中、高、非常に高い)。
- "Significance": 1から4の評価(低、中、高、非常に高い)。
- "Questions": 論文著者が答えるべき明確化のための質問セット。
- "Limitations": 研究の限界と潜在的な社会的悪影響のセット。
- "Ethical Concerns": 倫理的懸念があるかどうかを示すブール値。
- "Soundness": 1から4の評価(不十分、普通、良好、優秀)。
- "Presentation": 1から4の評価(不十分、普通、良好、優秀)。
- "Contribution": 1から4の評価(不十分、普通、良好、優秀)。
- "Overall": 1から10の評価(非常に強い拒否から賞品質まで)。
- "Confidence": 1から5の評価(低、中、高、非常に高い、絶対的)。
- "Decision": 以下のいずれかでなければならない決定:Accept、Reject。
"Decision"フィールドには、Weak Accept、Borderline Accept、Borderline Reject、Strong Rejectを使用せず、AcceptまたはRejectのみを使用してください。
このJSONは自動的に解析されるため、形式が正確であることを確認してください。

reviewer_reflection_prompt
ラウンド {current_round}/{num_reflections}。
思考の中で、まず、あなたが作成したレビューの正確性と健全性を慎重に検討してください。
論文を評価する上で重要だと思われる他の要因も含めてください。
レビューが明確で簡潔であること、そしてJSONが正しい形式であることを確認してください。
物事を過度に複雑にしないでください。
次の試みでは、レビューを洗練し、改善するよう努めてください。
明らかな問題がない限り、元のレビューの本質を守ってください。
以前と同じ形式で回答してください:
THOUGHT:
<THOUGHT>
REVIEW JSON:
```json
<JSON>
```
改善の余地がない場合は、思考の後に前回のJSONをそのまま繰り返し、思考の最後(JSONの前)に「完了しました」と記載してください。
変更を加えない場合にのみ「完了しました」を含めてください。

meta_reviewer_system_prompt
あなたは機械学習の学会のエリアチェアです。
{reviewer_count}人のレビュアーによってレビューされた論文のメタレビューを担当しています。
あなたの仕事は、レビューを集約して同じ形式で単一のメタレビューにまとめることです。
決定に際しては批判的かつ慎重であり、コンセンサスを見出し、すべてのレビュアーの意見を尊重してください。

5. 論文の執筆プロセス(perform_writeup.py)
5.1 初期設定
- コマンドライン引数解析: フォルダ名、AIモデル、執筆スキップオプション
- 選択AIモデル(GPT-4、Claude等)のクライアント初期化
- LaTeXテンプレート(template.tex)の読み込み
- アイデアファイル(ideas.json)の読み込み
5.2 セクション別執筆
以下の順でセクションを執筆。各セクションで以下のプロセスを実行:
- タイトルと要約
- 序論
- 背景
- 手法
- 実験設定
- 結果
- 結論
各セクション執筆プロセス:
i. セクション執筆要求
LLM実行: セクション固有のプロンプトでAIに執筆要求
- 入力: セクションのガイドライン、これまでの内容
- 出力: セクションの下書き
ii. セクション改善
LLM実行: refinement_promptでAIに改善要求
- 入力: 下書き、改善ガイドライン
- 出力: 改善されたセクション
5.3 関連研究の概要作成
LLM実行: AIに関連研究の概要作成を要求
- 出力: LaTeXコメントによる関連研究の構造と含めるべき論文の概要
5.4 引用の追加(最大20回)
i. 引用箇所の特定
LLM実行: citation_first_promptでAIに引用箇所特定を要求
- 出力: 引用追加箇所の説明、論文検索クエリ
ii. 論文検索
- Semantic Scholar APIを使用して論文を検索(最大10件)
iii. 引用論文の選択
LLM実行: citation_second_promptでAIに引用論文選択を要求
- 出力: 選択された論文のインデックス、引用追加の詳細説明
iv. 引用の追加
- 選択された論文のBibTeX情報をreferences.bibに追加
- LaTeXファイルに\citeまたは\citetコマンドを追加
5.5 関連研究セクションの執筆
LLM実行: AIに関連研究セクションの執筆を要求
- 入力: 追加された引用情報
- 出力: 完成した関連研究セクション
5.6 全体の改訂
各セクションに対して:
LLM実行: second_refinement_promptでAIに改訂を要求
- 入力: 現在のセクション、セクション固有のヒント
- 出力: 改訂されたセクション
5.7 LaTeX生成
- チクテックを使用してLaTeXエラーを修正(最大5回)
- pdflatexとbibtexを使用してPDFを生成
- 生成されたPDFを指定されたファイル名で保存

(個人のコメント)
AI-Scientist は複雑なシステムというより、LLMを活用した短いプロンプト集とその自動実行プロセスであり、コードは容易にClaudeなどに読み込ませることができます。
上記はコードとREADMEをClaudeに読み込ませて私が必要な情報をうまく出してくれるように何度か会話して出力されたもので、正しい保証はありません。(抽象的な説明はいくらかネットにありますが、もう少し踏み込んで、特にプロンプト文と処理を日本語でわかるようにしたかった。概要とコードの中間くらいの文章にできた気がする)。
AI-Scientistのループの回し方、レビューの仕方、プログラムの実行の仕方は、科学者にとどまらない多くの業務での応用が効きそうです。いまいち正確性な処理ができないがためにLLMが活かせていないという箇所で、必要な正確性を持たせるという手法のように感じられるからです。また、SakanaAIの試行錯誤の末の結論的フロー、プロンプトでしょうから、日常LLMを使う際にも応用できるちょっとした工夫が見つかるかもしれません。