Як я зі штучним інтелектом молекули малював

В 2025-му році я мав честь читати біоорганічну хімію в КШЕ, а цього року фізичну хімію в КАІ. В обох курсах мені ну дуже вже хотілося продемонструвати, як виглядають молекули та їх орбіталі. Це могло би суттєво допомогти студентам зрозуміти механізми хімічних реакцій, так як в більшості випадків вони передбачають перекриття правильних орбіталей та "перетікання" електронів, яке хіміки-органіки зображають спеціальними діаграмами (push-arrow diagrams).

На жаль, я не є спеціалістом у квантовій хімії, але в мене був штучний інтелект і нестримне бажання зробити круті лекції. З цього я і почав. Увесь код в проекті написано виключно штучним інтелектом, я тільки підбадьорював його теплими словами як справдешній прораб. Результати цього неподобства представлено в репозитарії на GitHub. В статті будуть 3D-ілюстрації, з яких я прибрав більшу частину орбіталей, щоб їх не засмічувати, тож якщо хто хоче "оголосити весь список" — ласкаво прошу в галерею на GitHub. Нижче мій особистий досвід: з якими проблемами зіткнувся, які рішення ухвалив та які висновки зробив.

То як же намалювати красиво?

Крок 1. Вводимо дані

Для того, щоб почати хоч щось рахувати, треба якось сказати комп'ютеру, що саме я зібрався рахувати, тож виникло питання: як задати хімічну формулу у зрозумілому машині форматі?

Теоретично назви за IUPAC, наприклад "β-D-arabino-Hex-2-ulofuranosyl α-D-gluco-hexopyranoside", могли б вирішити це питання, але на практиці це як мінімум незручно. Також є більш програмістський варіант — SMILES, але людині з ними важко працювати (якщо назву за IUPAC я ще з горем пополам запишу, то цю штуку тільки з довідника брати). Тому в ідеалі хотілось інструмент, який дозволяв би зобразити формулу — так я буду впевнений, що рахуватися буде саме потрібна мені речовина.

З доступних інструментів мою увагу привернули три: Ketcher, MarvinJS та JSME:

Ketcher дозволяє малювати структури вручну, а також підтримує кілька форматів, в яких можна завантажити дані, зокрема SMILES. Також він дозволяє експортувати в ряд форматів, тож намалювавши молекулу, я можу, наприклад, зберегти собі SMILES у текстовий файл і в майбутньому перевикористати.

Приклад інтерфейсу Ketcher. Можна поклацати, але жодного бекенду не передбачено, тож нічого цікавого після вводу молекули не відбудеться. Зате можна отримати уявлення, як виглядає інтерфейс дуже багатьох інструментів для хіміків (вони як дві краплі води, якщо чесно).

На жаль, дане рішення неідеальне і деякі молекули я так і не зміг ввести в Ketcher, але для лекційних демонстрацій він покриває 99% моїх потреб тільки так.

[18]аннулен — Та єдина найвпертіша молекула, яка була мені потрібна для лекцій і яку я так і не зміг намалювати в Ketcher. SMILES теж не допомогли. Тут представлена тільки конфігурація атомів у просторі, трохи пізніше подивимось на деякі орбіталі.

Крок 2. Тривимірні координати та орбіталі

Щоб одночасно отримати тривимірні координати атомів та електронні орбіталі, необхідно уже проводити квантово-механічні розрахунки. Я не стану вдаватись в деталі, скажу тільки, що така задача надзвичайно обчислювально складна. Складна до такого рівня, що отримати точний розв'язок рівняння Шредінгера для багатоелектронної молекули практично неможливо за розумний час. Тому в реальних розрахунках використовують наближені методи, як-от теорія функціонала густини (DFT), які забезпечують різний компроміс між швидкістю та точністю.

Щоб впоратися з таким у межах мого маленького проекту, очевидно, треба обрати якийсь добрий уже готовий інструмент. Я розглянув кілька варіантів:

У підсумку користувацький інтерфейс отримав випадаюче меню з пунктами:

Крок 3. Я хочу бачити результат

Всі ці розрахунки — то, звичайно, чудово, але хочеться нарешті побачити красиву картинку. Знову ж таки, я надав перевагу використанню існуючих інструментів замість писати з нуля навіть при підтримці всезнаючого штучного інтелекту. Цього разу в список на розгляд потрапило наступне:

Робочий стіл системи. Так виглядає те, що бачу я, коли готую черговий пакет для лекцій. Частина інтерфейсу повинна бути вже знайомою, тоді як решта стане зрозуміла по ходу розповіді.

А в чому проблема-то була?

Не сумніваюсь, що поки що вся задача виглядає для читача як "поєднати кілька інструментів" та ще й за допомогою штучного інтелекту. Очевидно, що таке повинно робитися за вечір і точно вже не заслуговує цілої статті. Ну хіба що дуже хочеться пографоманити. Насправді, я був би просто щасливий, якби воно так було, але сувора реальність як завжди вносить свої корективи.

А що ж повертають квантові обчислення?

Відповідь інженера — cube-файли зі значеннями хвильової функції; відповідь фізика/хіміка — канонічні орбіталі. Ну а хіба це не те, що ми й хотіли? На жаль, ні. Справа в тому, що хоча ми і не кажемо цього явно, але ж очікуємо на картинку, яку бачили у підручнику органічної хімії, чи принаймні щось достатньо схоже.

Етан, етен та етин — класичний приклад одинарного, подвійного та потрійного зв'язку. Орбіталі показано тільки для зв'язку вуглець-вуглець, щоб не засмічувати графік. Легко бачити, що одинарний зв'язок — $\sigma$, тоді як подвійний складається з одного $\sigma$- та одного $\pi$-зв'язку, а потрійний — з одного $\sigma$- та двох $\pi$-зв'язків.

Повертаючись до проблеми: ми би хотіли чогось подібного... і ми його швидше за все не отримаємо. Розв'язок рівнянь Кона-Шема дає власні функції оператора Кона-Шема (канонічні молекулярні орбіталі, CMO), а вони можуть бути делокалізовані по всій молекулі. Якщо подивитися на яку-небудь $\text{CMO}_{16}$, то це розмазня на 20 атомів — жоден студент-хімік не впізнає там звичний $\sigma$-зв'язок $\ce{C-C}$.

Так і що нам робити?

Нам необхідна так звана локалізація. Як я казав вище, "розмазня" — це власний базис оператора Кона-Шема (канонічні молекулярні орбіталі), а як відомо, базиси можна змінювати, наприклад за допомогою унітарного перетворення (узагальненого повороту). Таким чином, виникає питання: чи можемо ми так вибрати новий набір базових функцій серед зайнятих орбіталей, щоб їх комбінації давали ту саму загальну електронну густину, і при цьому наші нові орбіталі були якнайбільш схожі на звичні нам картинки з підручника?

Як виявилось, такі методи є. Я розглянув наступні:

Як промаркувати орбіталі

Ймовірно, ви очікували, що локалізація дасть нам красиву картинку і класифікацію всього, що ми нарахували, ото тільки бери і малюй. Як би не так — нам світить тільки трохи менша "розмазня", а класифікувати доведеться взагалі самим. В рамках класифікації було б добре показати вільні електронні пари, $\sigma$- та $\pi$-зв'язки. Для цього я використав наступний алгоритм:

А що робити з делокалізованими $\pi$-системами? (Бензол, аліл, карбоксилат $\ce{R-COO-}$)

Тут виникає класичний парадокс локалізації. Хімік хоче бачити зв'язки $\sigma(\ce{C-C})$ локальними, але для ароматичного кільця бензолу, алільної системи або резонансного аніону форміату та інших карбоксилатів потрібно показати делокалізовану $\pi$-підсистему. Це важливо, щоб пояснити резонансні ефекти, які мають суттєвий вплив на стабільність молекули чи іону, а також на її реакційну здатність. В той же час локалізація IBO намагається розірвати спільну електронну хмару на шматки — почергові подвійний та одинарний зв'язки. Для того, щоб поєднати такі дві взаємовиключні вимоги, доводиться додавати ще один крок.

При виявленні таких орбіталей вони вилучаються з пулу локалізації, тоді як решта передається на IBO. Для систем із виродженими орбіталями (як бензол, де $\pi_2$ і $\pi_3$ мають однакову енергію і довільну орієнтацію) ми виконуємо точне вирівнювання вироджених канонічних підпросторів через симетричну Löwdin-ортонормалізацію. Для кожної орбіталі обчислюється діагональна фоківська енергія $E_k = \langle \phi_k | \hat{F} | \phi_k \rangle$, а якщо інтеграл перекриття з канонічною граничною МО складає $\ge 90\%$, орбіталь заміняється на канонічну та позначається міткою (HOMO/LUMO).

Енергетична схема делокалізованої $\pi$-підсистеми бензолу.

Проблема віртуальних антизв'язуючих орбіталей ($\sigma^*$ та $\pi^*$)

У хімії дуже важливо бачити не лише зайняті зв'язуючі орбіталі, а й вільні акцепторні рівні (LUMO, $\sigma^*$, $\pi^*$). Наприклад, під час нуклеофільної атаки, зайнята орбіталь нуклеофіла взаємодіє з вакантною акцепторною орбіталлю електрофіла часто з вираженим $\sigma^*$- або $\pi^*$-характером. Тому було б вкрай непогано якось показати і їх.

Проте у квантовій хімії постає проблема практичної роботи з віртуальним простором. У наближенні Хартрі-Фока та теорії функціонала густини (DFT) канонічні віртуальні орбіталі є розв'язками для незайнятих одноелектронних станів в усередненому полі електронів. Оскільки вони не роблять внеску в електронну густину основного стану, для них не виникає природного критерію локалізації, аналогічного тому, який ми використовуємо для зайнятих орбіталей. Іншими словами, на них не діє локалізація IBO, адже там "нікого нема". В результаті звичні для хіміка валентні антизв'язуючі орбіталі ($\sigma^*$ чи $\pi^*$) не завжди відповідають окремим канонічним віртуальним МО, а "розмазані" по багатьох віртуальних рівнях і "зібрати назад" їх можна лише як лінійну комбінацію кількох таких МО.

Тому було вирішено піти іншим шляхом — відтворити класичну книжну картинку, а не просто покладатися на результат оптимізації. Залежно від того, чи була зв'язуюча орбіталь локалізована IBO, використовується один з двох підходів:

Такий комбінований підхід дозволяє зберегти і красиві локальні $\sigma^*$-антизв'язки на кожній зв'язковій ділянці, і не зруйнувати природну спільну $\pi^*$-систему ароматичних чи резонансних фрагментів.

Заливаємо це щастя на GitHub

Насправді проблема не стільки залити дані (git push впорається), як проблема: "скільки даних качати браузеру користувача?". І вона не така маленька, як здається: поширений формат для збереження орбіталей — Gaussian CUBE (3D-сітка значень хвильової функції, наприклад $100 \times 100 \times 100$ точок). Один такий файл у нашому випадку займає близько $13\text{ МБ}$, тобто $32$ орбіталі бензолу обійдуться $\sim 416\text{ МБ}$.

Як рішення проблеми, замість cube-файлів використовуються полігональні сітки, що відповідають певному значенню амплітуди хвильової функції (ізоповерхні для додатного та від'ємного значень). Відповідно, при пакуванні доводиться обирати isovalue (є відповідний слайдер; зазвичай добре працює $0.045$) та генерувати сітку алгоритмом Marching Cubes. Результати зберігаються у форматі JSON та архівуються у ZIP. Для бензолу повний пакет усіх орбіталей займає лише $1.39\text{ МБ}$ (у розпакованому вигляді JSON-сітки займають $6.82\text{ МБ}$). З порахованих для лекцій $36$-ти молекул середній розмір ZIP-пакета $1.23\text{ МБ}$, а найбільший — $6.06\text{ МБ}$, що чудово вантажиться в браузері за лічені секунди.

Що я з цього виніс

Як не дивно, але навіть дещо цікаве вдалось дізнатись з області фізики. Наприклад, більшість підручників, поєднуючи модель VSEPR із поясненням через $sp^3$-гібридизацію, стверджують, що у води $\ce{H2O}$ кисень має гібридизацію $sp^3$, а дві неподілені пари стирчать як "вуха кролика". Квантові ж розрахунки показали, що канонічні молекулярні орбіталі не еквівалентні! І що найцікавіше, фотоелектронна спектроскопія дійсно вказує на два різних потенціали іонізації води. Щоправда, є також роботи, які показують, що унітарним перетворенням можна добитися еквівалентних орбіталей не змінюючи саму багатоелектронну хвильову функцію (подібно як ми робили при локалізації), а різницю в спектрі пояснюють релаксацією електронної структури після видалення електрона. Тож навіть у питанні інтерпретації хімічного зв'язку нема консенсусу: повинні ми його розуміти як взаємодію молекулярних орбіталей, локалізованих орбіталей, чи має сенс тільки повний опис багатоелектронною хвилевою функцією? А для зацікавленого читача можу хіба що порекомендувати кілька статей:

Інший цікавий приклад я зустрів в роботі 2021 року, де використано метод real-space adaptive natural density partitioning, а кожен зв'язок $\ce{S-O}$ описується однією $\sigma$- та двома еквівалентними $\pi$-взаємодіями. Але ці $\pi$-внески приблизно на 92% локалізовані на атомах кисню! Автори прямо зазначають, що вважати їх неподіленими парами кисню, чи справжніми двоцентровими $\ce{S-O}$-зв'язками, значною мірою залежить від обраного способу інтерпретації. Кому цікаво, можу лише порекомендувати пару статей:

Ще один цікавий приклад стосується електронних властивостей алкільних замісників. У підручниках алкільні замісники часто називають електронодонорними, маючи на увазі позитивний індуктивний ефект ($+I$). Але останні роботи ставлять під сумнів саме таке пояснення: порівняно з атомом водню алкільна група має радше від'ємний індуктивний ефект ($−I$), а її видима електронодонорність у різних системах пояснюється іншими ефектами. Наприклад поряд з подвійним зв'язком сусідні $\sigma$-зв'язки $\ce{C-H}$ можуть взаємодіяти з розпушувальною $\pi^*$-орбіталлю ($\sigma(\ce{C-H}) \to \pi^*(\ce{C=C})$), передаючи їй електронну густину — гіперкон'югація. Вона, зокрема, підвищує енергію HOMO алкену.

З приводу штучного інтелекту (інструмент: Google Antigravity 2.0, підписка Pro, Opus 5.5 High для архітектури, Gemini 3.1 Pro High для генерації коду, а після того як гугл його видалив, то Gemini 3.8 Flash High). Я виявив для себе як ряд переваг, так і цілий список проблем, які доводиться враховувати в роботі. Спочатку про переваги:

Проте є ряд (схоже, типових) проблем, про які не згадати теж буде неправильно.

Куди далі?

Мрію зробити повноцінний IRC (intrinsic reaction coordinate) та візуалізацію, щоб "крутити мультики" як ChemTube3D, але поки що така задача надто складна і потребує дуже багато правок руками. Ну, але складно $\neq$ неможливо, то, може, з часом і таке продавлю, та й моделі стають все розумнішими, може, колись якусь добру ідею підкинуть.

IRC. Поки що найкращий результат моїх експериментів. Представляє один з типових механізмів — атаку нуклеофіла на групу $\ce{C=O}$ з утворенням тетраедричного проміжного продукту. Але навіть тут поки що сумнівні результати розрахунку енергії, а також я очікував більш суттєвого перенесення електронної густини $\pi$-зв'язку на кисень.

В схемі реакції знизу можна клацати по стрілочках і молекулах, також працює doubleclick на молекулах.

Подяки