(概要編)生成AIが拓く新たな可能性:自然言語でDemand-Drivenな量子化学計算
はじめに
QunaSysのCRSチームでエンジニアをやっている山口です。
私は学生時代、分子動力学を用いた研究に従事していました。
現在、QunaSysには量子化学計算に精通しているメンバーが多数在籍していますが、私自身は量子化学計算について多少心得てはいるものの、リサーチチームでもないため、本業としては取り組んでいません。
しかし、QunaSysの一員である以上、量子化学計算に対する理解は不可欠だと考えています。
ただ量子化学計算は非常に複雑で、理解を深めながら計算を進めることは容易ではありません。例えば、密度汎函数理論(DFT)での計算をしようとした時にどの汎関数を選択するか、計算結果をどうやって解釈するか、などは難しい判断が求められます。
そこで、私のように量子化学計算に詳しくない人でも、やりたいことベースで簡単に計算を実行し、結果を容易に解釈できるようにするため、生成AIを用いた量子化学計算の自然言語インターフェイスの作成に挑戦してみました。
生成AIが「私たちのリクエストをどのように解釈して計算を実行するのか」を確認することで、量子化学計算に対する理解度も大きく深まることが期待できます!
Demand-Drivenな量子化学計算の実行デモ
まずはデモ動画でどんなものか体感してみてください。
3本あります。楽しんでみてくださいね!
計算前提
今回のデモ動画では以下の前提で計算されています。
計算手法:PySCFでDFT計算
基底関数:sto-3g
最適化計算などは6-31Gもしくは6-31G(d)などを使うと思いますが、今回はサッと計算できるように一番小さいsto-3gにしました。
では早速デモ動画を見ていただきましょう!
構造最適化デモ動画
ざっくりデモ内容:
リクエスト「CC=Cの最安定構造が知りたい。」をLLMが理解して最適な計算を方法を選択 → 構造最適化計算
リクエスト内容から計算する対象分子を用意 → リクエスト内容からCC=Cを抽出
分子の内容から汎関数を選択 → B3LYP
1 ~ 3までの内容を使って分子の構造最適化を実行 & 可視化
構造最適化の結果からLLMが解釈し、回答を生成してます。
LLMが構造最適化した結果を解釈した内容:
振動解析デモ動画
ざっくりデモ内容:
リクエスト「c1ccccc1の振動モードを知りたい。」をLLMが理解して最適な計算を方法を選択 → 振動解析
リクエスト内容から計算する対象分子を用意 → リクエスト内容からc1ccccc1を抽出
分子の内容から汎関数を選択 → B3LYP
1 ~ 3までの内容を使って分子の振動解析を実行 & 可視化
振動解析の結果からLLMが解釈し、回答を生成してます。
LLMが振動解析した結果を解釈した内容:
一点計算デモ動画
ざっくりデモ内容:
リクエスト「CC=CC=CCの最安定構造が知りたい。」をLLMが理解して最適な計算を方法を選択 → 一点計算
リクエスト内容から計算する対象分子を用意 → リクエスト内容からCC=CC=CCを抽出
分子の内容から汎関数を選択 → B3LYP
1 ~ 3までの内容を使って分子の一点計算を実行
一点計算の結果からLLMが解釈し、回答を生成してます。
LLMが一点計算した結果を解釈した内容:
QunaSysの社員からのコメント
QunaSysの社員にもコメントをもらいました!
社員1
振動解析では、”この食い違いを考えると”というような出力がありますが、これは実験事実と比較した上での計算結果の食い違いを指しているのでしょうか?DFTの精度上、実験値と計算値の振動数は合わないことのほうが多いので、食い違いが生じるのは仕方ないような...という気持ちの上で確認したいと思っています
構造最適化では”ジオメトリの収束: ジオメトリが完全に最小に収束した兆候を最適化ログで確認します。これは通常、勾配が小さく、変位が小さ いことを確認し”と書いているけど何に対して小さいかまで書いて欲しい。「指定した収束しきい値以下まで各値が小さいことを確認する」とかだといい感じ。優・良・可・不可の4段階評価を付けるなら良くらいの感覚です。
一点計算に関しては違和感は無いです!
総じてこれが学生の頃にあったらなと思います。
大体はいい感じみたいですね。
これのMD版があると私も嬉しかったかもしれません。
「Demand-Drivenな量子化学計算」でできることの全体像を見る
今回だと「Demand-Drivenな量子化学計算」では以下のような構成になっています。
使ってる技術スタック
言語:Python
フレームワーク
クライアントサイド:Streamlit
サーバーサイド:FastAPI + LangServe
量子化学計算用ライブラリ:PySCF
LLMフレームワーク:LangChain
LLM:OpenAI
できる計算の種類
計算としてできるのは以下です。基本的にPySCFで計算を実行しています。
一点計算
構造最適化
振動解析
振動モードや最適化の可視化はPy3Dmolを使用しています。
LLMがサポートしてくれている部分
リクエストの内容を解釈し計算方法の選択 :
ユーザーの自然言語による指示を理解し、適切な計算方法を自動的に選択します。
分子の計算可能な形式への変換 :
ユーザーが入力からSMILESや化合物の名前を抽出し、量子化学計算に適した形式に自動的に変換します。
構造最適化の収束判定 :
構造最適化計算の過程を監視し、収束条件を満たしているかどうかを判断します。
汎関数の自動選択 :
計算対象の分子に適した汎関数を自動的に選択します。
Agentという技術を使ってます
「Demand-Drivenな量子化学計算」ではLLMをつかったAgentという仕組みを使っています。
今回は少しだけAgentについて解説させていただきます。
Agentは自然言語処理と推論を組み合わせて、ユーザーからの指示を理解し、適切なアクションを選択・実行することで、タスクを自動的に完了させる仕組みです。
ざっくりいうと、Agentとはモデルに意思決定の機能を与えて機能しているシステムなんですね。
このAgentを使えば、これまでは人間が手作業で行っていたドメインに特化した専門的なタスクを、AIに自動化させることができるんです。
例えば、化学の分野で言えば、特定の化合物を計算するのに適した密度汎関数を探したいとしましょう。Agentを使えば上記の図ような感じで、目的の論文や汎関数を自動で見つけ出してくれます。
解説すると、以下のようになります。
ユーザーリクエスト:化合物Aを計算するのに密度汎関数理論を使いたい。もっとも適した汎関数のchemRxiv論文を探して、教えてください。
Agentの行動 :
1. 化合物A+DFT+functionalでchemRxiv検索
2. 情報取得してユーザーリクエストでベクトル検索
3. ユーザーリクエストに合わせて、Agentが最適な汎関数の情報を回答として生成
精度に関しては別途考える必要がありますが、Agentではこのようなことができるようになります。
実際に今回作った「Demand-Drivenな量子化学計算」のシステムでもこのようなAgentの仕組みを使用しています。
ドメインに特化したことをLLMにやらせたいならAgent機能は必須になってきますね。
現状の課題と将来の展望
デモ動画の内容からはわかりづらいですが、「やりたいことの解釈と計算方法の選択」や「汎関数の自動選択」などの機能において、まだ精度の面で課題があります。
しかし、これらの課題は、RAG(Retrieval-Augmented Generation)などの技術を導入することで、大幅な改善が見込まれます。
例えば、「汎関数の自動選択」については、計算対象の化合物に関する論文を検索し、そこで使用されている汎関数を選択するという方法が考えられます。
また、「やりたいことの解釈と計算方法の選択」については、ユースケースと計算方法の対応表を作成し、RAGを用いてユースケースを検索しLLMに適切な計算方法を判断させるなどの方法が有効だと考えられます。
さらに、最近提唱されたLLaMP(Large Language Model Made Powerful for High-fidelity Materials Knowledge Retrieval and Distillation)の仕組みを取り入れることで、結晶構造の生成などにも対応でき、より簡単かつ精度よく計算できる範囲が広がると期待されます。
今後は、これらの新しい技術を積極的に取り入れて私がより便利に量子化学計算をできるように「Demand-Drivenな量子化学計算」プロジェクトの精度と利便性をさらに高めていきたいですね!
最後に
もちろんまだまだ拡張の余地がありますが、今回はデモ用に作ったものなのでこの辺でとどめています。
例えば、計算結果の可視化とか、軌道の可視化とかいろいろいれたいなとか思ったり思わなかったり…
次回は「Demand-Drivenな量子化学計算」で使っている自然言語のインターフェイスをどう作るかに関して解説していきたいと思います。よかったらフォローして待ちください!
CRSチームでは今後も化学の研究活動のサポートに向けて調査・開発を進めて行きます。
今回のような「Demand-Drivenな量子化学計算」の仕組みをより知りたい方はお気軽に下記までお問い合わせください!