はじめに
新薬開発は 「10年・3,000億円・成功率10%未満」 と言われてきました。その常識を崩す可能性を持つのが、量子コンピュータ × AI によるハイブリッド創薬です。量子計算が分子の振る舞いを「自然の言語」のまま扱い、AIがまだ存在しない有望な候補化合物を設計する――この組み合わせが、創薬の設計フェーズを 数ヶ月 にまで圧縮しつつあります。
「でも量子創薬って、巨大製薬と国家プロジェクトの世界だよね?」――いえ、Qiskit / PennyLane / RDKit など無料のOSS を使えば、エンジニアの手元のPCで VQEによる分子エネルギー計算 → 生成AIによる分子設計 → 古典シミュレーションでの評価 までの一連を回すことができます。
本記事では、note記事のテーマを開発者目線で落とし込み、Pythonで量子創薬パイプラインの最小ひな形を構築する具体的な手順 を解説します。
参考にした解説記事:「10年・3,000億円」という新薬開発の常識が崩れる日——量子創薬が医学史を書き換える | AI Robotics Quantum Lab
ゴールは以下のとおりです。
- Qiskit Natureで H2分子のVQE計算 を動かす
- RDKitで 分子の取り扱い・薬らしさ評価(Lipinski Rule of Five / QED) を行う
- 簡易的な 分子生成のループ(SMILES列挙+スコアリング) を作る
- IBM Quantumクラウドで 実機ジョブを投げる 手順を押さえる
- 倫理・法令・限界点を整理する
対象読者は、Pythonとnumpy/scikitlearnに触れたことがあり、量子コンピュータや創薬に興味のあるエンジニアです。量子力学の事前知識は最小限でOKです。
1. 全体像 ― 何を作るのか
[候補SMILES] ──► [RDKit前処理] ──► [Lipinski/QED] ──► [スコアでフィルタ]
│
└──► [Qiskit Nature: VQE] ──► [基底状態エネルギー]
│
└──► [反応性・安定性の代理指標]
- 古典側:RDKitで分子を扱い、薬らしさ(Drug-likeness)を評価
- 量子側:Qiskit NatureでVQEを使い、分子の量子化学計算(小さな分子から)
- 統合:両方のスコアを組み合わせ、候補化合物をランキング
「すぐ実用」ではなく、「現実的に手元で完走できる量子創薬の縮小ひな形」 を作るのがゴールです。
2. 環境構築
2.1 Pythonと仮想環境
mkdir quantum-drug-lab && cd quantum-drug-lab
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
2.2 必要ライブラリ
# 量子コンピューティング
pip install qiskit qiskit-aer qiskit-ibm-runtime
pip install qiskit-nature pyscf # 量子化学計算
# ケモインフォマティクス
pip install rdkit # 分子の扱い
pip install pandas numpy matplotlib tqdm
⚠️ Qiskitのバージョン更新が早いです。本記事は Qiskit 1.x / qiskit-nature 0.7+ を前提に書きます。バージョンが違う場合は公式マイグレーションガイドを参照してください。
2.3 プロジェクト構成
quantum-drug-lab/
├── data/
│ └── candidates.csv # 候補SMILES
├── src/
│ ├── chem.py # RDKit周り
│ ├── quantum.py # Qiskit Nature/VQE周り
│ ├── pipeline.py # 古典×量子の統合
│ └── ibm.py # IBM Quantum実機ジョブ
└── notebooks/
3. RDKitで「薬らしさ」を評価する(古典側)
3.1 Lipinski Rule of Five と QED
Lipinski's Rule of Five は、経口薬として吸収されやすい分子の経験則です。
QED(Quantitative Estimation of Drug-likeness)は、複数の物性を合成して0〜1で薬らしさを評価する指標です。
# src/chem.py
from dataclasses import dataclass
from rdkit import Chem
from rdkit.Chem import Descriptors, Lipinski, QED
@dataclass
class DrugLikeness:
smiles: str
mw: float
logp: float
hbd: int
hba: int
qed: float
passes_ro5: bool
def evaluate_smiles(smiles: str) -> DrugLikeness | None:
mol = Chem.MolFromSmiles(smiles)
if mol is None:
return None
mw = Descriptors.MolWt(mol)
logp = Descriptors.MolLogP(mol)
hbd = Lipinski.NumHDonors(mol)
hba = Lipinski.NumHAcceptors(mol)
qed = QED.qed(mol)
passes = (mw <= 500 and logp <= 5 and hbd <= 5 and hba <= 10)
return DrugLikeness(smiles, mw, logp, hbd, hba, qed, passes)
3.2 候補SMILESを評価
# 例: 既知の薬・候補化合物を並べる
candidates = [
"CC(=O)OC1=CC=CC=C1C(=O)O", # アスピリン
"CN1C=NC2=C1C(=O)N(C(=O)N2C)C", # カフェイン
"C1=CC(=CC=C1CCN)O", # チラミン
]
for s in candidates:
r = evaluate_smiles(s)
print(r)
passes_ro5=True で qed が高い(0.5以上目安)ものを 次の量子計算ステージに渡す イメージです。
4. Qiskit Natureで分子のエネルギーを計算する(量子側)
4.1 VQEとは何か
VQE(Variational Quantum Eigensolver)は、分子の基底状態エネルギー を、量子回路と古典最適化のハイブリッドで求める手法です。創薬では、分子の安定性や結合エネルギー、反応エネルギーの近似値を得るのに使います。
完全に古典で解こうとすると指数爆発する範囲を、量子重ね合わせの上に「変分ansatz」を置いて最小化することで、扱える原子数を増やす――これがVQEの本質的な利点です。
4.2 H2分子のVQEを動かす
H2(水素分子)はVQEの定番ベンチマークです。最小基底セット(STO-3G)なら数qubitで完走します。
# src/quantum.py
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.problems import ElectronicStructureProblem
from qiskit_nature.second_q.mappers import JordanWignerMapper
from qiskit_nature.second_q.circuit.library import UCCSD, HartreeFock
from qiskit.circuit.library import EfficientSU2
from qiskit_algorithms import VQE
from qiskit_algorithms.optimizers import COBYLA
from qiskit.primitives import Estimator
def compute_h2_ground_state(distance: float = 0.735) -> float:
"""H-H 結合距離を変えながら基底エネルギーを返す(単位: Hartree)"""
driver = PySCFDriver(
atom=f"H 0 0 0; H 0 0 {distance}",
basis="sto3g",
)
problem: ElectronicStructureProblem = driver.run()
mapper = JordanWignerMapper()
qubit_op = mapper.map(problem.second_q_ops()[0])
num_particles = problem.num_particles
num_spatial_orbitals = problem.num_spatial_orbitals
init_state = HartreeFock(num_spatial_orbitals, num_particles, mapper)
ansatz = UCCSD(num_spatial_orbitals, num_particles, mapper, initial_state=init_state)
vqe = VQE(estimator=Estimator(), ansatz=ansatz, optimizer=COBYLA(maxiter=200))
result = vqe.compute_minimum_eigenvalue(qubit_op)
nuclear_repulsion = problem.nuclear_repulsion_energy
total_energy = result.eigenvalue.real + nuclear_repulsion
return float(total_energy)
if __name__ == "__main__":
e = compute_h2_ground_state(0.735)
print(f"H2 ground-state energy ~ {e:.6f} Hartree")
実行すると、化学結合距離0.735 Åにおいて、理論値(およそ-1.137 Hartree)に近い値 が返ってきます。これは「量子コンピュータの作法」で分子のエネルギーを求めた、最小サンプルです。
4.3 解離曲線を描いてみる
import numpy as np
import matplotlib.pyplot as plt
distances = np.linspace(0.3, 2.5, 12)
energies = [compute_h2_ground_state(d) for d in distances]
plt.plot(distances, energies, marker="o")
plt.xlabel("H-H distance [Å]")
plt.ylabel("Energy [Hartree]")
plt.title("H2 dissociation curve via VQE")
plt.grid(True)
plt.savefig("h2_dissociation.png", dpi=150)
得られる曲線が解離曲線の典型形(最小エネルギーが結合距離付近にある)になっていれば成功です。
5. 古典×量子の統合パイプライン
ここまでで、
- 古典側:RDKitで薬らしさを評価
- 量子側:Qiskit Natureで小分子のエネルギーを計算
という両輪が揃いました。これを統合します。
# src/pipeline.py
import pandas as pd
from src.chem import evaluate_smiles
from src.quantum import compute_h2_ground_state
def score_candidates(smiles_list: list[str]) -> pd.DataFrame:
rows = []
for s in smiles_list:
d = evaluate_smiles(s)
if d is None:
continue
rows.append({
"smiles": d.smiles,
"qed": d.qed,
"mw": d.mw,
"logp": d.logp,
"passes_ro5": d.passes_ro5,
})
df = pd.DataFrame(rows)
# 量子計算は重いので、薬らしさで上位だけに絞る
top = df[df["passes_ro5"]].sort_values("qed", ascending=False).head(3)
# ここでは「H2の代理計算」を行うが、
# 実用ではフラグメント化して活性部位の小さな量子計算に置き換える
top["proxy_quantum_energy"] = compute_h2_ground_state(0.735)
return top
💡 ポイント:現代の量子コンピュータ(NISQ)では、医薬分子そのものを丸ごと解くのは困難です。実務では「分子のうち、もっとも電子相関が強い部分(活性中心)だけ」を量子で扱い、残りは古典DFTで処理する アクティブスペース分割/DFT-Embedding が主流です。本記事はあくまで「ループの形」を体験するためのひな形と捉えてください。
6. 簡易な分子生成ループ(疑似生成AI)
本格的な分子生成モデル(VAE、Transformer、拡散モデルなど)は学習に時間がかかります。まずは 「既知のSMILESに小さな変異を入れて評価する」 だけのGenetic Algorithm的な簡易版を組むと、生成AI連携の手応えが掴めます。
# src/generate.py
import random
from rdkit import Chem
from rdkit.Chem import AllChem
from src.chem import evaluate_smiles
SUBS = ["C", "N", "O", "F", "Cl"] # 置換候補
def mutate(smiles: str) -> str | None:
mol = Chem.MolFromSmiles(smiles)
if mol is None or mol.GetNumAtoms() < 2:
return None
rw = Chem.RWMol(mol)
idx = random.randrange(rw.GetNumAtoms())
new_atom = Chem.Atom(random.choice(SUBS))
try:
rw.ReplaceAtom(idx, new_atom)
Chem.SanitizeMol(rw)
return Chem.MolToSmiles(rw)
except Exception:
return None
def evolve(seed: str, n_generations: int = 50, pop: int = 20) -> list[str]:
population = [seed]
for _ in range(n_generations):
children = []
for _ in range(pop):
parent = random.choice(population)
child = mutate(parent)
if child:
children.append(child)
scored = []
for s in population + children:
d = evaluate_smiles(s)
if d and d.passes_ro5:
scored.append((d.qed, s))
scored.sort(reverse=True)
population = [s for _, s in scored[:pop]]
return population
from src.generate import evolve
# 例: アスピリンを起点に薬らしさを上げにいく
seeds = "CC(=O)OC1=CC=CC=C1C(=O)O"
final = evolve(seeds, n_generations=30, pop=15)
for s in final[:5]:
print(s)
実用には程遠いものの、「設計→評価→選択」のループ を体感する練習として優秀です。本格化するなら、MolGen / MOSES / REINVENT などのリファレンス実装をチェックしてみてください。
7. IBM Quantum 実機にジョブを投げる
シミュレータでの確認が済んだら、IBM Quantum の無料枠で実機を触れます。
7.1 アカウント設定
- IBM Quantum Platform でアカウント作成
- APIトークンを取得
# 一度だけ実行
from qiskit_ibm_runtime import QiskitRuntimeService
QiskitRuntimeService.save_account(token="YOUR_API_TOKEN", channel="ibm_quantum")
7.2 実機Backend選択 → Estimatorに差し替え
# src/ibm.py
from qiskit_ibm_runtime import QiskitRuntimeService, Estimator as RuntimeEstimator
from qiskit_ibm_runtime import Session
def run_on_ibm(qubit_op, ansatz, optimizer, backend_name: str = "ibm_brisbane"):
service = QiskitRuntimeService(channel="ibm_quantum")
backend = service.backend(backend_name)
with Session(service=service, backend=backend):
estimator = RuntimeEstimator()
from qiskit_algorithms import VQE
vqe = VQE(estimator=estimator, ansatz=ansatz, optimizer=optimizer)
return vqe.compute_minimum_eigenvalue(qubit_op)
実機はノイズがあり、シミュレータより誤差が大きく出ます。Error Mitigation(ZNE / PEC) を併用するのが研究の定石です。
⚠️ 課金プランによってはジョブのキューが長くなります。まずは無料枠+小さなansatzで挙動を確かめましょう。
8. 量子創薬の現実的な壁と、向き合い方
| 壁 | 内容 | 当面の打ち手 |
|---|---|---|
| qubit数 | 数十qubitでも医薬分子の全体は扱えない | アクティブスペース分割/DFT-Embedding |
| ノイズ | NISQ実機は誤差が大きい | エラー軽減、Variational手法、シミュレータでの裏付け |
| ベンチマーク | 「量子優位性」をいつどこで主張するかが難題 | 古典DFT/CCSDとの比較を必ず併走 |
| データ | 薬理活性データの偏り・公開不足 | ChEMBL / PubChem / DrugBank の活用 |
「今日、量子で劇的に新薬が出る」のではなく、「ハイブリッドが機能する場所を、コードで地味に増やす」のが現実的な前進の姿です。
9. 法令・倫理上の注意
- 創薬は GxP(GLP/GCP/GMP) の規制対象です。研究用途と医療用途の境界は厳格に分けてください。
- 個人ゲノム・電子カルテ等を組み合わせる際は、改正個人情報保護法・倫理指針への適合が必須です。
- 生成AIで設計した分子の責任所在 は新しい論点です。設計者・運用者・施設の責任分担をプロジェクト開始時に整理しましょう。
- 化学合成が難しい/危険な分子をスクリーニングで提案しないため、合成可能性スコア(SAスコア)も併用するのが望ましいです。
10. 拡張アイデア
- PennyLaneでhybrid勾配学習:分子記述子から薬理活性を学習する量子機械学習(QML)
- D-Wave Ocean / OpenJij でフラグメントベース分子設計をQUBOとして解く
- AlphaFoldで予測した3D構造にRDKit→AutoDock→Qiskit Natureの活性部位計算を接続
- VQE結果を強化学習の報酬 にした分子最適化エージェント
- Streamlitで「薬らしさ+量子エネルギー」を可視化するダッシュボード
まとめ
- 量子創薬は「巨大企業と国家だけのもの」ではなく、Qiskit / RDKitなどのOSS で個人開発者が触れる領域に下りてきている
- 本記事の最小ひな形で、RDKitによる薬らしさ評価 → Qiskit NatureでのVQE → IBM Quantum実機ジョブ までの一連を体験できる
- NISQ時代の正解は「量子だけで解く」ではなく 古典×量子のハイブリッド。エンジニアの腕の見せ所は、その 接続部分の設計 にある
- 「あなた専用に、数週間で設計された一錠」の未来を作るパイプラインの最初の歯車は、自分のノートPCで回せる
まずはH2のVQEを動かして、「分子のエネルギーが量子計算で出る」感覚を掴んでみてください。そこから先のスケーリングは、コードと粘り強さ の問題に変わります。