Revit e MCP Saiba mais sobre o LLM+Revit 2 por meio de estudos de caso: Realize várias cadeias de pensamento

Este artigo foi escrito e publicado em chinês e é uma versão traduzida original aqui.

 

Este artigo se aprofundará em como escrever código e executar comandos ao atribuir várias tarefas ao mesmo tempo.

 

contorno

O artigo anterior apresentou a rota técnica e os casos de implementação do MCP, e este artigo se aprofundará em como melhorar o caso em várias rodadas de cadeias de pensamento. Ainda tomando a parede como exemplo, desta vez não quero que os usuários participem da interação, tente deixar o computador completar o cálculo automaticamente. O requisito foi alterado de "Criar uma parede - > usuário seleciona uma parede - > Inserir portas e janelas em locais aleatórios" para: O LLM calcula automaticamente as coordenadas da parede e insere formas diferentes em cada parede. O conteúdo a seguir se concentrará na modificação imediata e no ajuste do código em várias rodadas de cadeia de pensamento.

 

O caso se desenrola

endereço

Githubhttps://github.com/imkcrevit/RevitMCP_Blog/tree/main 

 

rápido

O código deste projeto não mudou muito, principalmente por otimizar o método de descrição para que o LLM possa entender e chamar com precisão a execução da ferramenta. O conteúdo a seguir apresenta principalmente o ajuste lógico ao modificar um caso simples para um formato de várias cadeias de pensamento.

 

Passos

  • Primeiro, teste em MCP.Client, insira um parágrafo e veja se o LLM pode analisar várias ferramentas:
Crie um conjunto de paredes, a linha de posicionamento da parede deve ser um gráfico fechado e não inferior a três, o comprimento mínimo é de 10000 mm, a altura da parede é de 3000 por padrão e, em seguida, a janela é inserida na janela na posição aleatória da parede após a criação da parede, e as coordenadas da janela de cada parede são inconsistentes e o requisito não pode exceder a altura da parede.


Você pode ver que a saída é de duas ferramentas, provando que a descrição pode ser analisada corretamente pelo LLM e atribuída a diferentes ferramentas.

 

Pasted image 20250716140947.png

 

  • Continuando o teste, o prompt acima não define claramente "um conjunto de paredes", fazendo com que o LLM o reconheça como uma parede, o que não corresponde às expectativas. Depois de alterar o prompt, nada menos que três restrições foram adicionadas. Veja a captura de tela abaixo:
Crie um conjunto de paredes, a linha de posicionamento da parede deve ser um gráfico fechado e não inferior a três, o comprimento mínimo é de 10000 mm, a altura da parede é de 3000 por padrão e, em seguida, insira a janela na posição aleatória da parede após criar a parede, e as coordenadas da janela de cada parede são inconsistentes e o requisito não pode exceder a altura da parede.

 

O LLM criou três conjuntos de paredes, provando que o anterior "um conjunto é igual a uma parede" foi causado por descrições imprecisas.
O LLM gera três conjuntos de paredes e as ferramentas se tornam uma lista de três itens.

 

Pasted image 20250716142841.png

 

Neste momento, nos deparamos com o problema de como inserir com precisão as portas e janelas na parede especificada e, como não podemos obter o ID da parede criado a tempo, só podemos substituí-lo por números.

 

Pasted image 20250716142932.png

 

  • Como o ID não pode ser passado, essa é toda uma cadeia de pensamento que não envolve esperar a conclusão da criação ou a seleção do usuário. As opções são as seguintes:
    • Adicione uniqueId com base no formato GUID como um identificador exclusivo e passe uma combinação de formulários como a base do host (este projeto adota esse esquema)
    • Após cada criação, o ID do componente é retornado e substituído pela próxima Ferramenta de Ligação da Cadeia de Pensamento como fonte de dados.

Modifique o prompt para enfatizar a geração de um identificador exclusivo e passá-lo:

 

Crie um conjunto de paredes, a linha de posicionamento da parede deve ser um gráfico fechado e não inferior a três, e tem um identificador exclusivo, formato guid, tome-o como ID, o comprimento mínimo é 10000mm, a altura da parede é 3000 por padrão e, em seguida, insira a janela na posição aleatória da parede depois de criar a parede, as coordenadas da janela de cada parede são inconsistentes e o requisito não pode exceder a altura da parede, entenda com precisão minha intenção e divida-a para chamar a função por sua vez na ordem correspondente

 

No momento, o eId nos dados gerados não foi alterado, indicando que o LLM não entende a intenção. Você precisa alterar a descrição da ferramenta no servidor e ajustar as configurações do sistema para que ele saiba que o identificador exclusivo está no formato GUID.

No lado do servidor, modifique a descrição Create para que o LLM passe claramente o UniqueId ao percorrer a ferramenta:

 

[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 ")]

 

O lado do sistema também enfatiza a definição de um identificador exclusivo:

 

"""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"""

 

O resultado final da saída ainda é eId = 2, porque o formato do parâmetro de entrada do método é int, e o LLM produzirá uniqueId como formato int com base em parâmetros, e o tipo de parâmetro do método precisa ser modificado:

 

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}"" }} }}"; 
}

 

Teste novamente a instrução de entrada e descubra que o ID foi atribuído com precisão, mas a parede gerada pelo LLM não está fechada, resultando em dados anormais. Os LLMs ainda não estão maduros em desempenho 2D e não podem simular gráficos 2D ou 3D como os humanos. Você pode adicionar uma descrição detalhada à entrada.

 

Pasted image 20250716154005.png

 

  • Foram adicionadas restrições de definição de fechamento (interseção de ponta a ponta) e o resultado atendeu aos requisitos.
  • A correspondência entre a forma e a parede é adicionada, e a linguagem matemática e os pontos de projeção de coordenadas estão no segmento da linha da parede para garantir um cálculo preciso.
  • O prompt otimizado é o seguinte:

 

Uma parede corresponde a uma janela e possui um identificador identificador exclusivo no formato de: eId = 0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2, os dados são gerados estritamente de acordo com este formato e não podem ser repetidos, crie um grupo de paredes, a linha de posicionamento da parede deve ser uma figura fechada, as linhas de coordenadas são conectadas entre si em linha reta, a primeira é consistente com a última e não inferior a três, o comprimento mínimo é de 10000 mm e a altura da parede é de 3000 por padrão, Depois de criar a parede, a janela é inserida na janela na posição aleatória da parede, o ponto de posicionamento da janela deve estar na linha de posicionamento da parede gerada, a fórmula de cálculo é: o ponto de projeção do formulário deve estar no segmento de linha conectado pelo final da parede, cada parede corresponde a uma janela, precisa ser calculada separadamente, as coordenadas da janela de cada parede são inconsistentes, o requisito não pode exceder a altura da parede, entender com precisão minha intenção e calcular em estrita conformidade com os requisitos e dividir a função sucessivamente de acordo com a ordem correspondente

 

Exemplo de saída:

 

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]
              }
         }
    ]

 

efeito

 

resumo

Quando o número de paredes aumenta para cinco, há um erro, e ele só é definido de ponta a ponta, e o LLM ainda é insuficiente no processamento de dados 2D. Os LLMs têm desempenho limitado em tais cenários que precisam ser criados continuamente no Revit, especialmente quando envolvem relações espaciais 2D/3D. A precisão pode ser melhorada otimizando prompts, e os LLMs podem ter um desempenho melhor após a otimização no futuro. Os exemplos mostram que a revisão lógica pode ser usada para obter mais aplicativos por meio do MCP, como determinar várias condições de especificação e criar identidades. O código foi sincronizado com o GitHub. Bem-vindo ao download e à expansão. O artigo prova principalmente a viabilidade técnica, e o aplicativo específico precisa ser combinado com o trabalho real.

 

Este artigo foi escrito e publicado em chinês e é uma versão traduzida original aqui.