Que fait P&ID vers graphe de connaissances ?
Le travail est réparti entre des scripts déterministes et vous :
- Les scripts classifient les pages (vectorielles vs scannées), les rendent sous forme de tuiles lisibles, collectent les indices OCR/texte, puis construisent, vérifient, stockent et interrogent le graphe.
- Vous lisez les dessins et écrivez un fichier d'extraction structuré par feuille. La reconnaissance des symboles et le tracé des lignes relèvent du raisonnement visuel, et c'est la partie que les scripts ne peuvent pas bien faire.
Tous les scripts se trouvent dans scripts/ à côté de ce fichier. Appelez-les par leur chemin complet (les commandes ci-dessous l'abrègent en scripts/), et conservez le répertoire de travail dans le dossier courant de l'utilisateur, par exemple work/<usine>.
Installation. De nombreux utilisateurs sont des ingénieurs, pas des programmeurs, alors gérez l'installation vous-même. Les scripts nécessitent Python 3.10+. Avant la première exécution, installez les dépendances avec pip install -r <dossier du skill>/scripts/requirements.txt (utilisez un environnement virtuel si le Python de l'utilisateur est partagé avec d'autres travaux). Si Python est manquant, dites à l'utilisateur de l'installer depuis python.org et arrêtez-vous là.
Règles de base
- Seulement les pages P&ID. Les dessins se trouvent souvent dans un long rapport de permis ou de conception. Si l'utilisateur nomme les pages, passez-les avec
--pages. Sinon, et si le PDF a plus de quelques pages, explorez-le, regardez les aperçus des pages ou demandez à l'utilisateur, puis relancez l'exploration avec--pagesafin que les étapes suivantes ignorent les rapports, les légendes et les dessins non P&ID. - Une usine, un répertoire de travail, un graphe. Ne placez jamais des feuilles de différentes usines dans le même répertoire de travail : les étiquettes fusionneraient entre des usines non liées. Si l'utilisateur fournit plusieurs usines, exécutez l'ensemble du flux de travail séparément pour chacune.
- Une configuration par graphe. Si le PDF contient deux révisions du même dessin (même titre ou même zone, étiquettes qui se chevauchent, par exemple un plan "tel que construit" et une ébauche plus ancienne), ne les fusionnez pas. Demandez à l'utilisateur quelle révision utiliser, extrayez uniquement celle-ci, et enregistrez les pages exclues ainsi que la raison dans le rapport. L'assurance qualité signale les doublons probables comme
possible_duplicate_revision. Enregistrez leissue_statusde chaque feuille à partir du cartouche ou des tampons. - Enregistrez uniquement ce qui est dessiné. N'inventez jamais d'étiquettes, de connexions ou de boucles pour rendre le graphe complet. Tout ce qui n'est pas clair est placé avec une
confidenceplus faible, ou dansunreadable. - La boucle de contrôle qualité n'est pas optionnelle. Reconstruisez jusqu'à ce qu'il n'y ait plus d'erreurs, et revérifiez chaque avertissement sur le dessin.
Flux de travail
Copiez cette liste de contrôle dans vos notes et cochez les éléments :
- [ ] 1. Exploration : python scripts/probe_pdf.py <pdf> --work <work> --plant-name "<nom>" [--pages 47-60]
- [ ] 2. Rendu : python scripts/render_pages.py <work>
- [ ] 3. Orientation : ouvrez chaque pages/page_NN/overview_grid.png ; corrigez la rotation si le texte n'est pas à l'endroit
- [ ] 4. Indices : python scripts/make_hints.py <work>
- [ ] 5. Extraction : pour chaque feuille, écrivez <work>/extract/page_NN.json (références/extraction_procedure.md)
- [ ] 6. Construction : python scripts/build_kg.py <work>
- [ ] 7. Boucle QA : corrigez chaque erreur, revérifiez chaque avertissement, reconstruisez (répétez)
- [ ] 8. Rapport : résumez les résultats et ouvrez des problèmes pour l'utilisateur
1. Exploration
probe_pdf.py attribue à chaque page une classe et une voie d'extraction, et écrit <work>/manifest.json. Avec --pages, les étapes suivantes ne rendent et ne lisent que ces pages.
| Classe | Signification | Voie |
|---|---|---|
vector_text | Dessin vectoriel avec couche de texte | Rendu depuis les vecteurs ; texte exact de la couche de texte comme indices |
vector_outlined | Dessin vectoriel, texte dessiné sous forme de contours (pas de couche de texte) | Rendu vectoriel haute résolution ; indices OCR |
raster | Image numérisée | Rendu en résolution native, agrandi et avec contraste renforcé ; indices OCR |
raster_with_text | Numérisation avec une couche de texte OCR | Comme raster ; couche de texte comme indices (non fiables) |
hybrid | Vecteurs plus grandes images | Les deux voies |
Rapportez le résultat de l'exploration à l'utilisateur en une ligne, par exemple "14 feuilles vectorielles avec texte en contours."
Une faible résolution de numérisation est signalée dans les notes. Attendez-vous à enregistrer plus d'éléments dans unreadable sur ces feuilles.
2–3. Rendu et vérification de l'orientation
render_pages.py écrit ce qui suit pour chaque page :
overview.pngoverview_grid.png, qui montre les noms des tuiles- des tuiles qui se chevauchent dans
tiles/ tiles.json, qui enregistre quelles tuiles sont vides
L'orientation est détectée par OCR lorsqu'il est installé. Confirmez-la toujours sur overview_grid.png. Si le texte principal du dessin n'est pas à l'endroit, refaites le rendu de cette page avec une rotation explicite, donnée dans le sens horaire : render_pages.py <work> --pages N --rotation 90.
Les cartouches sont parfois orientés différemment du dessin. Orientez-vous par les étiquettes du dessin, pas par le cartouche.
4. Indices
make_hints.py écrit hints/page_NN.json. Chaque fichier contient des étiquettes candidates avec des positions de page, provenant de la couche de texte ou de l'OCR. Ce ne sont que des indices : l'OCR fait des erreurs de lecture et omet des choses. Vous n'avez pas besoin de lire les fichiers d'indices pendant l'extraction. L'assurance qualité les utilise pour signaler les étiquettes que vous avez peut-être manquées. Si l'OCR n'est pas installé, l'étape est ignorée ; notez-le dans le rapport final.
5. Extraire chaque feuille
C'est le cœur du travail. Suivez exactement la références/extraction_procedure.md. Elle couvre :
- l'ordre de lecture : aperçu, puis chaque tuile non vide, puis les recadrages zoomés
- comment modéliser les conduites, les tés, les prises, les signaux et les connecteurs hors page
- l'étalonnage de la confiance
- une liste d'auto-vérification à exécuter avant d'enregistrer
Documentation de référence, à lire si nécessaire :
- références/isa_5_1.md : codes de lettres d'instruments, symboles de bulles, types de lignes de signaux
- références/symbol_guide.md : comment les symboles d'équipement et de vanne correspondent aux valeurs
kind - références/ontology.md : les types de nœuds et de relations du graphe et comment ils sont dérivés
references/schema/extraction.schema.json: le schéma JSON exact d'un fichier de page
Écrivez extract/page_NN.json et enregistrez-le avant de commencer la feuille suivante, afin qu'un long travail ne contienne jamais plus d'une feuille dans son contexte. Avec de nombreuses feuilles, et si votre environnement prend en charge les sous-agents, vous pouvez extraire des feuilles en parallèle. Donnez à chaque sous-agent le fichier de procédure et son propre répertoire de page.
6–7. Construction et boucle de contrôle qualité
build_kg.py valide chaque fichier de page et s'arrête avec un message précis en cas d'erreur de schéma. Il écrit ensuite ces fichiers dans <work>/kg/ :
graph.jsongraph.duckdbsummary.mdqa_report.md
Parcourez qa_report.md :
- Les erreurs, comme
unresolved_reference, sont des fautes dans les fichiers de page. Corrigez-les et reconstruisez. - Les avertissements nomment les tuiles à revérifier. Regardez à nouveau ces tuiles, ou utilisez
crop.pypour une vue zoomée, et corrigez l'extraction si le dessin montre quelque chose de différent. Avertissements courants :instrument_not_located: un capteur sansmeasuresequipment_not_connectedunmatched_off_pagepossible_missed_tags: une étiquette OCR qui n'est pas dans votre extractiontiles_not_reviewed
- Un avertissement qui s'avère correct sur le dessin peut être laissé tel quel. Exemples : un connecteur hors page dont l'autre dessin n'a pas été fourni, ou une erreur de lecture OCR. Listez-les dans votre rapport.
Arrêtez-vous lorsqu'il n'y a plus d'erreurs et que chaque avertissement a été vérifié.
python scripts/crop.py <work> --page 5 --bbox 0.40 0.20 0.55 0.35 # vue zoomée d'une région
8. Rapport
Dites à l'utilisateur :
- où se trouvent les sorties
- les chiffres clés (équipements, instruments, boucles)
- deux ou trois exemples de chemins d'écoulement et de boucles tirés de
summary.md - ce qui reste incertain
Renvoyez à qa_report.md pour les détails. Indiquez clairement que le graphe est extrait automatiquement et nécessite une revue d'ingénierie avant d'être utilisé pour la conception, l'exploitation ou la sécurité.
Utilisation du graphe
summary.mdest le contexte compact et économe en tokens pour un LLM : flux au niveau des équipements, un tableau des instruments avec leurs emplacements, et un tableau des boucles.graph.jsonest le graphe canonique, que tout outil peut lire.graph.duckdbest pour SQL. Ses vues sontequipment,equipment_flow,instruments,loopsetsignals, et ses macros de table sontupstream(id)etdownstream(id).
Utilisez kg_query.py pour répondre aux questions ; ajoutez --json lorsqu'un autre outil consommera la sortie :
python scripts/kg_query.py <work>/kg downstream 660-TK-001 --equipment
python scripts/kg_query.py <work>/kg upstream FV-0502
python scripts/kg_query.py <work>/kg path 660-TK-001 660-TK-004
python scripts/kg_query.py <work>/kg instruments --on 660-PP-011
python scripts/kg_query.py <work>/kg loop FIC-0502
python scripts/kg_query.py <work>/kg sql "SELECT * FROM equipment_flow"
Pour mesurer la qualité d'extraction sur une feuille, vérifiez-la manuellement dans un petit fichier de référence (format dans scripts/eval_kg.py) et exécutez python scripts/eval_kg.py <work>/kg gold.json : cela rapporte la précision/rappel des étiquettes, flux et boucles, ainsi que le placement des instruments.
Pour déplacer un graphe vers d'autres outils : python scripts/export.py <work>/kg graphml produit un fichier pour yEd, Gephi ou NetworkX, et python scripts/export.py <work>/kg neo4j produit des CSV plus un script d'importation Cypher.