背景
バイオメディカル用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形式の下記ファイルについて、エージェントが使えるようになるかを確認しました。
- metadata_oxidative_stress.csv (https://doi.org/10.6084/m9.figshare.16834825.v4)
試す質問
- 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で試していましたが、ほとんど動作しない場合が多かったです。
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に読み込ませたい時など、非常に便利だと感じました。