当前位置:首页>python>化工仿真:Deepseek AI驱动Python直连Aspen

化工仿真:Deepseek AI驱动Python直连Aspen

  • 2026-10-11 12:15:37
化工仿真:Deepseek AI驱动Python直连Aspen
各位好,我是MrsJone,今天主要简单说一下如何用deepseek驱动aspen
首先,感谢我李姐,太有高智商了,阿里嘎多谢谢你QAQ,我的忍战带土终于拿下了!
各位可以加我的交流群:562721026
代码和bkp源文件会放在这个网站
https://wenxiaoshuo.github.io/AspenWithPython/
大家好,我是 MrsJone。
AI 时代,大模型(LLM)已经能写代码、写周报了,但在我们化工领域,最硬核的Aspen Plus 模拟能不能也让 AI 来帮忙?
想象一下这个场景: 你不需要打开 Aspen 的输入框一个个敲数字,只需要对着电脑说:

“设计一个甲醇-水精馏塔,进料60度,我要塔顶纯度99%。”

然后,AI 自动思考,提取参数,自动打开 Aspen,填入数据,运行模拟,并把结果甩给你。
今天,我们就用国产最强模型 DeepSeek 配合 Python,把这个“科幻”场景变成现实!(别问为啥用DeepSeek,因为它的API便宜!最近没钱了,快过年了省点花)
图1 流程图

0.需要准备工具

  1. Python环境,我用的编译器是Pycharm,可以使用Vscode
  2. 所需要的Python库:json(用于提取数据),openai(用于Deepseek大模型)
  3. 一个物性方法有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):负责执行严谨的化工计算。
![原理流程图](插入一张简单的流程图:用户输入 -> DeepSeek API -> JSON参数 -> Python脚本 -> Aspen Plus)

02. 第一步:调教 DeepSeek (Prompt Engineering)

DeepSeek 虽然聪明,但如果你直接问它,它可能会给你写一篇小作文。我们需要它输出结构化的数据。
我们在代码中加入了System Prompt(系统提示词),给 AI 下了死命令:

“你是一个化工模拟专家。请从用户的描述中提取 Aspen 模拟参数。必须且只能返回 JSON 格式。”

Python 代码片段:
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>,&nbsp;<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(或者说字典形式)
然后可以接下来用Aspen的COM接口
思路如下:
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  可视化
1.创建流股
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'])
2.创建模块
aspen.Tree.Elements("Data").Elements("Blocks").Elements.Add(fr"{data['col_name']}!RadFrac")
3.流股连接模块
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"])
4.给模块的参数(回流比什么的)
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"]
5.给流股参数(温度,压力,各个组分的含量)
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"]
6.运行
aspen.Run()
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
8.导出bkp新的文件
aspen.Export(1, "export2")
9.关闭aspen
aspen.Close()

✨ 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.不足与缺点

  1. 这个程序,目前来说其实用处不大,因为我这些操作实际上直接可以用Aspen直接模拟,但是我想说的是,能指望一个刚出生的婴儿干什么事情呢?
  2. 这个程序,目前缺的是单位不行,然后我在找方法
  3. 这个程序的物性不是自动化的,需要用户手动打开一个已经填好的Aspen文件
  4. 我听大佬说,这个本质上是一个工作流,因为我这个程序比较少,但是遇到比较多的模块的话可能就不顶用了
  5. 大佬推荐Qwen,是一个多模态的AI大模型,我这里只是给大家展示

最新文章

随机文章