Revit und MCP Erfahren Sie mehr über LLM+Revit 2 anhand von Fallstudien: Realisieren Sie mehrere Gedankenketten

 

Dieser Artikel wurde auf Chinesisch verfasst und veröffentlicht und ist eine übersetzte Version Originals. 

 

Im vorherigen Artikel wurden der technische Weg und die Implementierungsfälle von MCP vorgestellt, und in diesem Artikel wird untersucht, wie der Fall in mehreren Denkrunden verbessert werden kann. Um immer noch die Wand als Beispiel zu nehmen, möchte ich dieses Mal nicht, dass die Benutzer an der Interaktion teilnehmen, sondern versuchen, den Computer die Berechnung automatisch durchführen zu lassen. Die Anforderung wurde von "Wand erstellen - > Benutzer wählt eine Wand aus - >Türen und Fenster an zufälligen Stellen einfügen" geändert in: LLM berechnet automatisch Wandkoordinaten und fügt an jeder Wand unterschiedliche Formen ein. Der folgende Inhalt konzentriert sich auf die sofortige Änderung und Codeanpassung in mehreren Denkrunden. 

 

Das Gehäuse entfaltet sich 

Adresse 

Github:[https://github.com/imkcrevit/RevitMCP_Blog/tree/main](https://github.com/imkcrevit/RevitMCP_Blog/tre...) 

 

prompt 

Der Code dieses Projekts hat sich nicht wesentlich geändert, hauptsächlich wurde die Beschreibungsmethode optimiert, damit das LLM die Toolausführung verstehen und genau aufrufen kann. Der folgende Inhalt stellt hauptsächlich die logische Anpassung vor, wenn ein einfacher Fall in ein Format mit mehreren Gedankenketten geändert wird. 

 

Schritte 

  1. Testen Sie zunächst in MCP.Client, geben Sie einen Absatz ein und prüfen Sie, ob das LLM mehrere Tools analysieren kann: 

Erstellen Sie einen Satz von Wänden, die Wandpositionierungslinie muss eine geschlossene Grafik sein und nicht weniger als drei, die Mindestlänge beträgt 10000 mm, die Wandhöhe beträgt standardmäßig 3000, und dann wird das Fenster an der zufälligen Position der Wand in das Fenster eingefügt, nachdem die Wand erstellt wurde, und die Fensterkoordinaten jeder Wand sind inkonsistent, und die Anforderung darf die Wandhöhe nicht überschreiten. 

Sie können sehen, dass es sich bei der Ausgabe um zwei Tools handelt, was beweist, dass die Beschreibung vom LLM korrekt geparst und verschiedenen Tools zugewiesen werden kann. 

joaquimmoral_5-1754644258688.png

 

 

  1. Im weiteren Verlauf des Tests definiert die obige Eingabeaufforderung "eine Reihe von Wänden" nicht eindeutig, was dazu führt, dass der LLM sie als eine Wand erkennt, die nicht den Erwartungen entspricht. Nach dem Ändern der Eingabeaufforderung wurden nicht weniger als drei Einschränkungen hinzugefügt, siehe Screenshot unten: 

Erstellen Sie einen Satz von Wänden, die Wandpositionierungslinie muss eine geschlossene Grafik sein und nicht weniger als drei, die Mindestlänge beträgt 10000 mm, die Wandhöhe beträgt standardmäßig 3000, und fügen Sie dann das Fenster an der zufälligen Position der Wand ein, nachdem Sie die Wand erstellt haben, und die Fensterkoordinaten jeder Wand sind inkonsistent, und die Anforderung darf die Wandhöhe nicht überschreiten. 

 

Das LLM hat drei Wandsätze erstellt, was beweist, dass das vorherige "ein Satz entspricht einer Wand" durch ungenaue Beschreibungen verursacht wurde. 

Das LLM generiert drei Wandsätze, und Werkzeuge werden zu einer Liste mit drei Elementen. 

joaquimmoral_6-1754644258688.png

 

 

Zu diesem Zeitpunkt stehen wir vor dem Problem, wie wir die Türen und Fenster genau in die angegebene Wand einfügen können, und da wir die rechtzeitig erstellte Wand-ID nicht erhalten können, können wir sie nur durch Zahlen ersetzen. 

joaquimmoral_7-1754644258689.png

 

 

  1. Da die ID nicht übergeben werden kann, handelt es sich um eine ganze Gedankenkette, bei der nicht auf den Abschluss der Erstellung oder die Benutzerauswahl gewartet werden muss. Folgende Optionen stehen zur Verfügung: 
  1. Fügen Sie uniqueId basierend auf dem GUID-Format als eindeutigen Bezeichner hinzu, und übergeben Sie eine Formularkombination als Hostbasis (dieses Projekt übernimmt dieses Schema) 
  1. Nach jeder Erstellung wird die Komponenten-ID zurückgegeben und durch das nächste Chain of Thought Binding Tool als Datenquelle ersetzt. 

Ändern Sie die Eingabeaufforderung so, dass der Schwerpunkt auf dem Generieren und Übergeben einer eindeutigen Kennung liegt: 

 

Erstellen Sie einen Satz Wände, die Wandpositionierungslinie muss eine geschlossene Grafik sein und nicht weniger als drei und hat eine eindeutige Kennung, das GUID-Format, nehmen Sie es als ID, die Mindestlänge beträgt 10000 mm, die Wandhöhe beträgt standardmäßig 3000, und fügen Sie dann das Fenster an der zufälligen Position der Wand ein, nachdem Sie die Wand erstellt haben, die Fensterkoordinaten jeder Wand sind inkonsistent, und die Anforderung kann die Höhe der Wand nicht überschreiten, verstehen Sie meine Absicht genau und teilen Sie sie auf, um die Funktion nacheinander in der entsprechenden Reihenfolge aufzurufen 

 

Zu diesem Zeitpunkt hat sich die eId in den generierten Daten nicht geändert, was darauf hindeutet, dass der LLM die Absicht nicht versteht. Sie müssen die Beschreibung des Tools auf dem Server ändern und die Systemeinstellungen so anpassen, dass es weiß, dass die eindeutige Kennung im GUID-Format vorliegt. 

Ändern Sie auf der Serverseite die Create-Beschreibung so, dass der LLM die UniqueId beim Durchlaufen des Werkzeugs eindeutig übergibt: 

[McpServerTool(Name = "CreateWall"),  

Description("Generation Paramaters That Can Create Wall in Revit ,  

If User Want To Generation eId , 

 You Need To Generation a unique id base this :0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2 ")] 

 

Auf der Systemseite wird auch die Definition eines eindeutigen Identifikators betont: 

"""you are a professional enginer in BIM , 

 so you can select the greate tool to user , 

 also has a good develop tech in code ,  

and generation a standard input style And Arguments to tools ,  

also if some question need unique id you will generate a unique eId in this talk ,  

the example :0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2""" 

 

Das endgültige Ausgabeergebnis ist immer noch eId = 2, da das Format des Eingabeparameters der Methode int ist und der LLM uniqueId als int-Format basierend auf Parametern ausgibt und der Methodenparametertyp geändert werden muss: 

public string RevitCreateWallTool(string command, double x, double y, double z, double x1, double y2, string uniqueId) {  

return $@" {{  

""command"": ""CreateWall"",  

""arguments"": {{ ""start"": [{x}, {y}, {z}],  

""end"": [{x1}, {y2}, {z}], ""eId"": ""{uniqueId}"" }} }}";  

} 

 

  1. Testen Sie die Eingabeanweisung erneut, und stellen Sie fest, dass die ID korrekt zugewiesen wurde, die vom LLM generierte Wand jedoch nicht geschlossen ist, was zu abnormalen Daten führt. LLMs sind in der 2D-Leistung noch nicht ausgereift und können keine 2D- oder 3D-Grafiken wie Menschen simulieren. Sie können der Eingabe eine detaillierte Beschreibung hinzufügen. 

joaquimmoral_8-1754644258689.png

 

 

  • Es wurden Einschränkungen für die Abschlussdefinition (End-to-End-Schnittmenge) hinzugefügt, und das Ergebnis entsprach den Anforderungen. 
  • Die Entsprechung zwischen der Form und der Wand wird hinzugefügt, und die Projektionspunkte für die mathematische Sprache und die Koordinaten befinden sich auf dem Wandliniensegment, um eine genaue Berechnung zu gewährleisten. 
  • Die optimierte Eingabeaufforderung lautet wie folgt: 

 

Eine Wand entspricht einem Fenster und hat eine eindeutige Kennung im Format: eId = 0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2, die Daten werden streng nach diesem Format generiert und können nicht wiederholt werden, erstellen Sie eine Gruppe von Wänden, die Wandpositionierungslinie muss eine geschlossene Figur sein, die Koordinatenlinien sind in einer geraden Linie miteinander verbunden, die erste ist konsistent mit der letzten und nicht weniger als drei, die Mindestlänge beträgt 10000 mm und die Wandhöhe beträgt standardmäßig 3000, Nach dem Erstellen der Wand wird das Fenster an der zufälligen Position der Wand in das Fenster eingefügt, der Positionierungspunkt des Fensters muss auf der generierten Wandpositionierungslinie liegen, die Berechnungsformel lautet: Der Projektionspunkt der Form muss auf dem Liniensegment liegen, das durch das Ende der Wand verbunden ist, jede Wand entspricht einem Fenster, sie muss separat berechnet werden, die Fensterkoordinaten jeder Wand sind inkonsistent, die Anforderung darf die Höhe der Wand nicht überschreiten, verstehe meine Absicht genau und rechne in strikter Übereinstimmung mit den Anforderungen und teile die Funktion wiederum gemäß der entsprechenden Reihenfolge auf 

 

Beispielausgabe: 

Sample output: 

 

    [ 

         { 

              "command": "CreateWall", 

              "arguments": { 

                    "start": [0, 0, 0], 

                    "end": [10000, 0, 0], 

                    "eId": "0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2" 

              } 

         }, 

         { 

              "command": "CreateWall", 

              "arguments": { 

                    "start": [10000, 0, 0], 

                    "end": [10000, 10000, 0], 

                    "eId": "1A2B3C4D-5E6F-7G8H-9I10-11K12L13M14N" 

              } 

         }, 

         { 

              "command": "CreateWall", 

              "arguments": { 

                    "start": [10000, 10000, 0], 

                    "end": [0, 10000, 0], 

                    "eId": "15O16P17Q-18R19S-20T21U-22V23W-24X25Y26Z" 

              } 

         }, 

         { 

              "command": "CreateWall", 

              "arguments": { 

                    "start": [0, 10000, 0], 

                    "end": [0, 0, 0], 

                    "eId": "27A28B29C-30D31E-32F33G-34H35I-36J37K38L" 

              } 

         }, 

         { 

              "command": "InsertWindowInWall", 

              "arguments": { 

                    "eId" : "0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2", 

                    "location": [5000,0,1500] 

              } 

         }, 

         { 

              "command": "InsertWindowInWall", 

              "arguments": { 

                    "eId" : "1A2B3C4D-5E6F-7G8H-9I10-11K12L13M14N", 

                    "location": [10000,5000,1500] 

              } 

         }, 

         { 

              "command": "InsertWindowInWall", 

              "arguments": { 

                    "eId" : "15O16P17Q-18R19S-20T21U-22V23W-24X25Y26Z", 

                    "location": [5000,10000,1500] 

              } 

         }, 

         { 

              "command": "InsertWindowInWall", 

              "arguments": { 

                    "eId" : "27A28B29C-30D31E-32F33G-34H35I-36J37K38L", 

                    "location": [0,5000,1500] 

              } 

         } 

    ] 

 

 

Effekt 

> beachten Sie, dass das Video im ursprünglichen Beitrag ersetzt werden muss 

 

Zusammenfassung 

Wenn die Anzahl der Wände auf fünf erhöht wird, tritt ein Fehler auf, der nur durch Ende zu Ende definiert wird, und das LLM ist bei der 2D-Datenverarbeitung immer noch unzureichend. Bei solchen Szenarien, die kontinuierlich in Revit erstellt werden müssen, insbesondere wenn es sich um räumliche 2D/3D-Beziehungen handelt, ist die LLM-Leistung eingeschränkt. Die Genauigkeit kann durch die Optimierung von Eingabeaufforderungen verbessert werden, und LLMs können nach der Optimierung in Zukunft eine bessere Leistung erbringen. Beispiele zeigen, dass die logische Überprüfung verwendet werden kann, um mehr Anwendungen über MCP zu erreichen, z. B. das Bestimmen mehrerer Spezifikationsbedingungen und das Erstellen von Identitäten. Der Code wurde mit Github synchronisiert, kann gerne heruntergeladen und erweitert werden, der Artikel beweist hauptsächlich die technische Machbarkeit, und die spezifische Anwendung muss mit der tatsächlichen Arbeit kombiniert werden. 

joaquimmoral_9-1754644258689.png

 

 

Dieser Artikel wurde auf Chinesisch verfasst und veröffentlicht und ist eine übersetzte Version Originals.