Bu makale Çince yazılmış ve yayınlanmıştır ve burada orijinal çevrilmiş bir versiyonudur.
Önceki makale, MCP'nin teknik rotasını ve uygulama vakalarını tanıttı ve bu makale, birden fazla düşünme zinciri turu altında vakanın nasıl iyileştirileceğini inceleyecektir. Yine duvarı örnek alırsak, bu sefer kullanıcıların etkileşime katılmasını istemiyorum, bilgisayarın hesaplamayı otomatik olarak tamamlamasına izin vermeye çalışın. Gereksinim "Bir duvar oluştur - > kullanıcı bir duvar seçer - >Kapıları ve pencereleri rastgele yerlere yerleştirin" den şu şekilde değiştirildi: LLM duvar koordinatlarını otomatik olarak hesaplar ve her duvara farklı formlar ekler. Aşağıdaki içerik, birden fazla düşünce zinciri turu altında hızlı değişiklik ve kod ayarlamasına odaklanacaktır.
Dava ortaya çıkıyor
adres
Github:[https://github.com/imkcrevit/RevitMCP_Blog/tree/main](https://github.com/imkcrevit/RevitMCP_Blog/tre...)
Istemi
Bu projenin kodu çok fazla değişmedi, esas olarak açıklama yöntemini optimize etti, böylece LLM'nin Araç çalışmasını anlayabilmesi ve doğru bir şekilde çağırabilmesi için. Aşağıdaki içerik, temel olarak, basit bir durumu çok zincirli bir düşünce formatına değiştirirken yapılan mantıksal ayarlamayı tanıtmaktadır.
Adım -ları
- İlk olarak, MCP.Client'ta test edin, bir paragraf girin ve LLM'nin birden çok aracı ayrıştırıp ayrıştıramayacağına bakın:
Bir duvar seti oluşturun, duvar konumlandırma çizgisinin kapalı bir grafik olması ve üçten az olmaması gerekir, minimum uzunluk 10000 mm'dir, duvar yüksekliği varsayılan olarak 3000'dir ve ardından pencere, duvar oluşturulduktan sonra duvarın rastgele konumunda pencereye yerleştirilir ve her duvarın pencere koordinatları tutarsızdır ve gereksinim duvar yüksekliğini aşamaz.[Salt d\'ajustament del text]
Çıktının iki Araç olduğunu görebilirsiniz, bu da açıklamanın LLM tarafından doğru bir şekilde ayrıştırılabileceğini ve farklı araçlara atanabileceğini kanıtlayabilir.
- Teste devam ederken, yukarıdaki istem "bir dizi duvarı" açıkça tanımlamaz, bu da LLM'nin onu beklentilere uymayan bir duvar olarak tanımasına neden olur. İstemi değiştirdikten sonra, en az üç kısıtlama eklendi, aşağıdaki ekran görüntüsüne bakın:
Bir duvar seti oluşturun, duvar konumlandırma çizgisinin kapalı bir grafik olması ve üçten az olmaması gerekir, minimum uzunluk 10000 mm'dir, duvar yüksekliği varsayılan olarak 3000'dir ve ardından duvarı oluşturduktan sonra pencereyi duvarın rastgele konumuna yerleştirin ve her duvarın pencere koordinatları tutarsızdır ve gereksinim duvar yüksekliğini aşamaz.
LLM, önceki "bir set bir duvara eşittir" in yanlış açıklamalardan kaynaklandığını kanıtlayan üç duvar seti oluşturdu. [Salt d\'ajustament del text]LLM üç duvar seti oluşturur ve araçlar üç öğeden oluşan bir liste haline gelir.
Şu anda, kapı ve pencerelerin belirtilen duvara nasıl doğru bir şekilde yerleştirileceği sorunu ile karşı karşıyayız ve zamanında oluşturulan duvar kimliğini elde edemediğimiz için sadece sayılarla değiştirebiliyoruz.
- Kimlik teslim edilemediğinden, bu, oluşturma işleminin bitmesini beklemeyi veya kullanıcı seçimini içermeyen bütün bir düşünce zinciridir. Seçenekler aşağıdaki gibidir:
- Benzersiz bir tanımlayıcı olarak GUID biçimine dayalı olarak uniqueId ekleyin ve ana bilgisayar temeli olarak bir form kombinasyonu geçirin (bu proje bu şemayı benimser)
- Her oluşturma işleminden sonra, bileşen kimliği döndürülür ve veri kaynağı olarak bir sonraki Düşünce Zinciri Bağlama Aracı ile değiştirilir.
Benzersiz bir tanımlayıcı oluşturmayı ve bunu geçirmeyi vurgulamak için istemi değiştirin:
Bir duvar seti oluşturun, duvar konumlandırma çizgisinin kapalı bir grafik olması ve üçten az olmaması gerekir ve benzersiz bir tanımlayıcıya, guid formatına sahiptir, bunu kimlik olarak alın, minimum uzunluk 10000 mm'dir, duvar yüksekliği varsayılan olarak 3000'dir ve ardından duvarı oluşturduktan sonra pencereyi duvarın rastgele konumuna yerleştirin, her duvarın pencere koordinatları tutarsızdır ve gereksinim duvarın yüksekliğini aşamaz, niyetimi doğru bir şekilde anlayın ve işlevi sırayla karşılık gelen sırayla çağırmak için bölün
Şu anda, oluşturulan verilerdeki eId değişmedi, bu da LLM'nin niyeti anlamadığını gösteriyor. Aracın sunucudaki açıklamasını değiştirmeniz ve sistem ayarlarını, benzersiz tanımlayıcının GUID biçiminde olduğunu bilecek şekilde ayarlamanız gerekir.
Sunucu tarafında, Create açıklamasını, LLM'nin araçtan geçerken UniqueId'de açıkça geçmesi için değiştirin:
[McpServerTool(Name = "CreateWall"), [Salt d\'ajustament del text]Description("Generation Paramaters That Can Create Wall in Revit , [Salt d\'ajustament del text]If User Want To Generation eId ,[Salt d\'ajustament del text] You Need To Generation a unique id base this :0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2 ")]
Sistem tarafı ayrıca benzersiz bir tanımlayıcının tanımını da vurgular:
"""you are a professional enginer in BIM ,[Salt d\'ajustament del text] so you can select the greate tool to user ,[Salt d\'ajustament del text] also has a good develop tech in code , [Salt d\'ajustament del text]and generation a standard input style And Arguments to tools , [Salt d\'ajustament del text]also if some question need unique id you will generate a unique eId in this talk , [Salt d\'ajustament del text]the example :0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2"""
Nihai çıktı sonucu hala eId = 2'dir, çünkü yöntem giriş parametresi formatı int'dir ve LLM, parametrelere dayalı olarak int formatı olarak uniqueId çıktısı verecektir ve yöntem parametre türünün değiştirilmesi gerekir:
public string RevitCreateWallTool(string command, double x, double y, double z, double x1, double y2, string uniqueId) { [Salt d\'ajustament del text]return $@" {{ [Salt d\'ajustament del text]""command"": ""CreateWall"", [Salt d\'ajustament del text]""arguments"": {{ ""start"": [{x}, {y}, {z}], [Salt d\'ajustament del text]""end"": [{x1}, {y2}, {z}], ""eId"": ""{uniqueId}"" }} }}"; [Salt d\'ajustament del text]}
- Giriş ifadesini tekrar test edin ve kimliğin doğru bir şekilde atandığını, ancak LLM tarafından oluşturulan duvarın kapalı olmadığını ve anormal verilere neden olduğunu bulun. LLM'ler 2D performansında henüz olgunlaşmamıştır ve insanlar gibi 2D veya 3D grafikleri simüle edemezler. Girişe ayrıntılı bir açıklama ekleyebilirsiniz.
- Kapanış tanımı kısıtlamaları eklendi (uçtan uca kesişim) ve sonuç gereksinimleri karşıladı.
- Form ve duvar arasındaki yazışma eklenir ve doğru hesaplamayı sağlamak için matematiksel dil ve koordinat projeksiyon noktaları duvar çizgisi segmenti üzerindedir.
- Optimize edilmiş istem aşağıdaki gibidir:
Bir duvar bir pencereye karşılık gelir ve şu biçimde benzersiz bir tanımlayıcı tanımlayıcıya sahiptir: eId = 0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2, veriler kesinlikle bu formata göre oluşturulur ve tekrarlanamaz, bir duvar grubu oluşturun, duvar konumlandırma çizgisinin kapalı bir şekil olması gerekir, koordinat çizgileri birbirine düz bir çizgide bağlanır, ilki sonuncusu ile tutarlıdır ve üçten az değildir, minimum uzunluk 10000 mm'dir ve duvar yüksekliği varsayılan olarak 3000'dir, Duvarı oluşturduktan sonra, pencere duvarın rastgele konumunda pencereye yerleştirilir, pencerenin konumlandırma noktası oluşturulan duvar konumlandırma çizgisinde olmalıdır, hesaplama formülü şöyledir: formun projeksiyon noktası, duvarın ucuyla bağlanan çizgi segmenti üzerinde olmalıdır, her duvar bir pencereye karşılık gelir, ayrı ayrı hesaplanması gerekir, her duvarın pencere koordinatları tutarsızdır, gereksinim duvarın yüksekliğini aşamaz, niyetimi doğru bir şekilde anlayın ve gereksinimlere sıkı sıkıya bağlı olarak hesaplayın ve işlevi sırayla ilgili sıraya göre bölün
Örnek çıktı:
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]
}
}
]
etki
> orijinal gönderideki videonun değiştirilmesi gerektiğini unutmayın
özet
Duvar sayısı beşe çıktığında bir hata oluşur ve bu sadece uçtan uca tanımlanır ve LLM 2D veri işlemede hala yetersizdir. Revit'de sürekli olarak oluşturulması gereken bu tür senaryolar, özellikle 2B/3B uzamsal ilişkiler içerdiğinde, LLM'lerin performansı sınırlıdır. Doğruluk, istemler optimize edilerek iyileştirilebilir ve LLM'ler gelecekte optimizasyondan sonra daha iyi performans gösterebilir. Örnekler, mantıksal gözden geçirmenin, birden çok belirtim koşulunun belirlenmesi ve kimlik oluşturulması gibi MCP aracılığıyla daha fazla uygulama elde etmek için kullanılabileceğini göstermektedir. Kod Github ile senkronize edildi, indirmeye ve genişletmeye hoş geldiniz, makale esas olarak teknik fizibiliteyi kanıtlıyor ve belirli uygulamanın gerçek çalışma ile birleştirilmesi gerekiyor.
Bu makale Çince yazılmış ve yayınlanmıştır ve burada orijinal çevrilmiş bir versiyonudur.
Buraya yorum eklemek için kayıtlı bir kullanıcı olmanız gerekir. Daha önce kayıt olduysanız, lütfen giriş yapın. Henüz kayıt olmadıysanız, lütfen kayıt olun ve giriş yapın.