各位好,我是MrsJone,今天主要简单说一下如何用deepseek驱动aspen首先,感谢我李姐,太有高智商了,阿里嘎多谢谢你QAQ,我的忍战带土终于拿下了!https://wenxiaoshuo.github.io/AspenWithPython/AI 时代,大模型(LLM)已经能写代码、写周报了,但在我们化工领域,最硬核的Aspen Plus 模拟能不能也让 AI 来帮忙?想象一下这个场景: 你不需要打开 Aspen 的输入框一个个敲数字,只需要对着电脑说:“设计一个甲醇-水精馏塔,进料60度,我要塔顶纯度99%。”
然后,AI 自动思考,提取参数,自动打开 Aspen,填入数据,运行模拟,并把结果甩给你。今天,我们就用国产最强模型 DeepSeek 配合 Python,把这个“科幻”场景变成现实!(别问为啥用DeepSeek,因为它的API便宜!最近没钱了,快过年了省点花)图1 流程图0.需要准备工具
- Python环境,我用的编译器是Pycharm,可以使用Vscode
- 所需要的Python库:json(用于提取数据),openai(用于Deepseek大模型)
- 一个物性方法有NRTL,组分具有甲醇和水的bkp的Aspen文件(只需要物性就行)
图2,3,4 Aspen文件准备04-去deepseek申请API(需要花差不多10块钱),网址:https://platform.deepseek.com/usage图5 DeepSeek申请API图6 创建APIKey(这个代码用于后面的Python)01. 核心原理:AI 做大脑,Python 做双手
大脑 (DeepSeek):负责听懂你的“人话”,把它翻译成计算机能读懂的JSON 格式数据。双手 (Python):负责传递数据,利用 pywin32 库调用 Aspen 的 COM 接口。工具 (Aspen Plus):负责执行严谨的化工计算。02. 第一步:调教 DeepSeek (Prompt Engineering)
DeepSeek 虽然聪明,但如果你直接问它,它可能会给你写一篇小作文。我们需要它输出结构化的数据。我们在代码中加入了System Prompt(系统提示词),给 AI 下了死命令:“你是一个化工模拟专家。请从用户的描述中提取 Aspen 模拟参数。必须且只能返回 JSON 格式。”
import osimport jsonfrom openai import OpenAI1. 配置 API (请填入你的 Key)client = OpenAI( api_key="sk-9ba7b0b7075c45b8aa6919b37ceb91b9", # 或者直接填 "sk-xxxx" base_url="https://api.deepseek.com")def get_full_simulation_specs(user_text): print(f"--- 正在分析工艺需求: {user_text[:20]}... ---") # 定义超详细的 JSON 结构 system_prompt = """ 你是一个化工模拟专家。请从用户的描述中提取 Aspen Plus 模拟所需的全部参数。 用户默认使用 RadFrac 模块,全凝器 (Total Condenser) 和釜式再沸器 (Kettle Reboiler)。 进料压力一定要比塔压高 请返回纯 JSON 格式,必须包含以下字段(字段名为英文,值为提取的数值或字符串): { "feed_stream_name": "string(进料流股名称)", "feed_temp_c": "float(进料温度 C)", "feed_pres_kpa": "float(进料压力 bar)", "flow_methanol_kmol_h": "float(甲醇摩尔流量 kmol/h)", "flow_water_kmol_h": "float(水摩尔流量 kmol/h)", "column_stages": "int(总塔板数)", "feed_stage": "int(进料位置,如果用户未提及,请根据常识估算)", "reflux_ratio": "float(回流比)", "distillate_rate_kmol_h": "float(馏出物流率 kmol/h)", 'col_name':"string(塔顶名字,一般类似与T0101)", "col_top_pres_kpa": "float(塔顶压力 bar)", "col_pres_drop_kpa": "float(全塔压降 bar)", "top_product_name": "string(塔顶产品流股名)", "bottom_product_name": "string(塔底产品流股名)" } 注意:如果用户没有明确某些数值(比如塔压降),请给出一个合理的化工缺省值(例如压降 10kPa)。 """ try: response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_text}, ], stream=False, temperature=0.1, response_format={"type": "json_object"} ) content = response.choices[0].message.content return json.loads(content.replace("json"</span>, <span class="code-snippet__string">""</span>).<span class="code-snippet__title function_ invoke__">replace</span>(<span class="code-snippet__string">"", "").strip()) except Exception as e: print(f"AI 提取出错: {e}") return None
这里简单解释一下,先导入模块,然后定义一个函数,里面promet是提示词,最后会出来一个Json形式的,可以用Python字典来导出if __name__ == "__main__": user_input = input("模拟甲醇和水进料\n--------------------\n")
图7 用户输入这里明显可以看出,会得到一个Json(或者说字典形式)0.对Aspen进行初始化,(选择哪个程序,然后可视化为0)import win32com.client as win32import osaspen = win32.Dispatch('Apwn.Document')aspen.InitFromArchive2(os.path.abspath(r'D:\python pa chong\AI with Aspen\text.bkp'))aspen.Visible = 0 可视化
aspen.Tree.Elements("Data").Elements("Streams").Elements.Add(data["feed_stream_name"])aspen.Tree.Elements("Data").Elements("Streams").Elements.Add(data['top_product_name'])aspen.Tree.Elements("Data").Elements("Streams").Elements.Add(data['bottom_product_name'])
aspen.Tree.Elements("Data").Elements("Blocks").Elements.Add(fr"{data['col_name']}!RadFrac")
aspen.Tree.Elements("Data").Elements("Blocks").Elements(data['col_name']).Elements("Ports").Elements("F(IN)").Elements.Add(data["feed_stream_name"])aspen.Tree.Elements("Data").Elements("Blocks").Elements(data['col_name']).Elements("Ports").Elements("LD(OUT)").Elements.Add(data["top_product_name"])aspen.Tree.Elements("Data").Elements("Blocks").Elements(data['col_name']).Elements("Ports").Elements("B(OUT)").Elements.Add(data["bottom_product_name"])
aspen.Tree.FindNode(fr"\Data\Blocks\{data['col_name']}\Input\CONDENSER").Value = "TOTAL"aspen.Tree.FindNode(fr"\Data\Blocks\{data['col_name']}\Input\BASIS_D").Value = data["distillate_rate_kmol_h"]aspen.Tree.FindNode(fr"\Data\Blocks\{data['col_name']}\Input\BASIS_RR").Value = data["reflux_ratio"]aspen.Tree.FindNode(fr"\Data\Blocks\{data['col_name']}\Input\NSTAGE").Value = data["column_stages"]aspen.Tree.FindNode(fr"\Data\Blocks\{data['col_name']}\Input\FEED_STAGE\{data['feed_stream_name']}").Value = data["feed_stage"]aspen.Tree.FindNode(fr"\Data\Blocks\{data['col_name']}\Input\PRES1").Value = data["col_top_pres_kpa"]
aspen.Tree.FindNode(fr"\Data\Streams\{data['feed_stream_name']}\Input\TEMP\MIXED").Value = data["feed_temp_c"]aspen.Tree.FindNode(fr"\Data\Streams\{data['feed_stream_name']}\Input\PRES\MIXED").Value = data["feed_pres_kpa"]aspen.Tree.FindNode(fr"\Data\Streams\{data['feed_stream_name']}\Input\FLOW\MIXED\CH3OH").Value = data["flow_methanol_kmol_h"]aspen.Tree.FindNode(fr"\Data\Streams\{data['feed_stream_name']}\Input\FLOW\MIXED\H2O").Value = data["flow_water_kmol_h"]
7.输出甲醇在塔顶的质量分率,以及水在塔底的质量分率DIST_CH3OH = aspen.Tree.FindNode(fr"\Data\Streams\{data['top_product_name']}\Output\MASSFRAC\MIXED\CH3OH").ValueDIST_H2O = aspen.Tree.FindNode(fr"\Data\Streams\{data['top_product_name']}\Output\MASSFRAC\MIXED\H2O").ValueBOTTOM_CH3OH = aspen.Tree.FindNode(fr"\Data\Streams\{data['bottom_product_name']}\Output\MASSFRAC\MIXED\CH3OH").ValueBOTTOM_H2O = aspen.Tree.FindNode(fr"\Data\Streams\{data['bottom_product_name']}\Output\MASSFRAC\MIXED\H2O").Value
aspen.Export(1, "export2")
✨ 03. 实测效果
“帮我算一下:进料流股 FEED,温度 60C,压力 120kPa。甲醇 100 kmol/h,水 150 kmol/h。进到精馏塔 T0101,共 20 块板,第 10 块进料。要求全凝器,釜式再沸器,馏出量 100,回流比 1.2。”
--- 正在分析工艺需求... ---AI 解析成功!提取参数如下:{ "feed_stream_name": "FEED", "column_stages": 20, "reflux_ratio": 1.2, ...}1. 正在启动 Aspen Plus...2. 正在构建流程图与输入数据...3. 正在运行模拟...------------------------------塔顶甲醇质量分率: 0.9850塔底水质量分率: 0.9910------------------------------文件已保存。
即使我没有打开 Aspen 界面,Python 也在后台默默完成了所有的设置、计算和结果提取。图8 完整代码及其部分解释05. 总结与展望
这只是一个简单的Demo,但它展示了AI + 工业软件的巨大潜力。未来,我们可以把这个逻辑扩展成一个闭环智能体 (Agent):自动优化:AI 发现纯度不够?自动调整回流比再跑一次,直到合格为止。故障诊断:模拟报错了?把错误代码发给 DeepSeek,让它自动修改设置。自动报告:跑完模拟,直接生成 Word 版的设计说明书。化工人的未来,不应该是手动点鼠标的“操作员”,而是指挥 AI 干活的“架构师”。06.不足与缺点
- 这个程序,目前来说其实用处不大,因为我这些操作实际上直接可以用Aspen直接模拟,但是我想说的是,能指望一个刚出生的婴儿干什么事情呢?
- 这个程序的物性不是自动化的,需要用户手动打开一个已经填好的Aspen文件
- 我听大佬说,这个本质上是一个工作流,因为我这个程序比较少,但是遇到比较多的模块的话可能就不顶用了
- 大佬推荐Qwen,是一个多模态的AI大模型,我这里只是给大家展示