【AI for Science試行録】第4回 Biomniソースコード検証 Part2

背景

バイオメディカル用AIエージェントのBiomniは、新規データ(個人の研究データなど)を「data_lake」に追加し、AIエージェントが直接活用できる仕組みを備えています。この機能を実際に試してみたので、その仕組みと使い方をまとめました。

仕組み

Biomniは、内部で生成するコードを通じてdata_lake内のデータにアクセスします。データごとに設定されたタイトルと説明が動的にエージェントへのシステムプロンプトに組み込まれるため、必要な場面で自動的にそのデータを利用できるようになります。

データ形式

標準で用意されているdata_lakeのデータはcsvやtsvが多いですが、その形式に制限はないようです。Biomniが生成するコード(主にPython)から機械的に読み取れるデータであれば問題ないと理解しています。

データの保管場所

作業ディレクトリに「data」というフォルダが生成され、その中のdata/biomni_data/data_lakeというフォルダが、既存で準備されるデータの保管場所です。ここに新しいデータファイルを追加すれば、Biomniからアクセス可能になります。

自動ダウンロードデータの設定

初期設定では、Biomniが自動でいくつかのデータをダウンロードします。これらは、biomni/env_desc.pyに説明付きで定義されており、ローカル環境でBiomniを起動すると自動的にダウンロードが始まります。総量は約11GBと大きいため、必要なデータはコメントアウトして使うのが良いと思いました。

data_lakeへの新規データ追加方法

add_data()関数を使用

辞書形式でファイルパスと説明を受け取り、カスタムデータとして内部保存します。追加されたデータは自動的にenv_desc.pyで管理されているdata_lake_dictに追加され、利用可能となります。

データファイルを手動で配置する方法

data/biomni_data/data_lake内に手動で配置することも可能です。その際には、biomni/env_desc.pyにデータファイルタイトルとその説明をdict形式で記述する必要があります。Biomniはdata_lakeディレクトリを自動でスキャンし、env_desc.pyで管理されているdata_lake_dictから動的に必要なデータのタイトルや説明を取得してシステムプロンプトに含めます。

実例

試しに、酸化ストレスに関する遺伝子発現データIDやその情報をまとめたcsv形式の下記ファイルについて、エージェントが使えるようになるかを確認しました。

試す質問

  • neuronに800μMのH2O2を投与して得られた、遺伝子発現データのSRA Project IDを教えてください。

期待する回答

  • SRP239545

データ追加なしで検証

import os
from datetime import datetime
import pytz
from biomni.agent import A1

# エージェントの初期化
agent = A1(path='/app/data', llm='gpt-4.1-mini-2025-04-14')

# データの追加なしで検証
agent.go(
    "neuronに800μMのH2O2を投与して得られた、遺伝子発現データのSRA Project IDを教えてください。"
)
  • 回答が得られませんでした。
これまでPubMed、GEO、arXivで「neuron 800μM H2O2 遺伝子発現データ」に関するSRA Project IDを検索しましたが、該当するデータは見つかりませんでした。

次の選択肢としては、
- キーワードを変えて再検索する
- 具体的な論文名や著者名があれば、それに基づいて検索する
- 他のデータベースや情報源を探す

があります。

もし追加情報がない場合は、現時点で該当データが公開されていない可能性が高いと考えられます。

以上の状況を踏まえ、現状の回答としては該当するSRA Project IDは見つかっていないことを報告します。

<solution> 現時点で「neuronに800μMのH2O2を投与して得られた遺伝子発現データ」のSRA Project IDは公開されている情報からは特定できませんでした。もし具体的な論文や追加情報があれば、それをもとに再度検索を行うことをお勧めします。 </solution>

add_data()関数で検証

  • add_data()関数でデータを追加します。
import os
from datetime import datetime
import pytz
from biomni.agent import A1

# エージェントの初期化
agent = A1(path='/app/data', llm='gpt-4.1-mini-2025-04-14')

agent.add_data(
    {
        "metadata_oxidative_stress.csv": "This dataset provides metadata on oxidative stress-related RNA-seq samples used for a meta-analysis. It contains information on paired oxidative stress and normal state samples, including SRA project ID, SRR ID, stress source, concentration, and cell type."
    }
)

# 追加されたデータを確認
custom_data_list = agent.list_custom_data()
print("追加されたカスタムデータ:")
for name, description in custom_data_list:
    print(f"- {name}: {description}")
  • 無事データが追加されたようです。
Loaded environment variables from .env
Checking and downloading missing data lake files...

Added data item 'metadata_oxidative_stress.csv': The OS dataset provides metadata on oxidative stress-related RNA-seq samples used for a meta-analysis. It contains information on paired oxidative stress and normal state samples, including SRA project ID, SRR ID, stress source, concentration, and cell type.
Successfully added 1 data item(s) to the data lake

追加されたカスタムデータ:
- metadata_oxidative_stress.csv: The OS dataset provides metadata on oxidative stress-related RNA-seq samples used for a meta-analysis. It contains information on paired oxidative stress and normal state samples, including SRA project ID, SRR ID, stress source, concentration, and cell type.
  • Biomniに質問を投げます。
agent.go(
    "neuronに800μMのH2O2を投与して得られた、遺伝子発現データのSRA Project IDを教えてください。"
)
  • 外部ファイルを読み込み、期待する回答が得られました。
  • gpt-4.1-mini-2025-04-14を使用し、API費用は約0.017ドル(約2.5円)でした。
================================== Ai Message ==================================

<observation>Rows with approx 800 μM concentration:
    SRA Project ID Conc. (μM) cell type Source of Stress (Reagent)
18      SRP239545        800    neuron                       H2O2
19      SRP239545        800    neuron                       H2O2
20      SRP239545        800    neuron                       H2O2
21      SRP239545        800    neuron                       H2O2
</observation>
================================== Ai Message ==================================

neuronに800μMのH2O2を投与して得られた遺伝子発現データのSRA Project IDは "SRP239545" であることがわかりました。

<solution>
neuronに800μMのH2O2を投与して得られた遺伝子発現データのSRA Project IDは SRP239545 です。
</solution>
  
=== トークン使用量統計 ===  
- 総入力トークン: 32,028  
- 総出力トークン: 2,922  
- 総費用: $0.017486  
- LLM呼び出し回数: 11  

手動でデータファイルを配置する方法

  • 先ほどadd_data()で追加したデータは、Biomni初期化により読み込まれていないことを確認します。
import os
from datetime import datetime
import pytz
from biomni.agent import A1

# エージェントの初期化(自動でdata_lakeのダウンロードがスタート)
agent = A1(path='/app/data', llm='gpt-4.1-mini-2025-04-14')

# 追加されたデータを確認
custom_data_list = agent.list_custom_data()
print("追加されたカスタムデータ:")
for name, description in custom_data_list:
    print(f"- {name}: {description}")

# 追加したデータの詳細を確認
data_info = agent.get_custom_data("metadata_oxidative_stress.csv")
if data_info:
    print(f"パス: {data_info['path']}")
    print(f"説明: {data_info['description']}")
  • add_data()での追加データはないことを確認
Loaded environment variables from .env
Checking and downloading missing data lake files...
追加されたカスタムデータ:
  • /data/biomni_data/data_lakeにmetadata_oxidative_stress.csvを追加し、biomni/env_desc.pyにデータの説明を追加
data_lake_dict = {
    "metadata_oxidative_stress.csv": "This dataset provides metadata on oxidative stress-related RNA-seq samples used for a meta-analysis. It contains information on paired oxidative stress and normal state samples, including SRA project ID, SRR ID, stress source, concentration, and cell type.",
    .....    
}
  • Biomniに質問を投げます
agent.go(
    "neuronに800μMのH2O2を投与して得られた、遺伝子発現データのSRA Project IDを教えてください。"
)
  • 同様に、外部ファイルを読み込み、期待する回答が得られました。
  • gpt-4.1-mini-2025-04-14を使用し、API費用は約0.011ドル(約1.6円)でした。
================================== Ai Message ==================================

<observation>Filtered metadata rows for neurons treated with H2O2 (any concentration):
   SRA Project ID Oxidative Stress      Control Source of Stress (Reagent) Conc. (μM) cell type Time (h) Library type extracted molecule Note
18      SRP239545      SRR10832030  SRR10832029                       H2O2        800    neuron       17           PE          total RNA  NaN
19      SRP239545      SRR10832031  SRR10832032                       H2O2        800    neuron       17           PE          total RNA  NaN
20      SRP239545      SRR10832035  SRR10832033                       H2O2        800    neuron       17           PE          total RNA  NaN
21      SRP239545      SRR10832036  SRR10832034                       H2O2        800    neuron       17           PE          total RNA  NaN

Unique SRA Project IDs for neurons treated with H2O2 (any concentration):
['SRP239545']
</observation>
================================== Ai Message ==================================

I found gene expression data for neurons treated with 800 μM H2O2 in the metadata. The corresponding SRA Project ID is SRP239545.

<solution>
The SRA Project ID for gene expression data from neurons treated with 800μM H2O2 is SRP239545.
</solution>
  
=== トークン使用量統計 ===  
- 総入力トークン: 19,789  
- 総出力トークン: 1,648  
- 総費用: $0.010552  
- LLM呼び出し回数: 8  

課題

  • カスタムデータを追加する場合、OllamaによるローカルLLM使用が非常に不安定になります。私はgpt-oss:20bをOllamaで試していましたが、ほとんど動作しない場合が多かったです。
    • 下記がエラーの内容です。
    • ollamaが返したレスポンス形式がOpenAI互換のJSONではなく、プレーンテキストだったようです。
    • 原因の可能性としては、add_data()によってシステムプロンプトが複雑化し、ollamaサーバーによるBiomniの複雑なツール呼び出しに対応しきれなくなっているかもしれません。
    • add_data()関数を使う場合、手動でデータを配置する場合、両方のケースで同様の問題が発生します。
openai.InternalServerError: Error code: 500 - {'error': {'message': "error parsing tool call: raw='import json, os, textwrap, pprint, sys, pathlib, re, math, random', err=invalid character 'i' looking for beginning of value", 'type': 'api_error', 'param': None, 'code': None}}
  • 動作した時は、29回のLLM呼び出しを経て、どうにか外部ファイルを読み込む処理へ到達し、最終的に回答であるSRP239545が得られました。

まとめ

このように効率的に自前のデータを活用することができることがわかりました。データ追加時のローカルLLM利用の不安定さという課題はありましたが、研究で使っている独自のデータなどをローカルで動作させているBiomniに読み込ませたい時など、非常に便利だと感じました。