見出し画像

化学系問題解決ツールChemCrowを試してみる

こんにちは。QunaSys CRSチームでソフトウェアエンジニアをしている小澤です。

QunaSys(キュナシス)は量子コンピュータのアルゴリズムの研究開発から実用レベルのエンジニアリングまで、一貫して取り組んでいる東京のスタートアップです!
素材、化学、製薬など 様々な分野で産業活用できるよう、量子コンピュータのパワーを最大限引き出すための研究開発を進めています。

その中でCRS(Chemical Research Solution)チームでは化学の研究活動をサポートすることを目的として設立されたため、研究活動に有用そうな化学系のツール等もチェックしています。

今回化学系のツールとLLMで化学に関連する問題を解決するツールChemCrowを使ってみたので紹介します。

ChemCrow

ChemCrowはLLMと化学系のツールを組み合わせて、与えられた質問に対し、最終的な回答ができあがるまで、必要なツールを呼び出して最終的な回答を生成します。

論文として発表されています。

質問からどの外部ツールを呼び出すのかの判定は後述するLangChain Agentsが使用されています。
外部ツールは下記のようなものが使われています。

  • 物質名からSMILESに変換

  • SMILESから価格を予測

  • Wikipedia検索

  • 分子同士の類似度比較

  • 生成物を予測

  • 安全性チェック

ChemCrowのソースコードは、下記にあります。

ただ、このソースには「This package does not contain all the tools described in the ChemCrow paper because of API usage restrictions.」と書かれており、論文内で言及されている分子合成プランナー等のツールは、API制限の都合上含まれていないようです。

実際に論文で使ったツールでの結果を載せたレポジトリは

にあります。
こちらはソースはなく、実行結果のjupyter notebookだけのようです。

今回はchemcrow-publicを試してみます。

LangChain Agents

ChemCrowは内部でLangChain Agentsを使っています。

LangChain Agentsは予め登録したツールとその説明をもとに、
質問の最終回答を生成するのにどのツールを使うかを自動的に判断して、
必要なだけツールを呼び出し、最終回答を生成します。
使用するツールの判断にはGPT-4などのLLMが使用されます。

実行

chemcrow-publicはHugging Faceでも公開されているので、そちらでも試せますが、今回はソースを修正しながら試していきたいので、ローカルで動かします。

まず、該当レポジトリをcloneします。

git clone https://github.com/ur-whitelab/chemcrow-public

必要なライブラリをinstallします

cd chemcrow-public
pip install .

ChemCrowを動かすにはOpenAIのAPI Keysが必要なので予め作成しておきます。
(ChemCrowは一度の質問で何度もAPIを叩くので軽く試すだけで数ドル程度かかる可能性があります)

また、RXN for ChemistryのAPIも利用するため下記サイトでSign upしてAPIキーを作成しておきます。

RXN for Chemistryは化学反応の予測等を行ってくれるツールです。

作成したキーは.envを作成し、そこに記載します。

touch .venv
OPENAI_API_KEY=your-openai-api-key
RXN4CHEM_API_KEY=your-rxn4chem-api-key

また、記事執筆時点のソースでは実行時にエラーが出るようなので、
chemcrow/agents/tools.pyに下記importを足しておきます。

from chemcrow.tools.safety import ControlChemCheck

またRXN for Chemistryを使うためのproject_idがハードコーディングされているようなので、その箇所も書き換えておきます。

# chemcrow/tools/rxn4chem.py
self.rxn4chem.project_id = "your-rxn4chem-project-id"

ChemCrowはstremlitで実装されているので、下記コマンドで実行します。

streamlit run app.py

画面左側にOpenAI API keyの入力画面がありますが、すでに環境変数で設定済みの場合は入力不要です。

試しに、
https://github.com/ur-whitelab/chemcrow-runs/blob/main/tasks/03_explain_mechanism.ipynb

にある質問を入力してみます。

Predict the product of a mixture of Ethylidenecyclohexane and HBr.
Then predict the same reaction, adding methyl peroxide into the mixture.
Compare the two products and explain the reaction mechanism.
(日本語訳)
エチリデンシクロヘキサンとHBrの混合物の生成物を予測しなさい。
次に、混合物に過酸化メチルを加えて、同じ反応を予測しなさい。
二つの生成物を比較し、反応機構を説明しなさい。

実行すると、いくつかのツールを使いながら最終回答を生成している様子が伺えます。

最終的に下記の回答が得られました。

The product of the reaction between Ethylidenecyclohexane and 
HBr is CCC1(Br)CCCCC1. 
When methyl peroxide is added to the mixture, 
the product is CC(Br)C1CCCCC1. 
The presence of methyl peroxide changes the site of bromination. 
In the absence of methyl peroxide, bromine attaches at the tertiary carbon, 
while in its presence, bromine attaches at the secondary carbon. 
This is due to the fact that in the presence of peroxides, 
HBr undergoes anti-Markovnikov addition, 
where the bromine attaches to the less substituted carbon.
(日本語訳)
エチリデンシクロヘキサンとHBrの反応生成物はCCC1(Br)CCCCC1である。
この混合物に過酸化メチルを加えると、生成物はCC(Br)C1CCCC1になる。
過酸化メチルの存在は、臭素化の部位を変える。過酸化メチルが存在しない場合、
臭素は第三級炭素に結合するが、過酸化メチルが存在する場合、臭素は第二級炭素に結合する。
これは、過酸化物の存在下でHBrが逆マルコフニコフ付加を起こし、
臭素が置換度の低い炭素に結合するためである。

質問された内容には答えられているようです。

この回答について、チーム内の化学専門のメンバーに評価してもらったところ、現象論の記述としては間違っていないが、反応機構の説明を求めたのであれば下記の観点での説明もないと不十分とのことでした。

例えば単なるHBrによる反応(マルコフニコフ則による反応)機構では

  • 臭化水素においてどちらに電子化が偏るか

  • 二重結合部分に臭化水素の水素が付加する際の初期の反応段階についての記述(できれば図で)

  • 初期反応を後の生成物(カルボカチオン)のバリエーションについての記述(水素負荷の位置が二つありうる)

  • それぞれの生成物についての安定性の順番とその理由

このあたりは質問文を変えたり、外部ツールを追加したりすることで、結果が改善する可能性はあるかもしれません。

日本語対応

現状は日本語で質問しても英語での回答になるので、少し改良して、日本語で回答するようにしてみます。

chemcrow/agents/prompts.pyQUESTION_PROMPTに一行追加します。

Use the tools provided, using the most specific tool available for each action.
Your final answer should contain all information necessary to answer the question and subquestions.

Use the tools provided, using the most specific tool available for each action.
Your final answer should contain all information necessary to answer the question and subquestions.
And final answer MUST be translated into Japanese. 

And final answer MUST be translated into Japanese.
が追加した部分です。

日本語で質問してみます。

質問:アスピリンのSMILESを教えて
最終回答:アスピリンのSMILESはCC(=O)Oc1ccccc1C(=O)Oです。

日本語で回答してくれるようになりました。

ツールの追加

ChemCrowで使われているLangChain Agentsは自分でtoolを追加すれば、回答生成時に使ってくれるようになるため、toolを追加してみます。

pubchemのAPIを使って、物質名からCIDを取得するツールを作成します。
ツールを下記のように実装します。

class Query2CID(BaseTool):
    name = "Name2CID"
    description = "Input a molecule name, returns CID."
    url: str = None

    def __init__(self):
        super(Query2CID, self).__init__()
        self.url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/{}/{}"

    def _run(self, query: str) -> str:
        # query the PubChem database
        r = requests.get(self.url.format(query.strip(), "cids/JSON"))
        data = r.json()
        
        try:
            cid = data["IdentifierList"]["CID"][0]
        except KeyError:
            return "Could not find a molecule matching the text. One possible cause is that the input is incorrect, input one molecule at a time."
        return cid

このツールを回答生成時に使うようにするために、
chemcrow/agents/tools.pyにも追加します。

all_tools += [
  Query2SMILES(),
  Query2CAS(),
  Query2CID(), # 追加部分.

この状態で質問してみます。

質問:アスピリンのCIDを教えて

✅ **Name2CID:** Aspirin

The user is asking for the CID of Aspirin. I will use the Name2CID tool to find this information.

Action: Name2CID  
Action Input: Aspirin

✅ **Complete!**

Final Answer: アスピリンのCID2244です。

アスピリンのCID2244です。

追加したツールName2CIDを使用して回答されました。

おわりに

化学系のツールChemCrowを試してみました。
GPT-4と様々な外部ツールを連携させながら、回答を生成してくれるのと、
LangChain Agentsのツールに外部サービスを追加することで、機能を簡単に拡張できるところが良いと思いました。

LangChain AgentsにはHuman as a toolという人間をツールに見立てて、人間に回答を求めるツールがあるようなので、外部サービスでは回答が難しい問題は人間に質問する、といった拡張もできるかもしれません。



CRSチームでは今後も化学の研究活動のサポートに向けて調査・開発を進めて行きます。もしお困りのことがありましたらお気軽に下記までお問い合わせください!