6. Python 接続スクリプトを保存
全プラットフォーム
作業ディレクトリに local_chemistry_assistant.py として保存します。値を計算してからモデルに渡し、モデル生成コードは実行しません。
"""RDKit calculations followed by explanation using a local Ollama model.
Sources: https://www.rdkit.org/docs/GettingStartedInPython.html
https://docs.ollama.com/api/chat
This example has been source-reviewed, but has not been executed.
"""
import argparse
import json
import urllib.error
import urllib.request
from rdkit import Chem, rdBase
from rdkit.Chem import Descriptors, rdMolDescriptors
def main():
parser = argparse.ArgumentParser()
parser.add_argument("smiles")
parser.add_argument("--model", default="qwen2.5:3b")
parser.add_argument("--prompt", default="Explain the supplied molecular descriptors and their limits.")
args = parser.parse_args()
if not args.smiles.strip():
parser.error("Empty SMILES; no model request was sent.")
molecule = Chem.MolFromSmiles(args.smiles)
if molecule is None:
parser.error("Invalid SMILES; no model request was sent.")
results = {
"smiles": args.smiles,
"rdkit_version": rdBase.rdkitVersion,
"formula": rdMolDescriptors.CalcMolFormula(molecule),
"molecular_weight_g_mol": Descriptors.MolWt(molecule),
"tpsa_square_angstrom": rdMolDescriptors.CalcTPSA(molecule),
}
print(json.dumps(results, ensure_ascii=False, indent=2), flush=True)
request = urllib.request.Request(
"http://127.0.0.1:11434/api/chat",
data=json.dumps({
"model": args.model,
"stream": False,
"messages": [
{"role": "system", "content": "Explain only the supplied RDKit results. Preserve their numbers and units. Do not invent measurements, toxicity, efficacy or additional calculations. Reply in the user's language."},
{"role": "user", "content": args.prompt + "\nRDKit results:\n" + json.dumps(results)},
],
}).encode("utf-8"),
headers={"Content-Type": "application/json"},
method="POST",
)
try:
opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
with opener.open(request, timeout=180) as response:
body = json.load(response)
message = body.get("message", {}).get("content")
if not isinstance(message, str) or not message.strip():
raise ValueError("Ollama did not return message.content.")
print(message)
except (urllib.error.URLError, ValueError, TimeoutError) as error:
parser.exit(1, "Local Ollama request failed; RDKit results remain available above. " + str(error) + "\n")
if __name__ == "__main__":
main()
公式出典期待される結果
スクリプトを .venv と同じ作業ディレクトリに保存。
7. アスピリンの処理を実行
全プラットフォーム
macOS/Linux は .venv/bin/python、Windows は ..venv\Scripts\python.exe を使用します。--prompt で下記の指示を渡します。
.venv/bin/python local_chemistry_assistant.py "CC(=O)Oc1ccccc1C(=O)O" --prompt "RDKit が計算したアスピリンの結果を説明してください。分子式、質量、TPSA の値と単位を保持し、計算記述子と実験結果を区別してください。"
公式出典期待される結果
先に RDKit JSON の C9H8O4、約 180.16 g/mol、TPSA 約 63.6 Ų を確認します。説明の数値が一致し、根拠のない毒性・効果の主張がないことを調べます。これは期待する確認であり、今回の実測結果ではありません。