前言为什么我要写这篇文章最近在规划企业AI中台时我面临一个选择是用Dify、LangChain等开源框架快速搭建还是自研一套更贴合业务的技术方案经过深入调研和思考我选择了一条看起来更“笨”但长期更灵活的路——基于Palantir本体论思想自研一套本体驱动的Agent智能中台。本文不是广告也不是理论空谈而是一份可以直接落地的技术方案包含架构设计、目录结构、核心代码和落地路线图。希望能给同样在探索企业AI落地的同行一些参考。一、业务背景与核心诉求我们公司已有ERP、MES、PLM等成熟系统但存在一个典型问题数据分散查询困难。业务人员想查一个“本月产线3的良率为什么下降”需要在三个系统间来回切换手动导出数据、用Excel关联分析耗时半天。我们的目标是搭建一个统一的Web入口用户通过自然语言对话AI自动完成以下四件事智能检索跨系统找数据统计分析自动汇总计算根因分析找出问题原因行动建议给出可执行方案核心理念不是预设工作流写死A→B→C而是基于本体论Ontology配置业务知识让AI自主决策该查什么、怎么查、用什么API。二、为什么放弃纯工作流编排方案一开始我考虑过Dify这类工作流编排工具但很快意识到一个问题对比项工作流编排本体论驱动本文方案路径确定方式人工预设每一步AI实时推理决策遇到未覆盖问题报错或答不上来AI尝试组合现有工具解决新增业务场景新增一条工作流分支只需更新本体定义维护成本随场景增多线性增长随本体完善趋于稳定是否“写死”✅ 本质是If-Else升级版❌ 真正的智能体结论工作流编排适合流程固定、场景有限的RPA类需求而我们想要的是真正的AI智能体。三、整体架构设计3.1 四层架构┌─────────────────────────────────────────────────────────┐ │ Web 对话入口 │ │ Streamlit / FastAPI HTML │ ├─────────────────────────────────────────────────────────┤ │ Agent 自主决策层 │ │ LangChain ReAct Agent LLM │ │ 思考 → 选择工具 → 调用API → 分析 → 建议 │ ├─────────────────────────────────────────────────────────┤ │ 本体论语义层 │ │ skill.md references/*.md业务概念地图 │ │ 实体定义 | 属性 | 关联关系 | API清单 | 权限 | 规则 │ ├─────────────────────────────────────────────────────────┤ │ 数据与API层 │ │ ERP API │ MES API │ PLM API │ 其他系统 │ └─────────────────────────────────────────────────────────┘3.2 核心设计理念把业务知识从代码中剥离出来放到本体文件中。业务人员可以直接阅读和修改skill.md和references/*.md而不需要懂代码。Agent启动时自动加载这些本体文件就像给AI配备了一张完整的业务地图。用户提问后AI自己在地图上找路、决定调用哪些API、以什么顺序组合。四、目录结构与文件规范/ai-agent-platform ├── /agent_core │ ├── agent.py # 主Agent逻辑ReAct循环 │ ├── tool_retriever.py # 根据问题检索相关工具 │ └── llm_client.py # LLM客户端封装 │ ├── /web_ui │ ├── app.py # FastAPI服务 │ └── templates/ # 前端页面 │ ├── /ontology # ⭐ 核心本体定义目录 │ ├── skill.md # 系统总览给Agent的目录 │ └── /references │ ├── erp.md # ERP实体、属性、API │ ├── mes.md # MES实体、属性、API │ ├── plm.md # PLM实体、属性、API │ └── cross_system.md # 跨系统关联规则 │ └── /api_proxy # 统一API网关鉴权、路由五、核心文件内容示例5.1skill.md—— 系统总览# 企业AI智能中台 - 本体总览 ## 系统清单 | 系统 | 简称 | 核心职责 | |------|------|----------| | ERP | 企业资源计划 | 订单、库存、采购、财务 | | MES | 制造执行系统 | 工单、良率、设备状态、产线 | | PLM | 产品生命周期管理 | BOM、物料规格、设计变更 | ## 核心业务实体跨系统 - **物料Material**ERP有库存PLM有规格MES有消耗 - **工单WorkOrder**ERP下达MES执行PLM关联BOM - **设备Equipment**MES采集状态PLM记录维护 ## 典型分析场景 - 本月良率下降原因 → MES良率 ERP物料批次 PLM设备维护 - A物料够不够生产 → ERP库存 MES消耗速率 PLM BOM用量5.2references/erp.md—— 详细本体定义# ERP系统 - 本体定义 ## 实体Material物料 - **属性** - materialCodestring唯一标识 - namestring - safetyStockfloat安全库存 - **链接** - consumedBy → MES.WorkOrder - belongsToBOM → PLM.BOM - **权限**所有用户可查库存仅采购可修改 ## API列表 | API名称 | 端点 | 方法 | 参数 | 返回 | |---------|------|------|------|------| | 查询库存 | /api/erp/inventory | GET | materialCode | {quantity, warehouse} | | 查询采购单 | /api/erp/purchase | GET | supplier? status? | [PurchaseOrder] | ## 业务规则 - 安全库存预警inventory safetyStock → 建议补货5.3references/cross_system.md—— 跨系统关联# 跨系统关联规则 ## 实体映射 | 业务概念 | ERP | MES | PLM | |---------|-----|-----|-----| | 物料编码 | materialCode | materialId | partNumber | ## 关联查询规则 - 查询工单物料消耗MES.WorkOrder.materialId → ERP.Material.materialCode → 查库存 - BOM展开ERP.Material → PLM.BOM.partNumber → 子物料列表六、核心代码实现6.1 Agent核心逻辑agent.pyimportosimportjsonfromlangchain.agentsimportcreate_react_agent,AgentExecutorfromlangchain.toolsimportToolfromlangchain_openaiimportChatOpenAIfromlangchain.promptsimportPromptTemplatefromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModel# 1. 加载本体文件 defload_ontology():加载 skill.md 和所有 references/*.mdwithopen(ontology/skill.md,r,encodingutf-8)asf:skill_contentf.read()refs{}ref_dirontology/referencesforfileinos.listdir(ref_dir):iffile.endswith(.md):withopen(f{ref_dir}/{file},r,encodingutf-8)asf:refs[file]f.read()returnskill_content,refs# 2. 从本体动态生成工具 defbuild_tools_from_ontology():解析 references/*.md 中的 API列表自动生成 LangChain Toolstools[]# 这里简化演示实际需解析Markdown中的API表格# 真实场景遍历所有reference文件提取API定义# 然后为每个API生成一个Tool函数# 示例手动创建一个库存查询Tooldefquery_inventory(material_code:str)-str:查询物料库存参数material_code为物料编码# 实际调用ERP APIresponserequests.get(fhttp://erp.internal/api/inventory?code{material_code},headers{Authorization:os.getenv(ERP_TOKEN)})returnresponse.text tools.append(Tool(namequery_inventory,funcquery_inventory,description查询物料库存输入物料编码返回库存数量和仓库位置))# 更多工具通过解析本体文件自动生成...returntools# 3. 创建Agent defcreate_agent():skill_content,refsload_ontology()llmChatOpenAI(modeldeepseek-chat,# 或 gpt-4api_keyos.getenv(LLM_API_KEY),base_urlos.getenv(LLM_BASE_URL))toolsbuild_tools_from_ontology()# 系统提示词将skill.md作为业务上下文注入system_promptf{skill_content}你是一个企业智能助手拥有以下工具 {{tools}} 请遵循ReAct模式思考→行动→观察 1. Thought理解用户问题确定需要哪些数据 2. Action选择并调用合适的工具 3. Observation分析工具返回的结果 4. 重复1-3直到信息充足 5. 最终给出结论和行动建议 用户权限已在API调用时自动校验你无需担心。 promptPromptTemplate.from_template(system_prompt)agentcreate_react_agent(llm,tools,prompt)returnAgentExecutor(agentagent,toolstools,verboseTrue)# 4. Web接口 appFastAPI(titleAI智能中台)agentcreate_agent()classChatRequest(BaseModel):question:struser_id:strapp.post(/chat)defchat(request:ChatRequest):try:# 注入用户身份用于后续权限控制responseagent.invoke({input:request.question,user_id:request.user_id})return{code:0,data:{answer:response[output],steps:response.get(intermediate_steps,[])}}exceptExceptionase:return{code:-1,message:str(e)}# 5. 启动服务 if__name____main__:importuvicorn uvicorn.run(app,host0.0.0.0,port8080)6.2 前端页面templates/chat.html!DOCTYPEhtmlhtmlheadmetacharsetUTF-8titleAI智能中台/titlestylebody{font-family:Arial;max-width:800px;margin:0 auto;padding:20px;}#chat-box{height:500px;overflow-y:auto;border:1px solid #ddd;padding:15px;border-radius:8px;}.user{text-align:right;color:#1890ff;margin:10px 0;}.assistant{text-align:left;color:#333;margin:10px 0;background:#f5f5f5;padding:10px;border-radius:8px;}#input-area{display:flex;margin-top:15px;gap:10px;}#question{flex:1;padding:12px;border:1px solid #ddd;border-radius:8px;font-size:16px;}#send{padding:12px 30px;background:#1890ff;color:white;border:none;border-radius:8px;cursor:pointer;}.loading{color:#999;font-style:italic;}/style/headbodyh1 AI智能中台/h1pstylecolor:#666;用自然语言提问AI自动跨系统检索、分析、给出建议/pdividchat-box/divdividinput-areainputtypetextidquestionplaceholder例如本月产线3的良率为什么下降了buttonidsendonclicksendQuestion()发送/button/divscriptasyncfunctionsendQuestion(){constinputdocument.getElementById(question);constchatBoxdocument.getElementById(chat-box);constquestioninput.value.trim();if(!question)return;// 显示用户消息chatBox.innerHTMLdiv classuser${question}/div;input.value;// 显示加载状态constloadingIdDate.now();chatBox.innerHTMLdiv classassistant loading idloading-${loadingId} 思考中.../div;chatBox.scrollTopchatBox.scrollHeight;try{constrespawaitfetch(/chat,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({question,user_id:demo_user})});constresultawaitresp.json();// 移除加载状态document.getElementById(loading-${loadingId}).remove();if(result.code0){chatBox.innerHTMLdiv classassistant${result.data.answer}/div;}else{chatBox.innerHTMLdiv classassistant❌ 错误${result.message}/div;}}catch(e){document.getElementById(loading-${loadingId}).remove();chatBox.innerHTMLdiv classassistant❌ 网络错误请稍后重试/div;}chatBox.scrollTopchatBox.scrollHeight;}document.getElementById(question).addEventListener(keydown,(e){if(e.keyEnter)sendQuestion();});/script/body/html七、落地路线图5周计划阶段时间目标交付物Demo验证第1周接ERP 2-3个API跑通问库存→调API→回答可演示的对话原型本体完善第2周补全ERP/MES/PLM的references文件完整本体定义Agent优化第3周调整Prompt加入错误处理、重试机制稳定版Agent权限安全第4周接入企业SSOAPI调用注入用户身份安全合规版本上线推广第5周业务试用迭代本体定义生产可用版本八、关键注意事项8.1 本体质量决定Agent上限本体文件写得越清楚Agent越聪明。建议拉着业务人员生产主管、采购经理一起写他们用业务语言描述怎么看数据你负责转译成本体格式。8.2 API规范化是前置条件各系统API必须有清晰文档至少是Swagger/OpenAPI格式参数命名统一。否则Agent无法理解API的用途和参数含义。8.3 数据不迁移只做联邦查询ERP/MES/PLM的数据留在原系统通过API或只读视图暴露避免数据迁移风险。8.4 分阶段开放能力第一阶段只读检索统计第二阶段分析建议第三阶段自动执行需要严格审批流九、方案优势总结对比维度商业套件如Palantir开源框架如Dify本方案成本极高千万级免费免费仅LLM API费用灵活性受限于产品功能受限于框架设计完全自主控制本体驱动✅ 原生支持❌ 需二次开发✅ 自主实现业务人员可维护✅ 图形化编辑❌ 需改代码✅ 编辑Markdown即可数据主权数据上云可私有化完全本地私有十、总结本文分享的方案本质上是用AI编程工具Cursor 本体论思想 Agent模式自研一套企业级AI智能中台。核心亮点在于把业务知识从代码中剥离到本体文件业务人员可直接维护Agent自主决策而非预设工作流真正实现智能化完全开源私有化部署过程数据不出企业