99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

AI Agent驅(qū)動計算材料結構優(yōu)化:ASE EMT最小閉環(huán)與生產(chǎn)擴展

AI Agent驅(qū)動計算材料結構優(yōu)化:ASE EMT最小閉環(huán)與生產(chǎn)擴展 做計算化學和材料計算的朋友大多有過這樣的體驗一個結構優(yōu)化的任務從建模、選泛函、設收斂標準、跑任務、看軌跡、判斷是否收斂到最后一堆能量文件需要手工整理成表。整個鏈路里真正需要人做判斷的環(huán)節(jié)其實只有幾個剩下的全是重復勞動和格式轉換。而偏偏這幾個判斷環(huán)節(jié)又強依賴經(jīng)驗新人很難獨立完成。這篇文章想聊的就是能不能用 AI Agent 把這套鏈路串起來讓模型負責決定下一步做什么讓程序負責真正去做。文章會從概念講起然后手寫一個不依賴任何黑盒框架的最小 Agent用 ASE 內(nèi)置的 EMT 計算器跑通建?!獌?yōu)化—校驗—落盤的完整閉環(huán)最后再討論怎么把這個玩具級實現(xiàn)擴展到真實的第一性原理計算和機器學習勢場景。適合有 Python 基礎、做過一些原子尺度模擬、想了解 Agent 工程化的讀者。1. 為什么要把 AI Agent 引入計算化學與材料計算1.1 Agent 在這個語境下到底指什么先把這個詞說清楚因為它在不同圈子里含義差別很大。在這里AI Agent 指的是一個由大語言模型驅(qū)動的決策循環(huán)模型讀取當前的任務狀態(tài)從一組預先定義好的工具里挑選一個調(diào)用拿到工具返回的結構化結果再決定下一步如此往復直到任務結束或者觸發(fā)終止條件。它和用 ChatGPT 問一句然后復制粘貼結果有本質(zhì)區(qū)別。后者模型只是一次性地產(chǎn)生文本所有執(zhí)行動作由人完成前者模型處在一個閉環(huán)里它的每一次輸出都會被程序解析成具體的函數(shù)調(diào)用執(zhí)行結果又會回到模型的上下文里。換句話說Agent 的價值不在于模型懂多少化學而在于它能把意圖翻譯成操作序列并且根據(jù)中間結果動態(tài)調(diào)整。在計算化學和材料學里這個特性的用處非常明顯。因為這類任務的本質(zhì)是搜索——搜索構型空間、搜索參數(shù)組合、搜索收斂路徑。人的經(jīng)驗本質(zhì)上是一套啟發(fā)式規(guī)則而 Agent 恰好可以把這套規(guī)則形式化成工具調(diào)用序列同時保留在遇到異常時改弦更張的能力。需要強調(diào)的是Agent 不是萬能的。凡是需要高精度數(shù)值判斷的地方比如某個泛函對某類體系的系統(tǒng)性誤差模型基本給不出可靠結論。它的定位應該是實驗記錄員 操作員而不是理論家。1.2 與傳統(tǒng)腳本、工作流引擎的區(qū)別很多人會問我寫一個 Python 腳本把 ASE 的步驟串起來不就完了或者用工作流引擎編排一下這三者的差別值得掰開講。傳統(tǒng)腳本是確定性的路徑寫死。好處是可復現(xiàn)、易調(diào)試壞處是遇到邊界情況就崩比如某個元素 EMT 不支持、某個晶格常數(shù)導致優(yōu)化發(fā)散腳本沒法自己繞過去只能人來改代碼或者改參數(shù)。工作流引擎比如各種 DAG 編排工具解決了任務依賴和失敗重試的問題但它的分支邏輯依然是人預先寫死的。你可以配失敗了重試三次但沒法配如果能量異常升高就換個初始晶格常數(shù)再試。這類判斷需要語義理解工作流引擎做不到。Agent 補的正是這一塊把分支決策交給模型。代價是引入了不確定性——同樣的輸入模型兩次可能給出不同的操作序列。所以在工程上一個靠譜的 Agent 系統(tǒng)必須有確定性的校驗層兜底這一點后面會反復提到。一個實用的判斷標準是如果你的任務流程完全固定、輸入格式完全可控那就老老實實寫腳本別上 Agent。如果你的任務需要看情況比如結構來源五花八門、收斂行為不可預測、需要根據(jù)中間結果選下一步那 Agent 才有發(fā)揮空間。1.3 計算材料學里適合 Agent 化的任務不是所有任務都值得 Agent 化。根據(jù)實際使用情況下面這幾類收益比較明顯。第一類是結構準備與預處理。從 CIF、POSCAR、SMILES 等各種來源讀入結構判斷晶胞是否合理、是否需要加真空層、是否需要擴胞、表面模型該切哪個晶面。這些判斷規(guī)則性強但情況瑣碎很適合交給 Agent 調(diào)度。第二類是計算流程編排。給定一個體系和一個目標比如算彈性常數(shù)或算形成能Agent 需要拆解成一系列計算任務決定順序檢查每一步的輸出是否正常異常時調(diào)整參數(shù)重跑。第三類是結果解析與匯總。從大量輸出文件里提取能量、力、帶隙、晶格常數(shù)等量做單位換算整理成表格標注異常值。這類工作純體力活Agent 做起來出錯率反而比人低。第四類是文獻與數(shù)據(jù)庫的信息抽取輔助。比如從材料數(shù)據(jù)庫批量拉取結構并做一致性檢查。注意這里說的是輔助涉及判斷的部分仍然需要人復核。反過來純粹的精度評估、方法選擇的理論論證、需要長期經(jīng)驗的誤差分析這些不建議交給 Agent至少不能讓它做最終決策。2. 環(huán)境準備與項目骨架2.1 運行環(huán)境與依賴說明本文示例以 Python 環(huán)境為例。Python 版本建議 3.9 以上因為代碼里用了一些較新的類型標注寫法from __future__ import annotations可以兼容低版本但為了少踩坑建議直接用較新的小版本。核心依賴只有兩個方向計算側和編排側。計算側本文用 ASEAtomic Simulation Environment它自帶的 EMT 計算器可以對部分金屬做快速近似計算正好適合做演示不需要安裝任何第一性原理軟件。編排側如果要接真實大模型需要對應的 SDK如果只想先把流程跑通可以完全不用本文提供了一個離線的腳本化 Planner。需要說明的是具體依賴版本請以你本地環(huán)境的實際情況為準本文重點演示的是架構和配置思路不綁定某個特定版本號。安裝命令大致如下# 建議在虛擬環(huán)境中操作 python -m venv venv source venv/bin/activate # Windows 下用 venv\Scripts\activate # 計算側依賴 pip install ase numpy # 可選如果需要接大模型再安裝對應 SDK版本以官方文檔為準 # pip install openaiASE 的 EMT 計算器支持的元素有限主要覆蓋 Al、Cu、Ag、Au、Ni、Pd、Pt、H、C、N、O 等常見元素的一部分。如果你的體系包含它不支持的元素跑起來會直接報錯。這一點在演示階段要特別注意后面常見問題一節(jié)會專門講這個報錯怎么排查。2.2 項目目錄結構為了讓代碼可維護建議一開始就把結構分清楚。工具層負責真正干活Agent 層負責調(diào)度校驗層負責兜底三者不要混在一個文件里。推薦的結構如下chem-agent/ ├── agent/ │ ├── __init__.py │ ├── session.py # 計算會話持有當前結構等狀態(tài) │ ├── tools.py # 工具函數(shù)實現(xiàn) │ ├── schema.py # 工具描述給模型看的 │ ├── validators.py # 結果校驗 │ └── loop.py # Agent 主循環(huán) ├── planners/ │ ├── __init__.py │ ├── scripted.py # 離線規(guī)則 Planner用于測試 │ └── llm.py # 大模型 Planner可選 ├── runs/ # 運行產(chǎn)物自動創(chuàng)建 └── main.py # 入口這個劃分的好處是計算邏輯tools.py完全不感知模型的存在可以被普通腳本直接調(diào)用也可以在 Agent 里被調(diào)用。這一點非常重要因為它意味著你的計算代碼永遠可以獨立測試不會因為模型抽風而不可用。2.3 單位約定在動手寫代碼之前必須先把單位約定固定下來否則后面一定亂。ASE 內(nèi)部統(tǒng)一使用 eV 作為能量單位、? 作為長度單位、eV/? 作為力的單位。工具函數(shù)的入?yún)⒑头祷刂刀甲裱@套約定不要在中途混入 kcal/mol 或者 Hartree。如果最終要和其他軟件對接單位換算放在結果輸出環(huán)節(jié)統(tǒng)一做不要在工具內(nèi)部做隱式轉換。這個原則看似啰嗦但在實際項目里能省掉大量對不上數(shù)的排查時間。3. 核心原理拆解一個可落地的 Agent 由什么組成3.1 四要素模型拋開各種框架的包裝一個能干活的計算 Agent 由四部分組成狀態(tài)State、工具Tools、決策器Planner、循環(huán)控制器Loop Controller。狀態(tài)是當前任務的全部上下文包括已構建的原子結構、已執(zhí)行的操作歷史、中間計算結果。在計算化學場景里狀態(tài)管理是最容易被低估的部分。因為原子結構是個復雜對象沒法直接塞進模型的上下文只能序列化成摘要信息元素組成、原子數(shù)、晶格參數(shù)、當前能量等傳給模型。工具是一組有明確輸入輸出的函數(shù)。每個工具應該只做一件事并且可以被獨立測試。工具設計得好不好直接決定了 Agent 的上限——模型再聰明如果工具粒度太粗比如一個工具直接跑完整套流程模型就沒有調(diào)度空間如果太細比如一個工具只移動一個原子模型會被淹沒在細節(jié)里。決策器負責根據(jù)當前狀態(tài)選擇下一步動作。它可以是規(guī)則腳本也可以是大模型。把它抽成接口的好處是開發(fā)階段用規(guī)則腳本跑通流程上線前再換成模型兩者可以隨時切換對比。循環(huán)控制器負責防止 Agent 跑飛。必須有最大步數(shù)限制、重復動作檢測、異常中斷機制。一個沒有終止條件的 Agent 是很危險的尤其是當工具會消耗真實計算資源的時候。3.2 工具契約設計的三條原則寫工具函數(shù)的時候有三條原則值得堅持。第一條參數(shù)用基本類型。模型輸出的參數(shù)是 JSON只能表達字符串、數(shù)字、布爾、數(shù)組、對象。所以工具參數(shù)不要設計成Atoms對象這種復雜類型而應該用symbolCu、a3.6這樣的基本類型在函數(shù)內(nèi)部再去構造對象。第二條返回值必須可序列化且有明確狀態(tài)標識。建議統(tǒng)一返回一個 dict里面至少包含status字段ok/error和必要的數(shù)值結果。出錯時不要拋異常穿透到循環(huán)層而是在工具內(nèi)部捕獲后返回{status: error, message: ...}。這樣模型能看到錯誤信息并自行調(diào)整而不是整個程序崩掉。這點是 Agent 和普通腳本在設計理念上最大的不同之一。第三條單位寫進描述里。工具的 description 字段里要明確寫出參數(shù)和返回值的單位比如能量單位 eV、力收斂判據(jù)單位 eV/?。模型對單位非常敏感描述里不寫清楚它很容易傳錯量級。3.3 循環(huán)控制與終止條件一個最基本的 Agent 循環(huán)如下把當前狀態(tài)和歷史整理成消息列表。交給決策器得到下一個動作。如果是終止動作結束循環(huán)并輸出結果。否則解析動作名和參數(shù)調(diào)用對應工具。記錄工具返回結果回到第 1 步。這里面有幾個必須設的護欄。最大步數(shù)限制比如 20 步防止無限循環(huán)重復動作檢測防止模型卡在同一個調(diào)用上工具執(zhí)行超時防止某個計算卡死異常動作工具名不存在、參數(shù)缺失要有明確的兜底返回而不是直接拋異常。在實際項目中還有一個容易被忽略的護欄狀態(tài)一致性檢查。比如模型調(diào)用了優(yōu)化結構之后又調(diào)用了讀取能量如果優(yōu)化失敗導致結構狀態(tài)不合法讀取能量就應該返回明確的錯誤而不是給出無意義的數(shù)值。3.4 校驗層為什么不能省這一點值得單獨強調(diào)。模型給出的操作序列在語義上可能是合理的但在數(shù)值上可能完全錯誤。比如它可能把晶格常數(shù) 3.6 寫成 36或者把力的收斂判據(jù) 0.05 寫成 5。這類錯誤如果直接傳給計算程序輕則白跑一次重則產(chǎn)生一堆垃圾數(shù)據(jù)污染結果庫。校驗層的作用就是在工具執(zhí)行前后做數(shù)值合理性檢查晶格常數(shù)是否在合理區(qū)間比如 2 到 10 ?、原子間距是否過近小于 0.5 ? 通常意味建模出錯、能量是否為有限值、優(yōu)化后的最大力是否真的低于判據(jù)。這些檢查寫起來不復雜但能讓整個系統(tǒng)的可靠性提升一個量級。后面實戰(zhàn)部分會把它們具體實現(xiàn)出來。4. 完整實戰(zhàn)搭建一個結構優(yōu)化 Agent4.1 初始化項目與依賴先創(chuàng)建目錄結構并寫一個空的__init__.py然后在agent/session.py里定義會話對象。這個對象是整段代碼的狀態(tài)中心。# 文件路徑agent/session.py from __future__ import annotations import os from typing import Any, Dict, List, Optional from ase import Atoms class ChemSession: 計算會話持有當前結構、歷史記錄和運行目錄。 def __init__(self, workdir: str runs): self.workdir workdir os.makedirs(self.workdir, exist_okTrue) self.atoms: Optional[Atoms] None self.energy: Optional[float] None self.max_force: Optional[float] None self.history: List[Dict[str, Any]] [] def require_atoms(self) - Atoms: 獲取當前結構沒有則拋出可被工具層捕獲的錯誤。 if self.atoms is None: raise RuntimeError(當前會話還沒有結構請先調(diào)用 build_bulk) return self.atoms def summary(self) - Dict[str, Any]: 生成給模型看的結構摘要不要塞完整坐標。 if self.atoms is None: return {has_structure: False} return { has_structure: True, formula: self.atoms.get_chemical_formula(), natoms: len(self.atoms), cell_lengths: [round(x, 4) for x in self.atoms.cell.lengths()], energy_eV: None if self.energy is None else round(self.energy, 6), max_force_eV_per_A: ( None if self.max_force is None else round(self.max_force, 6) ), } def log(self, step: int, action: str, payload: Dict[str, Any]) - None: self.history.append({step: step, action: action, payload: payload})注意summary()里只返回摘要而不是完整坐標這是刻意設計的。一個 100 原子的結構如果完整序列化進上下文會占用大量 token而且模型也看不懂坐標數(shù)組。摘要里給元素組成、原子數(shù)、晶格參數(shù)、當前能量已經(jīng)足夠支撐決策了。4.2 編寫核心工具函數(shù)接下來是工具層。每個函數(shù)都遵循前面說的契約基本類型參數(shù)、dict 返回值、錯誤內(nèi)部捕獲。# 文件路徑agent/tools.py from __future__ import annotations import json import os from typing import Any, Dict from ase.build import bulk from ase.calculators.emt import EMT from ase.io import write as ase_write from ase.optimize import BFGS from agent.session import ChemSession def build_bulk( session: ChemSession, symbol: str, crystalstructure: str fcc, a: float 3.6, ) - Dict[str, Any]: 按指定晶格常數(shù)構建體相結構。a 的單位是 ?。 try: if not (2.0 float(a) 10.0): return { status: error, message: f晶格常數(shù) {a} 不在合理區(qū)間 [2.0, 10.0] ?請檢查是否單位寫錯, } atoms bulk(symbol, crystalstructure, afloat(a), cubicTrue) session.atoms atoms session.energy None session.max_force None return { status: ok, formula: atoms.get_chemical_formula(), natoms: len(atoms), cell_lengths_A: [round(x, 4) for x in atoms.cell.lengths()], } except Exception as exc: # noqa: BLE001 return {status: error, message: f構建結構失敗: {exc}} def optimize( session: ChemSession, fmax: float 0.05, steps: int 200, ) - Dict[str, Any]: 使用 BFGS 做結構優(yōu)化。fmax 單位 eV/?。 try: atoms session.require_atoms() if not (1e-4 float(fmax) 1.0): return { status: error, message: f收斂判據(jù) {fmax} eV/? 不合理常見取值 0.01 ~ 0.1, } if not (1 int(steps) 2000): return {status: error, message: f步數(shù) {steps} 超出允許范圍} atoms.calc EMT() optimizer BFGS(atoms, logfileos.devnull) converged optimizer.run(fmaxfloat(fmax), stepsint(steps)) forces atoms.get_forces() max_force float((forces ** 2).sum(axis1).max() ** 0.5) energy float(atoms.get_potential_energy()) session.energy energy session.max_force max_force return { status: ok, converged: bool(converged), energy_eV: round(energy, 6), max_force_eV_per_A: round(max_force, 6), cell_lengths_A: [round(x, 4) for x in atoms.cell.lengths()], } except Exception as exc: # noqa: BLE001 return {status: error, message: f優(yōu)化失敗: {exc}} def get_state(session: ChemSession) - Dict[str, Any]: 讀取當前會話狀態(tài)摘要。 return {status: ok, **session.summary()} def save_structure(session: ChemSession, filename: str final.xyz) - Dict[str, Any]: 把當前結構寫入 runs 目錄返回絕對路徑。 try: atoms session.require_atoms() if os.path.basename(filename) ! filename: return {status: error, message: filename 不能包含路徑分隔符} path os.path.join(session.workdir, filename) ase_write(path, atoms) return {status: ok, path: os.path.abspath(path), natoms: len(atoms)} except Exception as exc: # noqa: BLE001 return {status: error, message: f寫入結構失敗: {exc}}這里有幾點值得解釋。BFGS的run()方法返回布爾值表示是否收斂這個返回值要透傳給模型因為模型需要據(jù)此判斷是繼續(xù)調(diào)大步數(shù)還是調(diào)整初始結構。logfileos.devnull是為了避免優(yōu)化過程刷屏實際項目中建議改成寫文件方便事后復盤。最大力的計算用了(forces ** 2).sum(axis1).max() ** 0.5這是對每行三個分量求平方和再開方得到每個原子的力矢量模長取最大值。注意不要寫成forces.max()那是對分量取最大物理意義完全不同。save_structure里對filename做了路徑分隔符檢查這是一個簡單但必要的安全邊界。如果不檢查模型完全可能傳入../../etc/passwd這種值。雖然這只是個演示項目但這種習慣要養(yǎng)成。4.3 注冊工具 Schema工具寫好了還要告訴模型有哪些工具、參數(shù)是什么。這里用標準的 function calling 格式組織。# 文件路徑agent/schema.py TOOL_SCHEMA [ { type: function, function: { name: build_bulk, description: ( 按給定晶格常數(shù)構建體相晶體結構。 參數(shù) a 的單位是埃(?)常見金屬約在 3.0 到 4.5 之間。 ), parameters: { type: object, properties: { symbol: {type: string, description: 元素符號如 Cu}, crystalstructure: { type: string, description: 晶體結構類型如 fcc、bcc、hcp, }, a: {type: number, description: 晶格常數(shù)單位 ?}, }, required: [symbol, a], }, }, }, { type: function, function: { name: optimize, description: 對當前結構做 BFGS 結構優(yōu)化返回最終能量和最大力。, parameters: { type: object, properties: { fmax: { type: number, description: 力的收斂判據(jù)單位 eV/?常用 0.05, }, steps: {type: integer, description: 最大優(yōu)化步數(shù)}, }, required: [], }, }, }, { type: function, function: { name: get_state, description: 讀取當前結構摘要包括組成、原子數(shù)、晶格常數(shù)、能量。, parameters: {type: object, properties: {}, required: []}, }, }, { type: function, function: { name: save_structure, description: 把當前結構保存為 xyz 文件到運行目錄。, parameters: { type: object, properties: { filename: {type: string, description: 文件名不要帶路徑} }, required: [filename], }, }, }, ]Schema 里的 description 是給模型看的寫得好不好直接影響調(diào)用準確率。經(jīng)驗是把單位、常見取值、參數(shù)間的依賴關系都寫進去模型出錯的概率會明顯下降。比如常見金屬約在 3.0 到 4.5 之間這句話能有效避免模型傳 36 這種量級錯誤。4.4 實現(xiàn) Agent 主循環(huán)主循環(huán)負責把 Planner、工具、會話串起來。這里刻意不依賴任何 Agent 框架就是為了讓每一步都看得見。# 文件路徑agent/loop.py from __future__ import annotations import json from typing import Any, Callable, Dict, List from agent.session import ChemSession from agent.tools import build_bulk, get_state, optimize, save_structure MAX_STEPS 20 class AgentLoop: def __init__(self, session: ChemSession, planner, max_steps: int MAX_STEPS): self.session session self.planner planner self.max_steps max_steps self.tool_registry: Dict[str, Callable[..., Dict[str, Any]]] { build_bulk: lambda **kw: build_bulk(session, **kw), optimize: lambda **kw: optimize(session, **kw), get_state: lambda **kw: get_state(session), save_structure: lambda **kw: save_structure(session, **kw), } self.recent_actions: List[str] [] self.trace: List[Dict[str, Any]] [] def _is_repeat(self, action_key: str) - bool: return len(self.recent_actions) 2 and self.recent_actions[-2:] [action_key, action_key] def run(self, task: str) - Dict[str, Any]: for step in range(1, self.max_steps 1): decision self.planner.next_action(tasktask, stateself.session.summary()) if decision.get(name) finish: self.trace.append({step: step, action: finish, payload: decision}) return {status: ok, steps: step, answer: decision.get(arguments, {}), trace: self.trace} name decision.get(name, ) args decision.get(arguments, {}) or {} action_key f{name}:{json.dumps(args, sort_keysTrue)} if name not in self.tool_registry: result {status: error, message: f未知工具: {name}} elif self._is_repeat(action_key): result {status: error, message: 檢測到連續(xù)重復調(diào)用請換一個動作} else: try: result self.tool_registry[name](**args) except TypeError as exc: result {status: error, message: f參數(shù)不匹配: {exc}} except Exception as exc: # noqa: BLE001 result {status: error, message: f工具執(zhí)行異常: {exc}} self.recent_actions.append(action_key) self.session.log(step, name, {args: args, result: result}) self.trace.append({step: step, action: name, args: args, result: result}) return {status: timeout, message: f超過最大步數(shù) {self.max_steps}, trace: self.trace}幾個細節(jié)說明。tool_registry里用 lambda 把 session 閉包進去這樣 Planner 只需要關心業(yè)務參數(shù)不需要處理 session。_is_repeat檢測連續(xù)兩次完全相同的調(diào)用這是最常見的卡死場景——模型看不到進展就一直重復同一個動作。TypeError單獨捕獲是因為參數(shù)不匹配在 Agent 場景里極其常見需要給模型明確的錯誤提示讓它自我修正。另外注意返回值里帶了完整trace這個在調(diào)試時非常有用可以看到模型每一步的原始決策。生產(chǎn)環(huán)境里應該把它寫進日志文件而不是直接返回給用戶。4.5 兩個 Planner離線腳本與大模型先寫一個離線的腳本化 Planner用于在不接大模型的情況下驗證整條鏈路。# 文件路徑planners/scripted.py from __future__ import annotations from typing import Any, Dict, List class ScriptedPlanner: 按預設腳本順序返回動作用于離線聯(lián)調(diào)和回歸測試。 def __init__(self, script: List[Dict[str, Any]]): self.script list(script) self.cursor 0 def next_action(self, task: str, state: Dict[str, Any]) - Dict[str, Any]: if self.cursor len(self.script): return {name: finish, arguments: {summary: 腳本執(zhí)行完畢}} action self.script[self.cursor] self.cursor 1 return action對應的入口腳本# 文件路徑main.py from agent.loop import AgentLoop from agent.session import ChemSession from planners.scripted import ScriptedPlanner SCRIPT [ {name: build_bulk, arguments: {symbol: Cu, crystalstructure: fcc, a: 3.6}}, {name: get_state, arguments: {}}, {name: optimize, arguments: {fmax: 0.05, steps: 200}}, {name: get_state, arguments: {}}, {name: save_structure, arguments: {filename: cu_final.xyz}}, {name: finish, arguments: {summary: Cu 結構優(yōu)化完成}}, ] def main() - None: session ChemSession(workdirruns) loop AgentLoop(session, ScriptedPlanner(SCRIPT)) result loop.run(task優(yōu)化 fcc Cu 的晶格常數(shù)) for item in result.get(trace, []): print(item) if __name__ __main__: main()運行之后預期能看到這樣一串輸出先構建出含 4 個原子的 fcc 銅晶胞cubicTrue會生成常規(guī)立方胞然后優(yōu)化幾步能量大約在 -0.02 eV/atom 量級EMT 的絕對值本身沒有物理意義只看相對變化最后在當前目錄下生成runs/cu_final.xyz。如果要在真實場景里換成大模型Planner 需要實現(xiàn)同樣的next_action接口。核心邏輯是把工具 schema 一起傳給模型然后解析返回的 tool_calls# 文件路徑planners/llm.py from __future__ import annotations import json from typing import Any, Dict, List from agent.schema import TOOL_SCHEMA # 說明以下為調(diào)用思路示例SDK 版本與方法名請以官方文檔為準 class LLMPlanner: def __init__(self, client, model: str, system_prompt: str ): self.client client self.model model self.messages: List[Dict[str, Any]] [] self.system_prompt system_prompt or ( 你是一個計算材料學助手。你只能通過提供的工具操作結構 不要憑空給出數(shù)值結果。每次只調(diào)用一個工具。 ) def next_action(self, task: str, state: Dict[str, Any]) - Dict[str, Any]: if not self.messages: self.messages.append({role: system, content: self.system_prompt}) self.messages.append( { role: user, content: f任務{(diào)task}\n當前狀態(tài){json.dumps(state, ensure_asciiFalse)}, } ) response self.client.chat.completions.create( modelself.model, messagesself.messages, toolsTOOL_SCHEMA, tool_choiceauto, ) message response.choices[0].message self.messages.append(message.model_dump() if hasattr(message, model_dump) else message) if not getattr(message, tool_calls, None): return {name: finish, arguments: {summary: message.content}} call message.tool_calls[0] try: arguments json.loads(call.function.arguments or {}) except json.JSONDecodeError: arguments {} return {name: call.function.name, arguments: arguments} def observe(self, result: Dict[str, Any]) - None: 把工具結果回填到消息歷史供下一輪決策使用。 self.messages.append( {role: tool, content: json.dumps(result, ensure_asciiFalse)} )這里要提醒一句不同版本 SDK 的工具調(diào)用回填格式不完全一樣tool消息通常需要帶tool_call_id。實際接入時請對照官方文檔調(diào)整不要直接照抄。這也是本文故意把 Planner 抽成接口的原因——換個模型或者換個 SDK只需要改這一個文件。4.6 加入校驗層前面說的校驗層現(xiàn)在補上。它的作用是攔截那些看起來能跑但結果沒意義的情況。# 文件路徑agent/validators.py from __future__ import annotations import math from typing import Any, Dict from ase import Atoms def check_structure(atoms: Atoms, min_distance: float 0.5) - Dict[str, Any]: 檢查結構的基本合理性返回校驗結論。 issues [] if len(atoms) 0: issues.append(結構中沒有原子) cell_lengths atoms.cell.lengths() if any(x 0 for x in cell_lengths): issues.append(f晶胞長度異常: {cell_lengths}) distances atoms.get_all_distances(micTrue) for i in range(len(atoms)): for j in range(i 1, len(atoms)): if distances[i][j] min_distance: issues.append( f原子 {i} 與 {j} 距離 {distances[i][j]:.3f} ? 過近疑似建模錯誤 ) return {ok: not issues, issues: issues} def check_energy(energy: float) - Dict[str, Any]: 檢查能量是否為有限值。 if energy is None: return {ok: False, issues: [能量為空]} if not math.isfinite(energy): return {ok: False, issues: [f能量不是有限值: {energy}]} return {ok: True, issues: []}get_all_distances(micTrue)里的mic表示使用最小鏡像約定對周期性體系這是必要的否則會誤判跨邊界的原子距離。這個檢查在擴胞、切表面之后特別有用能抓出很多建模錯誤。把校驗接進優(yōu)化流程可以在optimize工具里返回值加一個validation字段也可以在循環(huán)層統(tǒng)一做。實踐上更推薦在工具內(nèi)部做因為工具知道自己的語義。5. 從演示走向生產(chǎn)擴展方向5.1 接入第一性原理計算與機器學習勢演示用的是 EMT速度極快但沒有精度。真實場景里通常要換成第一性原理計算器或機器學習勢。ASE 的好處是接口統(tǒng)一只要計算器實現(xiàn)了get_potential_energy和get_forces上層代碼基本不用改。下面是一個示意寫法展示如何把計算器做成可配置的# 文件路徑agent/calculators.py from __future__ import annotations from ase.calculators.emt import EMT def make_calculator(name: str emt, **kwargs): 根據(jù)名稱返回計算器實例。真實項目里在這里分支到 VASP、CP2K 或機器學習勢。 name (name or emt).lower() if name emt: return EMT() # 其他計算器請按實際安裝情況補充例如 # if name mace: # from mace.calculators import mace_mp # return mace_mp(modelkwargs.get(model, medium)) raise ValueError(f不支持的計算器: {name})這里的關鍵設計是把計算器選擇也變成一個參數(shù)讓 Agent 可以在成本和質(zhì)量之間做權衡。比如粗篩階段用機器學習勢最后精修用第一性原理。這種分階段策略在真實項目里非常常見因為它能把計算成本降下來一大截。需要提醒的是真正的第一性原理計算動輒幾十分鐘到幾小時Agent 的循環(huán)必須支持異步——不能讓整個進程阻塞等待。實踐做法是把任務提交到作業(yè)調(diào)度系統(tǒng)工具返回一個作業(yè) ID然后另設一個查詢工具輪詢狀態(tài)。這樣 Agent 的循環(huán)節(jié)奏和計算任務的生命周期就解耦了。5.2 批量任務與結果匯總單個結構的優(yōu)化只是起點。真實場景往往是幾十上百個結構這時候 Agent 的角色就變成了調(diào)度員決定先跑哪些、哪些失敗需要重試、哪些結果異常需要人工復核。批量場景下最重要的工程點是冪等性和緩存。每個結構用內(nèi)容哈希做 key算過的直接讀緩存不要重復算。這一步能省掉大量算力也能讓整個流程可以斷點續(xù)跑。結果匯總建議輸出結構化格式JSON 或 CSV字段固定不要用自然語言描述結果。自然語言適合給模型讀不適合給人做后續(xù)分析。5.3 讓 Agent 輸出可復現(xiàn)的記錄一個容易被忽略的要求Agent 的每一次運行都應該產(chǎn)出一份可復現(xiàn)的記錄包括任務描述、模型版本、工具調(diào)用序列、每個工具的輸入輸出、最終結果。這份記錄的價值在于當結果出現(xiàn)爭議時你可以一層層回溯到底是哪一步出了問題。實踐上可以把前面循環(huán)里的trace直接序列化成 JSON 落盤文件名帶上時間戳。如果接了真實模型建議把模型的原始響應也存下來方便排查是模型的問題還是解析的問題。6. 常見問題與排查清單6.1 高頻問題對照表問題現(xiàn)象常見原因解決思路報錯說某元素沒有對應的 EMT 參數(shù)EMT 計算器只支持部分元素換用支持該元素的計算器或在工具層做元素白名單校驗并提前返回明確錯誤優(yōu)化跑完converged為 False初始結構離平衡位置太遠、步數(shù)不夠、判據(jù)過嚴先放寬 fmax 到 0.1 粗優(yōu)化再收緊到 0.02 精優(yōu)化或調(diào)整初始晶格常數(shù)能量出現(xiàn)nan或極大正值原子重疊、晶胞退化、計算器參數(shù)缺失用check_structure檢查最小原子間距確認晶胞長度為正模型反復調(diào)用同一個工具工具返回值沒有提供新信息模型無法判斷進展檢查工具返回是否包含關鍵數(shù)值在主循環(huán)加重復動作檢測并返回提示工具調(diào)用報參數(shù)不匹配模型傳了多余參數(shù)或類型不對在循環(huán)里捕獲TypeError把錯誤信息回填給模型同時精簡 schema 的 required 字段優(yōu)化后晶格常數(shù)幾乎沒變用了固定晶胞的自由度設置只優(yōu)化了原子位置明確是否需要優(yōu)化晶胞ASE 中 BFGS 默認會優(yōu)化所有自由度但需確認Atoms是否帶正確的 pbc結果每次跑都不完全一樣初始結構不同、優(yōu)化器隨機性、并行歸約順序固定初始結構來源、固定優(yōu)化器參數(shù)、記錄完整輸入保存文件時報路徑錯誤文件名包含路徑分隔符或非法字符在工具層做文件名白名單校驗只允許字母數(shù)字下劃線和點6.2 建議的排查順序遇到 Agent 跑飛的情況建議按這個順序查先看 trace 里最后一個成功的工具調(diào)用是什么確認狀態(tài)是否合法再看模型給出的參數(shù)是否在合理范圍然后單獨把那個工具函數(shù)拎出來脫離 Agent 手動調(diào)用一次確認計算本身沒問題最后才懷疑模型。這個順序能幫你快速區(qū)分計算問題和調(diào)度問題避免在錯誤的方向上浪費時間。一個很實用的技巧是準備一組固定的回歸用例幾個典型結構、幾組典型參數(shù)每次改動 Agent 邏輯后跑一遍確認結果沒變。Agent 系統(tǒng)的不確定性很強沒有回歸測試的話改一行代碼可能帶來完全意想不到的行為變化。7. 最佳實踐與工程建議7.1 工具粒度的把握工具粒度是設計 Agent 時最需要反復調(diào)整的地方。太粗模型沒有調(diào)度空間Agent 退化成一個固定腳本太細模型要在瑣碎操作上消耗大量 token 和步數(shù)。一個經(jīng)驗法則是一個工具對應一個物理上有意義的操作。構建結構、優(yōu)化結構、計算單點能、保存結構這些都是有明確物理含義的原子操作。而把第 3 個原子的 x 坐標加 0.1這種就不適合做成工具因為它不對應任何有意義的研究動作。另一個法則是如果一個操作幾乎總是跟著另一個操作出現(xiàn)考慮把它們合并。比如優(yōu)化并返回能量就比優(yōu)化和讀能量兩個工具更實用因為分開調(diào)用只會增加步數(shù)。7.2 安全邊界與資源控制涉及真實計算資源的場景安全邊界必須提前設計。至少要有這幾層文件寫入限制在指定目錄內(nèi)計算任務有超時和資源上限單次會話的總計算量有配額危險操作比如刪除文件、提交大規(guī)模作業(yè)需要顯式確認。不要指望模型自己遵守這些規(guī)則。模型的輸出是不可信的輸入所有約束必須在代碼層強制實施。這和 Web 開發(fā)里永遠不要信任前端傳參是同一個道理。7.3 可復現(xiàn)性與版本記錄計算科學最講究可復現(xiàn)。引入 Agent 之后可復現(xiàn)性面臨新的挑戰(zhàn)同一個任務模型可能給出不同的操作序列。應對辦法有兩個方向一是把所有輸入任務描述、模型版本、溫度參數(shù)、工具 schema 版本都記錄下來二是關鍵流程提供固化能力也就是把一次成功的 Agent 運行固化成腳本后續(xù)直接跑腳本。第二個方向在實際項目中價值很高。Agent 負責探索一旦找到可行路徑就固化成確定性流程既保留了靈活性又保證了穩(wěn)定性。7.4 日志與可觀測性建議給每次會話分配一個唯一 ID所有日志帶上這個 ID。日志內(nèi)容至少包括每步的動作名、參數(shù)、返回結果摘要、耗時。有了這些出問題時可以像查分布式系統(tǒng)調(diào)用鏈一樣回溯。另外建議對工具調(diào)用做耗時統(tǒng)計。如果某個工具平均耗時特別長說明它可能被調(diào)用得過于頻繁或者內(nèi)部有優(yōu)化空間。這類數(shù)據(jù)驅(qū)動的優(yōu)化比憑感覺調(diào)整有效得多。7.5 成本控制如果接的是商用大模型 APItoken 成本需要關注。控制手段主要有三個精簡 schema只保留必要工具和參數(shù)、精簡狀態(tài)摘要不要傳完整結構、限制歷史長度只保留最近若干輪對話。一個容易忽略的點是工具返回值的長度。如果工具返回了完整的坐標數(shù)組或者幾千行的輸出文件token 會瞬間爆掉。所有工具返回值都應該做摘要化處理只保留決策需要的數(shù)值。8. 學習路線與后續(xù)方向如果想把這條路走下去建議分三個階段推進。第一階段是把本文的演示跑通并且改造它。換幾個不同的元素和晶體結構故意傳入錯誤參數(shù)看系統(tǒng)怎么反應故意讓優(yōu)化不收斂看 Agent 能否自行調(diào)整。這個階段的目的是建立對整個鏈路的直覺。第二階段是接入真實計算。選一個你熟悉的小體系用你平時用的計算軟件跑一遍然后把同樣的流程用 Agent 封裝。這個階段會暴露大量工程細節(jié)問題作業(yè)提交、狀態(tài)輪詢、輸出解析、錯誤恢復。把這些問題解決掉系統(tǒng)才算真正可用。第三階段是做對比評估。用同一批任務分別用人工流程和 Agent 流程跑對比耗時、成本、結果一致性。只有在數(shù)據(jù)上站得住腳才值得推廣。需要提前提醒的風險有幾個。一是不要把 Agent 的輸出當成最終結論所有數(shù)值結果都必須經(jīng)過獨立校驗二是不要在未經(jīng)驗證的情況下讓它操作生產(chǎn)計算資源三是注意數(shù)據(jù)的合規(guī)性涉及未公開材料的計算數(shù)據(jù)不要隨意傳給外部服務。最后想說Agent 在計算材料學里的定位短期內(nèi)更像是熟練的科研助理而不是獨立研究者。它能把重復勞動接過去能幫你把流程標準化能減少低級錯誤但科學判斷的部分仍然需要人來把關。把這個定位想清楚落地的時候就不會有太多不切實際的期待也更容易做出真正有用的東西。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
桃色成人网| 狠狠干青青草| 婷婷五月天影院| 乱抡小BB| 丁香五月香蕉| 九九色video| 婷婷五月天伊人网| 五月激情开心婷婷| 久热大香蕉| 天天操夜夜操| 婷婷成人综合| 五月婷婷六月婷| 婷婷色在线播放| 激情五月婷婷五月| 五月天婷婷丁香基地在线观看| 96精品久久久久久久久| 婷色综合| 久操欧美在线观看97| 婷婷夜夜操| 色吊丝永久访问网址| 久9热视频| 亚洲综合在线伊人婷| 亚洲黄网在线| 九月丁香网婷婷| 9l视频自拍9l视频自拍九色学生| 天天色综合网吨吧| 丁香婷婷六月激情| 色色色综合视频| 久久码久久无清| 玖玖资源在线视频| 成人网站免费在线播放| 久久久久久人妻| 99色看这里只有精品| 丁香玖玖| 亚洲人人操| 午夜69成人做爰视频| 91超级碰在线视频| 4399人妻无码久久久| 噜噜噜精品欧美成人在线观看| xx久久| 国产精品第一国产精品| 国产成人片| 婷婷刺激综合| 91色涩| 婷激情五月| 五月天激日本色情在线| 538午夜激情| 青青草婷婷久久| 99热久久这里只有精品| 婷婷中文字幕| 五月天色综合| 最近免费中文字幕大全高清大全1| 51XX午夜影福利| 综合色播| 久久久WWW| 天天爽夜夜爽夜爽精品| 激情网综合| 5月婷婷性视频| 激情综合4月| 五月综合丁香婷婷| 日夜操B| www.五月丁香| 色婷婷手机在线| 97影院一级片| 五月丁香在线视频观看| 我爱婷婷五月天综合88| 亚洲天天综合| 天天操婷婷| 激情 婷婷| 蜜桃人妻无码AV天堂三区| 色99欧洲色19| www.久久久久久久| 久99热| 99色婷婷| 天天久久九九| 五月婷婷色综图片| 五月丁香婷婷在线综合蜜桃| 亚洲精品色色色| 99re26视频| 五月丁香六月婷婷婷婷| 99无码视频| 桃色五月天| 青青草五月天| 日日杆天天| 午夜五月天| 久热只有精品| 伊人激情网| 秋霞av不能| 欧美图片丁香五月天| 日本一级一片免费视频| 美女天天艹人人爽| 人人草人| 91精品久久久久久77777| www.夜夜操| 国产精品久久久爽爽爽麻豆色哟哟| 综合色图婷婷| 另类天堂| 天天干天天日天天操| 日韩色色视频| 精品国产乱码久久久久夜深人妻 | 五月天啪啪视频| 色五月激情网| http://www.sd-xiangsu.com/| 狠狠五月天激情| 五月天激情久久| 九九色影视| 九月丁香| 国产综合色婷婷精品久久| 深爱丁香网| 五月丁香黄色| 99热这里全都是精品| 色五月激情五月| WWW色色色COM| 五月婷婷亚洲综合网| 婷婷五月伦理| 日韩1区2区| 五月天丁香婷婷久久九| 精品久久婷婷五月天| 日韩精品无码99| 五月天综合| 五月综合久久| 婷婷中文字幕| 国产免费AV在线| 亚洲日韩乱码一区二区三区四区| 粉嫩av懂色av蜜臀av熟妇| 狠狠狠人妻| 亚洲精品在线视频| 亚洲成人av在线观看| 伊人久久五月天| 影音先锋人妻出差| 少妇做爰免费视看片| 丁香婷婷久久综合在线| 婷婷五月天婷婷| 婷婷九月色| 狠狠色噜噜狠狠狠狠狠色综合久久| 黄色五月婷婷| 亲子乱AV一区二区三区下载| 91|九色|动漫| 思思热视频| 99国产精品久久久久久久久久久| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 久久五月综合| 日日夜夜狠狠婷婷色| 99精品大片| 青青久在线视频免费观看| 狠狠色噜噜狠狠狠狠综合| 色天天综合成人网| www.夜夜| 六月欧美综合色情| 开心五月激情网| 成人五月天丁香| 久久人妻www| 天天天天操| 日韩成人精品中文字幕| 丰满人妻一区二区三区| 精品九九在线观看视频| 99热18| 99爽视频| 婷婷色六月| www.99精品在线| 婷婷草| 中文字幕婷婷9月天| 99热20| 日日操夜夜撸| 在线综合婷婷| 日美三级| 丁香六月婷婷色播| 先锋五月婷婷丁香草草| 99热精品无码| 婷婷性爱无码视频| 丁香花五月天社区| 五月婷婷六月丁香玖玖玫瑰91| 五月丁香婷婷激情爱爱| 九九无码| 五月天亚洲图片婷婷| 亚洲性视频| 99视频在线观看视频| 激情综合五月婷婷六月丁香| 国产无人区大片| 色婷婷色99国产综合精品| 成人色图情色成人网 www.5b5b5bcom 五月天 | 五月天婷婷伊人| 99久久玖玖| 国产亚洲成AV人片在线| 大香蕉五月丁香| 猫咪伊人久久| 性av| 色停停五月,在线观看| 婷婷中文字幕网| 91丁香五月| 色综合久久久久| 色色婷婷五月天| 婷婷五月天av网| 欧洲色区| 久久免费操| 久久婷五月婷| 99热99热| 激情综合婷婷| 婷婷色色亚洲| 一本久久亚洲五月婷婷| 天天爽天天日人人爱| 26uu| 天天干天天干天天| 夜夜嗨一区二区三区直播内容| 亚洲成人高清在线| 激情综合女人网五月播播| 久久婷综合| 亚洲五月婷婷| 久热这里只有精品视频免费观看| 婷婷五月亚洲综合| 9|人妻人人操| 丁香综合网| 丁香亭亭久久| 99内射视频| 五月婷婷,六月丁香| 日本在线免费中文com.| 一区二区乱视频码| 在线不卡视频| 99热99精品| 天天色综合色色色色色。| 99热免费18| 亚洲网视屏| 色婷婷网| 啪啪五月综合| 97超碰,人人舔,人人操,人人摸 | 狠狠色婷| 婷婷五月色| 欧美婷婷五月天| 啪啪综合网| 天天综合天综合久久网| 国产这里只有精品| www.五月婷婷| 亚洲激情五月| 色五月色综合| 亚洲久久视频| 综合狠狠伊人| 国产9色在线/日韩| 天堂久久性| 九色综合网| 五月亭亭直播| 大香蕉av在线| 国产在线中文字幕| 荷兰av一级| 色久免费| 九热视频这里只有精品| 激情伊人六| 51XX午夜影福利| 五月婷色丁香| 99热一本| 97碰成超视频免费视频| 亚洲成人无码片| 亚洲第一成人无码A片| 九九热黄色| 26uuu| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 婷婷99狠狠躁| 婷婷丁香五月综合网上| 色婷婷成人| 99色热综合| 情婷婷五月天在线| 久久ER视频com| 99热思思久| 超碰九色| 九九视频这里是精品五月| 99热这里都是精品| www99热| 大香蕉99| 欧美色五月| 久久网日本| 久久久27操| 日本色色网站| 亚洲av日韩无码| 六月婷欧美| 日韩精品超碰在线观看| 久操热| 免费黄色片子| 91精品电影18T| 第2色五月婷| 欧美婷婷六月丁香综合色| 99久久久免费| 久久伊人日日夜夜| 深爱激情网综合| 狠狠干五月丁香综合网| 五月婷婷影院| 99操碰| 亚洲人人操| 五月天精品| 高清无码网址| 996re热精品视频| 丁香五月 激情文学| 天堂网亚洲色图| 99热www| 第四色网婷婷| 久热这里这里有精品| 色婷婷视频| 狠狠操在线视频| 婷婷激情五月天亚洲综合| 色综合日日| 激情五月婷婷综合| www.色婷婷.com| 色婷婷成人做爰A片免费看网站 | www.99精品在线| 操操国产| 婷婷亚洲色| 日本狠狠色| 婷婷香五月天| 玖玖伊人网| 91精品久久久久久久久久久久| 综合伊人久久| 去干网最新版本亚洲版| 激情视频综合| 婷婷五月在线影院| 激情文学久久| 天天色色天天| 色99色| 天天综合网色欲香| 樱花99视频| 思思久久青草热| 亚洲在线资源| 91n啪啪| 色V狠狠的干| 五月亭亭激情综合| 91热久久| www.com色播五月天| 91超级碰| 99热这里只有精品4| 婷婷五月激情小说| 激情久久丁香| 五月婷婷激清网| 狠狠综合久久| 亚洲有码在线视频| 。久久久久久久久久久久久久人妻 | 777久久久| 99惹| 色婷婷影院| 丁香五月 性爱| 国产色色在线| 99亚洲天堂| 久久小说网| 99手机在线精品视频| 狠狠色狠狠鲁| 日日夜夜天天| 天天日日夜夜爽| 婷婷丁香五月天激情| 亚洲综合在线视频| 五月天激情国产综合婷婷婷就去爱| 婷激情五月| 丁香六月婷婷| 色综合天堂| 天天干夜夜b| www.yw尤物| 性爱五月婷婷| 久久一热| 五月丁香趴趴| 无套内射极品大美女| 国产精品第一国产精品| 五月激情婷婷开心五月| 五月婷婷激情| 色狠狠999综合网| 在线成人网址| 久久HD| 伊人五月综合网| 色色综合热| 国产精品久久久丁香五月八戒视频| 99热在这里只有精品| 九月丁香八月婷婷久久综合久97| 色五月婷婷丁香五月| 日韩黄色中文字幕| 激情五月婷在线精品| 亚洲精品又粗又大又爽A片| 丁香花色色网| 色色色网站| 色色色综合网| 91欧美| site:hcxsz888.com| 丁香六月啪| 98色花堂98t.R| 天天天干夜夜夜操| 日韩精品超碰在线观看| Av大香蕉| 婷婷丁香高潮了| 欧美精品99久久久| 狠狠干伊人| av在线播放网站| 午夜不卡成人一区二区| 婷婷五月日本| av在线激情| 综合激情在线| 青草视频在线观看视频| 亚洲激情免费视频| 色五月婷婷影院| 中美日韩成人在线| 久草久青福利| 99热在线播放精品| 色五月色五天色情网| 99九九99九九九视频精彩| 成人在线不卡| 激情久久天天| 九色无码| 婷色五月天| 五月丁香六月婷婷手机无线| 懂色av蜜臀av粉嫩av永陈冠希| 99狠狠| 99在线精品观看99| 99热 精品在线| 综合激情五月天六月婷免费视频| 久碰久操| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 日韩成人精品中文字幕| SS丁香五月婷婷| 激情久久综合网| 99九色视频在线观看| 五月激情丁香久久综合网| Aaa久久| 人人色婷婷| 久久停停超碰| 五月丁香久久激情综合| 99精品在线| 99综合99| 五月丁香综合啪啪| 丁香婷婷激情四射五月| 久久丁香五月婷婷| 五月婷视频在线| 久久精品爱爱| 天天操五月天| 狠狠婷婷色综合| 大香蕉久久久久| 79成人网| 色婷五月天| 爱iii做iiii日| 9热精品| 六月婷婷无码观看| 97九色| 麻豆AV一区二区三区| 五月天综合| 天堂五月婷婷| 日韩色色色99| 九月婷婷久久久| 亚洲av综合在线| 99视频内射三四| 深爱激情婷| 五月天综合缴情网网站0| 超碰伊人碰婷婷五月| 能看的AV| 色色婷婷五月天| 五月网在线| 亭亭丁香aV| www热久久yy9| 色99www.| 五月婷av| 九月性爱网| 女人高潮内射99精品| 影音先锋一区| 日本婷婷五月天| 天堂草在线观| 亚洲中文乱字字幕线在永久| 欧美日韩大黄| 99热久只有| 在线中文av| 婷婷六月色情| 激情婷婷综合网| 新激情婷婷| 婷婷五月天av| 六月丁香啪啪| 精品夜夜澡人妻无码AV| 久久九色| 丁香五月综合| 男妓跪趴把舌头伸进我的嘴巴| 亚洲欧洲另类| 色99在线视频| 丁香六月激情综合| 99国产精品久久久久久久久久久| 99激情视频| 黄色成人网站在线播放| 色婷婷成人网| 婷婷婷婷婷婷婷五月丁香| 丁香婷婷色九月| 五月天婷婷激情| 这里只有精品视频在线| 99热免费精品| 大香蕉五月天婷婷| 26uuu国产| 婷婷伊人綜合中文字幕| 超碰成人公开| 青青久久91| 亚洲国产成人AV在线| 中文AV网站| 精品国婬伦V无码久久久| 久9草在线观看视频| 午夜丁香久久久久久| 婷婷在线日韩综合| 亚州婷婷五月激情综合| 变态另类9| 91热爆在线| 丁香五月婷婷深爱综合激情| 天天综合天天玩夜夜玩天天玩夜夜玩| 久99热| 99热这里只有精品4| 婷婷综合一二三| www婷婷| 五月丁香六月欧美综合网站| 性做爰A片免费视频A片直播| 丁香五月综合激情久久潮喷| 99日在线视频| 综合亚洲六月婷婷在线| 六月丁香综合网| 99免费视频网| 欧美色色色色色色| 超碰精品在线| 久热精彩视频98| 五月天婷婷社区久久综合| 99乱视频| 丁香综合伊人AV| 天天天综合网| 天天干天天干天天干| 亚洲狠狠爱婷婷| 视频1区2区| 激情五月天久久丁香| 丁香五月天精品| 天天爽,夜夜爽| 丁香婷婷网| 国产一级片色色| 久久激情五月网| 樱花99视频| 99re鈥哸鈥唙| 婷婷五月天影院| 伊人青涩网| 五月色网| 天天爽天天摸天天爱| 人人爱国产| 九久久九精品视频| 丁香五月性| 天天免费日日夜夜夜夜| 婷婷五月天小说| 热99视频精品在线| 日本精品在线噜噜噜| 人人舔人人| 99热精品中文字幕| www.久9| 开心婷婷五月天电影院| 91色吧网| 韩国97天堂| 九九热色视频| 激情 婷婷| 免费91久久精品| 另类视频在线| 永久免费视频| 五月婷九九草| 2w在线视频| 五月激情六月宗合| 六月婷久久| 婷婷五月天激情五月天| 婷婷亚洲色| 色婷婷综合综合网| 天天日日爽| 免费看欧美成人A片无码| 六月久久婷婷| 欧美激情VA永久在线播放| 亚洲亚洲人成综合网络| 五月丁香美女| 国产67194| www.久久久久久久久久久| 在线A色| 99热久久这里只有精品| 99re思思| 婷婷91| 婷婷综合五月| AV中文在线| 4399在线观看免费高清黄色视频| 色色亚洲五月天| 婷婷激情久久| 婷婷五月色综合| 亚洲视频在线观看| 五月天堂婷婷| 青草青草视频2免费观看| 九九色影院| 久久性操| 91精品久久久久久久| 五月丁香六月婷婷激情网| 超碰妻人人| 玖操97| 99视频在线观看地址| 婷婷丁香六月影视| 激情文学综合婷婷五月天丁香花| www.狠狠干| a在线观看| 久热这里这里有精品| 亚洲九区| 草AV9999| 色综合久久88色综合天天| 99riAv1国产在线观看| 丁香婷婷六月| 九九色中文| av九九| 99小精品| 婷婷无五月无码视频| 操逼棍操逼| 七月丁香五月婷婷在线| 亚艹艹| 久久九九九九| 久久停停超碰| 激情无码五月天| 色色五月天激情| 伊人丁香婷婷东京| 久99精品视频| 91日本在线观看| 激情五月丁香婷婷夜夜操| 激情深爱五月天| 五月婷婷婷婷婷婷艺术| 色吊丝av中文字幕| 丁香五月电影| 久久在线人妻| 日韩成人无码片| 99热亚洲| 激情久久五月网| 婷婷基地成人五月天| 九九久久99精品免费观看www| 九九AV| 欧美色片中文字幕久久久久| 日本丁香五月| 日韩 欧美 国产 一区 二区| 91热在线观看视频| 婷婷五月色情天| 日日干日日s| 大香伊人婷婷影院| 六月激情综合| 天天干天天干天天干天天干天| 丁香五月激情网| 免费精品99| 久久综合人妻| 激情婷婷五六月天| 2022人人操人人看| 午夜精品人妻无码一区二区三区| 天天干,夜夜爽| 婷久看人爽| 九九热婷婷| 亚洲无码色| 五月丁香六月婷婷激情视频在线观看免费 | 另类天堂| 丁香五月天堂网AV| 成人视频网| 五月丁香综合中文| 丁香六月亚洲综合| 9九热视频| 久久九九re热| 中文字幕1区2区。| 天天插综合| 婷婷天天色| 99色丁香婷婷综合网| 日本一毛片| 最新国产AV| 色999;丁香五月| 久久久久久人妻| 都市激情五月婷婷综合| 99热偷拍| 色五月婷婷操逼| 激情五月婷婷色综合| 99爱视频在线观看| 99热久草| 天天色天天| 噜噜噜精品欧美成人在线观看| 99五月丁香丁| 五月丁香琪琪| 久9精品视频| 九九九AAA热视频| 久久精品一区二区三区四区| 五月天综合| 久操激情| 九色无码| 人人摸人人干| 五月丁香六月婷婷啪啪| 99看片| 欧美爆乳一区二区三区| 99色看| 人人舔人人色人人高潮| 婷婷综合网| xx久久| 日韩精品一品二区三区的使用体验| 九九热这里只有精品9| 国产亚洲成AV人片在线观黄桃| 五月天开心激情综合网| 深爱激情五月网| 婷婷综合激情| 青草激情综合| 9色视频在线| 99热国产精品| 色婷婷丁香五月天| 看片视频在线免费日产在线看| 99综合在线| 五月婷婷色影院| 久久伦乱| 99热欧美| 丝袜大香蕉| 婷婷五月天激情网| 另类小说五月天| 午夜天堂一区人妻| 丁香六月婷婷基地| 99热色综合| 日本欧特黄色刺激一区影视久精品无码| 丁香五月天社区婷婷| 日韩操啪| 日韩高清成人| 中海油常州环保涂料有限公司| 五月激情五月丁香| 好吊丝aV| AV五月婷婷露脸| 丁香六月婷婷| 五月婷婷色色| 日本熟妇乱妇熟色A片蜜桃| 久久五月天激情| 亚洲国产另类av| 激情綜合網址| 台湾综合丁香五月蜜桃| 亚洲色五月天是什么| 久久婷婷一级片| 伊人婷婷五月天| 在线99热| 伊人婷婷福利网| 激情国产综合| 99国产小视频2013| 伊人久久五月天| 五月婷天天搞视频| 久久婷婷伊人| 国产婷伊人| 中文字幕av网站| www久久艹| 久久99激情| 日日夜夜狠狠操| 久热婷婷| 色婷婷在线视频观看| 丁香五月六月综合激情| 丁香五月婷婷88在线| 天天精品视频免费观看| 亚洲综合激情五月久久| 熟妇天天综合| 噜噜色天天开心| 天天干天天干天天干天天干天天干天天| 99热精品在线播放| 色婷网| 久热AⅤ| 五月婷婷色播视频| 99热这里只有精品青草| 秋霞免费视频| 成人网在线视频| 五月丁香网站在线播放| www.婷婷五月天| 亚洲成人影视在线| 亚洲色综合| 色婷婷小说| 久久99综合| 九九综舍久久| 国产精品婷婷午夜在线观看| 亚洲精品成人| 久久一级免费黄色片| 99在线观看免费精品视频| 亚洲人成色A777777在线观看| 日本欧美成人片AAAA| 五月婷婷六月丁香玖玖玫瑰91| 婷婷五月天激情综合婷婷五月天激情综合| www.婷婷| 97丁香视频| 伦99热| 五月婷婷香| 91chinese 在线| 激情五月婷婷中文字幕| 色吧综合网| VA色婷婷| 久久98热re| 五月丁香综合久久夜夜| 亚洲日韩26uuu| 五月天桃色深爱网| 91人人澡人人爽人人看| 激情综合激情综合| 97se在线视频| 精品99只有。| 96自拍视频九色在线观看| 99热思思久| 殴美日比视频| www99久久| 婷婷久久五月天| 玖久久网站| 婷婷久久六月费| 极品少妇高潮啪啪AV无码| 俺来也综合网精品一区| 综合色图区| 天天草天天爱| 99人妻碰碰久久久禁片| 五月丁香六月花| 日韩久久日| 亚洲精品国产精品乱码视99| 夜夜AVV| 综合性爱网| 26uuu偷拍亚洲欧洲综合| 九九婷婷网五月天| www.com.色色| 性爱久久| 狠狠第四色| 天天噜日日噜综合无码| 伊人久久五月天| 九九碰九九爱97超碰| 色五月婷婷色| 欧美黄色AA片哗啦啦啦| 五月天婷婷黄色视频| 婷婷五月天基地| 国产成人AV人人爽人人澡Va| 丰满少妇猛烈A片免费看观看| 日本人妻丁香婷婷久久寝取熟女五月| 国产毛片精品一区二区色欲黄A片| 涩综合在线| 天天综合久久| 亚洲妇女熟BBW| 亚洲六月婷| 人操91在线| 天天日天天舔| 五月婷婷性爱| 天天色情站| 激情网综合| 五月天婷婷丁香花| 免费AV播放| 蜜臀A∨在线水帘洞| 国产精品第一国产精品| 丁香五月婷婷在线视频| 五月天停停日日| 九九综合久久| 99综合婷婷五月| 91碰碰视频在线观看| 六月丁香网| 丁香婷婷久久| 天海翼中文字幕高| 国产va视频| 日本99视频| 日本无码专区| 色婷| 亚州美女| 丁香五月婷婷香| 九九黄色网| 丁香五月婷婷图片综合| 丁香五月综合在线视频| 天堂资源欧日浪女在线播放| 亚洲精品一区中文字幕乱码| 深情五月天| 亚洲欧洲国产精品| 最近免费中文字幕大全高清大全1| 色婷婷丁香五月天在线观看| 五月激情婷婷开心五月| 91婷婷丁香五月| 激情图片亚洲| 五月天激情久久| 亚洲综合激情五月久久| 国产在线6| 在线观看亚洲AV| 色五月综合激情网| 婷婷色综合| 日日操日日撸| 99aese| 激情小说五月天社区丁香 | 色色精品色| 天久久久久| 久综合4| 国产成人网站在线观看| 91婷婷色| 五月激情综合美女久久| 色在线五月天免费| 亚洲sesesese| 国产婷婷综合在线免费视频| 色婷婷五月综合色婷婷| 影音先锋男人女人| 欧美99| 国产色色视频| 久操无码| 国产精品成人AV在线| 色五月丁香婷婷在线观看| 性色99| 777精品成人a v久久| 五月伊人综合| 五月丁香网视频| 任你爽免费视频| 99热在线资源| 538任你爽视频不一样的| 色综啪啪| 亚洲成AV人片在线观看| 国产AV熟妇人震精品一品二区| 色色色热| www.色99| 久久99久久99精品免视看婷婷| 超碰在线人妻| 婷婷综合五月| 九九热99热| 天天天干夜夜夜操| 97色色视频| 色99在线| 福利视频在线播放| 色五月情| 久久91久久精品久久| 五月婷婷六月激情| 色色色色色色综合网| 五月丁香婷婷色啪| 婷婷酒色网| 国产亚洲成人综合| 操操熟女| 99热亚洲精品| 香蕉婷婷| 日日操夜夜操狠狠操| 精品婷婷五月视| 五月婷婷m| 丁香六月无码| 激情欧美丁香五月| 亚洲婷婷久久综合| 丁香五月久久| 五月天综合在线| 精品少妇人妻AV无码专区偷人 | 天天综合网~91综合网| 玖玖无码中文| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 五月丁香婷婷久久| 五月色婷婷综合| 中文成人在线| 91九色 熟| 日本WWW九九九| 99热福利| 天天干夜夜欢| 五月丁香婷婷免费视频| 色婷婷大香蕉| 亚洲精品V天堂中文字幕| 99久久婷婷国产综合精品电影| 久久久九九视频精品18| 五月丁香六月激情综合| 九九爱这里只有精品| 天天日天天操天天干| 久久人妻乱| 激情伊人五月天| 中文字幕成人网站| 久久激情五月网| 99在线er热| 色色 9| 欧美人人操| 少妇水多A片太爽了| 97超级碰碰碰| se色99| 五月丁香在线观看| 色五月激情五月开心五月| 五月天丁香婷婷视频网址| 色婷久| 色播播之激情五月婷婷| 狠狠干在线| 久久9视频| 丁香五月婷婷亚洲激情四射| 五月丁香日本片| 五月天成人小说| www.五月天| 久久99免费视频| 色欲婷婷夜夜| 五月丁香成人小说| 国产婷婷色综合AV蜜臀AV| 久久亚洲天堂| 99热这里只有精品23| 99热免费精品| 在线看AV| 天天天操天天天爰| 激情五月综合网| 日韩成人精品中文字幕电影| 97碰碰视频在线观看| 婷婷五月天另类网站| 日韩无码色色| 色婷婷四色| 激情丰满熟妇五月| 激情五月综合| 1024亚洲| 思思久热6| 久久久网站| 97干在线观看视频| 婷婷五月天开心激情网| 国产精品色色| 91碰碰| 超碰在线94| 99er在线观看| 婷婷五月天网| 欧美 日韩 成人在线| 老司机日日夜夜青草| 日本不卡一区二区三区| 亚洲婷婷视频| 成人av中文字幕| 97婷婷狠狠久久综合9色| 婷婷五月色亚洲| 五月丁香久久| 天天搞夜夜爽夜夜爽| 九九热99免费视频| 久久人五月| 色色色色色色色色综合网| 99精品视频免费观看近期发布| 天天人人综合| 亚洲天天操| 99色综合网| 色色色婷| 色五月天丁香婷婷| 五月天成人综合| 久久全色| 天天狠狠六月婷丁香影院| 97超美国视频在线观看| 影音先锋 婷婷| www.97视频| 天天操夜夜玩!| 国产婷婷色综合AV蜜臀AV | 欧美色骚婷婷五月天| 狠狠爱综合网| 色色色在线播放| 五月丁香六月婷婷中文版| 婷婷99狠狠躁天天躁| 五月天婷婷黄色视频| 伊人激情影院| 五月激情丁香六月狠狠干| 色婷婷丁香| 99精品这里只有免费视频| 欧洲色色| 无码激情精品色婷婷久久久久| 乱精品一区字幕二区| 开心五月激情站| 天天日天天久久青青| 五月丁香伊人网| 玖玖@三月天天丁香婷婷| 五月六月婷婷| 午夜色丁香| 五月天天综合| 欧美一级色| 99re在线观看| 色婷婷五月综合在线| 五月久久综合| 色噜噜五月天| 另类激情五月| 五月天综合在线| 色五月av伊人| 五月婷婷综合天天操| 婷婷五月激情丁香| 综合久久9| 亚洲久热| 国产精品五月天婷婷| 五月婷婷国产| 337p大胆噜噜噜噜噜91Av| 天天日天天狠狠操| 亚洲婷婷性爱| 色婷婷亚洲六月婷婷中文字幕| 天天干天天操天天射 | 91精品丝袜久久久久久久久粉嫩| 激情综合色图| 久久精品色| 超碰九热| 日本一级| 婷婷五月AA五月在线| 日本wwww在线| 337p大胆噜噜噜噜噜91Av| 国产va在线视频| 性爱五月婷| 欧美丁香婷婷五月| 色婷婷五月天小说网| 婷婷天堂视频| 99热| 激情综合激情综合| 五月丁香日本一抹本| 九久九精品| 五月婷婷狠狠干| http://www.lingjunshare.com/| 91久久国产综合久久| 五月丁香五月综合欧美| 色人妻五月| 亚洲啪啪啪啪| 67194线路二在线观看| 久九色| 日日撸日日操| 色婷婷久久久| 久久日婷婷| 99色色网| 一本色道久久综合狠狠躁小说| 天天拍夜夜撸| 激情綜合網址| 亚洲午夜成人av电影网| 色噜噜狠狠色综合成人网| 天天射天天射一道本日本社区 | 丁香花五月天激情| 成人性爱精品视频| 五月天社区| 欧美色色色色色色色色| 五月天激情小说网| 97性视频| 5月婷婷五月天| 久久婷婷丁香五月一二三| 婷婷五月天AV在| 欧美怡红院黄站| 99热婷婷| 99精品视频在线观看| 五月丁香婷中文字幕| 97色在线| 五月天天综合| 婷婷综合在线网| 九九99精品| 色久女| 六月丁香六月婷婷欧美| 91婷婷五月天综合视频| 亚洲成人在线播放| 综合色吧| 丁香五月天社区婷婷| 日日操夜夜擼| 激情综合色| 97人人干人人操| 婷婷刺激综合| 99免费热视频在线| 色噜噜在线| www.狠狠色.com| 激情综合青草| 91综合在线| 天天肏在线观看| 97婷婷狠狠久久综合9色| 国产99久| 狠狠五月婷婷| 最近中文字幕大全免费版在线 | 九月丁香婷婷网| se色婷婷视频| 欧美成人AAA片一区国产精品| 亚洲天堂色色| 天天干夜夜想| 日本一级黄色电影| 五月婷婷丁香综合| 日本啪啪天堂| 97精品欧美91久久久久久久| 精品网站:999WWW| 日本99色| 中文资源在线a| 久久久久亚洲AV成人无码电影| 免费亚洲婷婷五月| 天天色噜| 五月天成人在线播放| 久久婷婷五月综合| 婷婷六月综合基地| 五月丁香花视频| 五月丁香好婷婷A片网| 婷婷午夜精品久久久| 婷婷97碰碰| 99亚洲天堂| AAA久久| 少妇AB又爽又紧无码网站| 国产美女无遮挡裸体毛片A片| 香蕉AV福利精品导航| 精品国产一区二区三区四区阿崩| 激情五月婷婷| 北条麻妃伊人 | 婷婷五月丁香基| 99精彩视频在线观看| 大香蕉人人网| 激情五月婷| 激情综合网五月在线播放| 婷激情五月天视频导航| oumeisesewang| 婷婷涩五月天综合| 深爱激情六月天| 五月天丁香啪啪综合| ady狠狠入| 色播五月综合网| 玖玖无码中文| 激情五月天婷婷久久久久久久久久久| 天天爽—爽| 色丁香五月婷婷在线| 夜夜躁爽日| 五月丁香婷婷基地| 婷婷伊人| 色噜噜狠狠狠狠色综合久欧美| 九色porny在线观看激情四射| 色五月婷婷91| www。狠狠干。com| www.av骚货| 九热免费视频| 九九人人操| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 日韩三及成人AV片| 97干在线| 99精品爱| 色哟哟www| 嫩BBB槡BBBB搡BBBB| 日本波多野结衣视频| 性天堂久久| 国产日批视频| 婷婷五月在线播放| 五月天色影院| 热久久999| 婷婷五月综激情| 五月综合在线婷婷图片| 免费精品99| 被强行糟蹋的女人A片| 少妇婷婷五月天| 综合激情网五月激情| 五月天久久婷婷| www久久99| 五月天激情综合网| 激情综合5月| 五月丁香六月婷婷色日| 天天综合色| 狠狠干在线| 26uuu国产精品| 久久9视频欧美| 久久涩视频| 性爱AV天堂| 五月天综合| 成人无码髙潮喷水A片| 99热99久久| 欧美激情综合色丁香婷婷五月天 | www,com,五月色色| 色 五月俺去也| 91色久| 亚洲国产另类av| 狠狠色官网| 五月丁香婷婷色色| 色婷大香蕉| 深爱五月天婷综合| 婷婷伊人中文字幕| 久久资源综合| 夜夜www| 婷婷丁香色五月| 97婷婷在线视频| 激情综合六月| 久久思思热| 婷香五月| 久久999久久999久久999久久| 午夜不卡久久精品无码免费| 婷婷综合网| 激情丁香九九五月综合网| 丁香av网| 另类小说五月天综合网| 激情五月天视频| 另类A片| 色色色综合网| 丁香五月婷婷影院| 丁香五月丁香伊人| 99国产精品久久久久久久久久久| 亚洲视频五区| 久久99热这里只频精品6学生| 热99视频精品在线| 丁香五月亚洲无码| 91Chinese在线| 九九九这里只有精品| 99在线视频播放| 99九九在线视频| 天天色天天爱天天爱天天爱y| 久久大国产香蕉| 丁香5月啪啪| 极品少妇XXXX精品少妇偷拍| 美女亚洲五月丁香| 天天爱天天做天天操| 婷婷丁香五月综合| 婷婷无码视频| 97在线刺激| 超碰色综合| 国产av基地| 色三级色三级| AV在线免费播放| 91久久| 亚洲精品亚洲人成人网| 九九五月天| 九九色99| 激情五月天婷婷五月天| 97人人操人人干| 深爱激情综合| 都市激情蜜桃婷婷五月天| 久久激情综合| 五月婷婷久久综合| 一级操逼大片| 精品久久66| 99色日本|