自主 LLM 代理解决固体力学和流体动力学问题

设想一个未来,人工智能可以通过简单的对话轻松解决工程问题。下一代人工智能和语言模型将彻底改变我们利用有限元分析 (FEA) 和计算流体动力学 (CFD) 等工程工具解决结构分析、热力学、空气动力学、电场和电磁势等复杂问题的方式。很快,掌握这些工具将不再需要用户在力学、数学、材料、物理或编程方面的丰富专业知识。

当今的大型语言模型 (LLM) 和生成式 AI 工具可以模仿人类行为,如自然语言处理、模式识别、记忆保留、批判性思维、推理和决策。它们还可以用 C++、Python、Julia 和 MATLAB 编写和调试数值算法。除了语言之外,它们还是对话式 AI 代理背后的大脑,使 AI 与人类和 AI 与工具的交互更加顺畅和有效。多个代理可以协作来计划和执行任务、监控输出、调整和使用工具来自主实现目标。通过结合这些功能,工程师很快就能与强大的数值模拟工具进行交互,并通过对话以最少的干预解决工程问题。

基于这些进步,在本文中,我将演示如何构建一个由 LLM 驱动的 AI 代理网络,该网络可以在最少的人工输入下自主创建模型并模拟固体力学和流体动力学中的问题。我们使用Microsoft AutoGen建立了一个对话代理团队,每个代理都是规划、问题制定、编写、调试和执行代码、绘图和分析以及结果评论等角色的专家。他们将自主工作,根据需要相互纠正,以使用开源 Python 库创建和模拟 FEA 和 CFD 模型。OpenAI的 GPT-4 是这背后的强大力量。该框架使用Chainlit应用程序包装在用户界面中。

该应用程序的运行情况如下。

使用 Python 编码解决 CFD 问题的多智能体任务和对话示例

示例案例和提示

我针对各种 2D FEA 和 CFD 问题(标记为 (a)-(d))以及 3D FEA 问题(标记为 (e))测试了该应用程序。下面,您将看到代理生成的相应图形及其初始用户提示。

以下是我对上述五个例子使用的提示。

a) 二维板在位移作用下

一块 1m×1m 的弹性板,其杨氏模量为 1GPa,泊松比为 0.3。其左边缘的位移为零,右边缘沿 x 方向的位移为 0.1m。使用 FENICS 求解位移,并将位移结果存储在 PNG 文件中。

b) 带圆孔的板在位移作用下

一块 2D 板占据 1m×1m 的区域。它由铜制成,中间有一个半径为 0.2m 的圆形孔。它在左边缘有零位移,在右边缘沿 x 方向有 0.02m 的位移。顶部和底部边缘可以自由移动。请使用 FENICS 解决位移,绘制并将 von Misses 应力存储在 PNG 文件中,并计算出右边缘的总力。

c) 二维不可压缩流体流过矩形通道

求解长度为 2m、高度为 0.5m 的矩形通道内的二维不可压缩流体流动。流体密度为 1,粘度为 0.001。在左入口处规定了完全发展的抛物线速度分布,最大速度 = 0.3。使用 FEniCS FE python 库求解二维压力和速度场。绘制压力场并将图保存为 PNG 文件。

d) 流经带有圆形障碍物的矩形通道的二维流动

求解长度为 2m、高度为 0.5m 的矩形通道内圆柱体上的二维不可压缩流体流动。圆柱体中心位于 (0.2m, 0.2m),直径为 0.1m。流体密度为 1,粘度为 0.001。在左入口处规定了完全发展的抛物线速度分布,最大速度 = 0.3。使用 FEniCS FE python 库求解二维压力和速度场。绘制压力场并将绘图保存为 PNG 文件。

e) 内压三维空心钢管

创建外径 5 毫米、壁厚 0.5 毫米的 3D 钢管网格。首先绘制网格并与用户验证。使用 FEniCS FE python 库求解 100 MPa 内压下钢管的位移。使用 Pyvista 绘制并显示 3D 位移。将绘图保存为 PNG 文件。

请注意,这些都不是即时解决方案。有时,我会与代理进行多次来回对话,不断迭代,直到我们找到正确的解决方案。例如,问题 (b) 涉及一个带有中心圆孔的板。最初,几何图形缺少孔,但经过几次迭代后,我们对其进行了纠正。同样,CFD 问题缺少圆形障碍物,我们通过调试解决了这个问题。3D 问题需要最多的迭代,包括关闭并重新打开应用程序以从头开始。我还调整了输入提示,以更好地指导模型开发过程。总的来说,我对结果感到很兴奋。这只是 LLM 驱动的代理如何为建模和仿真任务编写、调试和执行工程代码的开始。

开发是在 Linux 环境中使用 Windows Subsystem for Linux (WSL) 和 Visual Studio Code 在 Windows 11 PC 上完成的,该 PC 配备 Intel i9 第 13 代处理器、64 GB RAM 和 24 GB Nvidia RTX 4090。我尚未在原生 Windows 环境中测试过,但您可以随意测试。有关安装 WSL 和设置 Python 和 Conda 环境的指南,请参阅本文(此处)。

这是源代码存储库的链接。

如果你读到了这里,请为本文点赞。请继续关注文章末尾的更多见解和改进。现在,让我们开始了解如何使用和修改代码。

安装指南

此实现的核心涉及使 AI 代理能够利用开源 Python 库和工具。为了解决 FEA 或 CFD 问题,我们需要工具来编写几何图形脚本、使用数值算法求解并可视化结果。使用 gmsh 等库(一种具有内置预处理和后处理功能的三维有限元网格生成器)来创建几何图形或网格。使用 FEniCS 来制定和运行数值模拟,FEniCS 是一种用于求解偏微分方程 (PDE) 的开源计算平台。对于可视化,matplotlib 用于二维几何图形,pyvista 用于三维几何图形。其他所需的库列在requirements.txt我的 GitHub 存储库中提供的文件中。

在创建应用程序时,我将安装限制为 AutoGen 和 Chainlit。通常,代理可以根据您要求它们解决的问题自动安装所有其他必要的库。但是,这通常会消耗额外的令牌和 API 调用,有时无法有效工作。因此,我预先安装了这些库,因为我知道它们是必需的。

请记住,您需要一个来自 ChatGPT 的 GPT-4o API 密钥。如果您的硬件允许,您可以尝试使用功能强大的离线模型,例如 Llama3:405B。较小的模型目前还无法使用。

用于安装和启动应用程序的终端命令

从 conda-forge 频道安装 FEniCS 也会安装兼容的 Python 版本,因此我们不需要指定它。

# Create conda environment and install FEniCS FEA package
conda create -n fea_agents -c conda-forge fenics mshr

# Activate environment
conda activate fea_agents

# Clone github repo
git clone https://github.com/karthik-codex/autogen_FEA.git

# select current directory
cd autogen_FEA

# Install other python packages (AutoGen, Chainlit, matplotlib, numpy, etc..)
pip install -r requirements.txt

# Export OpenAI API key
export API_KEY=<your_key_xxxxxx>

# Run chainlit app on default port - http://localhost//8000
chainlit run appUI.py

您将在我的 GitHub 存储库中找到以下文件。

  1. ./requirements.txt包含上述所有软件包的列表
  2. ./chainlit_agents.py包含包括 AutoGen 助手和用户代理的类定义。这允许跟踪多个代理并将其消息显示在 UI 中。(感谢 Chainlit 团队构建模板
  3. ./appUI.py包含设置代理、跟踪和处理消息以及在 Chainlit UI 中显示它们的主要异步函数。

主要 Python 应用程序细分

导入库

您会注意到从chainlit_agents导入了两个类。这些 AutoGen 代理的包装器类使 Chainlit 能够跟踪其对话、以适当的格式显示文本和代码,以及处理终止或其他用户输入。您可以在此处阅读更多相关信息。

import os
import autogen
import chainlit as cl
from chainlit_agents import ChainlitUserProxyAgent, ChainlitAssistantAgent

加载 LLM 配置

将您的 API 密钥导出到您的操作系统环境或将其作为字符串变量直接粘贴到代码中。

api_key = os.getenv('API_KEY')

config_list_openai = [
    {"model": "gpt-4o", "api_key": api_key}
]

llm_config = {
    "seed": 565,  # change the seed for different trials
    "temperature": 0,
    "config_list": config_list_openai,
    "timeout": 60000,
}

为代理创建系统消息。

我们设计了具有特定角色的代理:管理员 (admin)、规划师、科学家、工程师、执行者、评论家和群聊管理员,并将他们组织成一个研究小组,进行自主、互动和动态的群聊。每个代理的角色都是通过代理分析定义的,使用初始提示来影响 LLM 在聊天期间的行为。

  1. 管理员分配任务并在被问及时提供见解。
  2. 规划者制定分步计划并为其他代理提出具体的子任务。
  3. 科学家利用 FEM 公式解释力学问题。
  4. 工程师编写并调试实现代码。
  5. 执行器运行脚本,访问模拟环境并共享结果。
  6. 评论家对流程和代理人的表现做出评估。
  7. 群聊管理器通过选择发言者、收集输入和广播消息来协调对话。

以下是每个代理的系统提示。

USER_PROXY_MESSAGE = '''A human admin. Interact with the planner to discuss the plan. 
Plan execution needs to be approved by this admin.'''

ENGINEER_MESSAGE = '''Engineer. You follow an approved plan. You write Python/shell code to solve tasks. 
Wrap the code in a code block that specifies the script type. The user can't modify your code. 
So do not suggest incomplete code which requires others to modify. Don't use a code block if it's 
not intended to be executed by the executor. Don't include multiple code blocks in one response. 
Do not ask others to copy and paste the result. Check the execution result returned by the executor. 
If the result indicates there is an error, fix the error and output the code again. 
Suggest the full code instead of partial code or code changes. If the error can't be fixed or if 
the task is not solved even after the code is executed successfully, analyze the problem, 
revisit your assumption, collect additional info you need, and think of a different approach to try.
In the code you write, always add a part to report the solution on the boundaries and store it in a separate file for the Scientist to check.'''

PLANNER_MESSAGE = """Planner. Suggest a plan. Revise the plan based on feedback from admin and critic, until admin approval.
The plan may involve an engineer who can write code and a scientist who doesn't write code.
Explain the plan first. Ask the Executor to install any Python libraries or modules as needed without human input. 
Be clear which step is performed by an engineer, and which step is performed by a scientist."""

SCIENTIST_MESSAGE = """Scientist. You follow an approved plan. You can formulate the mechanics problem with 
clear boundary conditions and constitutive law of materials. You don't write code. You explicitly check the 
boundary results from the Engineer to see whether it agrees with the input boundary conditionand geometry. 
When you execute the code, always save a copy for review."""

EXECUTOR_MESSAGE = """Executor. Save and execute the code written by the engineer and report and save the result. 
Use both shell and python language interpreter."""

CRITIC_MESSAGE = """ Critic. Double check plan, claims, code from other agents, results on the boundary conditions, and provide feedback. 
Check whether the plan includes adding verifiable info such as source URL."""

Chainlit UI 的启动功能。

当用户打开聊天应用程序并打印欢迎消息时,我们会创建代理。执行器运行脚本,访问模拟环境并共享结果。因此,我们启用代码执行配置并将 docker 设置为 False,以仅使用本机操作系统环境执行代码。


@cl.on_chat_start
async def on_chat_start():
  try:
    print("Set agents.")
    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"""Hello! What simulation task would you like to get done today?      
                     """, 
                     author="User_Proxy")
    await msg.send()
    
  except Exception as e:
    print("Error: ", 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("Running conversation")
    await cl.make_async(user_proxy.initiate_chat)( manager, message=CONTEXT, )

这就是主要代码的结尾。

最后的想法

这种多智能体 LLM 框架展示了通过利用 ChatGPT 的广泛知识和开源工具来解决工程问题超越人类模式的潜力。这种方法的准确性和效率依赖于 LLM 对固体力学、流体动力学、多物理理论、材料科学和编码的深刻理解。在大量相关科学文献和编码数据集上训练的更专业、更精细的 LLM 可以产生更准确的结果。调整模型以编写和执行复杂的工程代码和算法至关重要。

可以创建其他代理来处理特定子任务,以增强此方法。例如,一个代理可以生成初始几何图形或 CAD 文件,另一个代理可以制作网格,第三个代理可以编写数值算法。这种分工减少了错误,并最大限度地减少了高效解决问题所需的迭代和群聊对话。

此外,这些自主代理可以使用 API 与 SOLIDWORKS、ANSYS、Abaqus 和 LS-DYNA 等商业工程软件进行交互。训练 LLM 编写这些 API 的脚本将有助于实现顺畅的交互。这种方法可以自动化工程设计和分析问题解决,为工程研究和创新中的无缝人机协作铺平道路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉达曼迪斯II

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值