🔍

AIで論文生成をするにはこんなふうに (AI Scientistの解説と実践)

2024/09/09に公開

3行サマリー

  • 2024年8月13日に論文をLLMで生成する記事が公開されました。
  • 難易度の高いゴールを達成するための複雑な過程をLLMで扱うためのアプローチを紹介します。
  • AI Scientistのソースコードの重要部分を解説します。

背景

私の中で、論文の執筆というのは豊富な専門知識とアイディアが必要なのでLLMでの代替は困難かと思っていました。 しかし、良く考えてみるれば、「アイディア=既存の事象の組み合わせ」という提言もあるのでLLMでの代替は可能かなと思い始めました。

論文の定義

領域によって論文の定義が異なってくると思いますので、論文とはなにかを定義する必要があります。GPT-4の回答の一部を引用すると以下です。

新しい知識や発見、理論を提案し、既存の知識に貢献することを目的としています。研究結果の報告、理論の検証、新しい視点の提案などが含まれます。

主に理系の学術論文では、新しさが含まれていることが重要のようです。

大学の研究室でもレビューされる際に「新規性は何なの?」というテーマで一番最初にディスカッションしたことを思い出します。

アプローチ

ではその新規性を作り出し、論文というアウトプットをどのように作るかというところです。

論文の執筆作業は単純でもありません。LLMに「機械学習の論文を書いて」といってもまともなものが出力されることは現時点では無いでしょう。

今回の論文執筆というタスクは複雑で難しい思いますが、そのような事象をLLMを使って複雑な事象を扱うアプローチがあります。

次に各アプローチと説明を紹介します。

チェーン・オブ・ソート (Chain of Thought)

LLMを使用して問題を段階的に解決する手法です。LLMは中間的な思考過程を示すことができるため、問題解決の途中経過を可視化できます。例えば、数学の問題を解く際に、LLMが途中の計算ステップを示してくれることで、解答の過程を理解しやすくなります。

ステップバイステップ推論 (Step-by-Step Reasoning)

ステップバイステップ推論は、問題を小さなステップに分解し、各ステップごとにLLMの出力を得る手法です。例えば、複雑な論理パズルを解く際に、問題を小さな部分に分割し、LLMが各ステップの解答を提供することで、全体の解答を導き出すことができます。

反復的精緻化 (Iterative Refinement)

初期の回答を基に、徐々に改善や詳細化を重ねていく手法です。LLMが初期の回答を生成した後、その回答を元にさらなる情報を追加し、より正確な回答を得ることができます。例えば、文章の要約を生成する際に、LLMが初期の要約を提供し、その後、追加の文脈情報を与えることで、より適切な要約を作成できます。

タスク分解 (Task Decomposition)

複雑なタスクを小さなサブタスクに分解し、それぞれを個別に処理する手法です。LLMが各サブタスクの解答を提供することで、全体のタスクを効率的に解決できます。例えば、プログラミングの問題を解く際に、大きな問題を小さな関数に分割し、LLMが各関数の実装をサポートすることで、全体のプログラムを完成させることができます。

自己一貫性 (Self-Consistency)

複数の推論パスを生成し、最も一貫性のある結果を選択する手法です。LLMが複数の解答候補を生成し、それらの一貫性を評価することで、最も信頼性の高い解答を選び出すことができます。例えば、意思決定のサポートシステムにおいて、LLMが異なる選択肢に対する意見や理由を提供し、一貫性の高い結論を導くことができます。

https://zenn.dev/minedia/articles/llm-design-pattern

AI Scientistを動かしてみる

システムの設計を頭に入れたうえで、各実装について確認していきます。

AI Scientistの構成

AI Scientistの構成図を以下に引用します。

AI Scientistの中では、前述の4つのアプローチをすべて取り入れています。
やはり、LLMによって複雑な事象を扱うためには必然的にそのようなアプローチを取ることになるのかと思います。

動作環境のセットアップ

実際に自分の学習のために動かしてみます。

基本的に詳細なセットアップの内容はオリジナルのREADMEにきちんと書かれているので、今回は私が実行したコマンドや設定を貼っておきます。

condaのセットアップ

condaが必要なのでセットアップしていない場合はセットアップします。
色々聞かれますが、基本的にはデフォルトで大丈夫です。

wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh
bash Anaconda3-2024.06-1-Linux-x86_64.sh

fishを使っているので、環境変数を読み込みます。

source /home/matsu/anaconda3/etc/profile.d/conda.csh

AI Scientistの準備

condaで環境を作成して、pipでインストールしていきます。

conda create -n ai_scientist python=3.11
conda activate ai_scientist
pip install anthropic aider-chat backoff openai
pip install matplotlib pypdf pymupdf4llm
sudo apt-get install texlive-full -y
pip install torch numpy transformers datasets tiktoken wandb tqdm

API Keyの準備

最低限動かすだけならOpenAIのAPIキーだけで良いので設定しておきます。

bash
export OPENAI_API_KEY="YOUR KEY HERE"
csh
set OPENAI_API_KEY "YOUR KEY HERE"

NanoGPTの準備

GPTに学習させてLLMを準備します。

python data/enwik8/prepare.py
python data/shakespeare_char/prepare.py
python data/text8/prepare.py

今回はワークフローの全体感を掴むのが目的なので
liteバージョンで実行します。

実行するので以下の方法で行います。

cd templates/nanoGPT_lite && python experiment.py --out_dir run_0 && python plot.py

GPUが刺さっていない場合は、以下のようにCPUに変更して実行します。

git diff
diff --git a/templates/nanoGPT/experiment.py b/templates/nanoGPT/experiment.py
index 303aebd..747755e 100644
--- a/templates/nanoGPT/experiment.py
+++ b/templates/nanoGPT/experiment.py
@@ -348,7 +348,7 @@ def train(dataset="shakespeare_char", out_dir="run_0", seed_offset=0):
     # DDP settings
     backend = "nccl"  # 'nccl', 'gloo', etc.
     # system
-    device = "cuda"  # Always use CUDA
+    device = "cpu"  # Always use CUDA
     dtype = (
         "bfloat16"
         if torch.cuda.is_available() and torch.cuda.is_bf16_supported()
diff --git a/templates/nanoGPT_lite/experiment.py b/templates/nanoGPT_lite/experiment.py
index 892ba72..f834b2f 100644
--- a/templates/nanoGPT_lite/experiment.py
+++ b/templates/nanoGPT_lite/experiment.py
@@ -348,7 +348,7 @@ def train(dataset="shakespeare_char", out_dir="run_0", seed_offset=0):
     # DDP settings
     backend = "nccl"  # 'nccl', 'gloo', etc.
     # system
-    device = "cuda"  # Always use CUDA
+    device = "cpu"  # Always use CUDA
     dtype = (
         "bfloat16"
         if torch.cuda.is_available() and torch.cuda.is_bf16_supported()

NPEETのインストール

git clone https://github.com/gregversteeg/NPEET.git
cd NPEET
pip install .
pip install scikit-learn

NPEET(Non-parametric Entropy Estimation Toolbox)は、連続変数と離散変数の両方に対するエントロピー、相互情報量、条件付き相互情報量の推定を行うPythonライブラリです。このツールは、Kullback-Leibler分散や混合変数間の相互情報量の推定もサポートしています。

8年前ぐらいに作られたライブラリです。pipで入らないのでcloneしてインストールします。

2D Diffusionの設定

cd templates/2d_diffusion && python experiment.py --out_dir run_0 && python plot.py

Grokkingのセットアップ

cd templates/grokking && python experiment.py --out_dir run_0 && python plot.py

プログラムの実行

最低限の準備は上記でOKです。
必要な引数を設定して実行します。

python launch_scientist.py --model "gpt-4o-2024-05-13" --experiment nanoGPT_lite --num-ideas 1

これで、しばらく放置する感じです。

実行を以下に掲載しておきますが、多分24時間ぐらい動かしておいてエラーで止まりました。最終的な論文は出力されませんでした。

一旦、今回の記事スコープでは深追いしないでおきます。

実行出力
❯ OPENAI_API_KEY='sk-pro-xxxxxxx' python launch_scientist.py --model "gpt-4o-2024-05-13" --experiment nanoGPT_lite --num-ideas 1
Using GPUs: []
Using OpenAI API with model gpt-4o-2024-05-13.

Generating idea 1/1
Iteration 1/3
{'Name': 'adaptive_embeddings', 'Title': 'Adaptive Embeddings: Context-Aware Token Representations for Enhanced Language Modeling', 'Experiment': 'Implement a mechanism to periodically update token embeddings based on attention weights. Modify the forward method of the GPT model to include a step where token embeddings are adjusted based on the attention weights from the transformer layers. Experiment with different update frequencies and evaluate the performance improvement compared to static embeddings.', 'Interestingness': 8, 'Feasibility': 5, 'Novelty': 7}
Iteration 2/3

{'Name': 'adaptive_embeddings', 'Title': 'Adaptive Embeddings: Context-Aware Token Representations for Enhanced Language Modeling', 'Experiment': 'Implement a mechanism to periodically update token embeddings using a weighted sum of the current embedding and the attention-weighted context vector. Modify the forward method of the GPT model to include this update step. Experiment with different update frequencies, such as after each epoch or every few epochs, to balance computational efficiency and performance. Evaluate the performance improvement compared to static embeddings using validation los
s and generation quality metrics.', 'Interestingness': 8, 'Feasibility': 6, 'Novelty': 7}
Iteration 3/3
{'Name': 'adaptive_embeddings', 'Title': 'Adaptive Embeddings: Context-Aware Token Representations for Enhanced Language Modeling', 'Experiment': 'Implement a mechanism to periodically update token embeddings using a weighted sum of the current embedding and the attention-weighted context vector. Modify the forward method of the GPT model to include this update step. Experiment with different update frequencies, such as after each epoch or every few epochs, to balance computational efficiency and performance. Evaluate the performance improvement compared to static embeddings using validation los
s and generation quality metrics.', 'Interestingness': 8, 'Feasibility': 6, 'Novelty': 7}
Idea generation converged after 3 iterations.

Checking novelty of idea 0: adaptive_block_size
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.3 seconds after 1 tries calling function search_for_papers at 08:45:59
Response Status Code: 200
Response Content: {"total": 5042, "offset": 0, "next": 10, "data": [{"paperId": "0e3ddf94053d06b40283f4250e37582bdcea0e9e", "title": "BlockLLM: Multi-tenant Finer-grained Serving for Large Language Models", "abstract": "The growing demand for Large Language Models (LLMs) across diverse applications has prompted a paradigm shift in the design of deep learning serving systems. Deploying LLMs, especially in multi-tenant environments, presents considerable challenges due to their high computational and memory demands
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.2 seconds after 1 tries calling function search_for_papers at 08:46:12
Response Status Code: 200
Response Content: {"total": 429, "offset": 0, "next": 10, "data": [{"paperId": "36daf0578aad5d3180d531cccbd32d65d62c8317", "title": "Extending Context Window in Large Language Models with Segmented Base Adjustment for Rotary Position Embeddings", "abstract": "In the realm of large language models (LLMs), extending the context window for long text processing is crucial for enhancing performance. This paper introduces SBA-RoPE (Segmented Base Adjustment for Rotary Position Embeddings), a novel approach designed to
Decision made: novel after round 2

Checking novelty of idea 1: layerwise_learning_rates
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.6 seconds after 1 tries calling function search_for_papers at 08:46:21
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 2.0 seconds after 2 tries calling function search_for_papers at 08:46:22


Response Status Code: 200
Response Content: {"total": 16299, "offset": 0, "next": 10, "data": [{"paperId": "3fa7f7565e815d8a5649441e4d1ba7db91e63ea0", "title": "Layer-wise Pruning and Auto-tuning of Layer-wise Learning Rates in Fine-tuning of Deep Networks", "abstract": "Existing fine-tuning methods use a single learning rate over all layers. In this paper, first, we discuss that trends of layer-wise weight variations by fine-tuning using a single learning rate do not match the well-known notion that lower-level layers extract general fea
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.4 seconds after 1 tries calling function search_for_papers at 08:46:32
Response Status Code: 200
Response Content: {"total": 817, "offset": 0, "next": 10, "data": [{"paperId": "fc4bb7f1bac92053bbd64850d1c6faf13c4cef88", "title": "Improving Knowledge Distillation in Transfer Learning with Layer-wise Learning Rates", "abstract": "Transfer learning methods start performing poorly when the complexity of the learning task is increased. Most of these methods calculate the cumulative differences of all the matched features and then use them to back-propagate that loss through all the layers. Contrary to these metho
Response Status Code: 200
Response Content: {"total": 8738, "offset": 0, "next": 10, "data": [{"paperId": "3fa7f7565e815d8a5649441e4d1ba7db91e63ea0", "title": "Layer-wise Pruning and Auto-tuning of Layer-wise Learning Rates in Fine-tuning of Deep Networks", "abstract": "Existing fine-tuning methods use a single learning rate over all layers. In this paper, first, we discuss that trends of layer-wise weight variations by fine-tuning using a single learning rate do not match the well-known notion that lower-level layers extract general feat
Decision made: novel after round 3

Checking novelty of idea 2: adaptive_embeddings
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.6 seconds after 1 tries calling function search_for_papers at 08:46:53
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 1.6 seconds after 2 tries calling function search_for_papers at 08:46:54
Response Status Code: 500
Response Content: {"message": "Internal Server Error"}

Backing off 3.9 seconds after 3 tries calling function search_for_papers at 08:46:58
Response Status Code: 200
Response Content: {"total": 2338, "offset": 0, "next": 10, "data": [{"paperId": "f8b901c330e7f946ef93453b24682f294b8764a1", "title": "In-domain Context-aware Token Embeddings Improve Biomedical Named Entity Recognition", "abstract": "Rapidly expanding volume of publications in the biomedical doma
in makes it increasingly difficult for a timely evaluation of the latest literature. That, along with a push for automated evaluation of clinical reports, present opportunities for effective natural language processing me
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.3 seconds after 1 tries calling function search_for_papers at 08:47:16
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.6 seconds after 2 tries calling function search_for_papers at 08:47:16
Response Status Code: 200
Response Content: {"total": 145, "offset": 0, "next": 10, "data": [{"paperId": "ea6982a936a2b263bbf46ff6eb27fc0b63fddaf7", "title": "VL-GPT: A Generative Pre-trained Transformer for Vision and Language Understanding and Generation", "abstract": "In this work, we introduce Vision-Language Generative Pre-trained Transformer (VL-GPT), a transformer model proficient at concurrently perceiving and generating visual and linguistic data. VL-GPT achieves a unified pre-training approach for both image and text modalities
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.1 seconds after 1 tries calling function search_for_papers at 08:47:28
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 1.3 seconds after 2 tries calling function search_for_papers at 08:47:29
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 1.7 seconds after 3 tries calling function search_for_papers at 08:47:30
Response Status Code: 200
Response Content: {"total": 14379, "offset": 0, "next": 10, "data": [{"paperId": "c7a3f9cc61cfafdc307f8ae24430b6b1121f9b2c", "title": "ToolkenGPT: Augmenting Frozen Language Models with Massive Tools via Tool Embeddings", "abstract": "Augmenting large language models (LLMs) with external tools has emerged as a promising approach to solving complex problems. However, traditional methods, which finetune LLMs with tool demonstration data, can be both costly and restricted to a predefined set of tools. Recent in-cont
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.0 seconds after 1 tries calling function search_for_papers at 08:47:41
Response Status Code: 429
Response Content: {"message": "Too Many Requests. Please wait and try again or apply for a key for higher rate limits. https://www.semanticscholar.org/product/api#api-key-form", "code": "429"}
Backing off 0.5 seconds after 2 tries calling function search_for_papers at 08:47:41
Response Status Code: 200
Response Content: {"total": 213, "offset": 0, "next": 10, "data": [{"paperId": "ec68079f15b620a8a7ad19b3477f895e2ecf193d", "title": "HeatViT: Hardware-Efficient Adaptive Token Pruning for Vision Transformers", "abstract": "While vision transformers (ViTs) have continuously achieved new milestones in the field of computer vision, their sophisticated network architectures with high computation and memory costs have impeded their deployment on resource-limited edge devices. In this paper, we propose a hardware-effic
Decision made: novel after round 4
Processing idea: adaptive_block_size
Failed to evaluate idea adaptive_block_size: [Errno 2] No such file or directory: 'templates/nanoGPT_lite/run_0/final_info.json'
Processing idea: layerwise_learning_rates
Failed to evaluate idea layerwise_learning_rates: [Errno 2] No such file or directory: 'templates/nanoGPT_lite/run_0/final_info.json'
Processing idea: adaptive_embeddings
Failed to evaluate idea adaptive_embeddings: [Errno 2] No such file or directory: 'templates/nanoGPT_lite/run_0/final_info.json'
All ideas evaluated.

アイディアは生成されていたのでこちらに転記しておきます。
https://gist.github.com/matsubo/c4aaf9ccecf431bf1dc8a046f7184940

[
  {
    "Name": "adaptive_block_size",
    "Title": "Adaptive Block Size: Dynamic Context Window Adjustment for Efficient Training",
    "Experiment": "Modify the model to dynamically adjust its block size during training, starting with a smaller block size and gradually increasing it. This could potentially lead to faster initial training and better long-range dependency learning.",
    "Interestingness": 6,
    "Feasibility": 4,
    "Novelty": 4,
    "novel": true
  },
  {
    "Name": "layerwise_learning_rates",
    "Title": "Layer-wise Learning Rate Adaptation: Optimizing Training Dynamics in Transformer Models",
    "Experiment": "Implement layer-wise learning rates, where each transformer layer has its own learning rate. Modify the configure_optimizers function to assign different learning rates to different layers, with deeper layers having lower learning rates. Compare the training dynamics, convergence speed, and final performance with the baseline model.",
    "Interestingness": 4,
    "Feasibility": 6,
    "Novelty": 2,
    "novel": true
  },
  {
    "Name": "curriculum_learning",
    "Title": "Curriculum Learning: Incremental Difficulty for Efficient Language Model Training",
    "Experiment": "Implement curriculum learning by starting with shorter sequences and gradually increasing the sequence length during training. Modify the get_batch function to adjust the block_size based on the iteration number. For instance, start with block_size=64 and double it every 1000 iterations until the maximum block_size is reached. Compare the training dynamics, convergence speed, and final performance with the baseline model.",
    "Interestingness": 7,
    "Feasibility": 6,
    "Novelty": 5,
    "novel": false
  }
]

novel というキーの部分が新規性があるかどうかという判断結果の値です。

コード解説

3ステップあるので各ステップ分けて重要なコードを紹介します。

アイディア生成

なにはともあれ一番最初にLLMに指示するためのプロンプトが記載されているコードがこちらです。

https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/ai_scientist/generate_ideas.py#L311-L326

You are an ambitious AI PhD student who is looking to publish a paper that will contribute significantly to the field.
You have an idea and you want to check if it is novel or not. I.e., not overlapping significantly with existing literature or already well explored.
Be a harsh critic for novelty, ensure there is a sufficient contribution in the idea for a new conference or workshop paper.
You will be given access to the Semantic Scholar API, which you may use to survey the literature and find relevant papers to help you make your decision.
The top 10 results for any search query will be presented to you with the abstracts.

You will be given {num_rounds} to decide on the paper, but you do not need to use them all.
At any round, you may exit early and decide on the novelty of the idea.
Decide a paper idea is novel if after sufficient searching, you have not found a paper that significantly overlaps with your idea.
Decide a paper idea is not novel, if you have found a paper that significantly overlaps with your idea.

{task_description}
<experiment.py>
{code}
</experiment.py>

長いので機械翻訳した日本語を掲載しておきます。

あなたは、分野に大きく貢献する論文を発表したいと考えている野心的なAI博士課程の学生です。 あるアイデアがあり、それが新規性があるかどうか、すなわち既存の文献と大きく重複していないか、あるいはすでに十分に探究されていないかを確認したいと考えています。 新しい会議やワークショップの論文として十分な貢献があるかを確認するため、新規性について厳しく評価してください。

Semantic Scholar APIへのアクセスが与えられており、関連する文献を調査し、意思決定の支援を得ることができます。 検索クエリごとに上位10件の結果とその要旨が表示されます。

決定には{num_rounds}回のラウンドが与えられていますが、すべてを使用する必要はありません。 どのラウンドでも早めに終了して、アイデアの新規性について判断することができます。 十分な検索を行った後、あなたのアイデアと大きく重複する論文が見つからなければ、そのアイデアを新規であると判断してください。 逆に、アイデアと大きく重複する論文が見つかった場合、そのアイデアは新規でないと判断してください。

開始はここから。
https://github.com/SakanaAI/AI-Scientist/tree/2c41a92902cc40669059283a18d5923ff03fc8b2/launch_scientist.py#L139-L149

ideas = check_idea_novelty(ideas) にてそのアイディアの新規性をチェックしてます。
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/launch_scientist.py#L376-L381

success = do_idea(idea) で各ideaを処理しています。
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/launch_scientist.py#L428-L437

do_idea の中身を見ていきます。

perform_experiments(idea) で実験を実行
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/launch_scientist.py#L201-L206

論文生成

perform_writeup(idea) で論文を作成
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/launch_scientist.py#L232-L236

論文のアブストラクト(概要)を生成
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/ai_scientist/perform_writeup.py#L404-L414

論文の各章をLLMに生成させる。
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/ai_scientist/perform_writeup.py#L421-L447

perform_review(paper_text) で査読
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/launch_scientist.py#L245-L261

論文をレビューする際に人間が考えていることをしっかりと言語化してどのような観点でレビューするのかをプロンプトに設定しています。

https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/ai_scientist/perform_review.py#L38-L62

レビューで指摘した内容を用いて改善します。
https://github.com/SakanaAI/AI-Scientist/blob/2c41a92902cc40669059283a18d5923ff03fc8b2/launch_scientist.py#L263-L288

考察

  • 複雑なワークフローもブレイクダウンして適切なアプローチを踏むことでLLMでは解決不可能と思われていたことも実現可能になりそうです。
  • 論文を生成する際のフレームワークとかライブラリかと思いましたが、LLM領域の論文を生成するアプリケーションという位置付けでした。
  • ある程度モジュールに分けられていたのでソースコードが読みやすかったです。

個人的に思ったこと

  • 様々なプロンプトのテクニックが駆使されているのでとても勉強になりました。
  • 「AIではまだ不可能」と考えていた事象が、「このように作ればできそう」という考えができるようになりました。
  • 自分のやってほしいタスクを正確にLLMへ伝達するスキルが重要になると思いました。具体的には、テクニカルライティングスキルプロンプトの手法です。
  • LLMを高校生、大学生の思考力、格段に高い外部記容量を備えている人として捉えると、その人に対して丁寧に何をすればよいか説明することに作業がにてます。新人教育と同じ感じです。
  • 今回はPythonで書かれたソースコードですが、同様の事をDifyで作れると思います。
株式会社マインディア テックブログ

Discussion