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()
官方来源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 Ų;再核对解释是否保留原数值,未新增无依据的毒性或疗效结论。这是预期检查,不是本次实测结果。