aurio9923

Claude Code で作る化合物ワークスペース ChemOmni(1)エディタとチャット

メディシナルケミストは ChemDraw のような化学構造エディタで分子を描くことが多いと思います。そして、しばしば描いた分子を SDF などとしてエクスポートし、何らかのツールに渡してプロパティを予測したり類縁体の構造生成などを実行することがあります。私自身もそうですが、このような複数のツールの橋渡しは面倒で、エディタと各種インシリコ機能(記述子や類似度の計算、構造生成、プロパティ予測、逆合成解析など)を統合したツールがあると良いと思っていました。そこで、ユーザーが描画した化合物とツールの橋渡し役を LLM に担当させ、化学構造エディタと LLM チャット機能を統合させたワークスペースツール(「ChemOmni」と名付けました)の開発に着手しています。現時点でエディタとチャットを一体化させた UI までができたところです。エディタには EPAM のオープンソースの構造エディタ Ketcher を使い、チャットの AI は RDKit の計算を道具として呼び出して答えます。

ChemOmni では、エディタが主役で、チャットは補助です。AI に計算や説明を頼むと、文章の答えと一緒に、物性の表や構造の画像がチャットに出ます。構造は「Open」を押すと新しいタブで開けます。AI がユーザーの描いた構造を勝手に書き換えることはありません。手元の PC で動かすアプリで、LLM は OpenAI と Anthropic のモデルから画面で選べます。

構造エディタと AI チャットを組み合わせたツールは、すでにいくつかあります。たとえば、Ketcher と AI チャットを組み合わせた Web サービスの ChemStitch、Ketcher をコネクタとして使える Anthropic の Claude Science、分子エディタ MoleditPy のチャットプラグインです。この組み合わせ自体は新しくありません。今回は同じ形のものをオープンソースの部品と Claude Code で手元に作れるか、どこまで使えるかを確かめる試作(PoC)です。

ソースコード:https://github.com/aurio9923/chemomni(MIT ライセンス)

ChemOmni の画面。左に Ketcher で描いたイマチニブ、上にタブ、下に物性の帯、右にチャットと物性の表
図1. ChemOmni の画面。左が Ketcher のエディタで、上にタブ、下の帯に描いた構造の物性が出ます(編集に合わせて更新)。右がチャットです。イマチニブのタブで「この化合物の物性を計算して」と送ったところ(モデルは gpt-6-luna)。

BCR-ABL 阻害薬3つで試す

タブを3つ開き、イマチニブ、ニロチニブ、ダサチニブの構造を1つずつ入れました(SMILES を貼り付けて描画)。モデルは低コストの gpt-6-luna です。チャットはメッセージを送るたびに、開いているタブの構造をまとめて AI に渡します。そのため、「この化合物」や「3つのタブ」と書くだけで、どの構造の話かが伝わります。

例1:物性を計算する

この化合物の物性を計算して

AI が物性計算のツールを呼び、表が返ってきました(図1の右)。イマチニブの値は分子量 493.62、cLogP 4.59、TPSA 86.3 Ų、水素結合供与体 2、受容体 7、回転可能結合 7、QED 0.39 です。AI の文章は「Lipinski 違反は 0 件で、Veber 基準も満たしています」という短いものでした。数値は RDKit が計算したもので、LLM が考えた数字ではありません。同じ値をアプリとは別に RDKit で計算し直して確かめています。送信してから表と答えが出そろうまでは、3〜5秒ほどでした。

ふだんは1〜3文で答え、表にある数値はなるべく繰り返さないように、AI に指示しています。表を見れば分かることを、文章でもう一度読まされないようにするためです。

例2:構造を説明してもらう

この構造の特徴を、創薬化学の観点で説明して

チャットの画面。イマチニブの構造を、ヘテロ芳香環、アミド部分、塩基性側鎖の3つに分けて説明している
図2. 構造の説明を頼んだときの答え。開いた質問なので、長めに答えています。

こういう開いた質問のときだけ、AI は詳しく答えます。今回は構造を「イマチニブ型のキナーゼ阻害剤」と見たうえで、ピリミジンとピリジンの部分、アニリノ基からベンズアミドまでの部分、メチルピペラジンの側鎖の3つに分けて、それぞれの役割を説明しました。不活性型(DFG-out)のキナーゼに結合することにも触れています。答えが出そろうまでは4〜7秒ほどでした。

この答えはツールの計算ではなく、モデルの知識によるもので、出典はついていません。回答として大枠に誤りはないものの、創薬化学で大事な点がいくつか抜けていました。たとえばベンズアミドのアミドは、水素結合で不活性型の構造をつなぎとめる部分ですが、答えでは「疎水性ポケットを占める部分」にまとめられています。中央のベンゼン環のメチル基がキナーゼの選択性に大きく寄与したことや、メチルピペラジンが溶解性だけでなく標的との結合にも関わることにも触れていません。この辺はウェブリサーチ機能を付けることで改善するかもしれません。

現状としては、概要をつかむには役立ちますが部位ごとの役割は文献で確かめて判断することが必要です。

例3:3つのタブの類似度を比べる

開いている3つのタブの化合物どうしの類似度を比べて

AI は類似度のツールを呼んで3組を比べ、最後に表にまとめました。指標は Morgan フィンガープリント(半径2、2048ビット)の Tanimoto 類似度です。

組み合わせTanimoto 類似度
イマチニブ – ニロチニブ0.517
イマチニブ – ダサチニブ0.275
ニロチニブ – ダサチニブ0.184
チャットの画面。類似度の計算が3回成功し、途中で1回、SMILES を読めないというエラーが出ている
図3. 類似度の比較(チャットの後半)。赤い×の行は、AI が書き写したニロチニブの SMILES が壊れていて、RDKit が読めなかった呼び出しです。AI はこのあと正しい SMILES で呼び直しました。

途中で1回、ツールの呼び出しが失敗しています(図3の赤い×)。AI がニロチニブの SMILES を自分で書き写したときに、環を閉じる番号が合わなくなったためです。RDKit が「読めない」と返し、AI は正しい SMILES で呼び直しました。失敗した呼び出しもチャットにそのまま残るので、何が起きたかを後から追えます。LLM に SMILES を書き写させる限り、この種の失敗は起こりえます。

例4:部分構造で絞り込む

3つのタブのうち、アミノピリミジン(2-アミノピリミジン)を含むのはどれ?

最初にこう聞くと、AI はツールを使わずに「イマチニブとニロチニブです」と答えました。答えは合っています。ダサチニブのピリミジン環は 2 位がメチル基で、アミノ基は 4 位と 6 位にあるからです。ただ、これは AI が SMILES を読んで判断したもので、根拠は画面に出ません。そこで、聞き方を変えました。

3つのタブの化合物を、2-アミノピリミジンで部分構造検索して

チャットの画面。部分構造検索で3つ中2つが一致し、イマチニブとニロチニブの該当する原子が赤く強調されている
図4. 部分構造検索の結果。一致した原子が赤く表示されます。

今度は部分構造検索のツールが呼ばれ、3つのうち2つが一致しました。一致した原子は構造の画像の中で赤く表示されます。同じことを聞いても、聞き方によって AI がツールを使うかどうかが変わります。根拠を画面で確かめたいときは、「計算して」「検索して」とはっきり頼む必要がありました。

それぞれの聞き方で6回ずつ送ると、最初の聞き方では6回ともツールを使わずに答え、答えは毎回正解でした。「部分構造検索して」では6回ともツールを使いましたが、正しかったのは3回だけです。残りの3回は、AI が検索語を 2-アミノピリミジン(Nc1ncccn1)ではなく 2-アミノピラジン(Nc1nccnc1)で書いてしまい、「一致なし」と答えました。ツールの計算が正しくても、ツールに渡す入力を LLM が間違えれば、答えは間違います。ツールを使った答えでも、何を入力したかまで確かめる必要があります。答えが出そろうまでは、最初の聞き方で4〜6秒、検索を頼んだときで4〜5秒ほどでした。

作るときに決めたこと

  • エディタが主役。AI の結果は新しいタブに出し、ユーザーの描いた構造は上書きしません。上書きは「置き換えて」と頼まれたときだけにします(この機能は次回紹介します)。
  • 計算は RDKit に任せる。チャットを作った段階で AI が使えるツールは、物性計算、SMILES の検証、2分子の類似度、部分構造検索の4つです。構造の画像は画面にだけ出し、LLM には渡しません。画像を渡すと、そのぶん AI に送る量(トークン)がかさむためです。
  • エディタは Ketcher。描いた内容を丸ごと保存して元に戻せ、プログラムから選択範囲を読むこともでき、サーバーなしでブラウザだけで動きます。
  • モデルは画面で切り替える。モデルはチャット欄の上のプルダウンで選びます。答えの下には、その答えを書いたモデルの名前が出ます。実際の API で、OpenAI の gpt-6.1-sol、gpt-6.1-terra、gpt-6-luna と、Anthropic の Claude Haiku 5.5 の4つが動くことを確かめました。使ってみた範囲では、低コストの gpt-6-luna で十分でした。

Claude Code との対話で作った

コードはコーディングエージェントの Claude Code に書いてもらいました。いわゆる vibe coding です。私が担当したのは、何を作るかの判断と、動かしての確認です。

ただ、いきなり書かせたわけではありません。コードを書く前に、AI に設計上の質問を出させ、私が答える形で、47の論点を一つずつ決めました(”grilling” スキルを使用しました)。

次回と今後

次回はチャットから構造を編集する機能を紹介します。たとえば「このフェニルの4位にフッ素を」と頼むと、編集した構造が新しいタブに出る形です。

その先では、類縁体の提案のように AI が新しい構造を出す機能を作る予定です。LLM に構造を提案させること自体は、すでにいくつものツールや研究で行われています。ChemOmni では提案された構造をタブに並べ、描いた構造や物性と見比べて選べる形にするつもりです。エディタと一体だからできる使い方を、ここから探していきます。

注記

  • モデル:OpenAI の gpt-6-luna(Responses API、推論の深さ low はアプリの既定)。各質問を1回ずつ送りました。同じ質問でも、答え方やツールを使うかどうかは回によって変わりえます。
  • 構造:イマチニブ Cc1ccc(NC(=O)c2ccc(CN3CCN(C)CC3)cc2)cc1Nc1nccc(-c2cccnc2)n1、ニロチニブ Cc1ccc(C(=O)Nc2cc(C(F)(F)F)cc(-n3cnc(C)c3)c2)cc1Nc1nccc(-c2cccnc2)n1、ダサチニブ Cc1nc(Nc2ncc(C(=O)Nc3c(C)cccc3Cl)s2)cc(N2CCN(CCO)CC2)n1。
  • 数値の確認:例1の物性、例3の類似度、例4の一致は、アプリとは別に RDKit 2026.09.1 で計算し直し、画面の値と一致しました(類似度は Morgan 半径2・2048ビットの Tanimoto、部分構造は 2-アミノピリミジン)。
  • 類似のツール:各ツールの紹介ページ(ChemStitch の公式サイト、Claude Science の公式ドキュメント、MoleditPy のプラグインのページ)で確かめました。実際に使って比べてはいません。