工程與下一代AI:自主LLM代理解決固體力學(xué)與流體動(dòng)力學(xué)問(wèn)題
对话式多代理框架进行工程模拟的图形摘要。注意:模拟图像仅用于说明目的。
想象一个未来,人工智能能够通过简单的对话轻松解决工程问题。下一代的人工智能和语言模型即将彻底改变我们使用工程工具(如有限元分析(FEA)和计算流体动力学(CFD))来解决结构分析、热力学、空气动力学、电场和电磁势等复杂问题的方式。很快,掌握这些工具将不再需要用户在力学、数学、材料学、物理学或编程方面具备深厚的专业知识。
今天的大型语言模型(LLM)和生成式AI工具可以模仿人类行为,例如自然语言处理、模式识别、记忆保持、批判性思维、推理和决策。它们还可以编写和调试C++、Python、Julia和MATLAB中的数值算法。除了语言之外,它们还是对话式AI代理的大脑,使AI与人类以及AI与工具之间的交互更加顺畅和有效。多个代理可以协作来规划和执行任务,监控输出,适应环境,并自主使用工具来实现目标。通过结合这些能力,工程师很快就能通过对话与强大的数值模拟工具互动,并通过最小的干预解决工程问题。
在此基础上,在本文中,我将演示如何构建一个由LLM驱动的AI代理网络,这些代理可以自主创建模型并使用最少的人工干预来模拟固体力学和流体动力学中的问题。我们将使用Microsoft AutoGen设置一组对话代理,每个代理都是特定角色的专家,例如计划、问题定义、编写、调试和执行代码、绘图和分析以及结果评估。它们将自主工作,必要时互相纠正,使用开源Python库创建和模拟FEA和CFD模型。OpenAI的GPT-4是这一框架背后的核心力量。该框架被封装在一个使用Chainlit应用程序的用户界面中。
这里展示了应用程序的实际运行效果。
使用Python编程解决CFD问题的多代理任务和对话示例
我在各种二维有限元分析(FEA)和计算流体动力学(CFD)问题(标记为(a)-(d))以及一个三维有限元分析(FEA)问题(标记为(e))上测试了该应用程序。以下为代理生成的相应图形,以及它们的初始用户提示。
这里是我用于上述五个示例的提示。
a) 受位移的2D板b) 带圆形孔的平板在位移下的分析一块1米乘1米的弹性板,其杨氏模量为1GPa,泊松比为0.3。左边缘的位移为零,右边缘沿x方向的位移为0.1米。使用FENICS求解位移,并将位移结果保存为PNG文件。
c) 二维不可压缩流体通过矩形通道流动一个2D板占据1米乘1米的区域。该板由铜制成,并在中心有一个半径为0.2米的圆形孔。左边缘的位移为零,右边缘沿x方向的位移为0.02米。顶边和底边可以自由移动。请使用FENICS求解位移,绘制并存储von Misses应力到PNG文件中,并计算右边缘的总力。
d) 具有圆形障碍物的矩形通道中的二维流动求解一个长2米、高0.5米的矩形通道内的二维不可压缩流体流动。流体的密度为1,粘度为0.001。在左侧入口处规定了一个完全发展的抛物线速度分布,最大速度为0.3。使用FEniCS有限元库求解二维压力场和速度场。绘制压力场并将其保存为PNG文件。
e) 内压作用下的3D空心钢管求解一个二维不可压缩流体在矩形通道内的圆柱周围的流动问题。矩形通道的长度为2米,高度为0.5米。圆柱位于(0.2米, 0.2米)处,直径为0.1米。流体的密度为1,粘度为0.001。在左侧入口处施加完全发展的抛物线速度分布,最大速度为0.3。使用FEniCS有限元库求解二维压力和速度场。绘制压力场并将其保存为PNG文件。
创建一个外径为5毫米、壁厚为0.5毫米的3D钢管道网格。首先绘制网格并让用户验证。使用FEniCS有限元Python库求解在100兆帕内部压力下的钢管道位移。使用Pyvista绘制并显示3D位移。将绘图保存为PNG文件。
注意,这些并不是瞬间就能解决的问题。有时,我会与代理进行多次来回对话,反复迭代直到把问题解决。例如,问题 (b) 涉及一个带有中心圆孔的板。最初,几何形状缺少这个孔,但在经过几次迭代后,我们纠正了这个问题。同样,CFD 问题缺少一个圆障碍物,我们通过调试解决了这个问题。3D 问题则需要最多的迭代,包括关闭和重新打开应用程序以从头开始。我还调整了输入提示,以更好地引导模型开发过程。总的来说,我对结果非常满意。这只是大型语言模型驱动的代理编写、调试和执行工程代码以进行建模和模拟任务的开始。
开发是在一个Linux环境中进行的,使用的是Windows子系统Linux (WSL)和Visual Studio Code,运行环境为Windows 11 PC,配置为Intel i9 13代处理器、64GB内存和24GB Nvidia RTX 4090。我未在原生Windows环境中进行测试,但您可以自由尝试。有关安装WSL和设置Python及Conda环境的指南,请参阅这篇文章(这里)。
这里是可以找到源代码仓库的链接。
如果你看到了这里,给这篇文章点一些赞。在文章末尾会带来更多见解和改进。现在,让我们开始学习如何使用和修改代码。
安装指南该实现的核心在于使AI代理能够利用开源的Python库和工具。为了解决FEA(有限元分析)或CFD(计算流体动力学)问题,我们需要工具来编写几何脚本,使用数值算法求解,并可视化结果。像gmsh这样的库,它是一个内置预处理和后处理设施的三维有限元网格生成器,用于创建几何图形或网格。FEniCS,一个用于求解偏微分方程(PDEs)的开源计算平台,被用来制定和运行数值模拟。对于可视化,matplotlib用于二维几何图形,pyvista用于三维几何图形。其他所需的库列在我的GitHub仓库中的requirements.txt
文件中。
在创建应用时,我将安装限制在了AutoGen和Chainlit上。通常,代理可以根据你要求解决的问题自动安装所有其他必要的库。然而,这往往会消耗额外的令牌和API调用,并且有时无法高效工作。因此,由于我知道这些库是必需的,所以我预先安装了它们。
终端命令以安装和启动应用程序请记住,你需要从ChatGPT获取GPT-4的API密钥。如果你的硬件允许,你可以尝试使用像Llama3:405B这样的强大离线模型。较小的模型目前还不行。
从 conda-forge 通道安装 FEniCS 时也会安装一个兼容的 Python 版本,因此我们不需要另行指定。
# 创建 conda 环境并安装 FEniCS FEA 包
conda create -n fea_agents -c conda-forge fenics mshr
# 激活环境
conda activate fea_agents
# 克隆 github 仓库
git clone https://github.com/karthik-codex/autogen_FEA.git
# 选择当前目录
cd autogen_FEA
# 安装其他 python 包 (AutoGen, Chainlit, matplotlib, numpy 等)
pip install -r requirements.txt
# 导出 OpenAI API 密钥
export API_KEY=<your_key_xxxxxx>
# 在默认端口上运行 chainlit 应用 - http://localhost//8000
chainlit run appUI.py
您将在我的GitHub仓库中找到以下文件。
./requirements.txt
— 包含上述所有包的列表./chainlit_agents.py
— 包含包含AutoGen助手和用户代理的类定义。这允许跟踪多个代理并将其消息显示在UI中。(感谢Chainlit团队构建的 模板 )。./appUI.py
— 包含设置代理、跟踪和处理消息以及在Chainlit UI中显示消息的主要异步函数。
你会发现从 _chainlitagents 导入了两个类。这些用于 AutoGen 代理的包装类使 Chainlit 能够跟踪它们的对话,以正确的格式显示文本和代码,并处理终止或其他用户输入。你可以在这里阅读更多相关内容:这里。
导入 os
导入 autogen
导入 chainlit as cl
从 chainlit_agents 导入 ChainlitUserProxyAgent, ChainlitAssistantAgent
加载LLM配置
将你的 API 密钥导出到操作系统环境变量,或者直接将其粘贴为代码中的字符串变量。
api_key = os.getenv('API_KEY')
config_list_openai = [
{"模型": "gpt-4o", "api_key": api_key}
]
llm_config = {
"seed": 565, # 更改种子以进行不同的试验
"temperature": 0,
"config_list": config_list_openai,
"timeout": 60000,
}
为代理创建系统消息。
我们设计了具有特定角色的代理:管理员(admin)、规划者、科学家、工程师、执行者、批评者和群聊管理者,并将它们组织成一个研究小组,以实现自主、互动和动态的群聊。每个代理的角色通过代理配置文件定义,使用初始提示来影响LLM在聊天过程中的行为。
- 管理员分配任务,并在被询问时提供见解。
- 规划者制定逐步计划,并为其他代理建议具体子任务。
- 科学家使用FEM(有限元法)来表述力学问题。
- 工程师编写并调试实现代码。
- 执行者运行脚本,访问模拟环境并分享结果。
- 评论者对过程和代理的表现进行评价。
- 群聊管理者通过选择发言人、收集输入和广播消息来协调对话。
以下分别是这些代理的系统提示。
USER_PROXY_MESSAGE = '''代理管理员。与规划者讨论计划。
计划的执行需要得到此管理员的批准。'''
ENGINEER_MESSAGE = '''工程师。遵循已批准的计划。编写Python/shell代码来解决问题。
将代码包裹在指定脚本类型的代码块中。用户不能修改你的代码。
因此不要提供需要他人修改的不完整代码。如果不是为了执行者执行,不要使用代码块。
不要在一次回复中包含多个代码块。不要让其他人复制粘贴结果。检查执行者返回的执行结果。
如果结果显示有错误,修复错误并再次输出代码。
建议提供完整的代码,而不是部分代码或代码修改。如果错误无法修复或即使代码成功执行但任务仍未解决,分析问题,
重新审视你的假设,收集需要的额外信息,并考虑不同的方法尝试。
在你编写的代码中,始终添加一个部分来报告解决方案的边界,并将其存储在一个单独的文件中供科学家检查。'''
PLANNER_MESSAGE = """规划者。提出一个计划。根据管理员和批评者的反馈修订计划,直到获得管理员批准。
计划可能涉及可以编写代码的工程师和不编写代码的科学家。
首先解释计划。要求执行者在没有人工输入的情况下安装任何所需的Python库或模块。
清楚地说明哪个步骤由工程师执行,哪个步骤由科学家执行。"""
SCIENTIST_MESSAGE = """科学家。遵循已批准的计划。你可以用明确的边界条件和材料的本构定律来表述力学问题。
你不会编写代码。你必须明确检查工程师提供的边界结果,以确定其是否与输入的边界条件和几何形状一致。
在执行代码时,始终保存一份副本以供审查。"""
EXECUTOR_MESSAGE = """执行者。保存并执行工程师编写的代码,并报告和保存结果。
使用shell和Python语言解释器。"""
CRITIC_MESSAGE = """批评者。仔细检查其他代理的计划、声明、代码、边界条件的结果,并提供反馈。
检查计划是否包括添加可验证的信息,如来源URL。"""
启动 Chainlit UI 的函数。
当我们用户打开聊天应用程序时,我们创建代理并打印欢迎消息。执行器运行脚本,访问模拟环境并共享结果。因此,我们启用代码执行配置,并将 docker 设置为 False,以仅使用原生操作系统环境来执行代码。
@cl.on_chat_start
async def on_chat_start():
try:
print("设置代理。")
user_proxy = ChainlitUserProxyAgent("Admin", system_message=USER_PROXY_MESSAGE, code_execution_config=False)
engineer = ChainlitAssistantAgent("Engineer", llm_config=llm_config, system_message=ENGINEER_MESSAGE)
scientist = ChainlitAssistantAgent("Scientist", llm_config=llm_config, system_message=SCIENTIST_MESSAGE)
planner = ChainlitAssistantAgent("Planner",llm_config=llm_config, system_message=PLANNER_MESSAGE)
critic = ChainlitAssistantAgent("Critic", llm_config=llm_config, system_message=CRITIC_MESSAGE)
executor = ChainlitAssistantAgent("Executor", system_message=EXECUTOR_MESSAGE, human_input_mode="NEVER",
code_execution_config={"last_n_messages": 3, "work_dir": "FEA_results","use_docker": False})
cl.user_session.set("user_proxy", user_proxy)
cl.user_session.set("engineer", engineer)
cl.user_session.set("scientist", scientist)
cl.user_session.set("planner", planner)
cl.user_session.set("critic", critic)
cl.user_session.set("executor", executor)
msg = cl.Message(content=f"""你好!今天你想完成什么样的仿真任务?
""",
author="User_Proxy")
await msg.send()
except Exception as e:
print("错误:", e)
pass
会话功能
为了测试这个多代理组自主解决工程问题的能力,我们仅使用管理员代理(用户代理)来分配任务。虽然可以在各个阶段收集人类输入,但在代理组聊天过程中我们跳过了人类输入。你可以增加变量 MAX_ITER
来增加代理之间的对话次数,以适应你尝试解决的问题的复杂性。
@cl.on_message
async def run_conversation(message: cl.Message):
MAX_ITER = 50
CONTEXT = message.content
user_proxy = cl.user_session.get("user_proxy")
planner = cl.user_session.get("planner")
engineer = cl.user_session.get("engineer")
critic = cl.user_session.get("critic")
executor = cl.user_session.get("executor")
scientist = cl.user_session.get("scientist")
groupchat = autogen.GroupChat(agents=[user_proxy, planner, engineer, scientist, executor, critic],
messages=[], max_round=MAX_ITER)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
print("运行对话")
await cl.make_async(user_proxy.initiate_chat)(manager, message=CONTEXT)
这便是主代码的结尾。
我的最终想法这个多代理的大规模语言模型框架展示了超越仅有人类模式在解决工程问题上的潜力,通过利用ChatGPT广泛的知识和开源工具。这种方法的准确性和效率依赖于大规模语言模型对固体力学、流体动力学、多物理理论、材料科学和编程的深刻理解。一个经过专门训练、针对大量相关科学文献和编程数据集进行微调的大规模语言模型可能会产生更准确的结果。使模型能够编写和执行复杂的工程代码和算法至关重要。
可以创建额外的代理来处理特定的子任务,以增强这种方法。例如,一个代理可以生成初始的几何形状或CAD文件,另一个代理可以生成网格,而第三个代理可以编写数值算法。这种分工减少了错误,并减少了为高效解决问题所需的迭代和群聊对话次数。
此外,这些自主代理可以使用API与SOLIDWORKS、ANSYS、Abaqus和LS-DYNA等商用工程软件进行交互。训练LLM编写这些API的脚本将促进顺畅的交互。这种方法可以自动化工程设计和分析问题的解决,为工程研究和创新中的人工智能与人类的无缝协作铺平道路。
关于我:我是位于美国密歇根州南菲尔德的伊顿研究实验室的首席建模工程师。我探索、开发工具,并撰写有关计算力学、材料科学、工程学、语言模型和生成式AI交汇领域的内容。
如果你想保持更新,可以关注下方我的社交平台。
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)