Plant Memory: Technical Language Processing and a Verified Maintenance Ontology for Agent-Accessible Failure Knowledge from SAP PM Work Orders
Organizations: M.Tech, School of Artificial Intelligence and Data Science, Indian Institute of Technology Jodhpur
Abstract
Maintenance work orders are the largest written record of how industrial equipment fails, yet in most plants they are close to unusable for analysis. Short texts are abbreviated and misspelt, asset identity is buried in free text, work-type labels contradict the work described, and the fields that matter most for reliability (symptom, root cause, action taken) are usually empty. As a result, diagnostic knowledge stays with senior technicians and leaves when they do. We present Plant Memory, a system that applies technical language processing (TLP) to SAP Plant Maintenance (PM) exports and builds an ISO 14224-aligned maintenance ontology in which every extracted statement is a reified fact carrying a confidence score, the evidence it was read from, and a verification state. Extraction is rule-first, with an optional large language model (LLM) acting as a second reader whose disagreements raise a fact's review priority rather than overwrite it. Technicians verify facts through a review queue, answer targeted knowledge-gap questions where failures repeat without a recorded cause, and approve or reject ontology drift proposals when new terms appear. The resulting graph is served to people through a web application and to AI agents through a Model Context Protocol (MCP) server, so both query the same verified knowledge and every answer cites the work orders behind it. On a synthetic 12-month export of 400 work orders from a parboiled-rice plant, rule-based extraction reaches 96.2% component accuracy, 88.9% failure-mode accuracy and 100% root-cause precision at 62% coverage; on 28 diagnostic questions, ranked root causes from the ontology are correct at top-1 in 82.1% of cases against 53.6% for the raw SAP root-cause column.
Figures & tables
| Class | Role and examples |
|---|---|
| ProcessArea | Top of the asset hierarchy: parboiling, paddy-to-rice milling, utilities, packing, warehouse |
| Asset | Maintainable item with a functional location, class and shop-floor aliases (e.g. Dryer elevator , alias “LSU elev”) |
| Component | Part of an asset: bearing, V-belt, sprocket, plummer block, rubber roll, mechanical seal |
| SparePart | SAP material that realises a component type, with material code and unit cost |
| Symptom | Observation: abnormal noise, vibration, belt slip, tripping, reduced output |
| FailureMode | ISO 14224-aligned, with mechanism code: bearing wear (2.4 Wear), belt slippage (1.5 Looseness), seal leakage (1.1 Leakage) |
| Tool | Returns |
|---|---|
| list_assets | Assets by process area, with order and failure counts |
| get_asset_history | Orders for an asset with extracted facts, statuses, cost and downtime |
| suggest_root_causes | Ranked causes with scores, confidence bands, evidence orders and technician statements |
| find_similar_failures | BM25 matches for a free-text description, with causes, actions and parts |
| rank_bad_actors | Pareto by cost, downtime or frequency |
| detect_recurrence | Repeat failures within a window |
| Layer | Technology |
|---|---|
| Core and pipeline | Python 3.10+, pandas, openpyxl, rule-based TLP, BM25 |
| LLM extraction | Any OpenAI-compatible API via httpx; evaluated with openai/gpt-oss-120b on Groq; local models via Ollama |
| Knowledge graph | Neo4j 5 (property graph, Cypher) or SQLite; RDF/Turtle export with rdflib; OWL 2 schema |
| Agent interface | Model Context Protocol server (Python MCP SDK, stdio transport) |
| Web API | FastAPI, Uvicorn, background build jobs |
| Web application | React 18, TypeScript, Vite, Cytoscape.js |
| Field | Events | Coverage | Precision | Accuracy | Macro F1 |
|---|---|---|---|---|---|
| Asset | 400 | 1.000 | 1.000 | 1.000 | 1.000 |
| Component | 391 | 0.987 | 0.974 | 0.962 | 0.953 |
| Failure mode | 350 | 0.991 | 0.896 | 0.889 | 0.880 |
| Root cause | 350 | 0.620 | 1.000 | 0.620 | 0.805 |
| Action | 400 | 0.948 | 0.982 | 0.930 | 0.899 |
| Symptom | 357 | 0.608 | 0.982 | 0.597 | 0.767 |
| Answerer | Top-1 | Top-3 | Answers citing evidence |
|---|---|---|---|
| Raw SAP root-cause column | 0.536 | n/a | n/a |
| Plant Memory | 0.821 | 0.964 | 1.000 |
| Field | Rules | LLM alone | Rules + LLM (adopted policy) |
|---|---|---|---|
| Component | 96.2 | 87.2 | 96.2 |
| Failure mode | 88.9 | 55.4 | 88.9 |
| Root cause | 62.3 | 46.9 | n/r |
| Action | 93.0 | 92.5 | 95.0 |
| Symptom | 59.7 | 53.5 | 61.1 |
| Diagnosis top-1 | 82.1 | n/a | 82.1 |