随着大语言模型推理能力增强、Agent 框架进入工程化阶段,以及 MCP 等工具互通协议逐渐成熟,AI 对 CAE 的影响已经不只是在软件里增加一个问答窗口。更值得关注的变化,是把需求理解、参数生成、求解器调用、结果检查和报告整理连接成一条可追踪、可干预的自动化链路。
围绕 2026 年 7 月 23 日举行的“AI 赋能 CAE 软件开发与应用技术研讨会暨 FastCAE 用户交流会”,一个核心议题已经浮现:传统 CAE 中高度依赖专家经验、参数耦合复杂、多工具协同成本高的问题,能否通过大模型、Agent 和标准化工具接口获得新的工程解法。
AI 改变的不是求解器,而是求解器周围的工作
有限元、计算流体力学等 CAE 求解器依靠明确的数学模型、离散方法和数值算法运行。大模型不能替代网格收敛性分析,也不能凭语言推理保证边界条件正确。它更适合处理求解器前后的高摩擦环节:
- 将自然语言工况转换为结构化仿真任务;
- 根据企业模板生成候选材料、载荷和边界条件;
- 调用前处理器、求解器和后处理脚本;
- 检查单位、参数范围、求解状态与关键结果;
- 汇总多轮计算结果,生成带证据引用的报告草稿。
这意味着工程师仍然负责物理判断,AI 则承担流程编排和重复操作。例如,“分析支架在 8 kN 竖向载荷下的最大位移”不能直接变成一次可信计算。系统至少要继续确认载荷位置、约束方式、材料牌号、接触设置、几何非线性和验收阈值。
更稳妥的设计,是让模型输出结构化意图,再由确定性程序完成校验和执行:
{
"analysis_type": "static_structural",
"geometry": "bracket.step",
"material": "aluminum_6061_t6",
"load": {
"type": "force",
"magnitude": 8000,
"unit": "N",
"direction": [0, -1, 0]
},
"requested_outputs": ["max_displacement", "max_von_mises_stress"]
}
模型可以提出这份任务,但执行端必须验证文件是否存在、单位是否一致、材料是否来自受控数据库,以及载荷和约束能否映射到真实几何实体。
Agent 让一次调用变成闭环,但必须设置闸门
普通聊天助手通常停留在“给出建议”。CAE Agent 则需要读取任务、选择工具、启动计算、观察状态,并根据结果决定下一步动作。一个典型闭环可以包含:
- 解析需求并识别缺失条件;
- 生成仿真配置,执行模式与单位检查;
- 调用网格和求解工具;
- 读取残差、警告、退出码与结果文件;
- 在授权范围内调整参数或提交人工复核;
- 记录每次输入、工具调用、文件版本和结论。
这里最危险的设计,是让 Agent 在没有边界的情况下不断修改网格、材料或收敛参数,直到获得一个“看起来合理”的结果。生产环境至少应设置三类闸门:
- 物理闸门:材料、单位、载荷和边界条件必须通过规则校验;
- 资源闸门:限制迭代次数、网格规模、CPU 时间和并发任务数;
- 审批闸门:涉及模型简化、接触关系或验收结论时要求工程师确认。
Agent 的价值不是替工程师签字,而是把每次尝试变成有记录、可复现的工程过程。
MCP 的意义:让模型通过统一方式发现和调用工具
CAE 工作流往往横跨 CAD、网格工具、多个商业或开源求解器、Python 脚本以及报告系统。传统集成通常为每组软件编写专用胶水代码,接口升级后还要逐一维护。
MCP 所代表的思路,是把工具能力、参数描述和调用结果放进统一交互边界。对 CAE 平台而言,可以将能力拆成清晰的小工具,例如:
inspect_geometry:读取几何元数据;generate_mesh:按受控参数生成网格;run_solver:提交求解任务并返回任务编号;get_job_status:读取计算状态和日志;extract_result:提取位移、应力或温度指标;build_report:根据结果文件生成报告草稿。
工具接口统一并不等于底层求解器统一。不同软件的单位体系、材料模型、实体命名和许可证限制仍然存在。适配层需要显式处理这些差异,不能把它们交给大模型猜测。
可以这样实践:先搭一个可审计的最小工作流
下面是一个可直接运行的 Python 示例。它不依赖真实 CAE 软件,而是模拟“校验配置、调用求解器、提取结果”的 Agent 工具链。假设后续接入实际平台时,将 run_solver 替换为 FastCAE、企业求解服务或命令行求解器的适配器。
运行前准备 Python 3.10 或更高版本,将代码保存为 cae_agent_demo.py,然后执行 python cae_agent_demo.py。
from __future__ import annotations
import json
import subprocess
import sys
import tempfile
from pathlib import Path
from typing import Any
ALLOWED_MATERIALS = {"aluminum_6061_t6", "steel_q235"}
MAX_FORCE_N = 100_000
def validate_task(task: dict[str, Any]) -> None:
if task.get("analysis_type") != "static_structural":
raise ValueError("Only static_structural is allowed in this demo")
if task.get("material") not in ALLOWED_MATERIALS:
raise ValueError("Material is not in the controlled catalog")
load = task.get("load", {})
if load.get("unit") != "N":
raise ValueError("Force must use N")
force = load.get("magnitude")
if not isinstance(force, (int, float)) or not 0 < force <= MAX_FORCE_N:
raise ValueError(f"Force must be between 0 and {MAX_FORCE_N} N")
def run_solver(task: dict[str, Any], workdir: Path) -> Path:
# 用子进程模拟外部求解器;生产环境应替换为真实适配器。
script = """
import json
import sys
from pathlib import Path
task = json.loads(Path(sys.argv[1]).read_text(encoding='utf-8'))
force = task['load']['magnitude']
result = {
'solver_status': 'converged',
'max_displacement_mm': round(force / 20000, 4),
'max_von_mises_stress_mpa': round(force / 80, 2),
'warning': 'Synthetic result for workflow testing only'
}
Path(sys.argv[2]).write_text(json.dumps(result, indent=2), encoding='utf-8')
"""
task_file = workdir / "task.json"
result_file = workdir / "result.json"
task_file.write_text(json.dumps(task, indent=2), encoding="utf-8")
subprocess.run(
[sys.executable, "-c", script, str(task_file), str(result_file)],
check=True,
timeout=30,
)
return result_file
def main() -> None:
task = {
"analysis_type": "static_structural",
"geometry": "bracket.step",
"material": "aluminum_6061_t6",
"load": {"magnitude": 8000, "unit": "N"},
}
validate_task(task)
with tempfile.TemporaryDirectory() as directory:
result_file = run_solver(task, Path(directory))
result = json.loads(result_file.read_text(encoding="utf-8"))
if result["solver_status"] != "converged":
raise RuntimeError("Solver did not converge; manual review required")
print(json.dumps({"task": task, "result": result}, indent=2))
if __name__ == "__main__":
main()
这个示例刻意把大模型排除在数值计算之外。接入模型时,可以让模型只负责生成 task JSON,随后继续使用同一套 validate_task 和 run_solver。还应为每次运行保存提示词版本、模型名称、结构化输入、适配器版本、求解日志和结果文件哈希。
如果要暴露为 MCP 工具,可以将函数边界设计成稳定的结构化契约。下面是一个概念性工具定义,字段需要按所采用的 MCP SDK 调整:
{
"name": "run_static_structural_analysis",
"description": "Submit an approved static structural analysis task",
"inputSchema": {
"type": "object",
"required": ["geometry", "material", "force_n", "approval_id"],
"properties": {
"geometry": {"type": "string"},
"material": {"type": "string", "enum": ["aluminum_6061_t6", "steel_q235"]},
"force_n": {"type": "number", "exclusiveMinimum": 0, "maximum": 100000},
"approval_id": {"type": "string"}
},
"additionalProperties": false
}
}
approval_id 很重要:它把“模型决定运行”改成“模型提交已经批准的任务”,适合高成本或高风险计算。
落地时先检查四件事
AI 进入 CAE 平台时,不宜一开始就追求完全自主。更现实的路径是从结果检索、脚本生成和报告整理等低风险环节起步,再逐步开放网格生成和求解器调用。
上线前可以检查以下四项:
- 任务是否结构化:自然语言必须转换为有类型、有单位、有范围的字段;
- 工具是否最小授权:读取结果和提交计算应使用不同权限,删除文件等高风险能力不应默认开放;
- 过程是否可复现:保存几何版本、配置、软件版本、随机种子、日志和结果校验值;
- 结论是否有人负责:AI 生成的报告必须区分计算事实、模型解释和工程师批准的结论。
大模型、Agent 和 MCP 可以显著降低 CAE 工具链的操作成本,但它们不会自动消除错误建模、错误边界条件和不收敛等工程风险。真正可用的 AI CAE 系统,应当把智能能力放进受控流程:模型负责理解和编排,规则负责约束,求解器负责计算,工程师负责最终判断。