Foam-Agent:基于大语言模型与多智能体的OpenFOAM自动化仿真框架
1. 项目概述当大语言模型遇上计算流体力学如果你接触过计算流体力学尤其是用过OpenFOAM那你一定对它的学习曲线深有体会。这玩意儿功能强大、开源免费但想用它跑通一个仿真你得先成为半个专家从网格划分、边界条件设置、求解器选择到参数调优每一步都布满了“坑”。一个blockMeshDict文件写错一个标点或者fvSchemes里差分格式选得不合适整个仿真就可能直接崩溃留下一堆让人摸不着头脑的错误日志。更别提那些复杂的湍流模型、多相流设置了没个几年的实战经验根本玩不转。这就是Foam-Agent要解决的问题。它本质上是一个由大语言模型驱动的多智能体框架目标是把CFD仿真的整个工作流程——从你的一句自然语言描述开始到最终的可视化结果——全部自动化。你可以把它理解为一个“CFD领域的Copilot”。你不再需要去手动编写那些令人头疼的.foam配置文件而是直接告诉它“帮我模拟一个雷诺数为1000的方腔顶盖驱动流”或者“分析这个机翼模型在Ma0.8时的气动特性”。剩下的工作包括理解你的意图、规划仿真步骤、生成正确的OpenFOAM文件、提交计算、监控运行、甚至自动纠错都由Foam-Agent背后的智能体们协作完成。这个项目的核心价值在于“降本增效”。对于CFD新手它极大地降低了入门门槛让你能快速验证想法把精力集中在物理问题本身而不是软件操作上。对于有经验的工程师或研究员它能自动化那些重复性、模板化的案例设置工作让你能更高效地探索更多设计参数或物理场景。根据论文数据在包含110个任务的FoamBench测试集上配合Claude Opus 4.6模型Foam-Agent实现了100%的成功率。这个数字背后是它对CFD领域知识和OpenFOAM工程实践的深度编码与自动化执行能力。2. 核心架构与多智能体工作流拆解Foam-Agent的成功并非偶然它背后是一套设计精巧的多智能体系统通过LangGraph构建的工作流将任务分解、执行与修正串联起来。理解这套架构是理解它如何工作的关键。2.1 四大核心智能体的角色与协作整个系统由四个分工明确的智能体组成它们像一支专业的CFD工程团队一样协同工作架构师Architect Agent这是团队的“总工程师”。它的职责是解析用户的自然语言需求并将其转化为一个结构化的、可执行的仿真计划。这个过程包括识别仿真类型稳态还是瞬态、确定物理模型用RANS还是LES选择哪个湍流模型、规划所需的OpenFOAM文件结构需要哪些system/,constant/,0/目录下的文件并预估计算资源。它输出的“蓝图”是后续所有工作的基础。输入文件编写器Input Writer Agent这是团队的“制图员”负责根据架构师的蓝图生成所有具体的OpenFOAM配置文件。这是最考验细节的一步。它需要精确地编写controlDict,fvSchemes,fvSolution,transportProperties, 湍流模型属性文件以及初始和边界条件文件0/目录下的U,p,k,epsilon等。这里Foam-Agent引入了一个关键设计RAG增强生成。它并非让LLM凭空想象而是从一个预先构建的、包含大量OpenFOAM官方教程的FAISS向量数据库中检索与当前任务最相关的配置片段作为参考极大地提高了生成文件的准确性和合规性。运行器Runner Agent这是团队的“操作员”。它的工作相对直接但至关重要执行生成的Allrun脚本启动OpenFOAM求解器如simpleFoam,pimpleFoam并实时监控计算进程。它会收集标准输出、错误日志以及求解器的收敛残差历史等信息为后续的审查提供原始数据。审查员Reviewer Agent这是团队的“质检专家”。当运行器遇到错误或仿真异常终止时审查员登场。它分析错误日志、残差曲线等运行时信息诊断问题根源例如时间步长太大导致发散、边界条件设置矛盾、网格质量太差等并生成具体的修复建议。这些建议会被反馈给输入文件编写器进行文件修改然后由运行器再次尝试。这个“运行-审查-修复”的循环最多可以进行25次构成了系统强大的自动纠错能力。实操心得智能体协作模式的选择在src/config.py中input_writer_generation_mode这个参数控制着输入文件编写器的工作模式它直接影响了生成效率和上下文连贯性。sequential_dependency顺序依赖模式智能体按文件间的依赖关系顺序生成例如先生成transportProperties再生成0/U时可以参考粘度系数。这种方式上下文信息充分生成质量高特别适合计算成本高昂的HPC任务或长时间仿真因为一次成功比多次重试更重要。parallel_no_context并行无上下文模式所有配置文件并行生成速度极快但文件之间没有信息共享。这适合本地快速测试或计算量小的案例即使生成有误重试的成本也很低。你需要根据你的计算资源和任务重要性来权衡选择。2.2 LangGraph与可组合服务架构这些智能体并非孤立运行它们通过LangGraph被编排成一个有向图工作流。LangGraph允许定义复杂的状态转移逻辑比如在“运行”节点后根据退出代码判断是跳转到“成功-可视化”节点还是跳转到“失败-审查”节点。这种基于图的编排使得工作流逻辑清晰、易于调试和扩展。更值得一提的是其可组合服务架构。Foam-Agent将每个智能体的核心功能都封装成了标准的模型上下文协议工具。MCP是一个正在兴起的、旨在让不同AI助手能安全、一致地调用外部工具和数据的开放协议。这意味着Foam-Agent的CFD自动化能力不仅可以作为一个独立应用运行还可以作为一个服务被集成到Claude Code、Cursor、Windsurf等任何支持MCP的AI编程工具中。你可以在写代码的IDE里直接通过聊天窗口或命令调用Foam-Agent来设置并运行一个仿真实现无缝的“AICAE”工作流。3. 从零开始实战部署与快速上手理论说得再多不如亲手跑一个案例来得实在。Foam-Agent提供了Docker这种最便捷的部署方式几乎屏蔽了所有环境依赖问题是我们入门的首选。3.1 基于Docker的一键式部署官方提供的Docker镜像leoyue123/foamagent已经集成了所有环境Foundation OpenFOAM v10、Miniconda、Python依赖以及预构建的RAG数据库。你只需要确保本机安装了Docker然后准备你的LLM API密钥即可。步骤一启动容器假设你使用OpenAI的GPT模型启动命令如下docker run -it \ -e OPENAI_API_KEYsk-your-actual-openai-api-key-here \ -p 7860:7860 \ --name foamagent \ leoyue123/foamagent这条命令做了几件事-it表示交互式终端-e设置环境变量你的API密钥-p 7860:7860将容器的7860端口映射到主机这是为后续MCP服务器准备的--name给容器起个名字方便管理。如果你更倾向于使用Anthropic的Claude模型命令需要稍作调整docker run -it \ -e FOAMAGENT_MODEL_PROVIDERanthropic \ -e ANTHROPIC_API_KEYyour-claude-api-key-here \ -e FOAMAGENT_MODEL_VERSIONclaude-3-5-sonnet-20241022 \ -p 7860:7860 \ leoyue123/foamagent步骤二编写你的第一个仿真提示容器启动后你会进入其bash终端。首先我们需要创建一个描述仿真需求的文本文件。使用vim或nano编辑user_requirement.txtnano user_requirement.txt文件内容可以是一个经典的入门案例——顶盖驱动方腔流Simulate a 2D lid-driven cavity flow at Reynolds number 1000. The domain is a square with side length 0.1m. The top wall (lid) moves with a constant velocity of 1 m/s in the x-direction. The other three walls are stationary no-slip walls. Use the SIMPLE algorithm for steady-state incompressible flow. Use the laminar model. Set the kinematic viscosity (nu) to 0.0001 m2/s to achieve Re1000 based on lid velocity and cavity height. Use a uniform hexahedral mesh with 50 cells in each direction. Run until residuals converge below 1e-6.这个描述包含了物理问题、几何尺寸、边界条件、求解算法、材料属性和网格要求足够详细让智能体理解你的意图。步骤三启动自动化仿真保存文件后运行主程序python foambench_main.py --output ./my_first_cavity_flow --prompt_path ./user_requirement.txt--output指定输出目录所有生成的文件和结果都将放在这里。--prompt_path指定你的需求文件路径。接下来你就可以泡杯茶观察终端里的日志了。你会看到架构师开始解析需求输入文件编写器在检索和生成文件运行器调用blockMesh和simpleFoam残差信息开始滚动。如果一切顺利几分钟后你就能在输出目录的postProcessing文件夹里找到结果并用ParaView打开查看流场。注意事项模型选择与成本考量Foam-Agent的性能高度依赖于背后的大语言模型。论文中的测试数据给出了清晰的指引追求最高成功率Claude Opus 4.6是当前最佳选择在25次循环纠错下能达到100%的任务成功率。但它的API调用成本也最高。性价比之选Claude Sonnet 4.6在基础任务上也有接近90%的成功率成本远低于Opus是大多数日常使用的理想选择。快速原型与测试如果只是跑一些简单、标准的案例进行功能验证GPT-5-mini或Haiku也能胜任成本最低但需要接受更低的首次成功率可能依赖更多次的自动纠错循环。 启动容器时务必通过环境变量FOAMAGENT_MODEL_VERSION指定你选择的模型版本。你的API密钥成本将直接与模型的调用次数和复杂度挂钩。3.2 处理自定义几何与网格很多时候我们的仿真对象并不是简单的方腔或管道而是复杂的CAD模型。Foam-Agent同样支持。你需要做的是使用外部网格工具如Gmsh生成网格并以ASCII 2.2格式的.msh文件保存。操作流程如下准备网格文件在Gmsh中完成几何建模、定义物理组Physical Groups。物理组至关重要因为它将几何实体如入口面、出口面、壁面命名并传递给OpenFOAM。保存时选择Mesh Save格式选Gmsh msh版本选ASCII 2.2。挂载网格到容器启动Docker容器时使用-v参数将主机上的网格文件挂载到容器内。docker run -it \ -e OPENAI_API_KEYyour-key \ -v /home/user/airfoil_mesh.msh:/workspace/airfoil.msh \ -p 7860:7860 \ leoyue123/foamagent编写包含边界描述的需求文件在user_requirement.txt中除了物理设置必须清晰描述网格中各个物理组对应的边界条件。Perform an external flow simulation over a NACA0012 airfoil at 10 degrees angle of attack. Use the custom mesh file airfoil.msh. In the mesh: - The curve named inlet is the far-field inlet. - The curve named outlet is the far-field outlet. - The curve named airfoil is the airfoil wall. - The curve named farfield represents the top and bottom far-field boundaries. Use a Reynolds-Averaged Simulation (RAS) with the k-omega SST turbulence model. Freestream velocity is 50 m/s. Use the pimpleFoam solver for transient simulation.运行并指定网格路径python foambench_main.py --output ./airfoil_result --prompt_path ./user_requirement.txt --custom_mesh_path ./airfoil.msh智能体会识别到--custom_mesh_path参数从而跳过blockMesh步骤直接使用foamyHexMesh或相应的工具来处理你的外部网格并分配边界条件。4. 高级集成将CFD自动化嵌入你的AI工作流Foam-Agent的可组合性设计让它不仅能独立运行更能成为你现有AI辅助编程生态的一部分。通过MCP服务器你可以让Claude Code或Cursor直接驱动CFD仿真。4.1 配置MCP服务器与Claude Code技能本地安装模式适用于已在主机安装OpenFOAM的环境如果你不想用Docker或者需要在本地开发环境深度集成可以采用本地安装。# 1. 克隆仓库并进入 git clone https://github.com/csml-rpi/Foam-Agent.git cd Foam-Agent # 2. 创建并激活Conda环境 conda env create -n FoamAgent -f environment.yml conda activate FoamAgent # 3. 以开发模式安装这会注册foamagent-mcp命令 pip install -e . # 4. 将Foam-Agent MCP服务器添加到Claude Code claude mcp add foamagent -- foamagent-mcp完成以上步骤后重启你的Claude Code。现在在聊天窗口中你就可以直接使用Foam-Agent提供的工具了。例如输入“/plan”并描述你的仿真需求Claude会调用背后的MCP工具来生成仿真计划。Docker模式下的MCP HTTP服务器对于使用Docker的大多数用户更简单的方式是启动一个HTTP MCP服务器。# 启动容器并运行MCP服务器 docker run -it \ -e OPENAI_API_KEYyour-key \ -p 7860:7860 \ leoyue123/foamagent \ foamagent-mcp --transport http --host 0.0.0.0 --port 7860这条命令在容器内直接启动了Foam-Agent的MCP服务并监听7860端口。接下来你需要在你的AI工具中配置连接这个服务器。以Cursor为例的配置方法打开Cursor进入SettingsFeaturesMCP。点击Edit MCP Settings这会打开一个JSON配置文件。在mcpServers对象中添加Foam-Agent的配置{ mcpServers: { foamagent: { url: http://localhost:7860/mcp } } }保存文件并重启Cursor。重启后Cursor的AI助手就具备了调用Foam-Agent所有CFD工具的能力。4.2 六大MCP工具详解与使用场景配置成功后你的AI助手就可以调用以下六个核心工具。每个工具都严格遵循Foundation OpenFOAM v10的规范。工具名称功能描述典型使用场景与提示词示例plan需求分析与仿真规划。分析自然语言描述输出结构化的仿真计划包括求解器、模型、文件清单等。“分析这个需求并制定仿真计划模拟一个微通道内的层流混合过程通道宽100微米两种流体速度分别为0.01m/s和0.005m/s。”input_writer配置文件生成。根据plan的输出生成完整的OpenFOAM案例文件结构system/,constant/,0/。“基于刚才的混合流计划生成所有必要的OpenFOAM v10配置文件。”run本地执行。在本地运行生成的Allrun脚本执行网格划分和求解计算并收集运行日志和错误。“执行刚刚生成的混合流案例。”review错误审查与诊断。分析run步骤产生的日志和错误信息诊断失败原因并提出修改建议。“分析上次运行失败的原因求解器在100步后发散了。”apply_fixes修复应用。根据review提出的建议修改相应的OpenFOAM配置文件。“应用刚才审查报告中提出的关于减小时间步长的修复建议。”visualization结果可视化。读取计算结果并生成PyVista脚本或图像用于流场快照或关键变量的图表。“对混合流的结果进行可视化生成速度场云图和中心线上的浓度分布曲线。”这套工具链赋予了AI助手强大的“动手”能力。你可以通过自然语言与AI进行多轮对话逐步细化、调整并最终完成一个CFD仿真。例如你可以先让AIplan检查计划是否合理然后让它input_writer生成文件运行(run)后发现不收敛再让它review并apply_fixes最后visualization查看结果。整个过程就像在指导一个经验丰富的CFD工程师助理。实操心得利用Claude Code内置技能实现一键仿真对于Claude Code用户项目还提供了一个更便捷的封装技能。如果你将Foam-Agent仓库克隆到本地在.claude/skills/目录下会有一个foam.md文件。这个技能定义了一个/foam命令。在Claude Code聊天框中你只需输入/foam Simulate the flow around a cylinder at Reynolds number 100.Claude Code会自动依次调用plan,input_writer,run,review(如果需要)等工具完成端到端的自动化流程。这比手动调用单个工具效率高得多是体验Foam-Agent完整能力的最佳方式。5. 避坑指南与常见问题排查实录即使有了智能体的帮助在实际操作中仍可能遇到一些环境或配置问题。以下是我在多次部署和使用中总结的典型问题及解决方案。5.1 环境与依赖问题问题一容器启动失败或提示OpenFOAM环境未找到。现象运行Docker容器后执行foamInstallationTest或启动Foam-Agent时报错提示OpenFOAM命令未找到。根因虽然官方镜像已预装OpenFOAM但某些情况下OpenFOAM的环境变量可能未正确加载。Docker镜像基于特定的Linux发行版和OpenFOAM安装路径构建如果基础镜像或安装脚本有变动可能导致此问题。解决方案进入容器后首先手动尝试加载OpenFOAM环境source /opt/openfoam10/etc/bashrc。如果此命令成功则说明环境存在但未自动加载。检查容器内的~/.bashrc或/etc/profile.d/目录下是否有OpenFOAM的初始化脚本。你可以手动添加source /opt/openfoam10/etc/bashrc到~/.bashrc中然后执行source ~/.bashrc。最根本的解决方法是使用项目提供的Dockerfile从源码重建镜像确保构建过程在你的环境下成功docker build -f docker/Dockerfile -t my-foamagent:latest .问题二RAG数据库文件缺失导致输入文件生成质量差或报错。现象运行时报错找不到database/目录下的索引文件或者智能体生成的配置文件明显不符合OpenFOAM语法。根因Foam-Agent依赖预构建的FAISS索引来检索OpenFOAM教程知识。如果database/目录不完整或者向量模型未正确加载RAG功能就会失效。解决方案确保你克隆了完整的仓库包括database/子目录。使用git clone时不要加--depth 1参数。如果使用Docker官方镜像已包含预构建的数据库。如果问题仍存在可以检查环境变量FOAMAGENT_EMBEDDING_PROVIDER和FOAMAGENT_EMBEDDING_MODEL的设置。默认使用本地的huggingface模型Qwen/Qwen3-Embedding-0.6B通常无需网络。如果设置为openai则需要相应的API密钥。可以尝试在容器内重新生成数据库耗时较长python scripts/build_database.py。确保网络通畅能下载Hugging Face模型。5.2 模型与API配置问题问题三LLM API调用失败提示权限错误或额度不足。现象程序在“Architect planning...”或“Input writer generating...”阶段长时间挂起后报错错误信息包含AuthenticationError,RateLimitError或InvalidRequestError。根因API密钥错误、未设置、已失效或者所选模型在当前区域不可用特别是某些GPT-5系列模型。对于Anthropic模型也可能是未在控制台启用相应模型。解决方案双重检查密钥确保OPENAI_API_KEY或ANTHROPIC_API_KEY环境变量值正确没有多余空格或换行。在容器内可以用echo $OPENAI_API_KEY检查。检查模型可用性登录OpenAI或Anthropic的控制台确认你使用的API密钥有权限调用你所选的模型如gpt-5-mini,claude-3-5-sonnet。对于GPT-5系列部分早期测试版可能仅限特定用户。切换备用模型如果主模型一直失败可以在启动容器时换用另一个被证明可用的模型例如从gpt-5-mini切换到gpt-4o或从claude-opus切换到claude-sonnet。查看额度与账单确保账户有足够的余额或额度。问题四使用OpenAI Codex OAuth登录时认证失败。现象按照文档配置了openai-codex提供商并挂载了auth.json但容器内仍提示需要API密钥。根因OAuth令牌文件路径不正确、令牌已过期或者Docker容器内的用户权限无法读取挂载的文件。解决方案确认令牌文件存在且有效在主机上运行codex whoami确保Codex CLI已登录且令牌有效。检查挂载路径与权限确保Docker命令中的挂载路径-v ~/.codex/auth.json:/root/.codex/auth.json:ro是正确的。注意容器内默认用户是root所以目标路径是/root/。如果容器以其他用户运行需要调整。尝试其他令牌路径Foam-Agent会按顺序查找多个路径。你可以尝试将auth.json复制到容器内Foam-Agent代码目录下的某个位置并设置环境变量CODEX_HOME指向该目录。5.3 仿真运行与纠错问题问题五仿真在“run”阶段失败错误信息指向具体的OpenFOAM字典文件语法错误。现象run阶段报错例如-- FOAM FATAL ERROR: unknown patchField type fixedValue或keyword transportModel is undefined。根因输入文件编写器生成的某个字典文件存在语法错误、拼写错误或使用了不兼容的OpenFOAM版本关键词。这通常是RAG检索的上下文不够精确或LLM在生成时出现了“幻觉”。解决方案利用自动纠错循环这是Foam-Agent的核心优势。不要手动修改让系统自己处理。查看日志审查员Reviewer应该已经识别到错误并生成了修复建议。系统会自动进入下一轮“生成-运行”循环。通常经过几轮迭代问题就能被修正。检查OpenFOAM版本兼容性这是最关键的一点Foam-Agent严格针对Foundation OpenFOAM v10生成文件。如果你在本地手动安装了ESI OpenFOAM如v2312, v2406即使环境变量设置正确也会因为字典语法、求解器名称的差异而导致失败。务必使用项目提供的Docker镜像或确保本地安装的是来自 openfoam.org 的Foundation版本。提供更精确的需求描述模糊的需求会导致规划不准确。在user_requirement.txt中尽可能使用标准的OpenFOAM术语描述边界条件如fixedValue,zeroGradient,noSlip、湍流模型kEpsilon,kOmegaSST、求解器simpleFoam,pimpleFoam。问题六仿真可以运行但结果明显不合理如残差不收敛、物理量异常。现象求解器能跑起来但残差曲线震荡不下降或者计算出的速度、压力值远超物理常识。根因智能体生成的初始条件、边界条件或求解参数如松弛因子、时间步长设置不合理。例如初始压力场全为零可能不利于某些求解器启动过大的时间步长会导致计算发散。解决方案审查生成的参数到输出目录的system/下检查fvSolution字典查看relaxationFactors松弛因子的设置。对于不稳定问题可以尝试减小松弛因子如从1.0降到0.7或0.5。检查时间步长与网格尺度对于瞬态模拟controlDict中的deltaT时间步长必须满足CFL条件。如果网格非常细密而时间步长设置得太大必然发散。你可以提示审查员“仿真发散可能时间步长太大请根据初始网格尺寸和流速建议一个合适的deltaT。”引入人工干预点Foam-Agent是一个工具而非黑箱。对于重要的仿真在智能体生成完所有文件后、正式运行前一个有经验的用户应该花几分钟快速浏览一下关键的配置文件0/U,0/p,system/controlDict,system/fvSolution进行人工校验。这能避免因明显参数错误而浪费计算资源。经过这些实战和排错你应该能感受到Foam-Agent带来的范式转变。它把CFD工程师从繁琐的、易错的文件编写工作中解放出来让我们能更专注于物理建模、结果分析和工程决策。虽然它目前可能还无法处理极端复杂或高度定制化的仿真场景但对于大量的常规仿真、教学案例和参数化研究它已经展现出了巨大的实用价值和效率提升潜力。随着底层LLM能力的进化和更多CFD知识的注入这类智能体框架必将成为CAE领域不可或缺的助手。